2015.10.13
註: 點選即前往該專題介紹文章
本篇介紹的是 土壤溼度計 YL-69,先說明一下這個溼度計所測到的數據,只是經過換算的到大概的數值而已,真正需要有工業用的土壤濕度計校正才算真正的準,但只是測量乾土與濕土的差別,還是很明顯的。
感測器就是如下圖中,那兩隻尖尖的是插進土壤的部分
轉換成數位資訊是連接感測器的那一個模組。
腳位 | 說明 | 接法 |
VCC | Voltage | +5V |
GND | Ground | GND |
D0 | 讀取數位訊號,範圍0-1; 此腳是利用在沒有控制器的電路上面,中間的可變電阻是在控制邊界值(可不接) |
任digital pin |
A0 | 讀取類比訊號,範圍0-1023(感測器不同,會影響區間); 可在程式中使用 |
任Analog pin |
我的作法是,先讀取感測器所讀到的數值,讀到數值區間為 400 至 800,400是直接插入水中的情況,800是在乾燥的數值,那在空氣中的數值介於900-1000。
得到數值後,再來就是縮小到0 - 100的數值之內,利用map的指令:
map(var,minimun,maximun,transform minimun,transform maximun) | ||
變數 | 中文 | 說明 |
var | 變數 | 想要被轉換的data |
minimun | 最小值 | 被轉換的最小值 |
maximun | 最大值 | 被轉換的最大值 |
transform minimun | 轉換後的最小值 | 經過轉換後的最小值 |
transform maximun | 轉換後的最大值 | 經過轉換後的最大值 |
程式部分就用一個副程式將其包起來,方便使用:
--------------------------------------------------------------------
/* 2015.10.13 Li-Han Chang */ int soil = 0; int map_soil; int YL69_pin = A3; void setup(){ Serial.begin(9600); } void loop(){ soil_loop(); //YL69 Serial.println(map_soil); } /*****副程式*****/ void soil_loop(){ hum = analogRead(0); if(soil > 800){ soil=800; } else if (soil<250){ soil=250; } map_soil = map(soil,250,800,100,0); }
--------------------------------------------------------------------
上面程式碼,我把max與min打相反是因為,我們測量的數值是由大到小變化,但是我們要的結果是當沒有濕度時顯示 0,所以反過來計算
剛才有提到當在空氣時900-1000,所以判斷式忽略800以上數值,令恆等於800;同理,當低於250,令恆等於250。
朋友在使用上,反映原本感測器的感測桿,那一片是塑膠製的,插在太硬的土上面感覺快斷掉了,所以就想辦法改造一下,其實不難,因為原本的感測桿,就是讀取兩端的訊號再經轉換得到訊號,所以只要找到適合的鐵棒,修改讀取到的數值區間即可,不過.....感測棒不同,當然區間就會有所不同,很有可能誤差會變得很大
上面也有提到,這真的要準,需要使用工業用的感測器來校正,所以這樣修改,一樣是量到「大概」。
我修改的感測棒是壞掉飲水機拆下的熱水感測棒,如圖:
然後接轉換器上面,只要將原本的拆掉,裝上新的即可,如照片中,兩隻那一端,
重新測試區間,新的區間為「380-900」,程式方面就直接修改掉,重新燒入就可以使用了。
----------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------