[Python玩转物联网]Micropython I2C实验
2017-04-18 本文已影响298人
fnd
本文将介绍如何使用ESP8266 Nodemcu的I2C模块读取VOC传感器模块的VOC数据。面包板的连接如下图:
面包板连接示意图 ESP8266 Nodemcu引脚图I2C是飞利浦公司发明的一种总线协议,在硬件方面有大量的运用,这个协议需要用到两根数据线如下:
i2c.png一个总线上只能有一个Master,Master负责总线的控制和仲裁。ESP 8266即可以初始化为Master也可以作为client,今天我们会使用Master功能来读取VOC传感器的数据,GPIO14作为SDA,GPIO12作为SCL,CLK为50KHz:
import machine
voc_dev = machine.I2C(scl = machine.Pin(14), sda = machine.Pin(12), freq = 50000)
这个时候我们用scan功能可以快速确认总线上一共有多少个设备:
print(voc_dev.scan())
结果为:[47]
所以我们可以直接读取四个字节的结果数据:
buf = voc_dev.readfrom(47, 4, True)
4个字节的数据格式如下:
数据格式.png针对数据格式的解析我这边用到了ustruct库来解析:
fmt = '>BHB'
addr,ppm,chk_val = ustruct.unpack(fmt,buf)
#print (addr,ppm, chk_val)
if ppm == 65535:
pass
voc = ppm*0.1
print(voc)
传感器预热的时候VOC的值为65535所以这个不处理,完整的代码如下:
import machine
import ustruct
voc_dev = machine.I2C(scl = machine.Pin(14), sda = machine.Pin(12), freq = 50000)
print(voc_dev.scan())
while True:
oc = 0.0
buf = voc_dev.readfrom(47, 4, True)
#print(ubinascii.hexlify(buf, ))
fmt = '>BHB'
addr,ppm,chk_val = ustruct.unpack(fmt,buf)
#print (addr,ppm, chk_val)
if ppm == 65535:
pass
voc = ppm*0.1
print(voc)
gc.collect()
运行效果图为:
运行效果图.png以上主要讲解了I2C Master的用法,关于Micropython I2C的用法请参考:
https://docs.micropython.org/en/latest/esp8266/library/machine.I2C.html?highlight=i2c
如果想更详细的了解I2C协议,请参考:
https://en.wikipedia.org/wiki/I%C2%B2C
原文地址:http://www.jianshu.com/p/2334368fa402