Arduino 智能花草看护系统 ESP32开发板

时间:2024-03-01 10:21:03

智能花草看护系统

摘要

        本次设计的花盆自动浇水系统包括土壤湿度显示,空气湿度显示,以及温度显示和自动加水功能及运用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软件说明书