今天,我們將利用ROHM感測器評估套件打造一套智慧花園系統。在此項目中,我們整合接近/環境光感測器(ALS)和其他感測器,實現植物培育裝置的自動化操作!
有關ROHM感測器的更多資訊,請參閱我們的文章ROHM感測器評估套件概覽!
此外,我們將使用Arduino Create對系統進行程式設計。
Arduino Create是一個多合一的線上平台,可以編寫代碼、配置電路板、共用專案。該平台於2016年8月18日正式發佈。
Arduino Create提供以下服務:
Arduino Web Editor是一款線上編輯器,用戶可以編寫代碼並將程式從網頁瀏覽器上傳至任何Arduino研發板上。
Arduino Project Hub是一個hackstar.io提供的課程平台。該Hub擁有大量不同難度和人氣的專案。
憑藉Arduino Cloud,用戶可以透過互聯網在雲中管理專案。Arduino Cloud執行亞馬遜的雲計算服務,能夠為使用者提供安全的研發環境。
預計完成時間:120分鐘
所需零件:
※ 您可以從以下網站購買羅姆感測器評估套件!
打造智慧花園系統的第一步就是要確定需要積體的內容。我們如何使用這些感測器打造一套有利於植物培育的裝置呢?首先,我們看一下各種感測器的功能和用法以及它們在該項目中的潛在用途。
感測器評估套件提供8種不同的感測器。我們應將哪些感測器積體到植物培育系統中呢?我們來複習一下每個感測器的功能,看看系統可以採用哪些感測器。
根據各個感測器的功能簡述,為了完成此專案,我們可能需要在系統中整合多個感測器。那麼我們應該積體哪些感測器呢?
如圖2所示,種植健康的植物必須滿足一定條件。一般來講,植物在通風良好、陽光充足和溫度適中的地方生長最好。當然,它們需要水。
根據這些資訊,我們可以縮小感測器的選擇範圍:
現在,我們開始構造這個系統吧!
類似的裝置……
說到植物培育裝置……已經有人製作過大型植物培育系統。比如FarmBot。從外觀上看,FarmBot就像是一台巨大的雷射切割機或3D印表機。正如下面的視訊所示,該機器還可以幫忙播種,似乎我們透過電腦或行動應用程式就能控制播種過程。長時間在室外管理和控制這些裝置會比較困難,尤其是在天氣比較惡劣的情況下。不管怎樣,這些非常酷的裝置在改善可持續發展農業領域具有巨大的潛力。
FARMBOT GENESIS – https://farmbot.io/
接下來我們看一下如何用Arduino Create編寫程式。
我們循序漸進地看一下Arduino Create如何使用。Arduino Create的迷人之處就在於您可以直接在瀏覽器中線上編寫代碼並進行共用(比如在社交媒體上)。通常,如果您要使用Arduino,您得在電腦上下載並安裝Arduino IDE,但是Arduino Create無需這個步驟。
PC版和網路版之間的主要區別是什麼呢?
Arduino Create非常有用。唯一的缺點是:要使用Web Editor,您必須連接互聯網,否則是無法使用的。我覺得介紹的差不多了。此時,您可以簡單地在電腦上使用現有的Arduino軟體。
首先打開Arduino Web Editor。
您會看到編輯器在瀏覽器中打開。值得一提的是,與Arduino Software IDE相比,這些菜單更易於查看和定位。有時,在電腦上使用IDE並打開太多帶有很多程式的視窗時,它們會變得雜亂無章;但是這個編輯器的視窗整潔有序,您可以輕鬆地找到所需檔。
功能表列位於編輯器的左側。
我們來查看一些常用功能。我們從“Blink.ino”開始(路徑:Examples →BUILT IN→01.BASICS→Blink)。使用螢幕上方中央的下拉式功能表,選擇要連接的Arduino研發板和埠。然後,點擊“Verify”→“Upload”(通常在Arduino軟體中執行此操作)。
接下來,我們將添加感測器評估套件程式館。要添加程式館,您可以點擊左側功能表的“Libraries”,並按一下“ADD ZIP LIBRARY”。然後,選擇要添加的程式館的zip檔完成添加。您可以從此處為每個感測器下載感測器評估套件程式館(zip文件)。
感測器評估套件已成功連接。現在,我們進行連線和程式設計!
整個系統的設計理念如下:
→ 用伺服馬達遮陽!
→ 使用土壤感測器和噴壺!
→ 用LED觸發警報!(也許將來我們可以透過網路通知程式來實現這個功能!)
→ 用伺服馬達操作扇子扇風。
至於程式,在迴圈的前半部分獲取每個感測器的值後,我們將根據每個感測器的值啟動伺服馬達和LED燈。由於每個感測器的啟動閾值因裝置大小而異,因此您可以自己的喜好調整具體數值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
#include <Wire.h> #include <Servo.h> #include <RPR-0521RS.h> #include <BD1020.h> #include <ML8511A.h> #include <BM1383GLV.h> //*********************************************** //Set threshold //*********************************************** int moi_threshold = 500; //set the moisture threshold (moist←0~1023→dry) int upper_temp_threshold = 30; //high temperature-red LED int under_temp_threshold = 10; //low temperature-blue LED int uv_threshold = 4; //set the intensity of ultraviolet light, shade if exceeded int send_wind_sec = 30; //wind blowing interval (in seconds) //*********************************************** Servo uvServo; Servo windServo; Servo waterServo; int redLedPin = 13; int blueLedPin = 12; int moisture_pin = A0; int tempout_pin = A2; int uvout_pin = A0; int counter = 0; bool uvFlg = false; BD1020 bd1020; RPR0521RS rpr0521rs; ML8511A ml8511a; BM1383GLV bm1383; //*********************************************************** void setup() { Serial.begin(9600); while (!Serial); Wire.begin(); byte rc; rc = rpr0521rs.init(); rc = bm1383.init(); pinMode(redLedPin,OUTPUT); pinMode(blueLedPin,OUTPUT); uvServo.attach(9); windServo.attach(10); waterServo.attach(11); bd1020.init(tempout_pin); ml8511a.init(uvout_pin); } //*********************************************************** void loop() { //********************************* //Soil Sensor int moi = analogRead(moisture_pin); Serial.write("MOISTURE = "); Serial.println(moi); Serial.println(); //********************************* //Temperature sensor float temp; bd1020.get_val(&temp); Serial.print("BD1020HFV Temp="); Serial.print(temp); Serial.print(" [degrees Celsius], ADC="); Serial.println(bd1020.temp_adc); //********************************* //UV sensor float uv; ml8511a.get_val(&uv); Serial.write("ML8511A UV = "); Serial.print(uv); Serial.println(" [mW/cm2]"); Serial.println(); //********************************* //Barometric pressure sensor byte cp; float press; cp = bm1383.get_val(&press); if (cp == 0) { Serial.write("BM1383GLV (PRESS) = "); Serial.print(press); Serial.println(" [hPa]"); Serial.println(); } //********************************* //ALS/proximity sensor byte rc; unsigned short ps_val; float als_val; byte near_far; rc = rpr0521rs.get_psalsval(&ps_val, &als_val); if (rc == 0) { Serial.print(F("RPR-0521RS (Proximity) = ")); Serial.print(ps_val); Serial.print(F(" [count]")); near_far = rpr0521rs.check_near_far(ps_val); if (near_far == RPR0521RS_NEAR_VAL) { Serial.println(F(" Near")); } else { Serial.println(F(" Far")); } if (als_val != RPR0521RS_ERROR) { Serial.print(F("RPR-0521RS (Ambient Light) = ")); Serial.print(als_val); Serial.println(F(" [lx]")); Serial.println(); } } //*********************************** //depending on the sensor value each time //the water level will rise when the soil dries if(moi > moi_threshold){ Serial.println("Water Servo start."); for(int m=0;m < 10;m++){ waterServo.write(0); //move servomotor to 0 degree delay(1500); //wait 1.5 seconds waterServo.write(90); //move the servomotor to 90 degrees } } //Temperature activate if(upper_temp_threshold > temp){ digitalWrite(redLedPin, HIGH); //turn on LED delay(moi); //set the moisture to LED flashing time digitalWrite(redLedPin, LOW); //turn off LED } if(under_temp_threshold < temp){ digitalWrite(blueLedPin, HIGH); //turn on LED delay(moi); //set the moisture to LED flashing time digitalWrite(blueLedPin, LOW); //turn off LED } //shades when the sunlight is too strong if(uv < uv_threshold && !uvFlg){ waterServo.write(90); uvFlg = true; } else if(uv >= uv_threshold && uvFlg){ waterServo.write(0); uvFlg = false; } //create wind at a specific time if(counter > send_wind_sec){ Serial.println("Wind Servo start."); for(int n=0;n < 10;n++){ waterServo.write(0); delay(1000); waterServo.write(90); } counter = 0; } counter++; delay(1000); } |
現在,接線和程式設計已經完成,我們來把系統組合在一起。
首先,您需要一棵植物(當然)!
當紫外線太強時,安裝在伺服馬達上的遮光板將旋轉90度,從而擋住窗戶上的陽光。
我們可以根據濕度水平利用伺服馬達拉動噴壺進行噴水。
我們的吹風裝置是一把東方摺扇!
整個系統仍有很大的改進空間。如果您想要科技感更高一些,您可以使用小型水泵、PC風扇等裝置。此外,如果房間中沒有窗戶,那麼可以同時利用LED與照度感測器,在房間變暗時斷路植物的LED。
在本專案中,我們組合使用感測器評估套件中的多個感測器來打造智慧花園系統。市面上已經出現了一些很酷的植物培育裝置(課程中做了簡要介紹),我相信本課程能夠為研發更先進的植物培育裝置奠定堅實的基礎。
在下一個課程中,我們將更詳細地介紹Arduino Create,並嘗試使用感測器評估套件中的加速度計。