本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:能够实现远程温湿度监测的 IOT 系统
原帖网址为:https://verimake.com/topics/194 (旧版论坛网址,已失效)
原帖作者为:hi(旧版论坛 id = 70,注册于 2020-09-23 11:08:34)
原帖由作者初次发表于 2021-04-30 16:29:00,最后编辑于 2021-04-30 16:29:00(编辑时间可能不准确)
截至 2021-12-18 14:27:30 备份数据库时,原帖已获得 789 次浏览、0 个点赞、0 条回复
1.概述
我们发展科技,是为了用科技更好的生活,物联网就是科技能为我们生活带来便利的最直接体现,所谓物联网系统,就是将实物与网络连接,通过网络获取有效信息或者发送命令控制物体,本次实验,就选择一个用处很广的温湿度传感器,与服务器连接,实时传输并显示采样的数据,以便更好地管理和控制不同的应用场景。
实用场景:
制药行业:制药行业的风险控制中,灭菌效果是重中之重。大多数灭菌采用的是热力灭菌,因此对温度数据的监测在制药行业里有相当重要的地位。对于无菌制剂,制药行业规范要求需定期进行温度验证。因此,在制药行业中对温度数据采集的准确性要求非常高。
空气净化器:随着消费者对大气污染关注度的不断提高,空气净化产品逐渐成为市场上的焦点,很多人家里都安装了空气净化器。空气净化器包含温湿度传感器,其作用是检测室内湿度(干燥状态),净化器根据该数据控制加湿量,即可保证室内环境在一定的湿度范围内,以保持最舒适的湿度。
智能农业监测:温湿度传感器推广了“智能大棚”建设。技术员在家里通过电脑或者是手机,都可直接遥控指挥。如发现棚内的温度超过某值,就可以通过手机遥控直接把整个设施棚内的风机打开。土壤湿度低于某个值,立即开始喷淋灌溉,人可以做到在任何时间任何地点来进行这一块管控。实现了智能大棚远程管理模式。
以上提到了温湿度传感器的个别应用场景,除此之外还有很多,根据不同的需求也可以使用更多的传感器来实现不同效果。
2.所需材料
NanoC *1,ESP-01S WiFi 模块 *1,dht11 温湿度模块 *1,母对母杜邦线 *8。
3.系统框架
框架介绍:
整个硬件设备是由一块兼容 arduino 的 VeriMake nanoC 板子作为主控板,连接有 dht11 温湿度传感器模块,ESP-01S WiFi 模块,接线图如下所示。传感器采样数据,通过 ESP-01S WiFi 模块实现设备与网络的互连,我们可以根据不同的需要使用不同的传感器。关于 esp8266WiFi 模块的介绍,参见如下 esp8266-01s介绍与使用_Nie_Hen的博客-CSDN博客
通过mqtt 协议实现数据与服务器之间的通信,mqtt 具体介绍可参考 MQTT 入门介绍 | 菜鸟教程 (runoob.com)。安装mqtt到ubuntu,需要在服务器上执行以下命令。
sudo apt-get install mosquitto-clients
Things Board 可以当作一个接收并显示数据的平台,我们搭建好Things Board 后,接收到的数据先传入后端,存入安装好的数据库,再显示在设置好的仪表盘中。Things Board 搭建看这里 https://verimake.com/d/129-ubuntu-vps-thingsboard
4.设备接线
dht11模块:
GND—GND
DATA—4
VCC—5V
esp-01s WIFI 模块:
TX—2
EN—3V3
3V3—3V3
GND—GND
RX—3
5. ESP 端代码及配置
首先:ESP-01S 的默认波特率为115200,需要将他改为9600才能够跟控制板通信,我们通过从串口发送AT指令的方法来设置波特率,首先在 arduino IDE 上运行如下代码。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
运行后打开串口监视器
在串口i监视器中输入如下AT指令设置波特率,输入后点击发送。
AT+UART_DEF=9600,8,1,0,0
如图则为成功设置
6. NanoC 端代码
代码流程图
#include "DHT.h"
#include <WiFiEspClient.h>
#include <WiFiEsp.h>
#include <WiFiEspUdp.h>
#include "SoftwareSerial.h"
#include <ThingsBoard.h>
#define WIFI_AP "WIFI名称" //双引号内换成自己WiFi名称
#define WIFI_PASSWORD "WiFi密码" //双引号内换成WiFi密码
// DHT
#define DHTPIN 4
#define DHTTYPE DHT11
char thingsboardServer[] = "IP地址"; //双引号内换成服务器主机IP
char TOKEN[] = "添加的设备的访问令牌"; //things board上复制设备访问令牌,粘贴到这里
// Initialize the Ethernet client object
WiFiEspClient espClient;
// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);
ThingsBoard tb(espClient);
SoftwareSerial soft(2, 3); // (nanoC) RX, TX
int status = WL_IDLE_STATUS;
unsigned long lastSend;
void setup() {
// initialize serial for debugging
Serial.begin(9600);
dht.begin();
InitWiFi();
lastSend = 0;
}
void loop() {
status = WiFi.status();
if ( status != WL_CONNECTED) {
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(WIFI_AP);
// Connect to WPA/WPA2 network
status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
delay(500);
}
Serial.println("Connected to AP");
}
if ( !tb.connected() ) {
reconnect();
}
if ( millis() - lastSend > 1000 ) { // Update and send only after 1 seconds
getAndSendTemperatureAndHumidityData();
lastSend = millis();
}
tb.loop();
}
void getAndSendTemperatureAndHumidityData()
{
Serial.println("Collecting temperature data.");
// Reading temperature or humidity takes about 250 milliseconds!
float humidity = dht.readHumidity();
// Read temperature as Celsius (the default)
float temperature = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.println("Sending data to ThingsBoard:");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C ");
tb.sendTelemetryFloat("temperature", temperature);
tb.sendTelemetryFloat("humidity", humidity);
}
void InitWiFi()
{
// initialize serial for ESP module
soft.begin(9600);
// initialize ESP module
WiFi.init(&soft);
// check for the presence of the shield
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue
while (true);
}
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(WIFI_AP);
// Connect to WPA/WPA2 network
status = WiFi.begin(WIFI_AP, WIFI_PASSWORD);
delay(500);
}
Serial.println("Connected to AP");
}
void reconnect() {
// Loop until we're reconnected
while (!tb.connected()) {
Serial.print("Connecting to ThingsBoard node ...");
// Attempt to connect (clientId, username, password)
if ( tb.connect(thingsboardServer, TOKEN) ) {
Serial.println( "[DONE]" );
} else {
Serial.print( "[FAILED]" );
Serial.println( " : retrying in 5 seconds" );
// Wait 5 seconds before retrying
delay( 5000 );
}
}
}
7.调试
代码编译后,需要在服务器上把 mqtt 的端口打开,在安全组中添加如下端口。
把代码上传到硬件中,打开串口监视器,可以看到硬件先连接上 WiFi ,再连接上 Things Board ,然后显示测得数据。
8.结果
如果仪表盘已经设置好,那么打开 Things Board 网页点击仪表板库,就可以看到数据以仪表盘的形式显示出来。
把仪表盘和对应的设备数据都设为公开,会生成一个链接,访问这个链接就能直接看到所设置的仪表盘,如下是我设置好的仪表盘,可点击访问。点我查看