题目:基于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>// 传感器引脚定义#defineDHT11_PIN15#defineSOIL_PIN36// 传感器对象初始化DHTdht(DHT11_PIN,DHT11);BH1750 lightMeter;// 全局变量定义floatairTemp,airHum,lightVal,soilHum;unsignedlonglastCollectTime=0;constintcollectInterval=5000;// 采集间隔5秒voidsetup(){Serial.begin(115200);dht.begin();Wire.begin(4,32);// I2C引脚初始化lightMeter.begin();pinMode(SOIL_PIN,INPUT);}voidloop(){// 定时采集数据if(millis()-lastCollectTime>=collectInterval){lastCollectTime=millis();// 采集传感器数据airTemp=dht.readTemperature();airHum=dht.readHumidity();lightVal=lightMeter.readLightLevel();soilHum=map(analogRead(SOIL_PIN),0,4095,100,0);// 土壤湿度值转换// 滑动平均滤波预处理staticfloattempBuf[5],humBuf[5],lightBuf[5],soilBuf[5];staticintbufIndex=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数据发送函数(声明)voidsendMqttData(String data);C++#include<WiFi.h>#include<PubSubClient.h>// WiFi与MQTT配置constchar*ssid="Agriculture_WiFi";constchar*password="12345678";constchar*mqttServer="thingsboard.cloud";constintmqttPort=1883;constchar*mqttToken="A1_TEST_TOKEN_001";WiFiClient espClient;PubSubClientclient(espClient);voidsetupWiFi(){delay(10);WiFi.begin(ssid,password);while(WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("\nWiFi connected");}voidcallback(char*topic,byte*payload,unsignedintlength){// 处理云平台下发的RPC指令Serial.print("Message arrived: ");for(inti=0;i<length;i++){Serial.print((char)payload[i]);}// 解析指令,如调整采集间隔// 此处省略指令解析逻辑}voidreconnect(){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);}}}voidsendMqttData(String data){if(!client.connected()){reconnect();}client.loop();// 发布遥测数据至ThingsBoardclient.publish("v1/devices/me/telemetry",data.c_str());}voidsetup(){// 其他初始化代码...client.setServer(mqttServer,mqttPort);client.setCallback(callback);setupWiFi();}voidloop(){if(!client.connected()){reconnect();}client.loop();// 其他业务逻辑...}Pythonimportqrcodeimportrequests# 配置参数 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)