树莓派技术入门应用树莓派 + MCC 118 实现数据采集Word文件下载.docx
《树莓派技术入门应用树莓派 + MCC 118 实现数据采集Word文件下载.docx》由会员分享,可在线阅读,更多相关《树莓派技术入门应用树莓派 + MCC 118 实现数据采集Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
sudoapt-getupdate
sudoapt-getinstallgit
cd~
gitclone
cd~/daqhats
sudo./install.sh
pipinstalldashdash-rendererdash-html-componentsdash-core-components
二、接线
先看光线传感器模块。
为什么用带模拟输出(AO)的光线传感器呢?
是因为这款传感器如果只有数字输出(DO)的话,其输出的数据只能是高电平或低电平,只能反映光线是否达到某个设定的值,而无法反映出光线的强弱。
但树莓派本身并没有ADC,无法直接读取模拟电信号(信号的强弱和光线强弱相关)。
这时MCC118DAQ就派上用场了。
MCC118的排座设计将GPIO全部引出了,很方便外接其他传感器。
引脚连接表
光线传感器:
VCC—树莓派:
5V
GND—MCC118:
GND
AO—MCC118:
CH1
RGBLED模块:
GND—树莓派:
R—树莓派:
BCM17
G—树莓派:
BCM27
B—树莓派:
BCM22
三、测量采集和数值换算
启动Web波形图程序:
cd~/daqhats/examples/python/mcc118/web_server
./web_server.py
接下来就可以在浏览器中打开http:
//:
8080访问了。
将其中的替换成树莓派的IP地址或主机名。
要想停止Web服务,可以回到命令行界面按下Ctrl+C中止。
首先试试看这个传感器的AO输出的电压范围,用MCC118SDK中自带的web_server范例可以非常方便的检测到。
这是一个类似示波器的应用,启动之后在浏览器打开,选择通道1后启动数据采集,通过开关灯可以看到电压的实时变化。
通过完全遮住光线传感器的光敏电阻,看到AO输出电压最大升至5V;
用手机自带闪光灯照射在光敏电阻上,看到AO输出电压最小降到0V。
看来0~5V就是这个传感器的模拟电信号输出范围(图表显示的电压伏特数是精确到小数点后6位的)。
为了简化后面的程序,我把0~5V的电压范围通过简单的公式换算到100~0的范围内,而树莓派的PWM支持的参数范围也是0~100,这样刚好可以用树莓派的PWM来设置LED的亮度。
#从通道1读取模拟电信号(电压)
value=hat.a_in_read(1,options)
#光照亮度指数换算
light_index=100-round(value*1000/50)
#根据光照亮度指数,通过PWM来设置LED的光照强度和颜色
#红色光
pwmR.ChangeDutyCycle(light_index)
#绿色光
pwmG.ChangeDutyCycle(light_index)
#蓝色光
pwmB.ChangeDutyCycle(100)
其效果是白天光线最强时鱼缸灯光达到最强的白色光,到晚间,灯光中的红色和绿色光源逐渐减弱至0,则呈现出夜晚的蓝色光氛围。
四、代码和运行
完整代码如下,这个代码是在MCC118范例single_value_read基础上修改而来的(范例做得清晰易懂很方便修改)。
#!
/usr/bin/envpython
#-*-coding:
utf-8-*-
from__future__importprint_function
fromtimeimportsleep
fromsysimportstdout
fromdaqhats_utilsimportselect_hat_device,enum_mask_to_string
fromdaqhatsimportmcc118,OptionFlags,HatIDs,HatError
#RGBLED
importRPi.GPIO
#Constants
CURSOR_BACK_2='
\x1b[2D'
ERASE_TO_END_OF_LINE='
\x1b[0K'
R,G,B=17,27,22
RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(R,RPi.GPIO.OUT)
RPi.GPIO.setup(G,RPi.GPIO.OUT)
RPi.GPIO.setup(B,RPi.GPIO.OUT)
pwmR=RPi.GPIO.PWM(R,70)
pwmG=RPi.GPIO.PWM(G,70)
pwmB=RPi.GPIO.PWM(B,70)
pwmR.start(0)
pwmG.start(0)
pwmB.start(0)
defmain():
"
"
Thisfunctionisexecutedautomaticallywhenthemoduleisrundirectly.
options=OptionFlags.DEFAULT
low_chan=0
high_chan=3
mcc_118_num_channels=mcc118.info().NUM_AI_CHANNELS
sample_interval=0.5#Seconds
light_index=0
try:
#Getaninstanceoftheselectedhatdeviceobject.
address=select_hat_device(HatIDs.MCC_118)
hat=mcc118(address)
print('
\nMCC118singledatavaluereadexample'
)
Options:
'
enum_mask_to_string(OptionFlags,options))
input("
\nPress'
Enter'
tocontinue"
except(NameError,SyntaxError):
pass
\nAcquiringdata...PressCtrl-Ctoabort'
whileTrue:
#Readasinglevaluefromeachselectedchannel.
value=hat.a_in_read(1,options)
light_index=100-round(value*1000/50)
led_display(light_index)
\r{:
12.5}V'
.format(value),'
\tIndex:
{:
5.4}'
.format(light_index),end='
stdout.flush()
#Waitthespecifiedintervalbetweenreads.
sleep(sample_interval)
exceptKeyboardInterrupt:
#Clearthe'
^C'
fromthedisplay.
print(CURSOR_BACK_2,ERASE_TO_END_OF_LINE,'
\n'
except(HatError,ValueError)aserror:
error)
pwmR.stop()
pwmG.stop()
pwmB.stop()
RPi.GPIO.cleanup()
defled_display(index):
#print(index)
pwmR.ChangeDutyCycle(index)
pwmG.ChangeDutyCycle(index)
pwmB.ChangeDutyCycle(100)
if__name__=='
__main__'
:
#Thiswillonlyberunwhenthemoduleiscalleddirectly.
main()
将程序代码文件light.py上传至树莓派,进入程序所在目录运行:
pythonlight.py
光照强度指数最大时效果如下。
光照强度指数最小时效果如下。
应用到鱼缸(效果图)。
五、延伸应用
做这个实验的过程中在想如果MCC118能自带一款显示屏用来显示采集到的实时数据就好了,后来发现手头有一款集成了数码管的瑞士军刀扩展板,刚好可以插在这个MCC118引出的排针上,如图:
瑞士军刀扩展板也有很方便的SDK,简单的整合了两部分代码,就实现了数码管动态显示光照强度指数,并能控制板载的8个LED实现1-8级亮度的小夜灯。
完整代码如下:
fromsakshatimportSAKSHAT
importtime
#DeclaretheSAKSBoard
SAKS=SAKSHAT()
SAKS.buzzer.off()
SAKS.digital_display.show(("
##%d"
%int(index)))
ifindex<
50:
SAKS.ledrow.set_row([True,True,True,True,True,True,True,True])
else:
SAKS.ledrow.set_row([False,False,False,False,False,False,False,False])
六、小结
看起来在专业领域才会接触到的数据采集,实际上也可以应用在日常的DIY实验之中。
MCC118这块数据采集卡配以完善的程序库和范例,是树莓派平台上很容易上手的数据采集方案。
在它的帮助下,我的爱鱼也能实时感受到室外的天气变化了~