0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Python開發(fā)OpenHarmony設(shè)備程序-I2C應(yīng)用實例分享

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

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

此內(nèi)容利用 GPIO 搭配 I2C 對外設(shè)進行編程。通過控制“智慧農(nóng)業(yè)”外設(shè)板上的傳感器,獲取當(dāng)前環(huán)境的溫度和濕度。

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

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

按照常規(guī)想法,要使用 I2C 作為通信協(xié)議,那么必須的需要有相應(yīng)的物理連接。而在當(dāng)前的硬件設(shè)計上,通常的做法是進行引腳復(fù)用,即:同一個物理引腳,可以用作 GPIO,也可以用來實現(xiàn) I2C 通信。

因此,在代碼層面可以復(fù)用 GPIO 實現(xiàn) I2C 通信!

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

sht30_addr = 0x44 《《 1 # SHT30 設(shè)備地址

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

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

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

gpio.set_func(1, func) # 設(shè)置 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 發(fā)送 # 初始化命令

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

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

最后,進行設(shè)備初始化:只需要向目標(biāo)設(shè)備發(fā)送初始化命令即可。如:向 SHT30 發(fā)送 [0x22, 0x36] 。

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

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

當(dāng)初始化正確完成,接下來讀取 SHT30 上的實時數(shù)據(jù):

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

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

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

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

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

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

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

最后進行溫濕度數(shù)據(jù)的轉(zhuǎn)換,方法如下:

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

完成如上工作,接下來只需循環(huán)調(diào)用 read() 即可完成最終目標(biāo):獲取當(dāng)前環(huán)境溫濕度。

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

最后的運行結(jié)果如下:

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

更新提示

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

1) 將 dt_python_demo 拷貝到應(yīng)用目錄

1.0:

。/applications/sample/wifi-iot/app

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

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

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) 根據(jù)代碼版本修改應(yīng)用 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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1495

    瀏覽量

    124205
  • 主控板
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    5527
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3744

    瀏覽量

    16467

原文標(biāo)題:使用Python開發(fā)OpenHarmony設(shè)備程序-I2C應(yīng)用實例

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

收藏 人收藏

    評論

    相關(guān)推薦

    I2C總線與Arduino的接口示例

    在現(xiàn)代電子設(shè)計中,I2C總線因其簡單性和靈活性而廣受歡迎。它允許多個設(shè)備共享同一通信線路,從而節(jié)省空間和成本。Arduino,作為一個多功能的微控制器平臺,自然也支持I2C通信。 I2C
    的頭像 發(fā)表于 01-17 15:34 ?129次閱讀

    I2C總線的工作模式介紹

    在現(xiàn)代電子系統(tǒng)中,I2C總線作為一種多主機、多從機的串行通信協(xié)議,扮演著至關(guān)重要的角色。它允許多個設(shè)備共享同一總線,進行數(shù)據(jù)傳輸,從而簡化了系統(tǒng)設(shè)計并降低了成本。 I2C總線的基本特性 I2C
    的頭像 發(fā)表于 01-17 15:32 ?116次閱讀

    I2C總線協(xié)議詳細(xì)解析

    1. I2C總線簡介 I2C總線由Philips Semiconductor(現(xiàn)為NXP Semiconductors)在1980年代初期開發(fā)。它是一種多主機總線,允許多個設(shè)備共享同一
    的頭像 發(fā)表于 01-17 15:22 ?162次閱讀

    I2C總線故障排除技巧

    I2C總線是一種廣泛使用的串行通信協(xié)議,它允許多個設(shè)備在兩條線上(數(shù)據(jù)線SDA和時鐘線SCL)進行通信。由于其簡單性和靈活性,I2C總線在嵌入式系統(tǒng)中非常流行。然而,當(dāng)I2C總線出現(xiàn)問
    的頭像 發(fā)表于 01-17 15:20 ?146次閱讀

    I2C總線與單片機的連接

    在現(xiàn)代電子系統(tǒng)中,單片機(MCU)是核心控制單元,而I2C總線作為一種多主機、多從機的串行通信協(xié)議,因其簡單、高效和節(jié)省引腳的特性而被廣泛應(yīng)用于各種電子設(shè)備中。 I2C總線概述 I2C
    的頭像 發(fā)表于 01-17 15:18 ?136次閱讀

    I2C總線設(shè)備地址設(shè)置方法

    I2C總線是一種廣泛使用的串行通信協(xié)議,它允許多個設(shè)備在兩條線上(數(shù)據(jù)線SDA和時鐘線SCL)進行通信。每個設(shè)備都有一個唯一的地址,以確保數(shù)據(jù)能夠正確地發(fā)送到目標(biāo)設(shè)備。
    的頭像 發(fā)表于 01-17 15:17 ?168次閱讀

    I2C總線應(yīng)用實例分析

    在現(xiàn)代電子系統(tǒng)中,I2C總線因其簡單、靈活和高效的特點而被廣泛應(yīng)用于各種設(shè)備之間的通信。 I2C總線概述 I2C總線由Philips(現(xiàn)為NXP)在1980年代初期
    的頭像 發(fā)表于 01-17 15:09 ?144次閱讀

    I2C總線與SPI總線的比較

    于低速通信。它只需要兩根線:數(shù)據(jù)線(SDA)和時鐘線(SCL),這使得I2C非常適合于節(jié)省引腳的應(yīng)用。 特點 多主機支持 :多個微控制器可以共享同一I2C總線。 多從機支持 :多個從設(shè)備可以連接到同一總線上。 地址識別 :每個從
    的頭像 發(fā)表于 01-17 15:08 ?143次閱讀

    RISC V的I2C操作

    。tsuData中,1代表10ns;Timeout中,1表示10nstLow和tHigh的1代表10ns10.1.3 軟件部分(Risc V)l? I2C通信主要包括以下幾個部分:1、主設(shè)備發(fā)送起始位(Start
    的頭像 發(fā)表于 11-01 11:06 ?262次閱讀

    I2C啟動加載準(zhǔn)備TMS320C645x應(yīng)用程序

    電子發(fā)燒友網(wǎng)站提供《為I2C啟動加載準(zhǔn)備TMS320C645x應(yīng)用程序.pdf》資料免費下載
    發(fā)表于 10-16 11:30 ?0次下載
    為<b class='flag-5'>I2C</b>啟動加載準(zhǔn)備TMS320<b class='flag-5'>C</b>645x應(yīng)用<b class='flag-5'>程序</b>

    I2C基本指南

    電子發(fā)燒友網(wǎng)站提供《I2C基本指南.pdf》資料免費下載
    發(fā)表于 09-10 09:40 ?0次下載
    <b class='flag-5'>I2C</b>基本指南

    第二屆大會回顧第25期 | OpenHarmony上的Python設(shè)備應(yīng)用開發(fā)

    Python以其簡單、易學(xué)和功能強大而聞名,有著廣泛的用戶群體。采用Python開發(fā)有助于降低OpenHarmony的學(xué)習(xí)門檻。如何在OpenHar
    的頭像 發(fā)表于 08-27 11:53 ?759次閱讀
    第二屆大會回顧第25期 | <b class='flag-5'>OpenHarmony</b>上的<b class='flag-5'>Python</b><b class='flag-5'>設(shè)備</b>應(yīng)用<b class='flag-5'>開發(fā)</b>

    簡單認(rèn)識I2C通信協(xié)議

    I2C(Inter-Integrated Circuit)通信協(xié)議是由飛利浦公司(現(xiàn)為恩智浦半導(dǎo)體)開發(fā)的一種簡單、雙向二線制同步串行總線協(xié)議。自1982年發(fā)布以來,I2C協(xié)議因其高效、靈活和易于實現(xiàn)的特點,在電子
    的頭像 發(fā)表于 07-25 18:06 ?1613次閱讀

    什么是I2C協(xié)議 I2C總線的控制邏輯

    在實際使用過程中,I2C比較容易出現(xiàn)的一個問題就是死鎖 ,死鎖在I2C中主要表現(xiàn)為:I2C死鎖時表現(xiàn)為SCL為高,SDA一直為低。
    發(fā)表于 03-12 09:17 ?1137次閱讀
    什么是<b class='flag-5'>I2C</b>協(xié)議 <b class='flag-5'>I2C</b>總線的控制邏輯

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發(fā)版的硬件I2C驅(qū)動如何做到穩(wěn)得一批

    在一個評論中,看到網(wǎng)友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2866次閱讀
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派<b class='flag-5'>開發(fā)</b>版的硬件<b class='flag-5'>I2C</b>驅(qū)動如何做到穩(wěn)得一批