【.NET 與樹莓派】溫度/溼度感測器——SHT30

東邪獨孤發表於2021-06-09

SHT3XX 系列的感測,常見的有三種:SHT 30、SHT 31、SHT 35。其中,比較便宜價效比較愉快的是 SHT 30。

DHT 11 模組也是檢測溫度、溼度的,但SHT 11 使用的不是我們常見的 i2c 等協議,而是用它自己特有的單資料線協議。因此使用 DHT11 你需要自己寫通訊協議或使用現有的庫;另外,DHT 11 模組似乎反應不太靈敏,上電後還得等幾秒鐘才能讀到穩定資料。最重要的一點,不知道是不是老周運氣不好,買了三個 DHT 11,壞了兩個。而 SHT 30,一直用著——老周把它弄成家用溫度計,掛在家裡長期運作。當然,不是用樹莓派去控制。畢竟,你想想,刻意用樹莓派去讀個溫度,這也太浪費資源了,最開始是和客廳的監控連在一起的。老周買了個攝像頭,用一塊2G記憶體的樹莓派刷了 Motion ,做成了監控,供家裡客廳使用。

為了完美的偽裝,找了箇舊手機的盒子,自己打幾個孔,然後把樹莓派放進盒子裡,攝像頭用雙面膠貼在盒子上。偽裝效果還行,外人進來了一般不會發現。裝中盒子裡就造成一個問題:SHT30 檢測溫度溼度就不準了。於是,老周就拿掉了SHT,買了一塊山寨的 ESP-8266,體積也很小,功耗低,也便宜,搞幾個乾電池就能供電了,然後就用 ESP 8266 來控制 SHT 30,還能通過 Wi-fi 來傳資料(就讀個溫度/溼度,安全性不重要,隨便透傳)。用了三天,ESP 8266 上的板載LED燈壞了,但開發板還能正常用。

如果你特別喜歡大草莓(樹莓派),也可以買樹莓派家族的微控制器開發板—— 樹莓派 Pico,也可以叫它小草莓。小草莓和 Arduino 系列的板子有點像(和 Nano 體積差不多),有 Micro-USB 口,用一根安卓手機資料線就可以和電腦連線了,非常地友好。Pico 不帶作業系統,就是一塊微控制器,所以功耗低,特省電,供電電壓在 1.8V 到 5.5V 之間,可以用手機充電器供電,省事。

【.NET 與樹莓派】溫度/溼度感測器——SHT30

 

 

好了,扯遠了,因為本文的內容比較 easy,所以老周就先扯些沒用的,接下來我們們扯些有用的。

SHT30 很小巧,標準的 i2C 引腳——vcc、gnd、sda、scl。買的時候最好買已經焊接好引腳的,不然,自己焊的話真的需要經驗,畢竟模組很小,技術不好容易弄壞,動作不夠快也容易焊成連錫——各個引腳導通了。老周的焊功比較爛,不敢自己動手。

既然是標準的 I2C 引腳,這模組當然是用 I2C 來通訊了。如果你沒作更改,預設的從機地址是 0x44。

這一次,老周向各位介紹微軟封裝的另一個庫——iot bindings。這個庫是微軟提供的,裡面封裝了很多常用模組的操作,我們不用每次都自己手動寫硬體通訊,直接引用,開箱即用,無需調校,免打孔,免安裝。

在建立.NET 專案後,執行以下命令引用(也可以用VS的Nuget管理工具)。

dotnet add package System.Device.Gpio
dotnet add package iot.device.bindings

封裝的模組類位於名稱空間 Iot.Device.XXX 中,其中XXX是各類模組的大類名。比如,我們這次用的 SHT 30, 它屬於 SHT 30、31、35 系列,故名稱空間為 Iot.Device.Sht3x。

在程式碼檔案中,using 一下。

using System;
using System.Device.I2c;
using Iot.Device.Sht3x;

然後,很簡單的幾行程式碼呼叫。

     I2cConnectionSettings set=new(4, (byte)I2cAddress.AddrLow);
     I2cDevice dev= I2cDevice.Create(set);
            using Sht3x sht= new Sht3x(dev);
            bool running = true;
            Console.CancelKeyPress += (_,_) => running=false;

            while(running)
            {
                // 溫度
                double temp = sht.Temperature.DegreesCelsius;
                // 溼度
                double hui = sht.Humidity.Percent;
                Console.WriteLine("溫度:{0:N1} ℃\n溼度:{1:N1} %RH", temp, hui);
                System.Threading.Thread.Sleep(2000);
            }

注意看 I2cAddress 列舉,它已經為我們定義好了 SHT 3x 感測器(模組)的地址:

    public enum I2cAddress : byte
    {
        AddrLow = 0x44,
        AddrHigh = 0x45
    }

我們在用時選預設地址 0x44 即可。

Sht3x 類已封裝好,訪問 Temperature 獲取溫度值,DegreesCelsius 是攝氏度,其他的不知道什麼單位,老周見識淺,沒研究過。Humidity 屬性是相對溼度,一般用百分比。

寫完程式碼後,釋出。

dotnet publish -c Release -r linux-arm --no-self-contained

如果你的大草莓上沒有配置 dotnet 框架,那就把 --no-self-contained 去掉,讓它生成全部類庫,然後全部複製到大草莓上執行。

scp -r bin\Release\net5.0\linux-arm\publish\* pi@192.168.0.xxx:/home/pi/<你要放置的目錄>

執行結果如下圖所示。

【.NET 與樹莓派】溫度/溼度感測器——SHT30

 

 

是不是很簡單呢?前面在寫這系列文章時,老周沒有提到這個 Iot.Device.Bindings 庫,是因為想讓大夥伴們對 GPIO 一些基本通訊有所瞭解。我們們在學習的時候,不要急著拿現成的庫來用,先自己試著寫些簡單的東東玩玩,對相關知識有一定了解後,再去尋找現成的庫。這樣既能學到原理性的東西,也能提高開發效率。

目前這個 bindings 庫微軟在不斷地更新,支援的模組越來越多。儘管如此,有些模組還是沒有收錄進去。比如,上次老周介紹過的 MPU 6050 ,bindings 庫裡面就沒有,庫裡面只有 MPU 6500 和 MPU 9250。

 

相關文章