目录

ESP8266&自动浇水系统

简介:

一、硬件设计

1、原理图

1、主控电路

2、TYPE-C供电下载电路、USB转串口下载电路

3、5V转3.3V电源电路

4、土壤湿度ADC采集电路

5、控制接口电路:

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

2、PCB图

1、PCB顶层设计

2、PCB底层设计

3、3D预览

3、实物预览

4、BOM表单(硬件成本只需要25人民币左右)

二、程序编写

1、程序流程图

2、程序代码

三、框架+实物展示

1、数据框架

2、实物图

3、项目技能总结:

MQTT技术:

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进行无线传输来调试开发板,方便了对产品的后期维护。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐