<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Python開發OpenHarmony設備程序-I2C應用實例分享

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:唐佐林 ? 2021-12-07 11:34 ? 次閱讀

在上一篇帖子《使用Python開發OpenHarmony設備程序(1-GPIO外設控制)》中,已經成功的使用 Python 對 GPIO 上的外設進行了控制。這是非常重要的一個里程碑:在OpenHarmony上用使用 Python 進行物聯網編程。并且加上 Python 語言天生的優勢(易于掌握,開發效率高),可以通過深入打造,將OpenHarmony上的 Python 進行到底。

此內容利用 GPIO 搭配 I2C 對外設進行編程。通過控制“智慧農業”外設板上的傳感器,獲取當前環境的溫度和濕度。

外設板上的 SHT30 是一個溫度濕度傳感器,它通過 I2C 與主控板(Hi3861)進行連接。因此,SHT30 是一種 I2C 設備,只需要通過 I2C 接口就能輕易對它進行控制。

什么是 I2C ?一般能查到的定義都會是:I2C ( Inter-Integrated Circuit ) 是一種由 PHILIPS 公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。所以,可以把 I2C 直接看作總線,即:SHT30 與 Hi3861 直接通過 I2C 總線相連。除此之外,也可以把 I2C 看作一種通信協議,即:SHT30 與 Hi3861 通過 2 根信號線連接在一起,并遵守預定義的規則,進而能夠交換信息。

按照常規想法,要使用 I2C 作為通信協議,那么必須的需要有相應的物理連接。而在當前的硬件設計上,通常的做法是進行引腳復用,即:同一個物理引腳,可以用作 GPIO,也可以用來實現 I2C 通信。

因此,在代碼層面可以復用 GPIO 實現 I2C 通信!

所以,下面的代碼就有了!

sht30_addr = 0x44 《《 1 # SHT30 設備地址

def init(): gpio.gpio_init(0) # 初始化 GPIO_0 func = gpio.query_func_value(0, ‘I2C1_SDA’)

gpio.set_func(0, func) # 設置 GPIO_0 的功能為 I2C1_SDA # I2C1_SDA: I2C_1的串行數據線 gpio.gpio_init(1) # 初始化 GPIO_1

func = gpio.query_func_value(1, ‘I2C1_SCL’)

gpio.set_func(1, func) # 設置 GPIO_1 的功能為 I2C1_SCL # I2C1_SCL: I2C_1的串行時鐘

i2c.i2c_init(1, 400000) # 初始化 I2C_1, 波特率為 400000

i2c.write(1, sht30_addr, [0x22, 0x36]) # 向 I2C_1 上的 SHT30 發送 # 初始化命令

在原理上,I2C 需要 2 根信號線完成設備間的通信;其中 SDA 為串行數據線,用來傳輸起始標志、應答標志和數據;而 SCL 為串行時鐘線,用來對設備進行同步。因此,在代碼層面,需要編程復用 2 個 GPIO 完成對 I2C 的支持。而 GPIO_0 能夠提供 I2C1_SDA 的功能,GPIO_1 能夠提供 I2C1_SCL 的功能,所以在初始化 I2C1 之前需要對 GPIO_0 和 GPIO_1 進行正確的功能設置,否則,設備間無法進行通信。

當 GPIO 的初始化完成,接下來對 I2C1 進行初始化,方法如下:將 I2C1 的 ID 和波特率作為參數調用 i2c_init()。

最后,進行設備初始化:只需要向目標設備發送初始化命令即可。如:向 SHT30 發送 [0x22, 0x36] 。

相信上述操作初始化代碼大家可以快速理解,接下來推理另一個問題: 除了有 I2C1,是否有 I2C0 呢?

答案是:有!OpenHarmony 輕量設備目前通過復用 GPIO 的方式提供 2 個 I2C 供使用。

當初始化正確完成,接下來讀取 SHT30 上的實時數據:

def read(): r , d = i2c.write_read(1, sht30_addr, [0xE0, 0x00], 6) if r == 0: t = (d[0] 《《 8) | d[1] # 溫度數據 h = (d[3] 《《 8) | d[4] # 濕度數據 return cal_t(t), cal_h(h) # 格式化數據并返回else: return None, None # 讀取失敗返回 None

上面的代碼非常簡潔,但似乎不那么好理解!首先我們熟悉一下目前 Python 提供的 I2C 接口函數。

c54e372c-55c2-11ec-b2e9-dac502259ad0.png

如上表格便于理解上面的代碼片段,即:先向 I2C1 上的 SHT30 發送讀取命令 [0xE0, 0x00],然后再從設備讀取 6 個字節的數據。如果函數執行成功,那么可得到從設備返回到的溫濕度數據。

完整交互過程如下圖所示:

c6005b50-55c2-11ec-b2e9-dac502259ad0.png

這里對 SHT30 返回的數據做一點說明。如果讀取成功,SHT30 會返回 6 個字節的數據,其中前 3 個字節表示溫度數據,后 3 個字節表示濕度數據;并且,d[2] 和 d[5] 分別表示溫度和濕度的校驗字節,通過這兩個字節即可判斷讀取到的溫濕度數據是否有效(注:本文的示例中,為了方便大家理解,沒有做數據校驗的工作。)

最后進行溫濕度數據的轉換,方法如下:

def cal_t(t): # 計算溫度,單位 ℃ t = t & ~0x3 t = t * 175 // 65536 - 45 return t

def cal_h(h): # 計算濕度,單位 % h = h & ~0x3 h = h * 100 // 65536 return h

完成如上工作,接下來只需循環調用 read() 即可完成最終目標:獲取當前環境溫濕度。

while True: t , h = read() if t != None: print(‘temperature = ’ + str(t)) if h != None: print(‘humidity = ’ + str(h)) os.sleep(5)

最后的運行結果如下:

c634a504-55c2-11ec-b2e9-dac502259ad0.png

更新提示

這個版本的實現同時支持 1.0 和 1.1 的代碼,因此,大家需要根據代碼版本編譯 dt_python_demo。

1) 將 dt_python_demo 拷貝到應用目錄

1.0:

。/applications/sample/wifi-iot/app

1.1:。/applications/sample/BearPi/BearPi-HM_Nano

2) 修改 app 模塊的任務列表

1.0:

。/applications/sample/wifi-iot/app/BUILD.gn

1.1:。/applications/sample/BearPi/BearPi-HM_Nano/BUILD.gn

3) libdtpython.a 路徑

1.0:

。/vendor/hisi/hi3861/hi3861/build/libs

1.1:。/device/bearpi/bearpi_hm_nano/sdk_liteos/build/libs

4) 根據代碼版本修改應用 BUILD.gn (路徑示例:。/applications/sample/BearPi/BearPi-HM_Nano/dt_python_demo/BUILD.gn)

static_library(“dt_python_demo”) { sources = [ “dt_python_demo.c”, # “sdk_adapter_1.0.c”, “test.c” ]

代碼開源地址: https://gitee.com/delphi-tang/python-for-hos

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    121129
  • 主控板
    +關注

    關注

    0

    文章

    31

    瀏覽量

    5389
  • OpenHarmony
    +關注

    關注

    24

    文章

    3442

    瀏覽量

    15291

原文標題:使用Python開發OpenHarmony設備程序-I2C應用實例

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【先楫HPM5361EVK開發板試用體驗】RT-Thread I2C使用

    /rt-thread-standard/programming-manual/device/i2c/i2c 2 I2C使用實例
    發表于 12-25 23:57

    如何在非Autosar應用中執行I2C?

    驅動器作為 Autosar 復合設備驅動器使用, 它使用 LPI2c 和 FlexIO 硬件外圍I2c 驅動程序既執行主模式,也執行奴隸模式。LPI
    發表于 11-13 07:04

    如何實例i2c設備?實例i2c設備的4種方式

    在架構板級文件中添加i2c設備信息,并注冊到特定位置??匆粋€nxp imx開發板的電源芯片的實例,arch/arm/mach-imx/mach-mx35_3ds.c
    的頭像 發表于 10-17 11:18 ?477次閱讀

    Rockchip i2c開發指南

    視壯嵌入式板卡rk3399《rockchip i2c 開發指南 v1.0》分享i2c設備設備應用非常廣泛,常見的包含重力傳感器,觸摸屏驅動
    發表于 10-10 08:17

    OpenHarmony:如何使用HDF平臺驅動控制I2C

    本帖最后由 xxl1925 于 2023-9-20 09:41 編輯 1、程序介紹本程序是基于OpenHarmony標準系統編寫的平臺驅動案例:I2C目前已在凌蒙派-RK3568
    發表于 09-12 15:18

    81 第23.2講 I2C實驗-AP3216C簡介與程序編寫 - 第5節

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:17:45

    81 第23.2講 I2C實驗-AP3216C簡介與程序編寫 - 第2

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:15:15

    81 第23.2講 I2C實驗-AP3216C簡介與程序編寫 - 第1節

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:14:25

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第7節 #硬聲創作季

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:07:44

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第6節 #硬聲創作季

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:06:54

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第5節 #硬聲創作季

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:06:04

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第4節 #硬聲創作季

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:05:14

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第3節 #硬聲創作季

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:04:23

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第2

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:03:33

    80 第23.1講 I2C實驗-I2C協議和6U的I2C控制器詳解 - 第1節

    程序代碼I2C協議
    充八萬
    發布于 :2023年08月17日 10:02:43
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>