本文將介紹如何使用ESP8266 Nodemcu的I2C模塊讀取VOC傳感器模塊的VOC數(shù)據(jù)坷襟。面包板的連接如下圖:
面包板連接示意圖
ESP8266 Nodemcu引腳圖
I2C是飛利浦公司發(fā)明的一種總線協(xié)議睬罗,在硬件方面有大量的運用恋沃,這個協(xié)議需要用到兩根數(shù)據(jù)線如下:
i2c.png
一個總線上只能有一個Master,Master負責總線的控制和仲裁。ESP 8266即可以初始化為Master也可以作為client,今天我們會使用Master功能來讀取VOC傳感器的數(shù)據(jù),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]
所以我們可以直接讀取四個字節(jié)的結果數(shù)據(jù):
buf = voc_dev.readfrom(47, 4, True)
4個字節(jié)的數(shù)據(jù)格式如下:
數(shù)據(jù)格式.png
針對數(shù)據(jù)格式的解析我這邊用到了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協(xié)議寂汇,請參考:
https://en.wikipedia.org/wiki/I%C2%B2C
原文地址:http://www.reibang.com/p/2334368fa402