1. 程式人生 > >在樹莓派上讀取土壤溼度感測器讀數-python程式碼實現及常見問題(全面簡單易懂)

在樹莓派上讀取土壤溼度感測器讀數-python程式碼實現及常見問題(全面簡單易懂)

本篇文章簡單介紹瞭如何在樹莓派上配置土壤溼度感測器以讀取土壤溼度及程式碼實現。

主要包含有以下4個模組:

一、土壤溼度感測器常見型別及介紹

二、實驗所需裝置

三、裝置連線方式與程式碼實現

四、常見問題及注意事項

需要哪個模組的內容直接跳轉去看即可~

 

一、土壤溼度感測器常見型別及介紹

 土壤溼度感測器,又名土壤水分感測器、土壤墒情感測器、土壤含水量感測器等。顧名思義,主要用來測量土壤相對含水量,做土壤墒情監測。在智慧農業,農業灌溉和林業防護等領域極廣。該感測器價格低廉,如果想在家制作一個簡易的智慧自動化作物灌溉系統,有了它,再加上溫溼度感測器、樹莓派/Arduino就可以輕鬆完成。

常見的土壤感測器分為兩類,電阻型和電容型土壤溼度感測器。但原理大同小異,都是測量土壤中水分的體積含量,並以電壓表示水分值。

(一)電阻型土壤溼度感測器

常見的有感測器型號有YL-69(下圖左)和FC-28(下圖右)。這是一種低技術含量的感測器這類感測器由兩部分組成,帶探針的感測器,A to D(模擬訊號轉數字訊號)電子板(校準靈敏度主機板),兩者用母對母杜邦線連線。                

            它根據土壤的介電常數(土壤的導電能力)來估計土壤體積水含量,工作時,使用兩個探針讓電流通過土壤,然後讀取電阻來獲得溼度水平。水分越多,土壤導電越容易(電阻越小),而土壤乾燥,導電越差(電阻越大)。土壤中的溼度是一個連續變化的一系列值,為模擬訊號,使用A to D接線板之後可以將從環境中得來的模擬訊號轉成數字訊號,在該板上有兩個指示燈,PWR-LED和DO-LED,前者檢測是否插好電源,如果電源的正負極連線正確,則會亮起,如下圖(左)所示。在這裡我使用的是YL-69型號,燈為綠色,也有一些廠商生產的感測器指示燈為紅色。該感測器在輸出數字訊號時,可以使用改錐調節板上的電位計(藍色中間有十字架的部位)來提前設定閾值大小,一旦土壤溼度達到或大於閾值,則DO-LED亮起,如下圖(右)所示。

 電子板從左到右的標記為AO、DO、GND、VCC,如下圖所示。AO和DO為訊號引腳,如果需要模擬訊號,則連線AO,輸出的模擬值是介於所提供的電壓值到0V間的變化的電壓值,如果輸出0V,則代表土壤導電性不好,即水分含量低,可以用這個電壓值來估計土壤溼度。如果需要數字訊號輸出則連線DO,簡單的輸出0和1,可直接通過訊號燈判斷土壤中水分是否低於閾值,高於則“開”,低則“關”。GND表示接地,VCC連線電源,但在這個專案中,我們將單獨利用模擬輸出。

               

 該感測器的優點是價格低廉,且有指示燈,觀察方便,但由於土壤環境是酸性的(acidic),隨著時間的推移,土壤裡的化學物質會使得探針氧化(oxidize)導致測量不準確,所以需要時不時的進行更換以保證測量的準確性。

(二)電容型感測器

相比較前一型別的感測器,這類感測器就顯得“光禿禿”了,只有一個元件,沒有指示燈,且只能輸出模擬訊號。它區別於電阻感測器,利用電容感應原理來檢測土壤溼度,避免了電阻式感測器極易被腐蝕的問題,生命週期較長,缺點是不能用指示燈判斷感測器是否正常工作,它同時只提供模擬訊號。如圖設計DF Robot的一款感測器,內建穩壓晶片,支援3.3V-5.5V寬電壓工作。DFRobot-Gravity介面具有相容性,可直接和Gravity IO擴充套件板相連線。輸出電壓為0-3VDC。

在自動化澆灌系統中,溼度感測器用於測量土壤中水分,可以提前預設一個閾值,一旦土壤中的水分低於此閾值,則啟動連線著蓄水池(家用拿礦泉水瓶裝滿水替代即可)的水泵噴水,等到水分值超過預設值,則水泵暫停工作。

 

二、實驗所需裝置

樹莓派 3 b+/樹莓 4 b/樹莓派Zero W

MCP3008

麵包板

跳線(公對母,母對母,最好多準備一些)

土壤感測器(電容式、電阻式均可)

一杯水(可以將感測器放入水中來觀察溼度讀數的變化,若沒有條件也可直接用手握住感測器的探針)

MCP3008

由於樹莓派沒有模擬訊號引腳,所以沒有辦法直接輸出模擬訊號數值,此時我們需要使用MCP3008積體電路。

MCP3008 IC(Integrated Circuit)是一個8通道,10位的具有SPI序列介面的A / D轉換器(模擬-數字轉換器),共有16個引腳,可以用來解決模擬引腳問題(MCP3004也是ADC,不過為4路,體型更小)。MCP3008使用SPI匯流排協議從樹莓派接收模擬輸入值。它有8個模擬輸入(ch0-ch7),另外一列的8個引腳中有4個電源和地引腳和4個連線樹莓派的引腳,它產生範圍為0-1023的輸出值(注意:0表示0V, 1023表示3.3V)。

三、裝置連線方式與程式碼實現

在此實驗中,主要介紹和使用的FC-28型號土壤溼度感測器,但其它型號的感測器使用,連線均與此相同。

(一)裝置連線方式

1.電路圖及說明

MCP3008共有16個引腳,其中8個用於記錄模擬輸入值,位於CH0-CH7(引腳1-8),4個通訊引腳通過SPI協議方法與樹莓派通訊,還有2個電源引腳,2個接地引腳。

(二)程式碼實現

1. 啟用樹莓派的SPI介面

樹莓派的SPI介面與SSH、VNC服務相同,是預設關閉的,需要我們在配置中開啟此服務才可以使用。

按照以下步驟啟動終端並輸入以下命令:

(1)開啟樹莓派配置選項

sudo raspi-config

(2)導航到Interface選項,啟用SPI介面。

(3)重啟樹莓派

reboot

2. 安裝spidev庫

光啟用SPI介面,但是樹莓派還是無法讀取感測器傳過來的值,spidev庫將幫助通過SPI介面讀取感測器值。

 使用以下命令安裝spidev庫:

sudo apt-get install git python-dev
git clone git://github.com/doceme/py-spidev
cd py-spidev/
sudo python setup.py install

3. 安裝numpy庫

我們從感測器獲得的值還是電壓值而非土壤溼度值,土壤溼度需要使用百分比的形式體現,為了將輸出值轉換為百分比,還需要使用numpy庫。我們從MCP3008 IC接收到的輸出值是在前面提到的0-0123範圍內的數值,仍需要將把這些值對映到0-100,以得到一個百分比。

使用以下命令安裝numpy模組:

sudo apt-get install python-numpy

4. Python程式碼

# Importing modules
import spidev # To communicate with SPI devices
from numpy import interp  # To scale values
from time import sleep  # To add delay


# Start SPI connection
spi = spidev.SpiDev() # Created an object
spi.open(0,0) 


# Read MCP3008 data
def analogInput(channel):
  spi.max_speed_hz = 1350000
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data


while True:
  output = analogInput(0) # Reading from CH0
  output = interp(output, [0, 1023], [100, 0])
  output = int(output)
  print("Moisture:", output)
  sleep(0.1)

當從土壤溼度感測器讀取模擬輸出值時,它以百分比測量溼度,使用來自numpy庫的特定interp模組進行對映得到從0-100的值。

四、常見問題及注意事項

(一)常見問題

1. 持續輸出0或100,無論探針是否放入水中均沒有變化

2. 沒有操作探針,但讀數呈有規律地變化

針對以上出現有以下幾種解決方案

1.檢查樹莓派的SPI服務有無正確開啟

2.先檢查線有沒有接穩,檢視是不是線的連線順序(感測器的正負極有沒有接反,與樹莓派的連線有沒有序列)有誤

3. 線是否有生鏽或損壞(之前第一次做實驗時,各種除錯都出現不了正確結果,後來才發現是有幾根線生鏽了所以不通)

(二)注意事項 

1. 儘量使用長線,便於看清連線位置

2. 儘量不要使用拼接線(一根公對公,一根母對母拼接成公對母的),這樣需要照顧的線更多,也更容易出紕漏

3. 一定一定要有耐心,出現問題後按照順序逐一排查。因為涉及到的連線較多,對硬體小白來說,很容易眼花繚亂想放棄,但是太簡單的東西誰都能做,能攻破學習或者生活中一個個難關的人才能有所成長啊~

如果你在配置土壤溼度感測器時或使用樹莓派時遇見了什麼問題,歡迎在評論區寫下,看到了會及時答覆。期待與大家一起學習。

文字及圖片部分來源:https://maker.pro/raspberry-pi/tutorial/interfacing-soil-moisture-sensor-with-raspberry-pi

轉發請標明來源。祝大家學派happ