基于Blinker的土壤湿度监测系统
本帖最后由 ytying1001 于 2021-10-3 19:40 编辑我家的阳台上种了两棵草,一棵薄荷草,一棵三叶草,它们生长在由洗衣液剪成的简易“花盆”里,最近经常忘了浇水,有几次草都快死了,由于它们貌似是多年生植物,我决定研究一种土壤干旱到一定程序的报警装置。但是考虑到ESP8266做为耗电大户,(工作时接近100ma),用普通的18650电池也用不了几天,所以我在想,能不能让它们上电的时候,上报一两次数据,然后就关机休眠,大概半小时后再次重启。这样一小时就上报两次数据。加起来大概5分钟。而待机电池大概只有20ma了,一节锂电池应该用个个把周。这就是故事的大概背景。
薄荷草和三叶草图,三叶草因为缺水有点枯了,临时加了一点水,三叶草还没有完会恢复过来,根本原因可能是因为薄荷草长得过大,蒸腾作用太强,感觉加满水三四天就缺水了。
于是我翻出了已经买的一个土壤检测电极,后面还带一个放大器,加起来好像也就几块钱。放大器上有模拟量输出和数字量输出,数字量输出可以通过电位器调门槛值。本案用了它的模拟量输出。
下面是关于硬件连接的,其中GPIO16 和RST端子连接一下,主要是因为休眠时间到了以后,GPIO16脚会产生一负脉冲,引至RST脚上,8266重启以达到“唤醒”,唤醒后,程序大概等待两个心跳周期后,再进入休眠模式,休眠大概是25分钟,用到了ESP.deepSleep()函数,参数为多少微秒。最大可以写到71分钟。即71*60*1000*1000。
上传时同时上传时间和传感器的原始数值。下午2点刚加了水,数值为238。我初步做了一个试验,悬空数值为1024,对应的3.3V. 记得文档上说ESP12模拟量满值为1.5V,但是本人用得是一个现成的带电路板的,当初买的时候不到20块钱。可能原电路板从输入处做了分压处理。导致大概3.3V的时候才满值1024。我放入自来水中,数值为450左右。插入潮湿土壤,数值初变为240左右,可能是因为土壤中含有无机盐,增加了导电性。
到了晚上,数值上升为315,可能由于经过了几个小时,水没有以前多了,导电性开始变差。至于土有点干了后数值会升到多少,还需要过几天我观察一下。有可能到个七八百。这个时候就应该浇水了。目前数据显示18点36收到一次。上一次是18:09收到的。大概25分钟刷新一次的样子,这25分钟就是休眠时间。
好了,为了能用上Blinker专业版,上程序。
#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG
//#define RLY 0
#include <Blinker.h>
#define TEXTE_1 "tex-ttt"
#define TEXTE_2 "tex-tim"
BlinkerText Text1(TEXTE_1);
BlinkerText Text2(TEXTE_2);
char auth[] = "XXXXXXXX";//你的密钥
// 新建组件对象
BlinkerNumber Number2("num-2ez");
String inString = "";
int counter = 0;
int aa = 0;
int value;
uint32_t read_time = 0;
uint32_t run_time=0;
int a1,a2,a3;
//心跳函数,blinker大概一分钟执行一次。太快了服务器会报错。
void heartbeat()
{
BLINKER_LOG("Situation synchronization! ");
//显示时间
a1=Blinker.hour();
a2=Blinker.minute();
a3=Blinker.second();
BLINKER_LOG(a1,":",a2,":",a3);
if(a2<10)
inString+=((String)a1+":0"+(String)a2);
else inString+=((String)a1+":"+(String)a2);
if(a3<10)
inString+=(":0"+(String)a3);
else inString+=(":"+(String)a3);
Text2.print(inString);
inString="";
//确定执行几次后进入休眠模式
aa++;
//读取模拟量口数据
value=analogRead(A0);
//在blinker上显示当前数值
Number2.print(value);
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// Blinker.begin(auth, ssid, pswd);
//有程序首的#define BLINKER_ESP_SMARTCONFIG 可以不用写入路由器名字和密码,由手机配网。
Blinker.begin(auth);
Blinker.attachData(dataRead);
Blinker.attachHeartbeat(heartbeat);
// Blinker.attachDataStorage(tubiao);
//设置时区,-8.0文档看是西八区,但8.0东八区时间差了8小时,所以改西八区时间就对了,可能日期差一天
Blinker.setTimezone(-8.0);
}
void loop()
{
Blinker.run();
//采集两次后进入睡眠模式
if(aa>=2)
{
aa=0;
Serial.println("sleeping");
//休眠25分钟,单位是微秒,加上前面两次读数,大概30分钟后由GPIO16 连接RST进行一次重启唤醒。
ESP.deepSleep(25*60*1000000);
}
//非休眠期,大概2分钟。在2分钟期间,每4秒串口输出一次模拟量值。
value=analogRead(A0);
Serial.println(String(value));
delay(4000);
}
程序比较简单。但是做出了如何让8266休眠,即GPIO16连接RST.ESP12芯片上引出了16脚,ESP01只引出了RST 16脚没有引出,需要从芯片上飞线,脚太密,我这种张飞手干不来。所以以12芯片为例。
Blinker让我们非专业人士可以不用自己做上位机就能用上远程监控界面。我想用一个其图表功能,但图表功能只有专业版才能用上。这样做一张关于湿度的表格,可以看出土温度随时间的变化趋势。
我看你这个系统只采用了1路ADC,可以考虑使用沁恒的CH9141进行数据采集,集中发送给ESP32上传到Blinker,ESP32使用AD/DC供电,CH9141使用18650 + 太阳能板供电,续航时间可以按年计算
页:
[1]