SCI采集模块可以负责进行传感器的数据采集,然后对外能够以标准化的形式提供数据,而不用我们队传感器挨个进行处理了。
有这等好事?试试就知道了。
在行空板上一试,果然好用,现在分享给大家。
步骤1 认识SCI采集模块
首先,看一看这个SCI模块长啥样:
背面没啥好看的,主要看正面。
中间的OLED屏,可以显示读取的数据,左边是三个传感器接口,有三针AD的,也有4针用于I2C、UART的。右边是I2C接口,用于和其他控制板连接。上面的接口,是锂电池接口和Type-C接口。
这个模块的具体设备说明:
步骤2 实物连线
然后,使用DFRobot提供的专用数据线(PH2.0转2.54),接上几个模块:
* 土壤潮湿度传感器:接到3针模拟接口,Port1* SHT31数字温湿度传感器:接到I2c接口,Port2* 氧气浓度传感器:接到I2C接口,Port3
并将SCI模块的I2C数据输出接口,连接到行空板的I2C接口:
步骤3 通电查看数据
给行空板上电,等行空板启动后,就会自动给SCI模块供电了,然后SCI模块启动,自动读取传感器的数据,并在OLED显示屏上呈现出来。
拉近一点镜头,详细看一下:
列出来的数据,具体如下:
* 土壤潮湿度:实际读取值与潮湿度是成反比关系的* 温度(空气)* 湿度(空气)* 氧气浓度
到这里,可以看到,是不是非常的简单,方便,一接上,数据就出来了。
步骤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,然后执行,即可读取到数据了:
注意:如果PinPong库没有更新,就不能正确读取数据,会出错。
另外,上述代码,也可以在在线管理界面的Jupyter中编写执行。
步骤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,然后执行,实际显示效果如下:
步骤6 总结
通过以上的使用过程,可以看到,SCI模块真得非常有用,与行空板做搭档,真的是绝配,从此不用花费时间在怎么读取传感器数据上,让开发效率成倍的提升!!!
花生编程2023.01.24
666
花生编程2023.01.24
厉害
三春牛-创客2023.01.04
赞!
三春牛-创客2023.01.04
厉害厉害