由于我的工作,我非常擅长维护我们的代码库,但对于我们的办公设备,就不太在行了。所以衍生出了这个项目,使用 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% 以下时,我们口渴的植物将通过设定好的联系方式联系我们,请求浇水!这是设置的一瞥。
评论
查看更多