本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

DIY办公室植物灌溉监测系统

发布时间:2022-08-04
分享到:

DIY办公室植物灌溉监测系统

发布时间:2022-08-04
分享到:

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

本文中所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Brian Carbonette,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论