ESP8266&自动浇水系统
本文介绍了一款基于ESP8266的低成本自动浇水系统,具备远程控制和本地自动灌溉功能。系统采用国产ESP8266芯片作为主控,内置WiFi模块实现数据上传云端,使用嘉立创EDA设计电路板,Arduino开发软件,通过MQTT协议与巴法云进行数据交互。硬件成本控制在25元左右,支持WiFiManager手机配网和OTA无线升级。系统可实时监测土壤湿度,当低于阈值时自动开启水泵灌溉,同时支持用户远程控
目录
ESP8266&自动浇水系统
简介:
这是一款可靠、稳定、低成本的自动浇水器。本产品可以远程控制浇水和补光,本地系统也可以检测土壤湿度自动浇水灌溉。主控制器采用乐鑫科技推出的ESP8266,这是一款国产芯片,里面集成了一个WIFI模块可以连接网络实现本地数据上传云端。外围控制电路使用国产嘉立创EDA来制作电路板。使用Arduino来开发本产品的软件部分,通过MQTT网络协议来订阅和发布数据内容。云端采用巴法云来收集数据。在用户体验本团队也做了升级,在产品连网我们使用了WiFiManager技术,让用户可以通过手机来对产品进行连网操作,在后期产品维护我们采用了OTA"隔空抛物"技术来对产品进行无线调试。适用于需要进行远程检测和控制等场景。本产品硬件成本低廉,在量产时所有硬件成本可控制在25元(人民币)左右。
视频链接:https://www.bilibili.com/video/BV1bBvSBVEHU/
一、硬件设计
1、原理图
1、主控电路
主控为上海乐鑫科技2014推出的产品,主控本身集成了WiFi连网模块,方便数据进行连网传输。它成本低廉、性能稳定、具有Arduino生态,花同样的钱,ESP8266-12F 直接带 Wi-Fi,性能碾压 8-bit/32-bit MCU,这是本团队选择它的主要原因。
这是主控芯片的实物图:

在参考的芯片的数据手册和网络上的资料,本团体设计了主控电路、复位按键和控制按键图,如下是原理图:


2、TYPE-C供电下载电路、USB转串口下载电路
考虑现在用户家庭对电子设备供电主要本团队采用TYPE-C供电口。本团队开发时采用了CH340C芯片,把USB转TTL电平的电路直接设计进入电路板,方便开发时直接使用USB线连接电脑和产品进行下载和调试程序。
这是TYPE-C和CH340C的实物图


这是本团队参考了芯片手册和资料设计的TYPE-C和CH340C的电路原理图:

3、5V转3.3V电源电路
因为主控芯片需要使用3.3v供电使用,而TYPE-C供电时是5V电源,需要转5V为3.3V电压,这里本团队采用了AMS1117芯片实现相依的需求。
这是AMS1117芯片实物图:

下面这是本团队参考AMS1117数据手册和网络资料设计的电路原理图:

4、土壤湿度ADC采集电路
为了对土壤湿度进行采集本团队设计了模拟信号转数字信号电路。
下面是ADC电路原理图:

5、控制接口电路:
为了对水泵和关照的控制,我们设计如下的接口电路。(注意:这里多出的GPIO可连接多个外部设备进行远程控制,对后期项目的功能扩展有一定的作用)

这是产品的整体电路原理图:

2、PCB图
注意:这是本项目PCB采用两层板,分为顶层和底层,走线时需要注意晶振走差分信号线。在走线时确保信号线不被干扰所以先走信号线,再走电源线,最后走GND底线,这里地线我们采用铺GND铜皮来解决GND线路。值得注意的是最后铺铜后会有一些GND还是没有连上,这时我们需要在没有连上的GND线路附近打上过孔,然后重新铺铜,即可解决问题。
1、PCB顶层设计
这是项目硬件的PCB顶层图:

2、PCB底层设计
这是项目硬件的PCB底层图:

3、3D预览
这是硬件部分的项目预览:

3、实物预览
这是硬件的实物预览:

4、BOM表单(硬件成本只需要25人民币左右)
经我们团队的计算,所有硬件成本(包括水泵和土壤湿度检测器)在量产时少于25元(人民币)。下面是BOM表单:

二、程序编写
1、程序流程图

2、程序代码
#include <WiFiManager.h> // 包含WiFi管理器库
#include <PubSubClient.h> // 包含用于MQTT的PubSubClient库
#include <ESP8266WiFi.h> // 包含ESP8266 WiFi库
#include <Ticker.h>
#include <ArduinoOTA.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#define buttonPin D3 // 按钮引脚D3
// 定义WiFi Manager对象
WiFiManager wifi;
// MQTT服务器的地址和端口
const char* mqttserver = "bemfa.com";
const int prot = 9501;
// 定义WiFi客户端对象
WiFiClient ClientA;
// 定义PubSubClient对象
PubSubClient ClientB(ClientA);
Ticker ticker;
int count;
#define buttonPin D1
bool pinState; // 存储引脚状态用变量
void setup() {
// 初始化串口通信
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP); // 将引脚设置为输入上拉模式
pinMode(LED_BUILTIN, OUTPUT); // 初始化NodeMCU控制板载LED引脚为OUTPUT
digitalWrite(LED_BUILTIN, LOW);// 初始化LED引脚状态
pinMode(D2, OUTPUT); // 初始化NodeMCU控制外接LED引脚为OUTPUT
digitalWrite(D2, HIGH);// 初始化LED引脚状态
// 设置MQTT服务器和端口
ClientB.setServer(mqttserver, prot);
Serial.println("");
// 建立WiFiManager对象
WiFiManager wifiManager;
// 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
//wifiManager.autoConnect("itlsl2");
// 如果您希望该WiFi添加密码,可以使用以下语句:
wifiManager.autoConnect("itlsl2", "12345678");
// 设置MQTT订阅回调函数
ClientB.setCallback(receiveCallback);
ticker.attach(1, tickerCount);
// OTA设置并启动
ArduinoOTA.setHostname("itlsl2");
ArduinoOTA.setPassword("12345678");
ArduinoOTA.begin();
Serial.println("OTA ready");
}
void loop() {
ArduinoOTA.handle();
// 等待10毫秒
delay(10);
// 如果MQTT客户端已连接,则执行循环
if (ClientB.connected()) {
// 循环处理MQTT消息
ClientB.loop();
if (count >= 10){
pubMQTTmsg();
count = 0;
}
} else {
// 尝试连接到MQTT服务器
connectMQTTServer();
}
// 等待1秒钟
delay(3000);
readPin();
}
void readPin()
{
pinState = digitalRead(buttonPin);
if(pinState == HIGH)
{
digitalWrite(D2, LOW); // 则开水阀
}
else
{
digitalWrite(D2, HIGH);
}
}
void tickerCount(){
count++;
}
// 连接到MQTT服务器的函数
void connectMQTTServer() {
// 客户端ID
String clientId = "xxxxxxxxxx";
// 使用clientId连接到MQTT服务器
if (ClientB.connect(clientId.c_str())) {
// 延迟200毫秒
delay(200);
// 如果状态为0(已连接)并且订阅了"MQTT"主题,则打印连接成功的消息
if (ClientB.state() == 0 && ClientB.subscribe("test")) {
Serial.println("Connected successfully!");
}
} else {
// 打印连接失败的消息
Serial.println("Failed to connect!");
}
}
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println("");
Serial.print("Message Length(Bytes) ");
Serial.println(length);
if ((char)payload[0] == 'O' && (char)payload[1] == 'N') {
digitalWrite(LED_BUILTIN, LOW); // 则点亮LED。
digitalWrite(D2, LOW); // 则开水阀
digitalWrite(D1, LOW); // 则开关。
//Serial.println("LED ON");
}
if((char)payload[0] == 'O' && (char)payload[1] == 'F' && (char)payload[2] == 'F'){
digitalWrite(LED_BUILTIN, HIGH); // 否则熄灭LED。
digitalWrite(D2, HIGH);
digitalWrite(D1, HIGH);
//Serial.println("LED OFF");
}
}
// 发布信息
void pubMQTTmsg(){
// 建立发布信息。
String messageString = "当前湿度:"+String(analogRead(A0));;
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
if(ClientB.publish("test", publishMsg)){
//Serial.println("Publish message:");Serial.println(publishMsg);
} else {
//Serial.println("Message Publish Failed.");
}
}
三、框架+实物展示
1、数据框架
1、ESP8266检测土壤湿度信息,通过MQTT网络协议向巴法云推送消息。用户向巴法云订阅相应的土壤湿度信息。
2、用户向巴法推送开关水阀或补光信息。ESP8266向巴法云订阅水阀开关或补光开关信息。ESP8266控制水阀开关或补光开关。
3、ESP8266检测到土壤湿度低于阈值会自动开启水阀,对作物进行灌溉操作。

2、实物图

3、项目技能总结:
MQTT技术:
MQTT协议是当今世界上最受欢迎的IoT协议。它已广泛应用于车联网、智能家居、即时聊天应用和工业互联网等领域。目前通过MQTT协议连接的设备已经过亿,这些都得益于MQTT 协议为设备提供了稳定、可靠、易用的通信基础。用户与客户端之间数据的推送和订阅。
WiFiManager网络配置:
用户可以使用手机对产品设备配置网络环境。方便产品采集数据后通过MQTT协议上传至云端。
OTA技术:
(隔空传物技术)开发人员在二次调试的时候不用使用UART串口进行调试,可以通过WiFi进行无线传输来调试开发板,方便了对产品的后期维护。
更多推荐



所有评论(0)