由于我的工作,我非常擅長維護我們的代碼庫,但對于我們的辦公設備,就不太在行了。所以衍生出了這個項目,使用 Arduino 讓我們的植物保持活力。
背景
最近,我們非常興奮于搬進了我們的新辦公空間。我們一直在用白板覆蓋的墻壁、閃亮的新技術和所有居家般的舒適設施來裝飾它。當我們在整個空間中放置一些這些綠葉朋友時,這個辦公室也開始有了家的感覺!
但當我們忘了給它們澆水,一周左右之后我們的綠葉朋友就會開始看起來像這樣:
鑒于我們是一家物聯網公司,在這個項目中還是比較有利的。所以我使用我們的 anduino WiFi shield 和IFTTT組合了一個解決方案。是時候認真對待我們的植物朋友了!
為了讓您的植物“發出聲音”,您需要一個 Arduino Due 或 Zero、一個anduinoWiFi shield(或任何其他可以與 Adafruit IO 對話的 WiFi 連接的 Arduino),最后是一個“電容式土壤濕度傳感器”。別忘記,還需要一杯水。
濕度傳感器
土壤濕度傳感器非常酷,實際上并沒有多少傳感器提倡把傳感器浸入潮濕的泥土中,但由于項目的需要:
不過雖然要接觸土壤,但還是需要注意不要將傳感器浸入該白線以下。上面沒有任何措施可以很好地承受水分暴露,所以在給含有這個傳感器的植物澆水時要小心。
如何校準“電容式土壤濕度傳感器”
我們的電容傳感器有三根線,我們將連接到 3.3v(紅色)、接地(黑色)和(藍色信號)模擬引腳 A1。當我們校準我們的傳感器時,我們將在傳感器完全干燥時記錄電容讀數,然后在傳感器浸入一杯水中(注意白線!)時再讀取一次讀數。這為我們提供了極端的 0-100% 相對濕度閾值。
連接你的傳感器,運行下方的概要,然后記下你的結果。作為參考,我的 dryVal 為 807,wetVal 為 415。
int inputPin = A1;?
void setup() {?
?Serial.begin(115200);?
?delay(3000);?
}?
void loop() {?
Serial.print("Raw val: ");?
Serial.println(readHumidity());?
delay(3000);?
}?
int readHumidity() {?
?int sensorVal = analogRead(inputPin);?
return sensorVal;?
}?
一旦你有了這兩個數字,你就可以配置相對濕度映射了。考慮自己校準!
#include
#include "Adafruit_MQTT.h"?
#include "Adafruit_MQTT_Client.h"?
#include "AnduinoLCD.h"?
// WiFi parameters?
#define WLAN_SSID ? ? ? "Andium"?
#define WLAN_PASS ? ? ? "maybeitsjustpassword"?
// Adafruit IO?
#define AIO_SERVER ? ? ?"io.adafruit.com"?
#define AIO_SERVERPORT ?1883?
#define AIO_USERNAME ? ?"yourusernname"?
#define AIO_KEY ? ? ? ? "dosifje0j230fj32lksdfj230ff23"?
WiFiClient client;?
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);?
/****************************** Feeds ***************************************/?
// Setup feed for temperature?
Adafruit_MQTT_Publish humidityVal = Adafruit_MQTT_Publish(&mqtt, ?AIO_USERNAME "/feeds/officePlants");?
/*Create an instance of the AnduinoLCD */?
AnduinoLCD LCD = AnduinoLCD(ST7735_CS_PIN, ST7735_DC_PIN, ST7735_RST_PIN);?
int inputPin = A1;?
const int dryVal = 807;?
const int wetVal = 415;?
int humidity = 0; ?
int humidityPrev = 0;?
int relHumidity = 0;?
void setup() ?
{ ??
?Serial.begin(115200);?
?delay(3000);?
?//Connect to WiFi & Adafruit.IO?
?connectToWiFi();?
?connectToAdafruit();?
?//Initialize LCD?
?LCD.begin();?
?LCDinit();?
}?
void loop() {?
? ?// ping adafruit io a few times to make sure we remain connected?
?if(! mqtt.ping(3)) {?
? ?// reconnect to adafruit io?
? ?if(! mqtt.connected())?
? ? ?connect();?
?}?
? ?humidity = readHumidity();?
? ?//convert int temp to char array?
? ?char b[4];?
? ?String str;?
? ?str=String(humidity);?
? ?for(int i=0; i
? ? ?b[i]=str.charAt(i);?
? ?}?
? ?b[(str.length())+1]=0;?
?// Publish data?
?if (!humidityVal.publish((char*)b)) {?
? ?Serial.println(F("Failed to publish temp"));?
?} else {?
? ?Serial.print(F("Humidity published: "));?
? ?Serial.println(humidity);?
? ?displayHumidity(humidity, humidityPrev);?
?}?
?Serial.print("Humidity: ");?
?Serial.print(humidity);?
?//Serial.print(" *F\t");?
?//prev temp stored for LCD?
?humidityPrev = humidity;?
?//repeat every 10min?
?delay(600000);?
}?
// connect to adafruit io via MQTT?
void connect() {?
?Serial.print(F("Connecting to Adafruit IO... "));?
?int8_t ret;?
?while ((ret = mqtt.connect()) != 0) {?
? ?switch (ret) {?
? ? ?case 1: Serial.println(F("Wrong protocol")); break;?
? ? ?case 2: Serial.println(F("ID rejected")); break;?
? ? ?case 3: Serial.println(F("Server unavail")); break;?
? ? ?case 4: Serial.println(F("Bad user/pass")); break;?
? ? ?case 5: Serial.println(F("Not authed")); break;?
? ? ?case 6: Serial.println(F("Failed to subscribe")); break;?
? ? ?default: Serial.println(F("Connection failed")); break;?
? ?}?
? ?if(ret >= 0)?
? ? ?mqtt.disconnect();?
? ?Serial.println(F("Retrying connection..."));?
? ?delay(1000);?
?}?
?Serial.println(F("Adafruit IO Connected!"));?
}?
void displayHumidity(int humidity, int humidtyPrev)?
{?
? ?//clear the stale value?
? ?LCD.setTextColor(ST7735_BLACK); ?
? ?LCD.setTextSize(2);?
? ?LCD.setTextWrap(true);?
? ?LCD.setCursor(40,60);?
? ?LCD.setTextSize(5);?
? ?LCD.print(humidityPrev);?
? ?LCD.setTextSize(2);?
? ?LCD.print("%"); ?
? ?//Print new value?
? ?LCD.setTextColor(ST7735_WHITE); ?
? ?LCD.setTextSize(2);?
? ?LCD.setTextWrap(true);?
? ?LCD.setCursor(40,60);?
? ?LCD.setTextSize(5);?
? ?LCD.print(humidity);?
? ?LCD.setTextSize(2);?
? ? LCD.print("%"); ?
?}?
void connectToWiFi()?
{?
?// Connect to WiFi access point.?
?delay(10);?
?Serial.print(F("Connecting to "));?
?Serial.println(WLAN_SSID);?
?WiFi.begin(WLAN_SSID, WLAN_PASS);?
?while (WiFi.status() != WL_CONNECTED) {?
? ?delay(500);?
? ?Serial.print(F("."));?
?}?
?Serial.println(F("WiFi connected!"));?
}?
void connectToAdafruit()?
{?
? ?// connect to adafruit io?
?connect();?
}?
void LCDinit()?
{?
?LCD.setBacklight(ON);?
?LCD.fillScreen(ST7735_BLACK); ?//clear the screen ? ?
?LCD.showBanner(); ? ? ? ? ? ? ?//load Andium Banner?
?LCD.setTextColor(ST7735_WHITE); ?
?LCD.setTextSize(2);?
?LCD.setTextWrap(true);?
?LCD.setCursor(0,40);?
?LCD.print("Humidity: ");?
}?
int readHumidity() {?
?int sensorVal = analogRead(inputPin);?
? ? ? relHumidity = map(sensorVal, dryVal, wetVal, 0, 100);?
? ? ? Serial.println("relHumidity");?
? ? ? Serial.print(relHumidity);?
return relHumidity;?
}?
將此概要復制并粘貼到您的 IDE 中,并確保已安裝這些庫。
WiFi101
Adafruit_MQTT
Arduino LCD
以及您的個人校準:
const int dryVal = 807;
const int wetVal = 415;
濕值和干值。當我們讀取Humidity()時,在草圖的底部,我們使用這些值來映射0-100%的相對濕度。所以現在我們的值在干燥時為 0%,在完全飽和時為 100%。
relHumidity = map(sensorVal, dryVal, wetVal, 0, 100);
如果一切順利,并且您的 arduino 連接到 WiFi 和 Adafruit IO,您應該開始看到每 10 分鐘出現一次讀數。
不要介意今天早些時候的那些異常值,當我閱讀我的原始未映射電容以確定我的干濕值時,我也在調整。
到此,現在我們每 10 分鐘發布一次土壤濕度讀數。不必過于在乎讀數是多少,設定一個值到我們的植物需要澆水時給它們澆水。讓我們使用 IFTTT 設置閾值濕度水平并配置要發送的通知,以便提醒我們給植物澆水!
IFTTT 閾值
使用 IFTTT,我設置了一個閾值,當土壤的相對濕度降至 20% 以下時,我們口渴的植物將通過設定好的聯系方式聯系我們,請求澆水!這是設置的一瞥。
評論
查看更多