基于ESP32和公有云平台的农产品二维码溯源系统|毕设答辩|单片机项目|毕业设计

题目:基于ESP32和公有云平台的农产品二维码溯源系统
一、项目介绍
摘要
针对传统农产品溯源系统存在的数据采集不实时、信息不透明、成本高、易篡改等问题,本文设计并实现了一种基于ESP32和公有云平台的农产品二维码溯源系统。系统采用“感知层-传输层-云平台层-应用层”四层架构,以ESP32嵌入式芯片为核心,搭载DHT11、GY-30等传感器实现种植环境参数实时采集,通过MQTT协议完成数据无线传输,基于ThingsBoard云平台实现数据存储、可视化与异常告警,借助ZXing库生成唯一溯源二维码,实现农产品从种植、加工到销售的全链条追溯。通过系统测试验证,该系统数据采集精度高、传输稳定,二维码扫码响应时间≤1秒,数据传输成功率≥98%,单套采集终端成本控制在200元以内,具备低成本、易推广、高可靠的特点,可有效解决传统溯源模式的痛点,为农产品质量安全监管提供技术支撑,助力智慧农业高质量发展。
关键词:ESP32;农产品溯源;物联网;MQTT协议;二维码
研究内容与技术路线
本研究围绕基于ESP32和公有云平台的农产品二维码溯源系统展开,核心研究内容包括四大方面,兼顾技术实现与实际应用,确保系统的可行性、实用性和经济性。第一,系统需求分析与技术选型。通过调研农产品生产、流通、监管各环节的核心需求,明确系统的功能需求、性能需求和安全需求;结合成本控制与技术适配性,完成核心技术选型,包括ESP32嵌入式开发平台、MQTT物联网通信协议、ThingsBoard公有云平台及二维码编码解码技术,构建系统的技术框架。
第二,系统总体设计与模块划分。基于需求分析结果,确定系统的设计目标与原则,构建“感知层-传输层-云平台层-应用层”的四层架构;划分硬件采集模块、数据传输模块、云平台存储与处理模块、二维码生成与解析模块、用户交互模块五大功能模块,明确各模块的核心功能与交互逻辑,设计系统的整体工作流程,确保各环节数据无缝衔接。
第三,系统硬件与软件的设计实现。硬件层面,完成ESP32主控模块、环境感知传感器模块(土壤温湿度、光照、农药残留等)的电路设计,实现传感器与主控模块的接口适配,完成硬件组装与调试,确保数据采集的准确性和稳定性。软件层面,开发ESP32嵌入式端数据采集与传输程序,实现传感器数据的实时采集、预处理与MQTT协议传输;配置公有云平台,实现数据存储、解析、可视化展示与异常预警功能;开发二维码生成与解析程序,为每批农产品生成唯一溯源二维码,实现溯源信息的便捷查询。
第四,系统测试与优化。搭建系统测试环境,设计功能测试、性能测试和兼容性测试方案,对硬件模块的采集精度、数据传输的稳定性、云平台的响应速度及二维码溯源的准确性进行全面测试;分析测试结果,针对存在的问题进行优化调整,提升系统的可靠性和实用性,最终形成一套低成本、易推广、全链条的农产品二维码溯源解决方案。
本研究采用“理论调研-需求分析-方案设计-开发实现-测试优化”的技术路线,确保研究工作有序推进。首先,通过查阅国内外相关文献、调研行业现状,明确研究背景、意义与研究切入点;其次,开展需求调研,完成技术选型与系统总体设计;再次,分模块实现硬件电路设计、嵌入式程序开发、云平台配置及二维码功能开发;最后,通过系统测试发现问题并优化,形成研究成果,为农产品溯源技术的推广应用提供实践参考。整个研究过程注重理论与实践结合,兼顾技术先进性与实际适用性,确保系统能够真正服务于农业生产实践。
二、文档介绍





三、项目截图





C++
#include <Arduino.h>
#include <DHT.h>
#include <BH1750.h>
#include <Wire.h>
// 传感器引脚定义
#define DHT11_PIN 15
#define SOIL_PIN 36
// 传感器对象初始化
DHT dht(DHT11_PIN, DHT11);
BH1750 lightMeter;
// 全局变量定义
float airTemp, airHum, lightVal, soilHum;
unsigned long lastCollectTime = 0;
const int collectInterval = 5000; // 采集间隔5秒
void setup() {
Serial.begin(115200);
dht.begin();
Wire.begin(4, 32); // I2C引脚初始化
lightMeter.begin();
pinMode(SOIL_PIN, INPUT);
}
void loop() {
// 定时采集数据
if (millis() - lastCollectTime >= collectInterval) {
lastCollectTime = millis();
// 采集传感器数据
airTemp = dht.readTemperature();
airHum = dht.readHumidity();
lightVal = lightMeter.readLightLevel();
soilHum = map(analogRead(SOIL_PIN), 0, 4095, 100, 0); // 土壤湿度值转换
// 滑动平均滤波预处理
static float tempBuf[5], humBuf[5], lightBuf[5], soilBuf[5];
static int bufIndex = 0;
tempBuf[bufIndex] = airTemp;
humBuf[bufIndex] = airHum;
lightBuf[bufIndex] = lightVal;
soilBuf[bufIndex] = soilHum;
bufIndex = (bufIndex + 1) % 5;
// 计算平均值
airTemp = (tempBuf[0]+tempBuf[1]+tempBuf[2]+tempBuf[3]+tempBuf[4])/5;
airHum = (humBuf[0]+humBuf[1]+humBuf[2]+humBuf[3]+humBuf[4])/5;
lightVal = (lightBuf[0]+lightBuf[1]+lightBuf[2]+lightBuf[3]+lightBuf[4])/5;
soilHum = (soilBuf[0]+soilBuf[1]+soilBuf[2]+soilBuf[3]+soilBuf[4])/5;
// 封装为JSON格式
String jsonData = "{\"deviceId\":\"ESP32_001\",\"time\":" + String(millis()) +
",\"airTemp\":" + String(airTemp) +
",\"airHum\":" + String(airHum) +
",\"lightVal\":" + String(lightVal) +
",\"soilHum\":" + String(soilHum) + "}";
Serial.println(jsonData);
// 调用MQTT传输函数发送数据
sendMqttData(jsonData);
}
}
// MQTT数据发送函数(声明)
void sendMqttData(String data);
C++
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi与MQTT配置
const char* ssid = "Agriculture_WiFi";
const char* password = "12345678";
const char* mqttServer = "thingsboard.cloud";
const int mqttPort = 1883;
const char* mqttToken = "A1_TEST_TOKEN_001";
WiFiClient espClient;
PubSubClient client(espClient);
void setupWiFi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void callback(char* topic, byte* payload, unsigned int length) {
// 处理云平台下发的RPC指令
Serial.print("Message arrived: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
// 解析指令,如调整采集间隔
// 此处省略指令解析逻辑
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32_001", mqttToken, "")) {
Serial.println("connected");
// 订阅RPC指令主题
client.subscribe("v1/devices/me/rpc/request/+");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void sendMqttData(String data) {
if (!client.connected()) {
reconnect();
}
client.loop();
// 发布遥测数据至ThingsBoard
client.publish("v1/devices/me/telemetry", data.c_str());
}
void setup() {
// 其他初始化代码...
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
setupWiFi();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 其他业务逻辑...
}
Python
import qrcode
import requests
# 配置参数
THINGSBOARD_URL = "https://thingsboard.cloud/api"
API_TOKEN = "ADMIN_TOKEN"
BATCH_ID = "BATCH_20240501_001"
# 生成溯源信息链接
trace_url = f"{THINGSBOARD_URL}/plugins/telemetry/DEVICE/ESP32_001/values/timeseries?keys=airTemp,airHum,lightVal,soilHum&batchId={BATCH_ID}"
# 生成二维码
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECTION_M,
box_size=10,
border=4,
)
qr.add_data(trace_url)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(f"trace_qr_{BATCH_ID}.png")
# 将二维码链接关联至批次资产
headers = {"Content-Type": "application/json", "X-Authorization": f"Bearer {API_TOKEN}"}
data = {"qr_url": f"/static/qr/trace_qr_{BATCH_ID}.png"}
requests.post(f"{THINGSBOARD_URL}/plugins/telemetry/ASSET/{BATCH_ID}/values/attributes", headers=headers, json=data)
更多推荐
所有评论(0)