Arduino 智能花草看護系統 ESP32開發板


智能花草看護系統

摘要

        本次設計的花盆自動澆水系統包括土壤濕度顯示,空氣濕度顯示,以及溫度顯示和自動加水功能及運用EPS32無限傳感模塊傳輸數據實現手機APP控制功能。其中包括濕度傳感器連接到ESP芯片上,AO作為輸出口,將數據進行輸出,輸入到ESP32芯片上,在利用函數將數據輸出到手機的APP上,同理的將溫濕度傳感器也是能夠將數據能夠數據顯示在手機APP上。本系統有手動模式和自動模式兩種模式。當啟動手動模式的時候會跟據相關判斷條件來進行澆水,根據地域的不同設定了相關的閥值。當為手動模式的時候,我們就能夠實現直接澆水,不管是哪中情況都能夠直接澆水。

關鍵詞:ESP32芯片    WIFI技術   土壤濕度傳感器   溫濕度傳感器  水泵

 

一.   產品設計理念

隨着科技的發展,自動化技術越來越成熟的今天,我們所接觸的電子產品越來越多,包括許多簡易到復雜的設備。而我們家里甚至是許多植物研究的工廠都需要一些能夠自動看護的簡易設備,從而代替人工看管的問題。我們可以利用此設備進行花草的看護,讓植物可以在無人工的情況下,能夠自動看護花草。

 

二.產品設計目標

此款設備的最終目標是滿足當客戶未在家中無法定時澆水或者忘記澆水的時候能夠根據相關條件能夠自行澆水,或者手工澆水。同時滿足這兩種條件的情況。

通過以下小型的設備能夠放在家中完成智能澆水的相關功能。實現低碳環保,功能小巧的原理。

 

三.市場需求分析

   1.需求分析

(1)室內種植植物,務必需要花盆來裝花,但是如果僅僅只是一個普通的花盆的話,需要人為定期的澆水,但是多久交一次,一次澆多少卻是一個問題。澆水澆多了不僅會讓植物淹死。澆少了,植物會枯死

    (2)植物對於其所處的環境因素比較敏感。如濕度,溫度等都會影響花的生長。普通花盆不能夠很好的控制這些因素。

    (3)當我們需要外出旅行,並且不能照看家中的花草植物的時候。

    2.相關設備的預算

ESP32芯片

價格:60元

 

土壤濕度傳感器

 價格:4.32元

 

溫濕度傳感器

價格:7.97元

 

繼電器

價格:3.55元

 

小型水泵

價格:24.6元

還要需要的相關設備是導線若干,兩個發光二極管,電池槽一個,支持提供4*1.5=6V電壓。

 

四.產品設計細節

       4.1創新點

    通過物聯網無限傳輸技術實現花盆的智能控制,將澆水和控制的功能通過物聯網技術連接起來,不會澆水的問題以智能的方式解決。

       4.2設計內容細節

    手機通過Blynk軟件APP來進行相關的控制花草看護的功能,土壤溫濕度傳感器測出的數值到ESP32芯片。此時我們可以情況進行判定是否需要澆花。當啟動自動功能的時候,智能花草看護系統就能夠自己進行判斷,當滿足相關條件的時候,花草看護就能夠自行澆花。當啟動手動澆花的時候我們就能夠馬上澆水。當我們外出家門的時候無法澆水的時候,我們就能夠遠程控制此系統澆水。

       4.3具體模塊規划

 

4.4無線傳輸模塊

    選用的無線傳輸的芯片為ESP32,利用ESP32的WIFI模塊來控制芯片的技術,之后將數據接收到到芯片上,在將芯片上的數據讀出的數據在創數到我們的手機APP上。

       4.5 土壤濕度傳感器,空氣濕度溫度傳感器

    土壤濕度傳感器YL-69我們采用的是的模塊,將讀出的模擬值通過AO口輸出到ESP芯片上,模擬的方式是土壤濕度傳感器上當無水面接觸的時候時,顯示的都是1,為高電平,當有水接觸的時候,顯示的為低電平為0.利用相關傳感技術將數據通過模擬量傳輸到我們ESP芯片上,在通過手機的APP讀出相關的數據出來。

    溫濕度傳感器是DHT-11,濕度傳感器通過模擬的真值直接傳輸到我們我們芯片上,在通過事件代碼分別將兩個數據讀出來,將讀出來的值同樣傳輸到我們手機上

       4.6機械運作模塊

    機械運作模塊我們就是采用繼電器來控制水泵,其中自動模式是判斷條件,當ESP32芯片給接口給高電平的時候,采用啟動繼電器,這樣就能夠控制水泵啟動,其中我們采用外部電池供電,因為芯片供電不穩定,所以我們盡量采用外部供電。或者是手動模式,當啟動手動模式的時候,我們直接可以啟動繼電器來供電。讓水泵直接工作來達到手動模式的需求。

代碼:

#define BLINKER_WIFI
#include <Blinker.h>
#include <dht11.h>
#define DHTPIN 22
#define ASignal 35
dht11 DHT11;

char auth[] = "ae953e42d0ed";
char ssid[] = "note8";
char pswd[] = "rime2108";
 
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
BlinkerNumber NUM1("num1");
BlinkerNumber NUM2("num2");
BlinkerNumber NUMt("numt");
BlinkerNumber NUMCI("numci");
BlinkerText TURANG("turang");
BlinkerButton Button1("btn-abc");
BlinkerButton Button2("btn-js");
BlinkerNumber RAN("ran");
BlinkerText BENG("beng");
BlinkerSlider Slider1("ran");

int val=0,ci=0,zhi=2850,a=0;
String turang_read,beng_read;
double humi_read = 0, temp_read = 0, num1_read = 0, num2_read = 0, numt_read = 0,ci_read=0;
float h = 0.0,t = 0.0,n1 = 0.0,n2 = 0.0;

void slider1_callback(int32_t value)
{
    BLINKER_LOG("get slider value: ", value);
    zhi=value*100; 
}

//對土壤濕度、空氣濕度、溫度值檢測,進行自動澆水
int turang(){
  val=analogRead(ASignal)/41;   //val值從potPin信號口讀取    
  Blinker.delay(10);//延時1S 
    if(analogRead(ASignal)>=zhi && t<=36 && h<68)
    { 
       digitalWrite(12, HIGH); 
       Blinker.println("土壤干旱,需要澆水");
       ci++; 
       turang_read="土壤干旱";
       beng_read="水泵打開";
       Blinker.notify("花草智能看護系統正在自動給花草澆水!");
       Blinker.delay(3000);
       return ci;
      }
     else if(analogRead(ASignal)<zhi)
    { 
       digitalWrite(12, LOW);  
       Blinker.println("土壤潮濕,不需要澆水");
       turang_read="土壤濕潤";
       beng_read="水泵關閉";
       Blinker.delay(5000);
      }
     else if(t>36)
    { 
       digitalWrite(12, LOW);  
       Blinker.println("溫度過高,不適宜澆水");
       Blinker.notify("溫度過高,不適宜澆水!");    
       turang_read="溫度過高不適宜澆水";
       beng_read="水泵關閉";
       Blinker.delay(3800);
      }
     else if(h>68)
    { 
       digitalWrite(12, LOW);  
       Blinker.println("空氣濕度高,可能會下雨!");
       Blinker.notify("空氣濕度高,可能會下雨!");   
       turang_read="空氣濕度高可能下雨";
       beng_read="水泵關閉";
       Blinker.delay(3800);
      } 
 }

//開燈
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    digitalWrite(16, !digitalRead(16));
    Blinker.vibrate();//手機震動
}

//手動澆水
void button2_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
    if (state=="on") {
        digitalWrite(12,HIGH);
       // 反饋開關狀態
        Button2.print("on");
        Serial.println("on");
        Blinker.println("開始澆水");
        beng_read="水泵打開";
        Blinker.vibrate();//手機震動
    } else if(state=="off"){
        digitalWrite(12,LOW);
        // 反饋開關狀態
        Button2.print("off");
        Serial.println("off");
        Blinker.println("已停止澆水");
        beng_read="水泵關閉";
    }
       Blinker.delay(3800);  
}

//攝氏溫度度轉化為華氏溫度
double Fahrenheit(double celsius) 
{
        return 1.8 * celsius + 32;
}

// 快速計算露點,速度是5倍dewPoint()
// 參考: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
        double a = 17.271;
        double b = 237.7;
        double temp = (a * celsius) / (b + celsius) + log(humidity/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}

//數據發送到App
void heartbeat()
{
    HUMI.print(humi_read);
    TEMP.print(temp_read);
    NUM1.print(num1_read);
    NUM2.print(num2_read);
    NUMt.print(numt_read);
    NUMCI.print(ci_read);
    TURANG.print(turang_read);
    BENG.print(beng_read);
    
//    Button1.icon("fas fa-lightbulb");
//    Button1.color("#C0C0C0");
//    Button1.text("關燈","開燈");
      Button1.print("on");
    
//    Button2.icon("fas fa-tint");
//    Button2.color(" #87CEEB");
//    Button2.text("關閉","澆水");
    Button2.print("off");
}

void dataStorage()
{
  Blinker.dataStorage("humi9",humi_read);
  Blinker.dataStorage("temp9",temp_read);
  Blinker.dataStorage("numt9",numt_read);
  }
//
void wenshidu(){
    int chk = DHT11.read(DHTPIN);
    h=(float)DHT11.humidity;
    t=(float)DHT11.temperature;
    n1=dewPointFast(DHT11.temperature, DHT11.humidity);
    n2=Fahrenheit(DHT11.temperature);
    Blinker.delay(10);
  }

void printlf(){
    BLINKER_LOG("空氣濕度:", h, " %");
    BLINKER_LOG("攝氏溫度: ", t, " *C");
    BLINKER_LOG("華氏溫度: ", n1, " Td");
    BLINKER_LOG("露點: ", n2, " fc");
    BLINKER_LOG("土壤濕度: ",analogRead(ASignal)/41, " %");
    BLINKER_LOG("自動澆水次數:",ci, "");
    BLINKER_LOG("當前",turang_read,"");
    BLINKER_LOG("當前水泵狀態",beng_read,"");
  }
void setup()
{
    Serial.begin(9600);
    Serial.println("DHT11 TEST PROGRAM ");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT11LIB_VERSION);
    
    Button1.attach(button1_callback);
    Button2.attach(button2_callback);
    Slider1.attach(slider1_callback);
    
    pinMode(ASignal, INPUT);    
    pinMode(12, OUTPUT);
    pinMode(14, OUTPUT);
    pinMode(16, OUTPUT);
    digitalWrite(16, LOW);

    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();//開啟調試
    Blinker.begin(auth, ssid, pswd);
    
    Blinker.attachHeartbeat(heartbeat);
    Blinker.delay(20);
}

void loop()
{
    Blinker.run();
    turang();
    dataStorage();
    wenshidu();
    printlf();
    humi_read = h;
    temp_read = t;
    num1_read = n1;
    num2_read = n2;
    ci_read = ci;
    numt_read = analogRead(ASignal)/41;
}

 

 

在Blinker上實現的效果

 

 

 前圖是Blinker1  后圖是Blinker2

Blinker2界面配置導出如下:

{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨¨assets/img/bg/4.jpg¨}}¨dashboard¨|{¨type¨¨num¨¨t0¨¨攝氏溫度¨¨ico¨¨fal fa-thermometer-three-quarters¨¨clr¨¨#389BEE¨¨min¨É¨max¨¢1c¨uni¨´℃´¨bg¨Ë¨cols¨Ë¨rows¨Ë¨key¨¨temp¨´x´Ë´y´Ë¨speech¨|÷}{ß9ßAßB¨露點¨ßD¨fal fa-tint¨ßFßGßHÉßIº0ßJ¨Td¨ßKËßLËßMËßN¨num2¨´x´Ï´y´ËßP|÷}{ß9ßAßB¨自動澆水¨ßD¨fal fa-repeat-alt¨ßFßGßHÉßIº0ßJ´次´ßKËßLËßMËßN¨numci¨´x´É´y´ËßP|÷}{ß9ßAßB¨土壤干燥¨ßD¨fal fa-question¨ßF¨#00A90C¨ßHÉßIº0ßJ´%´ßKÊßLÍßMËßN¨numt¨´x´É´y´ÉßP|÷¨lstyle¨Ê}{ß9ßAßB¨華氏溫度¨ßD¨fal fa-fire¨ßFßGßHÉßIº0ßJ´℉´ßKËßLËßMËßN¨num1¨´x´Í´y´ËßP|÷}{ß9¨btn¨ßD¨fal fa-lightbulb¨¨mode¨ÊßB¨照明¨¨t1¨¨文本2¨ßKËßLËßMËßN¨btn-abc¨´x´É´y´¤AßP|¦¨act¨¨cmd¨‡¨on¨¨開燈¨¨off¨¨關燈¨—÷ßbÉßF¨#FBA613¨}{ß9ßfßDßRßhÊßB¨澆水¨ßjßkßKËßLËßMËßN¨btn-js¨´x´Ï´y´¤AßP|¦ßmßn‡ßoßtßo¨膠水¨ßq¨關閉¨—÷ßbÉßF¨#076EEF¨}{ß9¨cha¨ßK˨sty¨¨line¨ßFßx¨sty1¨ß10¨clr1¨ßs¨sty2¨ß10¨clr2¨ßZßLÑßMÍßN¨humi9¨´x´É´y´ÍßP|÷ßbÊßB¨空氣濕度¨ßj¨空氣溫度¨¨key1¨¨temp9¨´t2´¨土壤濕度¨¨key2¨¨numt9¨}{ß9ßAßBß16ßDßYßFßsßHÉßIº0ßJ´%´ßKÊßLÍßMËßN¨humi¨´x´Í´y´ÉßP|÷ßbÊ}{ß9¨ran¨ßB¨自動澆水閾值¨ßFßGßIº0ßHÉßKËßLÑßMËßNß1E´x´É´y´ÑßP|÷ßbÉ}{ß9¨tex¨ßB¨水泵狀態¨ßj´´ßKËßD¨iconfont icon-fan¨ßLÍßMÊßN¨beng¨´x´Ë´y´¤AßP|÷ßbÊ}{ß9ß1GßB¨土壤是否潮濕¨ßj´´ßKËßD¨fal fa-leaf¨ßLÍßMÊßN¨turang¨´x´Ë´y´¤BßP|÷ßbÊ}{ß9¨deb¨ßhÉßKÉßLÑßMÍßN¨debug¨´x´É´y´¤CßP|÷ßbÊ}÷}

復制配置信息,在軟件里點擊導入即可。

 

 

設計總結

         本次設計的智能盆花管家系統以電子類的自動澆花器的工作原理為參考, 運用溫濕度采集電路及單片機控制技術構成一個土壤溫濕度無線傳輸系統與控制系統。 再用數字電路控制自動給水系統及時的澆水系統供水。 整個智能盆花管家 系統包括土壤溫濕度的采集和數據分析處理兩個個部分。 土壤溫濕度的采集以數字溫濕度傳感器DHT-11和土壤和YL-69值檢測傳感器 ESP32為感應部件,將檢測到的土壤溫濕度值送入 ESP32單片機, ESP32 單片機進行處理數據,再由WIFI模塊的無線傳輸模塊發出具體操作指令。 同時此也是是否給盆花澆水參考值。它設計為智能和手動兩個部分:智能澆水系統是通過單片機程序設定澆水的上下限值並與溫濕度采集電路送入單片機的土壤濕度值相比較,當傳感器檢測到的濕度值低於設定的下限值時,ESP32單片機輸出一個信號,開始澆水,高於設定的上限值時再由單片機輸出一個信號,停止澆水;手動部分是由單片機從接收手機應用指令, 通過軟件程序設定澆水的水量。通過本次實訓,讓我進一步了解了微電腦控制的智能系統。也使我真正接觸 到了檢測控制系統的設計,雖然是一個人們日常生活中的小系統,但也讓我明白了很多設計上應該注意的問題。比如實用性,經濟性以及安裝條件等。

 

參考文獻

[1]王智,潘強,邢濤。面向物聯網的實體實時搜索服務綜述 [d]。中國科學院上海微系統與信息技術研究所。2009年。

[2] 機械工業出版社“物聯網技術概論”

[3] 劉雲浩 。 編着 。 “物聯網導論”

[4] 無線模塊。工業無線模塊

[5] Blynk軟件說明書

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM