回到顶部 回到顶部
best-icon

行空板搭配SCI 采集模块博采多模块数据无难事 中等

头像 HonestQiao 2022.11.15 110 0

SCI采集模块可以负责进行传感器的数据采集,然后对外能够以标准化的形式提供数据,而不用我们队传感器挨个进行处理了。

有这等好事?试试就知道了。

在行空板上一试,果然好用,现在分享给大家。

步骤1 认识SCI采集模块

首先,看一看这个SCI模块长啥样:

image.png

 

 

image.png

 

 

背面没啥好看的,主要看正面。

中间的OLED屏,可以显示读取的数据,左边是三个传感器接口,有三针AD的,也有4针用于I2C、UART的。右边是I2C接口,用于和其他控制板连接。上面的接口,是锂电池接口和Type-C接口。

 

这个模块的具体设备说明:

 

 

 

 

 

步骤2 实物连线

然后,使用DFRobot提供的专用数据线(PH2.0转2.54),接上几个模块:

* 土壤潮湿度传感器:接到3针模拟接口,Port1* SHT31数字温湿度传感器:接到I2c接口,Port2* 氧气浓度传感器:接到I2C接口,Port3

image.png

 

并将SCI模块的I2C数据输出接口,连接到行空板的I2C接口:

image.png

 

 

步骤3 通电查看数据

给行空板上电,等行空板启动后,就会自动给SCI模块供电了,然后SCI模块启动,自动读取传感器的数据,并在OLED显示屏上呈现出来。

image.png

 

拉近一点镜头,详细看一下:

image.png

 

列出来的数据,具体如下:

* 土壤潮湿度:实际读取值与潮湿度是成反比关系的* 温度(空气)* 湿度(空气)* 氧气浓度

到这里,可以看到,是不是非常的简单,方便,一接上,数据就出来了。

 

步骤4 行空板读取SCI数据

终于到行空板出场了!!!

要想在行空板上面,通过SCI模块读取数据,需要先安装DFRobot提供的专用数据读取库。

具体步骤如下:

代码
# 升级pip
/usr/bin/python3 -m pip install --upgrade pip 

# 升级pinpong库到最新版本,能够支持SCI采集模块
pip install -U pinpong 

# 下载支持库
cd /root/git clone https://gitee.com/liliang9693/ext-sci.git 

# 拷贝sci扩展库
mkdir sci_testcp ext-sci/python/libraries/dfrobot_rp2040_suab.py sci_test/  

现在,专用库准备好了,就需要写程序来实际调用了。

参考官方提供的行空板读取SCI数据的例子:SCI采集模块,根据上面实际接入的传感器,最终的代码如下:

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from dfrobot_rp2040_suab import *
from pinpong.board import Board
import time

Board().begin()
SCI1 = DFRobot_SUAB_IIC(addr=0x21)
while SCI1.begin() != 0:
    print("Initialization Sensor Universal Adapter Board failed.")
    time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")

while True:
    print("SCI数据读取:")
    O2 = SCI1.get_value0("O2").strip()
    O2_unit = SCI1.get_unit0("O2").strip()
    print("氧气浓度: %s %s" % (O2, O2_unit))

    Moisture = SCI1.get_value1(SCI1.eAD,"Moisture").strip()
    Moisture_unit = SCI1.get_unit1(SCI1.eAD,"Moisture").strip()
    print("土壤潮湿度:%s %s %%" % (Moisture, Moisture_unit))

    Temp_Air = SCI1.get_value1(SCI1.eI2C_UART1,"Temp_Air").strip()
    Temp_Air_unit = SCI1.get_unit1(SCI1.eI2C_UART1,"Temp_Air").strip()
    print("温度:%s %s ℃" % (Temp_Air, Temp_Air_unit))

    Humi_Air = SCI1.get_value1(SCI1.eI2C_UART1,"Humi_Air").strip()
    Humi_Air_unit = SCI1.get_unit1(SCI1.eI2C_UART1,"Humi_Air").strip()
    print("湿度:%s %s %%" % (Humi_Air, Humi_Air_unit))

    time.sleep(1)

上述代码逻辑如下:

* 初始化板子:Board().begin()

 

* 初始化SCI的I2C:SCI1 = DFRobot_SUAB_IIC(addr=0x21),此处0x21的地址,来自于SCI屏幕顶部显示的地址,需要对应正确* 启动SCI的I2C数据通讯:SCI1.begin()

 

* 读取特定接口的数据:

 

* SCI1.get_value0("O2"):直接读取指定数据标签的数据,需要是全局唯一的

 

* SCI1.get_value1(SCI1.eAD,"Moisture"),读取指定传感器接口上,指定标签的数据,这里的eAD,表示模拟传感器接口

 

* SCI1.get_value1(SCI1.eI2C_UART1,"Temp_Air").strip(),读取制定传感器接口上,指定标签的数据,这里的eI2C_UART1,表示I2C接口

 

* SCI1.get_unit0("O2"):表示获取对应数值的单位符号

 

* 打印读取的数据

 

将上述代码,保存为sci_test1.py,然后执行,即可读取到数据了:

image.png

 

注意:如果PinPong库没有更新,就不能正确读取数据,会出错。

 

另外,上述代码,也可以在在线管理界面的Jupyter中编写执行。

image.png

 

步骤5 在行空板的屏幕上呈现传感器数据

光在命令行显示读取到的数据,还是不过瘾的,我们还要呈现从屏幕上。

结合行空板自身所带的Python扩展库提供的图形界面操作功能,可以非常方便的实现:

代码
#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from dfrobot_rp2040_suab import *
from pinpong.board import Board
from unihiker import GUI   #导入包
import time

gui=GUI()  #实例化GUI类

Board().begin()
SCI1 = DFRobot_SUAB_IIC(addr=0x21)
while SCI1.begin() != 0:
    print("Initialization Sensor Universal Adapter Board failed.")
    time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")

x_max = 240
y_max = 320
gui.draw_text(x=60, y=20, text='SCI数据读取')
gui.draw_text(x=0, y=80, text='氧气浓度:')
gui.draw_text(x=0, y=120, text='土壤湿度:')
gui.draw_text(x=0, y=160, text='温度:')
gui.draw_text(x=0, y=200, text='湿度:')

t1 = gui.draw_text(x=100, y=80, text='0')
t2 = gui.draw_text(x=100, y=120, text='0')
t3 = gui.draw_text(x=100, y=160, text='0')
t4 = gui.draw_text(x=100, y=200, text='0')

t5 = gui.draw_text(x=20, y=260, text='')

while True:
    print("SCI数据读取:")
    O2 = SCI1.get_value0("O2").strip()
    O2_unit = SCI1.get_unit0("O2").strip()
    print("氧气浓度: %s %s" % (O2, O2_unit))
    t1.config(text = "%s%%" % O2)

    Moisture = SCI1.get_value1(SCI1.eAD,"Moisture").strip()
    Moisture_unit = SCI1.get_unit1(SCI1.eAD,"Moisture").strip()
    print("土壤潮湿度:%s %s %%" % (Moisture, Moisture_unit))
    t2.config(text = "%s%%" % Moisture)

    Temp_Air = SCI1.get_value1(SCI1.eI2C_UART1,"Temp_Air").strip()
    Temp_Air_unit = SCI1.get_unit1(SCI1.eI2C_UART1,"Temp_Air").strip()
    print("温度:%s %s ℃" % (Temp_Air, Temp_Air_unit))
    t3.config(text = "%s℃" % Temp_Air)

    Humi_Air = SCI1.get_value1(SCI1.eI2C_UART1,"Humi_Air").strip()
    Humi_Air_unit = SCI1.get_unit1(SCI1.eI2C_UART1,"Humi_Air").strip()
    print("湿度:%s %s %%" % (Humi_Air, Humi_Air_unit))
    t4.config(text = "%s%%" % Humi_Air)

    t5.config(text = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

    print("")
    # time.sleep(1)

在之前的代码中,我们添加了GUI操作的调用,涉及到的操作如下:

 

* 引入GUI库:from unihiker import GUI

 

* 实例化GUI对象:gui=GUI()

 

* 输出各个数据标签的名称:gui.draw_text(x=60, y=20, text='SCI数据读取')

 

* 输出各个数据的默认值并保留操作对象:t1 = gui.draw_text(x=100, y=80, text='0')

 

*更新数据操作对象的值为读取到的传感器的数据:t1.config(text = "%s%%" % O2)

 

* 更新最底部的事件信息的值 

 

将以上代码保存为sci_test2.py,然后执行,实际显示效果如下:

image.png

 

步骤6 总结

通过以上的使用过程,可以看到,SCI模块真得非常有用,与行空板做搭档,真的是绝配,从此不用花费时间在怎么读取传感器数据上,让开发效率成倍的提升!!!

评论

user-avatar