1、概述
si7006是一個SILICON LABS生産的溫濕度傳感器, 具有低功耗,高精度的溫濕度檢測,它是工廠校準,I2C接口的數字晶片。可檢測溫度-10~85°C (誤差+1°C), 濕度 0~90% RH(誤差5%RH)。
HaaS EDU K1物聯網教育開發闆已經內建了這款晶片, 用于溫濕度檢測的演練。
AliOS Things 3.3系統提供了Python輕應用架構,其包括對底層裝置驅動的封裝,開發者可以利用python輕松實作對底層裝置的程式設計。
下面示範如何通過簡短的python代碼實作對I2C裝置si7006的程式設計。
2、硬體環境
HaaS EDU K1中自帶si7006傳感器,相關購買連結如下:
HaaS EDU K1購買連結3、軟體環境
下載下傳和燒錄Python輕應用的最新的EDK固件。參考
HaaS EDU K1 Python輕應用固件下載下傳4、SI7006驅動代碼
利用python控制外設的前提是需要把外設的相關資訊,提供給python輕應用架構。 我們提供了board.json配置檔案,用來描述闆子的配置資訊。
HaaS EDU K1開發闆的board.json 中si7006的配置片段如下, 裡面包含這款晶片的I2C的關鍵配置包括I2C port, devAddr等。
- "si7006": {
- "type": "I2C",
- "port": 1,
- "addrWidth": 7,
- "freq": 400000,
- "mode": "master",
- "devAddr": 64
- },
si7006的主要實作代碼子產品在si7006.py。 AliOS Things 3.3的python輕應用架構,提供driver的子產品,實作對底層裝置驅動的封裝, 要想操作底層裝置需要導入這個子產品。
si7006晶片是I2C接口的,是以主要依賴driver子產品中的I2C class提供的方法。 如果你操作的裝置也是I2C接口的,可以參考本示例如下代碼。
- # -*- coding: UTF-8 -*-
- """
- The driver for Si7006 chip, it is a temperature and humidity sensor.
- from driver import I2C
- from utime import sleep_ms
- # The register address in Si7006 controller.
- Si7006_MEAS_REL_HUMIDITY_MASTER_MODE = 0xE5
- Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE = 0xF5
- Si7006_MEAS_TEMP_MASTER_MODE = 0xE3
- Si7006_MEAS_TEMP_NO_MASTER_MODE = 0xF3
- Si7006_READ_OLD_TEMP = 0xE0
- Si7006_RESET = 0xFE
- Si7006_READ_ID_LOW_0 = 0xFA
- Si7006_READ_ID_LOW_1 = 0x0F
- Si7006_READ_ID_HIGH_0 = 0xFC
- Si7006_READ_ID_HIGH_1 = 0xC9
- Si7006_READ_Firmware_Revision_0 = 0x84
- Si7006_READ_Firmware_Revision_1 = 0xB8
- class SI7006Error(Exception):
- def __init__(self, value=0, msg="si7006 common error"):
- self.value = value
- self.msg = msg
- def __str__(self):
- return "Error code:%d, Error message: %s" % (self.value, str(self.msg))
- __repr__ = __str__
- class SI7006(object):
- """
- This class implements SI7006 chip's functions.
- def __init__(self):
- self.i2cDev = None
- def open(self, devid):
- self.i2cDev = I2C()
- self.i2cDev.open(devid)
- def getVer(self):
- """
- Get the firmware version of the chip.
- reg = bytearray([Si7006_READ_Firmware_Revision_0, Si7006_READ_Firmware_Revision_1])
- self.i2cDev.write(reg)
- sleep_ms(30)
- version = bytearray(1)
- self.i2cDev.read(version)
- return version[0]
- def getID(self):
- """Get the chip ID."""
- reg = bytearray([Si7006_READ_ID_LOW_0, Si7006_READ_ID_LOW_1])
- id_buf_low = bytearray(4)
- self.i2cDev.read(id_buf_low)
- reg = bytearray([Si7006_READ_ID_HIGH_0, Si7006_READ_ID_HIGH_1])
- id_buf_high = bytearray(4)
- self.i2cDev.read(id_buf_high)
- return id_buf_low + id_buf_high
- def getTemperature(self):
- """Get temperature."""
- reg = bytearray([Si7006_MEAS_TEMP_NO_MASTER_MODE])
- readData = bytearray(2)
- self.i2cDev.read(readData)
- value = (readData[0] << 8 | readData[1])
- if (value & 0xFFFC):
- temperature = (175.72 * value) / 65536.0 - 46.85
- return temperature
- else:
- raise SI7006Error("failed to get temperature.")
- def getHumidity(self):
- """Get humidity."""
- reg = bytearray([Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE])
- value = (readData[0] << 8) | readData[1]
- if (value & 0xFFFE):
- humidity = (125.0 * value) / 65535.0 - 6.0
- return humidity
- raise SI7006Error("failed to get humidity.")
- def getTempHumidity(self):
- """Get temperature and humidity."""
- temphumidity = [0, 0]
- temphumidity[0] = self.getTemperature()
- temphumidity[1] = self.getHumidity()
- return temphumidity
- def close(self):
- self.i2cDev.close()
以上是Python輕應用對于SI7006傳感器的封裝,預設已經內建到了Python輕應用的固件當中,通過以下指令導入到Python 輕應用中使用
from si7006 import SI7006
5、Python 輕應用測試代碼
- Testing si7006 python driver
- The below i2c configuration is needed in your board.json.
- "si7006": {
- "type": "I2C",
- "port": 1,
- "addrWidth": 7,
- "freq": 400000,
- "mode": "master",
- "devAddr": 64
- }
- print("Testing si7006 ...")
- si7006Dev = SI7006()
- si7006Dev.open("si7006")
- version = si7006Dev.getVer()
- print("si7006 version is: %d" % version)
- chipID = si7006Dev.getID()
- print("si7006 chip id is:", chipID)
- temperature = si7006Dev.getTemperature()
- print("The temperature is: %f" % temperature)
- humidity = si7006Dev.getHumidity()
- print("The humidity is: %f" % humidity)
- si7006Dev.close()
- print("Test si7006 success!")
示範過程

測試結果
- (ash:/data)# python /data/python-apps/driver/i2c/test_si7006.py
- Testing si7006 ...
- si7006 version is: 32
- si7006 chip id is:_space_bytearray(b'\x00\x00?\xeb\xe1\xf0\xbe"')
- The temperature is: 53.182993
- The humidity is: 17.785000
- Test si7006 success!
- free python heap mm
測試結果是53°C, 濕度約為17.8%,注意測試使用的HaaS EDU K1物聯網教育開發闆隻是教學用的,不是産品。是以它的溫濕度傳感器是完全封閉在闆子上的,測試結果顯示的是闆子的溫濕度,而不是環境中的溫濕度。
6、總結
使用Python輕應用架構開發控制一個I2C裝置, 隻需要很簡短的代碼就可以實作,而且還可以利用Python語言的簡潔和豐富的元件庫的能力,省去傳統嵌入式開發中編譯,燒錄等繁瑣的步驟,大大縮短産品開發周期,快來一試吧。
技術交流
Python輕應用繼承了Python易學易用的特點,同時提供了基于嵌入式硬體的基礎庫封裝,讓開發者可以很友善的通過互動式的環境,實時進行嵌入式開發,讓嵌入式開發也變得簡單友善。
如需更多技術支援,可加入釘釘開發者群,享受一對一的技術支援。