由于我的工作,我非常擅長(zhǎng)維護(hù)我們的代碼庫(kù),但對(duì)于我們的辦公設(shè)備,就不太在行了。所以衍生出了這個(gè)項(xiàng)目,使用 Arduino 讓我們的植物保持活力。
背景
最近,我們非常興奮于搬進(jìn)了我們的新辦公空間。我們一直在用白板覆蓋的墻壁、閃亮的新技術(shù)和所有居家般的舒適設(shè)施來(lái)裝飾它。當(dāng)我們?cè)谡麄€(gè)空間中放置一些這些綠葉朋友時(shí),這個(gè)辦公室也開(kāi)始有了家的感覺(jué)!
但當(dāng)我們忘了給它們澆水,一周左右之后我們的綠葉朋友就會(huì)開(kāi)始看起來(lái)像這樣:

鑒于我們是一家物聯(lián)網(wǎng)公司,在這個(gè)項(xiàng)目中還是比較有利的。所以我使用我們的 anduino WiFi shield 和IFTTT組合了一個(gè)解決方案。是時(shí)候認(rèn)真對(duì)待我們的植物朋友了!
為了讓您的植物“發(fā)出聲音”,您需要一個(gè) Arduino Due 或 Zero、一個(gè)anduinoWiFi shield(或任何其他可以與 Adafruit IO 對(duì)話的 WiFi 連接的 Arduino),最后是一個(gè)“電容式土壤濕度傳感器”。別忘記,還需要一杯水。

濕度傳感器
土壤濕度傳感器非常酷,實(shí)際上并沒(méi)有多少傳感器提倡把傳感器浸入潮濕的泥土中,但由于項(xiàng)目的需要:

不過(guò)雖然要接觸土壤,但還是需要注意不要將傳感器浸入該白線以下。上面沒(méi)有任何措施可以很好地承受水分暴露,所以在給含有這個(gè)傳感器的植物澆水時(shí)要小心。
如何校準(zhǔn)“電容式土壤濕度傳感器”
我們的電容傳感器有三根線,我們將連接到 3.3v(紅色)、接地(黑色)和(藍(lán)色信號(hào))模擬引腳 A1。當(dāng)我們校準(zhǔn)我們的傳感器時(shí),我們將在傳感器完全干燥時(shí)記錄電容讀數(shù),然后在傳感器浸入一杯水中(注意白線?。r(shí)再讀取一次讀數(shù)。這為我們提供了極端的 0-100% 相對(duì)濕度閾值。
連接你的傳感器,運(yùn)行下方的概要,然后記下你的結(jié)果。作為參考,我的 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;?
}?
一旦你有了這兩個(gè)數(shù)字,你就可以配置相對(duì)濕度映射了。考慮自己校準(zhǔn)!
#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;?
}?
將此概要復(fù)制并粘貼到您的 IDE 中,并確保已安裝這些庫(kù)。
WiFi101
Adafruit_MQTT
Arduino LCD
以及您的個(gè)人校準(zhǔn):
const int dryVal = 807;
const int wetVal = 415;
濕值和干值。當(dāng)我們讀取Humidity()時(shí),在草圖的底部,我們使用這些值來(lái)映射0-100%的相對(duì)濕度。所以現(xiàn)在我們的值在干燥時(shí)為 0%,在完全飽和時(shí)為 100%。
relHumidity = map(sensorVal, dryVal, wetVal, 0, 100);
如果一切順利,并且您的 arduino 連接到 WiFi 和 Adafruit IO,您應(yīng)該開(kāi)始看到每 10 分鐘出現(xiàn)一次讀數(shù)。

不要介意今天早些時(shí)候的那些異常值,當(dāng)我閱讀我的原始未映射電容以確定我的干濕值時(shí),我也在調(diào)整。
到此,現(xiàn)在我們每 10 分鐘發(fā)布一次土壤濕度讀數(shù)。不必過(guò)于在乎讀數(shù)是多少,設(shè)定一個(gè)值到我們的植物需要澆水時(shí)給它們澆水。讓我們使用 IFTTT 設(shè)置閾值濕度水平并配置要發(fā)送的通知,以便提醒我們給植物澆水!
IFTTT 閾值
使用 IFTTT,我設(shè)置了一個(gè)閾值,當(dāng)土壤的相對(duì)濕度降至 20% 以下時(shí),我們口渴的植物將通過(guò)設(shè)定好的聯(lián)系方式聯(lián)系我們,請(qǐng)求澆水!這是設(shè)置的一瞥。

電子發(fā)燒友App






















評(píng)論