摘要
随着城市化进程的加快,阳台植物盆栽成为城市居民接近自然、提升生活品质的重要途径。为了有效监测和管理阳台植物的生长环境,本项目利用FireBeetle ESP32-C6、土壤传感器、太阳能板和锂电池,设计了一套低功耗、可持续的阳台植物监测系统。该系统能够实时采集土壤湿度数据,并通过无线通信传输到用户端,实现远程监控和智能提醒。本文详细介绍了该系统的设计与实现过程,包括硬件选择、电路设计、软件开发、数据分析等内容,旨在为城市居民提供一种高效、便捷的植物养护解决方案。
引言
项目背景
在现代城市生活中,阳台植物盆栽不仅美化了居住环境,还能够改善空气质量,带来心理上的愉悦。然而,由于日常生活的繁忙,许多城市居民往往难以定时关注和照料这些植物,导致植物生长不良甚至枯萎。传统的植物养护方式依赖人工经验,不仅费时费力,而且难以保证准确性和及时性。因此,利用智能硬件和物联网技术,实现对阳台植物的自动监测和管理,成为解决这一问题的重要途径。
项目目的
本项目旨在设计并实现一套阳台植物监测系统,通过FireBeetle ESP32-C6、土壤传感器、太阳能板和锂电池的协同工作,实现对植物生长环境的实时监测和智能管理。具体目标包括:
1.实时监测:通过土壤传感器实时采集植物土壤湿度数据,并将数据传输至用户端,实现对植物生长环境的实时监控。
2.节能环保:利用太阳能板为系统供电,结合锂电池储能,实现系统的长期稳定运行,减少对外部电源的依赖。
3.智能提醒:根据土壤湿度数据,智能分析植物的需水情况,并通过无线通信模块及时向用户发送提醒信息,帮助用户合理安排浇水时间。
4.易于安装:提供详细的安装和调试指导,使系统能够方便快捷地应用于各种阳台环境。
硬件清单
硬件连接
软件设计
数据采集与处理
在本项目中,ESP32微控制器作为核心处理单元,负责采集传感器数据、处理和分析数据,并通过无线通信将数据传输至服务器。以下是具体的软件逻辑设计:
1.电池电压采集:
a.使用ESP32的IO0引脚采集电池电压。
b.通过模拟数字转换(ADC),将采集到的模拟电压信号转换为数字信号,便于后续处理。
2.土壤湿度采集:
a.使用ESP32的IO3引脚采集土壤湿度传感器的电压。
b.通过ADC将土壤湿度传感器的模拟电压信号转换为数字信号。
3.数据处理:
a.读取并处理电池电压和土壤湿度的数字信号,转换为实际的电压值和湿度百分比。
4.数据上报:
a.使用ESP32的WiFi模块连接至无线网络。
b.通过HTTP协议,将采集到的数据上报至服务器,便于远程监控和管理。
以下是具体的软件实现代码示例:
- #include <WiFi.h>
- #include <HTTPClient.h>
-
- // #define DATA_SEND_INTERVAL_MS 15 * 60 * 1000
- #define DATA_SEND_INTERVAL_MS 60 * 1000
-
- int lastDataSentTimestamp = 0;
- unsigned long previousMillis = 0;
- unsigned long interval = 30000;
-
- // WiFi 网络信息
- const char* ssid = "your_SSID";
- const char* password = "your_PASSWORD";
-
- // 服务器URL
- const char* serverName = "http://192.168.1.236:5000/update";
- const char* serverToken = "your_influx_token";
-
- // 定义ADC引脚
- const int batteryPin = 0; // IO0
- const int soilMoisturePin = 3; // IO3
-
- void sendData() {
- // 采集电池电压
- int batteryVoltage = analogReadMilliVolts(batteryPin)*2;
- Serial.print("BAT millivolts value = ");
- Serial.print(batteryVoltage);
- Serial.println("mV");
-
- // 采集土壤传感器电压
- int soilMoisturePercent = analogReadMilliVolts(soilMoisturePin);
- Serial.print("Soil sensor voltage = ");
- Serial.print(soilMoisturePercent);
- Serial.println("mV");
- Serial.println("--------------");
-
- // 创建HTTP客户端
- if (WiFi.status() == WL_CONNECTED) {
- HTTPClient http;
- http.begin(serverName);
- http.addHeader("Content-Type", "text/plain");
- http.addHeader("authorization", serverToken);
- // 创建POST数据
- String httpRequestData = "batteryVoltage=" + String(batteryVoltage) + "&soilMoisture=" + String(soilMoisturePercent);
-
-
- // 发送HTTP POST请求
- int httpResponseCode = http.POST(httpRequestData);
-
- // 打印响应结果
- if (httpResponseCode > 0) {
- String response = http.getString();
- Serial.println(httpResponseCode);
- Serial.println(response);
- } else {
- Serial.print("Error on sending POST: ");
- Serial.println(httpResponseCode);
- }
- // 结束HTTP请求
- http.end();
- }
- }
-
- void setup() {
- Serial.begin(115200);
- //set the resolution to 12 bits (0-4096)
- analogReadResolution(12);
-
- // 连接WiFi
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.println("Connecting to WiFi...");
- }
- Serial.println("Connected to WiFi");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- sendData();
- }
-
- void loop() {
- unsigned long currentMillis = millis();
- // if WiFi is down, try reconnecting
- if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >= interval)) {
- Serial.print(millis());
- Serial.println("Reconnecting to WiFi...");
- WiFi.disconnect();
- WiFi.reconnect();
- previousMillis = currentMillis;
- }
- if (millis() > lastDataSentTimestamp + DATA_SEND_INTERVAL_MS) {
- sendData();
-
- Serial.print("Millis since last measurement: ");
- Serial.println(millis() - lastDataSentTimestamp);
- lastDataSentTimestamp = millis();
- }
- }
-
复制代码
服务器搭建
在电脑端进行以下操作
1. 安装python 3
2. 安装flask
2.1 按下Win+R,输入cmd,进入命令面板
2.2 输入"pip install flask" 安装flask
3. 在命令行中运行python代码
- from flask import Flask, request, jsonify
-
- app = Flask(__name__)
-
- # Endpoint to handle data from Arduino
- @app.route('/update', methods=['POST'])
- def update():
- auth_header = request.headers.get('authorization')
- if auth_header == 'your_influx_token':
- data = request.data.decode('utf-8')
- print(f"Received data: {data}")
- # Process the data sent from Arduino here, such as storing it in a database
- return jsonify({"status": "success", "message": "Data received"}), 200
- else:
- return jsonify({"status": "error", "message": "Unauthorized"}), 401
-
- @app.route('/')
- def home():
- return "Hello from Flask server!", 200
-
- if __name__ == '__main__':
- app.run(host='0.0.0.0', port=5000)
复制代码
最终结果如下
结论
项目成果
通过本项目的实施,我们成功设计并实现了一套阳台植物监测系统。该系统基于ESP32微控制器、土壤湿度传感器、太阳能板和锂电池,能够实时监测阳台植物的土壤湿度,并通过无线通信实现远程数据传输和智能提醒。具体成果包括:
1.实时监测和智能提醒:
a.系统能够持续监测土壤湿度,确保植物在最佳湿度范围内生长。
b.当土壤湿度低于设定阈值时,系统能够及时向用户发送提醒,避免植物因缺水而受损。
2.节能环保设计:
a.采用太阳能板为系统供电,结合锂电池储能,实现系统的自给自足,减少对外部电源的依赖。
b.低功耗设计确保系统长时间稳定运行,进一步提升系统的实用性和环保性。
3.易于安装和使用:
a.系统设计简单,组件安装方便,用户无需专业技能即可完成设备的布置和调试。
b.直观的用户界面和易于理解的数据展示,使用户能够轻松掌握植物的生长状况。
未来展望
尽管本项目已取得显著成果,但仍有进一步改进和扩展的空间:
1.功能扩展:
a.增加温度、湿度和光照传感器,全面监测植物生长环境的各项参数,提供更科学的养护建议。
b.集成自动浇水系统,根据实时监测数据自动调整浇水量,实现更智能化的植物养护。
2.数据分析与智能化:
a.利用大数据分析和机器学习算法,对采集到的环境数据进行深入分析,预测植物的生长趋势,优化养护策略。
b.开发智能养护助手,根据历史数据和环境变化,为用户提供个性化的养护建议。
3.用户体验优化:
a.提升用户界面的设计,使其更加友好和易于操作。
b.增加数据的可视化功能,通过图表和图像展示植物生长状况,帮助用户更直观地了解植物的健康情况。
|