2017年8月30日 星期三

Arduino 之間的 I2C 通訊 (9) 實例(一) 簡單傳感數據收集

完成以上 8 章之後, 要進行 arduino 之間的 i2c 通訊, 應該沒有難度吧.

但有個問題, 為什麼要以 i2c 通訊呢?

因為有很多原因, 單一片 arduino 不足以滿足要求, 比如 I/O 不足, 又或有些程式太煩覆, 希望可以拆開, 以多片 arduino 合成一個大的系統.

比如你想建立一個超多傳感的測量系統, arduino 的 I/O 絕對不能滿足.  而且, 要安裝不同的庫, arduino 的記憶體也是一個限制.

如果可以把工作分開, 由多個 arduino 板子組成一個更大的系統, 當中由一個 master 板子, 執行主程式, 其他 slave 去配合讀取不同的資料.

當然, 現在的 arduino, 一般只有一組 i2c, 所以整個系統就只可以有一組 i2c bus.
而在  i2c bus 上只可以有一個 master, 所以 i2c 有關的設備, 都只可以靠 master 去處理.
另外, 相同 i2c 地址的設備, 不會因為加入多塊 arduino 板子, 而可以同時使用.
這個缺憾, 需要有另一個系統去配合.
比如在  i2c 之外, 再加上SPI 的通訊, 就可以把 i2c 都分開了.
這個複雜的系統, 之後再去探討吧.  現在以一個 i2c bus 為基礎去開始.

首先, 嘗試做一個簡單系統.  假設你的板子 I/0 都用盡了, 你還想加入一個 DHT11 的溫濕度測量.  你可以簡單加入一片 mini 或 nano 的板子, 以 i2c  跟主板連上, 去擴充你的 I/O.

最簡單是修改 "由 master 向 slave 要求資料回傳" 的例子.
當 master 向 slave 發出請求時, 配合 "(8) 浮點的傳送" 的例子, 就可以把 溫濕度 數據以直接回傳.

由於某些 設備的庫, 不一定可以在 interrupt 內執行的, 可以嘗試在 slave 的 loop 內不斷更新, 當收到 master 的請求時, 就把最後的資料發過去.

詳情大家可以在相關程式中看到, 執行後, 在 master 隨意發送一些資料, slave 就會回傳.



而 slave 的 serial monitor 亦會同時顯示出已發送的資料供對比:



用類似的方法, 就可以把 非 i2c 的傳感, 放到另一片 arduino 中去讀取數據, 甚至先進行簡單分析.  例如 濾波.
一片 arduino slave 板子, 可以同時接上多個 非 i2c device 呢.  其主力工作, 就是為主程式準備所需的資料.

當 主程式需要時, 就可以向 slave 直接讀取了.  主程式亦不需要加入有關的庫, 會變得簡單一點.

當然, 這不是沒有付出的, 系統上, 就要增加了 arduion 板子.  是否值得, 還是看需要吧.


相關程式下載:




3 則留言:

  1. 您好,謝謝您的教學,很實用,
    想請問一下,以這篇教學內容,如果不想先手動在 master 隨意發送一些資料,slave 才回傳,
    而是變成slave自動回傳,然後直接在master的 serial monitor顯示的話,要如何修改?

    回覆刪除
    回覆
    1. i2c 的通訊,只可以由 master 作啟動,不可以由 slave 主動發送的。

      刪除
  2. 作者已經移除這則留言。

    回覆刪除