本文將介紹如何使用ESP8266 Nodemcu的I2C模塊讀取VOC傳感器模塊的VOC數(shù)據(jù)。面包板的連接如下圖:
面包板連接示意圖
ESP8266 Nodemcu引腳圖
I2C是飛利浦公司發(fā)明的一種總線協(xié)議,在硬件方面有大量的運(yùn)用,這個(gè)協(xié)議需要用到兩根數(shù)據(jù)線如下:
i2c.png
一個(gè)總線上只能有一個(gè)Master,Master負(fù)責(zé)總線的控制和仲裁。ESP 8266即可以初始化為Master也可以作為client,今天我們會(huì)使用Master功能來(lái)讀取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)
這個(gè)時(shí)候我們用scan功能可以快速確認(rèn)總線上一共有多少個(gè)設(shè)備:
print(voc_dev.scan())
結(jié)果為:[47]
所以我們可以直接讀取四個(gè)字節(jié)的結(jié)果數(shù)據(jù):
buf = voc_dev.readfrom(47, 4, True)
4個(gè)字節(jié)的數(shù)據(jù)格式如下:
數(shù)據(jù)格式.png
針對(duì)數(shù)據(jù)格式的解析我這邊用到了ustruct庫(kù)來(lái)解析:
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)
傳感器預(yù)熱的時(shí)候VOC的值為65535所以這個(gè)不處理,完整的代碼如下:
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()
運(yùn)行效果圖為:
運(yùn)行效果圖.png
以上主要講解了I2C Master的用法,關(guān)于Micropython I2C的用法請(qǐng)參考:
https://docs.micropython.org/en/latest/esp8266/library/machine.I2C.html?highlight=i2c
如果想更詳細(xì)的了解I2C協(xié)議,請(qǐng)參考:
https://en.wikipedia.org/wiki/I%C2%B2C
原文地址:http://www.lxweimin.com/p/2334368fa402