天天看點

HaaS輕應用(Python): si7006溫濕度傳感器案例1、概述2、硬體環境3、軟體環境4、SI7006驅動代碼5、Python 輕應用測試代碼6、總結技術交流

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等。

  1.   "si7006": {
  2.       "type": "I2C",
  3.       "port": 1,
  4.       "addrWidth": 7,
  5.       "freq": 400000,
  6.       "mode": "master",
  7.       "devAddr": 64
  8.     },

si7006的主要實作代碼子產品在si7006.py。 AliOS Things 3.3的python輕應用架構,提供driver的子產品,實作對底層裝置驅動的封裝, 要想操作底層裝置需要導入這個子產品。

si7006晶片是I2C接口的,是以主要依賴driver子產品中的I2C class提供的方法。 如果你操作的裝置也是I2C接口的,可以參考本示例如下代碼。

  1. # -*- coding: UTF-8 -*-
  2. """
  3. The driver for Si7006 chip, it is a temperature and humidity sensor.
  4. from driver import I2C
  5. from utime import sleep_ms
  6. # The register address in Si7006 controller.
  7. Si7006_MEAS_REL_HUMIDITY_MASTER_MODE    = 0xE5
  8. Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE = 0xF5
  9. Si7006_MEAS_TEMP_MASTER_MODE            = 0xE3
  10. Si7006_MEAS_TEMP_NO_MASTER_MODE         = 0xF3
  11. Si7006_READ_OLD_TEMP                    = 0xE0
  12. Si7006_RESET                            = 0xFE
  13. Si7006_READ_ID_LOW_0                    = 0xFA
  14. Si7006_READ_ID_LOW_1                    = 0x0F
  15. Si7006_READ_ID_HIGH_0                   = 0xFC
  16. Si7006_READ_ID_HIGH_1                   = 0xC9
  17. Si7006_READ_Firmware_Revision_0         = 0x84
  18. Si7006_READ_Firmware_Revision_1         = 0xB8
  19. class SI7006Error(Exception):
  20.     def __init__(self, value=0, msg="si7006 common error"):
  21.         self.value = value
  22.         self.msg = msg
  23.     def __str__(self):
  24.         return "Error code:%d, Error message: %s" % (self.value, str(self.msg))
  25.     __repr__ = __str__
  26. class SI7006(object):
  27.     """
  28.     This class implements SI7006 chip's functions.
  29.     def __init__(self):
  30.         self.i2cDev = None
  31.     def open(self, devid):
  32.         self.i2cDev = I2C()
  33.         self.i2cDev.open(devid)
  34.     def getVer(self):
  35.         """
  36.         Get the firmware version of the chip.
  37.         reg = bytearray([Si7006_READ_Firmware_Revision_0, Si7006_READ_Firmware_Revision_1])
  38.         self.i2cDev.write(reg)
  39.         sleep_ms(30)
  40.         version = bytearray(1)
  41.         self.i2cDev.read(version)
  42.         return version[0]
  43.     def getID(self):
  44.         """Get the chip ID."""
  45.         reg = bytearray([Si7006_READ_ID_LOW_0, Si7006_READ_ID_LOW_1])
  46.         id_buf_low = bytearray(4)
  47.         self.i2cDev.read(id_buf_low)
  48.         reg = bytearray([Si7006_READ_ID_HIGH_0, Si7006_READ_ID_HIGH_1])
  49.         id_buf_high = bytearray(4)
  50.         self.i2cDev.read(id_buf_high)
  51.         return id_buf_low + id_buf_high
  52.     def getTemperature(self):
  53.         """Get temperature."""
  54.         reg = bytearray([Si7006_MEAS_TEMP_NO_MASTER_MODE])
  55.         readData = bytearray(2)
  56.         self.i2cDev.read(readData)
  57.         value = (readData[0] << 8 | readData[1])
  58.         if (value & 0xFFFC):
  59.             temperature = (175.72 * value) / 65536.0 - 46.85
  60.             return temperature
  61.         else:
  62.             raise SI7006Error("failed to get temperature.")
  63.     def getHumidity(self):
  64.         """Get humidity."""
  65.         reg = bytearray([Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE])
  66.         value = (readData[0] << 8) | readData[1]
  67.         if (value & 0xFFFE):
  68.             humidity = (125.0 * value) / 65535.0 - 6.0
  69.             return humidity
  70.             raise SI7006Error("failed to get humidity.")
  71.     def getTempHumidity(self):
  72.         """Get temperature and humidity."""
  73.         temphumidity = [0, 0]
  74.         temphumidity[0] = self.getTemperature()
  75.         temphumidity[1] = self.getHumidity()
  76.         return temphumidity
  77.     def close(self):
  78.         self.i2cDev.close()

以上是Python輕應用對于SI7006傳感器的封裝,預設已經內建到了Python輕應用的固件當中,通過以下指令導入到Python 輕應用中使用

from si7006 import SI7006

5、Python 輕應用測試代碼

  1. Testing si7006 python driver
  2. The below i2c configuration is needed in your board.json.
  3. "si7006": {
  4.   "type": "I2C",
  5.   "port": 1,
  6.   "addrWidth": 7,
  7.   "freq": 400000,
  8.   "mode": "master",
  9.   "devAddr": 64
  10. }
  11. print("Testing si7006 ...")
  12. si7006Dev = SI7006()
  13. si7006Dev.open("si7006")
  14. version = si7006Dev.getVer()
  15. print("si7006 version is: %d" % version)
  16. chipID = si7006Dev.getID()
  17. print("si7006 chip id is:", chipID)
  18. temperature = si7006Dev.getTemperature()
  19. print("The temperature is: %f" % temperature)
  20. humidity = si7006Dev.getHumidity()
  21. print("The humidity is: %f" % humidity)
  22. si7006Dev.close()
  23. print("Test si7006 success!")

示範過程

HaaS輕應用(Python): si7006溫濕度傳感器案例1、概述2、硬體環境3、軟體環境4、SI7006驅動代碼5、Python 輕應用測試代碼6、總結技術交流

測試結果

  1. (ash:/data)# python /data/python-apps/driver/i2c/test_si7006.py
  2. Testing si7006 ...
  3. si7006 version is: 32
  4. si7006 chip id is:_space_bytearray(b'\x00\x00?\xeb\xe1\xf0\xbe"')
  5. The temperature is: 53.182993
  6. The humidity is: 17.785000
  7. Test si7006 success!
  8. free python heap mm

測試結果是53°C, 濕度約為17.8%,注意測試使用的HaaS EDU K1物聯網教育開發闆隻是教學用的,不是産品。是以它的溫濕度傳感器是完全封閉在闆子上的,測試結果顯示的是闆子的溫濕度,而不是環境中的溫濕度。

6、總結

使用Python輕應用架構開發控制一個I2C裝置, 隻需要很簡短的代碼就可以實作,而且還可以利用Python語言的簡潔和豐富的元件庫的能力,省去傳統嵌入式開發中編譯,燒錄等繁瑣的步驟,大大縮短産品開發周期,快來一試吧。

技術交流

Python輕應用繼承了Python易學易用的特點,同時提供了基于嵌入式硬體的基礎庫封裝,讓開發者可以很友善的通過互動式的環境,實時進行嵌入式開發,讓嵌入式開發也變得簡單友善。

如需更多技術支援,可加入釘釘開發者群,享受一對一的技術支援。

HaaS輕應用(Python): si7006溫濕度傳感器案例1、概述2、硬體環境3、軟體環境4、SI7006驅動代碼5、Python 輕應用測試代碼6、總結技術交流