为了丰富我们的养老生活。本文我们来介绍利用Esp8266来做一个智能养花系统。
实现功能
-
通过手机端查看当前的温度 湿度(小爱播报) 以及土壤湿度。 -
当土壤湿度低于50%时,自动启动继电器,利用水泵浇水。湿度超过50%断开继电器。
所需设备
-
esp8266 -
继电器 -
DHT11 -
土壤湿度传感器
线路连接
设备 | VCC (+) | GND(-) | 信号线 |
---|---|---|---|
继电器 | 3V | GND | D4 |
DHT11 | 3V | GND | D2 |
土壤传感器 | 3V | GND | D0 |
代码
#define BLINKER_WIFI
#define BLINKER_MIOT_SENSOR //引入小爱同学
#define soilPin A0 //土壤传感器脚针 DO
#define CS 2 //定义继电器脚针为D4
#include <Blinker.h>
#include <DHT.h> //DHT11传感器的头文件
#define DHTPIN 4 //定义DHT11模块连接管脚io4(D2脚)
#define DHTTYPE DHT11 // 使用DHT11温度湿度模块,当然也可以换其他DHT
//存储土壤的值
int soilValue;
//定义土壤湿度
int soilMoisture;
char auth[] = "1c2ce3****946"; //点灯app的密钥key
char ssid[] = "PDCN"; //所需连接的WiFi名
char pswd[] = "1234567890"; //WiFi的密码
BlinkerNumber HUMI("humi"); //定义湿度数据键名
BlinkerNumber TEMP("temp"); //定义温度数据键名
BlinkerNumber TEMP2("temp2"); //定义土壤湿度数据键名
DHT dht(DHTPIN, DHTTYPE); //定义dht
float humi_read = 0, temp_read = 0; //初始化读取的数据
//仪表盘组件
void heartbeat()
{
HUMI.print(humi_read); //给blinkerapp回传湿度数据
TEMP.print(temp_read); //给blinkerapp回传温度数据
TEMP2.print(soilMoisture);
if(soilMoisture <=50) //土壤湿度低于50
{
digitalWrite(CS, !digitalRead(CS)); //运行继电器
}
else
{
digitalWrite(CS, HIGH);
}
}
//实时曲线图组件
void dataStorage()
{
Blinker.dataStorage("temp", temp_read);
Blinker.dataStorage("humi", humi_read);
Blinker.dataStorage("humi2", soilMoisture);
}
//数据返回至小爱同学
void miotQuery(int32_t queryCode)
{
BLINKER_LOG("MIOT Query codes: ", queryCode);
int humi_read_int=humi_read; //将float转成int类型,整数
BlinkerMIOT.humi(humi_read_int); //小爱接收湿度
BlinkerMIOT.temp(temp_read); //小爱接收温度
BlinkerMIOT.print();
}
void setup()
{
//初始化串口Serial,开启调试输出
Serial.begin(9600);//波特率
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);//WIFI初始化设置
Blinker.attachHeartbeat(heartbeat);//注册仪表盘
dht.begin();
BlinkerMIOT.attachQuery(miotQuery);//注册小爱
Blinker.attachDataStorage(dataStorage);//注册实时曲线
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, 1);
pinMode(CS, OUTPUT);// 初始化继电器脚针
digitalWrite(CS, HIGH); //初始化继电器脚针
}
void loop()
{
Blinker.run();//负责处理blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。(这个很重要)
float h = dht.readHumidity();//读取DHT11采集的湿度数据
float t = dht.readTemperature();//读取DHT11采集的温度数据
if (isnan(h) || isnan(t))//判断温湿度值是否为空
{
BLINKER_LOG("读取传感器数据失败");
}
else
{
BLINKER_LOG("Humidity: ", h, " %");//打印输出调试信息
BLINKER_LOG("Temperature: ", t, " *C");
humi_read = h;
temp_read = t;
}
soilValue = analogRead(soilPin); //获取土壤的值0-1024
soilMoisture = map(soilValue,0,1023,100,0);//将0-1024转为100%-0 空气中土壤湿度为1024
Blinker.delay(200);
//延时函数, 在延时过程中仍保持设备间连接及数据接收处理
}
效果
当湿度低于50%时,继电器自动工作。
当土壤湿度高于50%时,继电器停止工作当然上面的代码,仅仅是完成了相应的功能。可能存在一定的不足之处。可根据你的实际情况自行修改。
更多精彩文章 欢迎关注我们
原文始发于微信公众号(kali黑客笔记):程序员的养老日常
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/151813.html