Arduino智能浇灌系统
电子元件土壤湿度传感器、泵,ardunio uno,面包板,三极管,水位传感器,电阻源代码
·
电子元件
土壤湿度传感器、泵,ardunio uno,面包板,三极管,水位传感器,电阻
源代码
手机上下载Blinker软件
源代码
源代码
烧录到esp8266
/*
* esp8266
*/
#define BLINKER_WIFI
#define BLINKER_PRINT Serial
#define BLINKER_APCONFIG //启用热点 wifi一键配置功能
#define LED_BUILTIN 2 //esp8266 板子上的灯是 D4 ,此处必须这么设置,不然控制不到灯
#include <Blinker.h>
#include <EEPROM.h>
#include <ESP8266WiFi.h>
void timeSendEeprom();//时间存
void timeGetEeprom();//时间取
void beginText();
char auth[] = "2fa38771f67c";// blinker app提供的秘钥,用于mqtt协议远程控制用
//新建组件对象
BlinkerButton Button1("btn-abc");//LED灯
BlinkerNumber HUMI("humi");//湿度数据键
BlinkerText Text1("time");//显示上传浇灌时间,文本组件
BlinkerButton Button2("shuax");//刷新
BlinkerButton Button3("water");//浇水的开关
BlinkerSlider Slider1("humimin");//湿度值设置
//定义所需参数
//湿度的数据
int humi1=0;
//上次浇灌时间数据
int yearr=0,mouth=0,day=0,hourr=0,minn=0,secondd=0;
//温湿度阈值定义
int humid=40;//湿度下限
//扫描串口,获得从arduino传过来的数据
char find1[]="humi";
char find2[]="gengx";//发现gengx时开始处理串口数据
//处理调用时间格式存储于timesend
String timesend="";
String xie="";
String mao=":";
//进行一次灌溉功能函数//记录本次灌溉时间发送给app
void fun(int humi1)
{
digitalWrite(2,1);
Blinker.delay(2000);//浇水2s
digitalWrite(2,0); //2号引脚没办法直接驱动
//获取时间
yearr=Blinker.year();
mouth=Blinker.month();
day=Blinker.mday();
hourr=Blinker.hour();
minn=Blinker.minute();
secondd=Blinker.second();
timesend=String(yearr)+xie+String(mouth)+xie+String(day)+" "+String(hourr)+mao+String(secondd);
Text1.print("上次灌溉时间",timesend);
timeSendEeprom();//存储时间数据
}
//上电初始化组件显示数据
void beginText()
{
EEPROM.begin(20);
timeGetEeprom();
timesend=String(yearr)+xie+String(mouth)+xie+String(day)+" "+String(hourr)+mao+String(secondd);
Text1.print("上次灌溉时间",timesend);
EEPROM.end();
Serial.println("初始化完成");
}
//在eeprom内刷新上次灌溉时间数据
//int year=0;mouth=0;day=0;hourr=0;minn=0;secondd=0;
void timeSendEeprom()
{
EEPROM.begin(20);
EEPROM.write(5,yearr);
EEPROM.write(6,mouth);
EEPROM.write(7,day);
EEPROM.write(8,hourr);
EEPROM.write(9,minn);
EEPROM.write(10,secondd);
EEPROM.end();
}
//获取eeprom保存的时间数据
void timeGetEeprom()
{
yearr=EEPROM.read(5);
mouth=EEPROM.read(6);
day=EEPROM.read(7);
hourr=EEPROM.read(8);
minn=EEPROM.read(9);
secondd=EEPROM.read(10);
}
//存储湿度到云端
void dataStorage()
{
Blinker.dataStorage("humi",humi1);
}
//心跳包函数/59s一次
void heartbeat()
{
HUMI.print(humi1);
Serial.println("heart");
}
//button按键回调函数,意思是app上按了这个键就会调用这个函数
void button2_callback(const String & state)
{
BLINKER_LOG("get button state:",state);
beginText();
Button1.print();
}
void button3_callback(const String & state )
{
if(state==BLINKER_CMD_ON){
digitalWrite(2,HIGH);
Button2.print("on");
}
else{
digitalWrite(2,LOW);
Button2.print("off");
}
}
// 按下按键即会执行该函数
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(LED_BUILTIN, LOW);
BLINKER_LOG("Toggle on!");
Button1.print("on");
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(LED_BUILTIN, HIGH);
BLINKER_LOG("Toggle off!");
//Button1.icon("icon_1");
Button1.color("#ff66b3");
// Button1.text("Your button name or describe");
// Button1.text("Your button name", "describe");
Button1.print("off");
}
}
void slider1_callback(int32_t value)
{
humid=value;
BLINKER_LOG("get slider value:",value);
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
fun(humi1);
HUMI.print(humi1);
uint32_t BlinkerTime=millis();
Blinker.print("millis",BlinkerTime);
}
// 系统初始化函数, 系统入口
void setup()
{
Serial.begin(115200); //设置波特率
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll(); //开启调试模式,可以看到 blinker mqtt 协议相关交互信息
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
// 初始化blinker
Blinker.begin(auth);
Blinker.attachData(dataRead);//没有绑定的控件 函数注册
//注册一个心跳包
Blinker.attachHeartbeat(heartbeat);
//上传数据到云端的回调函数
Blinker.attachDataStorage(dataStorage);
//设置时区
Blinker.setTimezone(8.0);
//按键回调函数
Button1.attach(button1_callback);
Button2.attach(button2_callback);
Button3.attach(button3_callback);
Slider1.attach(slider1_callback);
}
void loop()
{//让主代码放在这里重复运行
Blinker.run();
if(Serial.available()>0)
{
if(humi1<humid)
{
fun(humi1);
Serial.println("water");
}
Blinker.delay(60000);//浇水完成后的渗透时间
if(Serial.find(find2))
{
if(Serial.find(find1))
{
humi1=Serial.parseInt();
Serial.print("humi:");
Serial.println(humi1);
}
}
}
}
烧录到arduino
/*
* 烧录到ardunio
* 发送数据格式 “gengxhumi70”
*/
#include<math.h>
#define N A0
const int M=7;//获取GPIO2的数值
const int D=8;//水泵驱动引脚
void getHumi();
String sendl="gengxhumi";
String sendDate="";
float h=0;
void SendDate(){
if(h!=0)
{
sendDate=sendl+(String)((int)h);
Serial.println(sendDate);
}
}
void setup()
{
Serial.begin(115200); //init Serail band rate
}
void Mote()
{
pinMode(7,INPUT);
pinMode(8,OUTPUT);
if(digitalRead(7)==HIGH){
digitalWrite(8,HIGH);
}
else{
digitalWrite(8,LOW);//arduino 一个引脚定义输入做判断esp8266D2引脚高还是低,做水泵的开或关操作
}
}
void loop()
{
getHumi();//湿度
SendDate();//date transport
Serial.print("humi:");
Serial.println("int(h)");
Mote();
}
void getHumi()
{
h=analogRead(A0);
h=((1024-h)/1024)*100;
if(isnan(h))
{
Serial.println("Falid to read from sensor");
}
delay(2000);
}
更多推荐
已为社区贡献2条内容
所有评论(0)