由于我的工作,我非常擅长维护我们的代码库,但对于我们的办公设备,就不太在行了。所以衍生出了这个项目,使用 Arduino 让我们的植物保持活力。
背景
最近,我们非常兴奋于搬进了我们的新办公空间。我们一直在用白板覆盖的墙壁、闪亮的新威廉希尔官方网站 和所有居家般的舒适设施来装饰它。当我们在整个空间中放置一些这些绿叶朋友时,这个办公室也开始有了家的感觉!
但当我们忘了给它们浇水,一周左右之后我们的绿叶朋友就会开始看起来像这样:
	
鉴于我们是一家物联网公司,在这个项目中还是比较有利的。所以我使用我们的 anduino WiFi shield 和IFTTT组合了一个解决方案。是时候认真对待我们的植物朋友了!
为了让您的植物“发出声音”,您需要一个 Arduino Due 或 Zero、一个anduinoWiFi shield(或任何其他可以与 Adafruit IO 对话的 WiFi 连接的 Arduino),最后是一个“电容式土壤湿度传感器”。别忘记,还需要一杯水。
	
湿度传感器
土壤湿度传感器非常酷,实际上并没有多少传感器提倡把传感器浸入潮湿的泥土中,但由于项目的需要:
	
不过虽然要接触土壤,但还是需要注意不要将传感器浸入该白线以下。上面没有任何措施可以很好地承受水分暴露,所以在给含有这个传感器的植物浇水时要小心。
如何校准“电容式土壤湿度传感器”
我们的电容传感器有三根线,我们将连接到 3.3v(红色)、接地(黑色)和(蓝色信号)interwetten与威廉的赔率体系 引脚 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% 以下时,我们口渴的植物将通过设定好的联系方式联系我们,请求浇水!这是设置的一瞥。
	
                        电子发烧友App
                    
                
                
          
        
        













           
            
            
                
            
评论