不喜欢按所谓的标准格式写“可行性研究、需求分析、系统设计,模块测试,总结,参考文献,源码附录”
一、引言
随着信息技术的飞速发展,无线传感器网络(WSN)技术在各领域中得到了广泛应用。特别是在粮食储藏管理中,传统粮仓管理面临着管理效率低下、监管困难、信息不透明等一系列挑战。为了解决这些问题,智能粮仓监测系统应运而生,无线传感器网络技术的引入为粮仓的实时监测和管理带来了革命性的变革。本文旨在设计一种基于无线传感器网络的智能粮仓监测系统,以提高粮食储藏的效率和安全性。
二、系统概述
1.设计目标
本设计旨在构建一种能够实时监测粮仓内温度、湿度等环境参数的智能粮仓监测系统,并通过无线传感网络将数据实时传输到远程监控中心,实现粮仓的远程管理和智能控制。
- 系统组成
智能粮仓监测系统主要由无线传感器节点、协调器节点、网关和远程监控中心组成。无线传感器节点负责采集粮仓内的环境参数,协调器节点负责将采集到的数据汇聚并传输给网关,网关将数据通过有线或无线网络传输到远程监控中心。
三、无线传感器网络设计
1.传感器节点设计
传感器节点采用低功耗设计,内置温湿度传感器、空气监测传感器,烟雾报警等,能够实时监测粮仓内的环境参数。节点之间通过无线方式进行通信,将数据传输到协调器节点。
2.通信模块设计
通信模块设计负责接收来自传感器节点的数据,并将数据汇聚后通过网关传输到远程监控中心。协调器节点还负责网络的组织和管理,确保网络的稳定性和可靠性。本系统使用esp8266作为网关节点与网关节点连接通信。
- 网关设计
网关作为无线传感器网络与有线网络之间的桥梁,负责将无线传感器网络中的数据转换为有线网络可识别的格式,并通过有线网络将数据传输到远程监控中心。本系统使用wifi路由器作网关(使用设计热点模拟)。
四、系统实现
1.1硬件配置
根据系统设计要求,选arduino uno作为传感器节点微处理器,mq-2烟雾传感器,dh温湿度传感器,火焰传感器,舵机,esp8266通信模块,继电器,L298N等。硬件连接框图如4-1。
图 4-1-1
1.2烧录代码
首先需要编写代码设置wifi模块,确保通信模块与单片机进行数据交换同时将数据上传服务器.对Esp8266烧录的程序源码如下。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define BUILTIN_LED 2
char P_NAME[] = "pangchao"; //设置热点名称,根据自己的热点名称修改
char P_PSWD[] = "qq8164731"; //设置热点密码,根据自己的密码修改
char sub[] = "Sub/100813"; //设置设备SUB名称
char pub[] = "Pub/100813"; //设置设备PUB名称
const char *ssid = P_NAME;
const char *password = P_PSWD;
const char *mqtt_server = "easyiothings.com";
String reStr;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
void setup_wifi()
{
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
randomSeed(micros());
}
void callback(char *topic, byte *payload, unsigned int length)
{
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect()
{
while (!client.connected())
{
String clientId = "ESP8266Client";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str()))
{
client.publish(pub, "{\"State\":\"OnLine\"}");
client.subscribe(sub);
}
else
{
Serial.print(client.state());
delay(5000);
}
}
}
void setup()
{
pinMode(BUILTIN_LED, OUTPUT);
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
digitalWrite(BUILTIN_LED, HIGH);
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
if (Serial.available() > 0)
{
reStr = Serial.readStringUntil('\n');
//检测json数据是否完整
int jsonBeginAt = reStr.indexOf("{");
int jsonEndAt = reStr.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1)
{
reStr = reStr.substring(jsonBeginAt, jsonEndAt + 1);
int str_len = reStr.length() + 1;
char char_array[str_len];
reStr.toCharArray(char_array, str_len);
client.publish(pub, char_array);
}
}
除了通信模块,作为微处理器的主板Arduino uno也需要编写对应的代码实现传感器信息采集及控制功能。
#include <ArduinoJson.h> //导入JSON库,用来封装发送数据的格式
#include <DHT.h> //导入温湿度传感器库
#include <Servo.h> //控制舵机的库
#include <Arduino.h>
StaticJsonDocument<200> sendJson; // 创建JSON对象,用来存放发送数据
StaticJsonDocument<200> readJson; // 创建JSON对象,用来存放接收到的数据
unsigned long lastUpdateTime = 0; //记录上次上传数据时间
const unsigned long updateInterval = 4000; // 在这里设置数据发送至云平台的时间间隔,单位为毫秒
//定义传感器相关的引脚
#define BUZZER 11
#define DHTPIN 10 //定义温湿度传感器引脚为10
#define DHTTYPE DHT11 //定义温湿度传感器型号为DHT11
#define CURTAIN 9 //设定舵机(窗户)的Arduino引脚为9
#define COPEN 10 //设定舵机的角度,窗户开启时舵机的角度
#define CCLOSE 100 //窗户关闭时舵机的角度
#define FIRE 8 //设定火焰传感器连接的Arduino引脚为8
#define LED 7 //设定LED灯引脚为7
#define FAN 6 //设定继电器(风扇)的引脚为6
/*定义烟雾传感器A0,D0引脚*/
#define Sensor_AO A0
#define Sensor_DO 3
//定义相关的变量
long ID = 100813; // 定义设备ID号,替换成云平台生成的ID号
float temperature, humidity,smoke; // 定义温湿度变量
int lightState,fireState,fanState,curtainState; // 定义灯光,火焰,继电器(风扇),窗户状态(0代表无或者关闭,1代表有或者打开)
int airTemperatureSet=26; // 定义风扇的设定温度,默认26度
DHT dht(DHTPIN, DHTTYPE); //创建dht对象,用于操作温湿度传感器
Servo curtainServo; // 创建舵机对象,用来控制窗户的舵机
// Arduino的初始化函数,仅在通电时运行一次
void setup()
{
Serial.begin(9600); //初始化串口,用于和esp8266进行通信,完成数据的接收与上传
dht.begin(); //初始化温湿度传感器
curtainServo.attach(CURTAIN); //初始化9号引脚为舵机引脚
pinMode(FIRE, INPUT); //初始化火焰传感器引脚为输入模式
pinMode(LED, OUTPUT); //初始化LED灯引脚为输出模式
pinMode(FAN, OUTPUT); //初始化继电器(风扇)引脚为输出模式
}
// Arduino的loop函数,当setup函数执行完毕后进入该函数并一直循环运行
void loop()
{
// 该函数段可完成数据定时上报的功能,并且不会阻塞loop函数的运行
if (millis() - lastUpdateTime > updateInterval)
{
sendJsonData();
lastUpdateTime = millis();
}
// 当用户使用手机控制当前设备时ESP8266会通过串口向Arduino发送指令,该函数段可判断串口有没有接收到消息,并完成对用户消息的解析
while (Serial.available() > 0) { // 判断串口缓冲区是否有消息
String inputString = Serial.readStringUntil('\n'); //从串口缓冲区读入数据,并赋值给inputString变量(String变量为Arduino独有变量类型,可以简化字符串操作)
//检测json数据是否完整,若通过则进行下一步的处理
/*
云平台向硬件下发JSON的格式为 {"Light":"1"} 类型的字符串,通常叫键值对,C语言中叫做哈希表。
左边的"FAN"为我们在云平台中定义的标识符,右边为具体的指令
*/
int jsonBeginAt = inputString.indexOf("{");
int jsonEndAt = inputString.lastIndexOf("}");
if (jsonBeginAt != -1 && jsonEndAt != -1)
{
inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1); //净化json数据
deserializeJson(readJson, inputString); //通过ArduinoJSON库将JSON字符串转换为方便操作的对象
// 判断接收的指令
if (readJson.containsKey("LightState")) //判断云平台下发的消息是否包含Light标识符,如果是则进行下一步处理
{
digitalWrite(LED, (int)readJson["LightState"]); // 根据Light的值来控制小灯,0为关,1为开,由于是char类型,所以我们需要转换为int
delay(100);
lightState = digitalRead(LED); // 及时更新小灯的状态信息,这样云平台才能知道是否控制成功
}
else if(readJson.containsKey("CurtainState")) // 若添加了多个功能,则使用else if隔开
{
//更新curtain的值
curtainState = (int)readJson["CurtainState"];
}
// 风扇开关设定
else if(readJson.containsKey("FanState")){
fanState = (int)readJson["FanState"]; // 让Arduino中的风扇设定值更新为云平台下放的值
}
// 风扇温度设定
else if(readJson.containsKey("AirTemperatureSet")){
airTemperatureSet = (int)readJson["AirTemperatureSet"]; // 让Arduino中的风扇设定值更新为云平台下放的值
}
delay(500);
sendJsonData(); //向云平台发送最新的信息
}
}
//判读curtainState的值是否为1,是则让舵机转到开启的角度,否则关闭
if(curtainState){
curtainServo.write(COPEN);
}
else{
curtainServo.write(CCLOSE);
}
//判断风扇是否为开启的状态
if(curtainState){
// 判断当前室内温度是否低于设定温度,是则触发继电器,否则关闭
if(temperature<airTemperatureSet){
digitalWrite(FAN,HIGH);
}
else{
digitalWrite(FAN,LOW);
}
}
else{
digitalWrite(FAN,LOW);
}
//读取传感器数据
fireState = digitalRead(FIRE); //火焰传感器
// 温湿度传感器
temperature = dht.readTemperature();
humidity = dht.readHumidity();
lightState = digitalRead(LED); //LED灯状态
}
//上传数值
void sendJsonData()
{
// 将数据添加到JSON对象中,左边为在云平台中定义的标识符,右边为变量
sendJson["ID"] = ID;
sendJson["Temperature"] = temperature;
sendJson["Humidity"] = humidity;
sendJson["LightState"] = lightState;
sendJson["FanState"] = fanState;
sendJson["CurtainState"] = curtainState;
sendJson["FireState"] = fireState;
sendJson["AirTemperatureSet"] = airTemperatureSet;
sendJson["smoke"] = smoke;
//将对象转换成字符串,并向ese8266发送消息
serializeJson(sendJson, Serial);
Serial.print("\n");
}
- 软件设计
编写传感器节点的数据采集和传输程序,编写协调器节点的数据汇聚和传输程序,以及编写网关的数据转换和传输程序。同时,设计远程监控中心的界面和功能,实现数据的实时显示、存储和分析。服务端相关技术:Spring boot、MyBatis、Spring Security、Jwt、Mysql、Redis、TDengine、EMQX、Netty等开发工具:IDEA。Web端相关技术:ES6、Vue、Vuex、Vue-router、Vue-cli、Axios、Element-ui、Echart等开发工具:Visual Studio Code。本系统采用易联智能物联网平台。平台系统架构图分析如图2-1.
图2-1
- 系统测试
对搭建好的系统进行测试,验证系统的稳定性和可靠性。测试内容包括传感器节点的数据采集精度、无线通信的稳定性、数据的实时传输等。
五、结论与展望
本文设计了一种基于无线传感器网络的智能粮仓监测系统,通过实时监测粮仓内的环境参数,提高了粮食储藏的效率和安全性。系统采用低功耗设计,降低了能耗和成本,同时支持远程监控和智能控制,为粮食储藏管理提供了有力的技术支持。未来,可以进一步优化系统的性能和功能,如增加更多的传感器类型、提高数据传输速率等,以满足更广泛的应用需求。
遇到问题可联系作者qq:2917671185