能够实现远程温湿度监测的 IOT 系统

教程 hi ⋅ 于 2021-04-30 16:29:00 ⋅ 736 阅读

1.概述

我们发展科技,是为了用科技更好的生活,物联网就是科技能为我们生活带来便利的最直接体现,所谓物联网系统,就是将实物与网络连接,通过网络获取有效信息或者发送命令控制物体,本次实验,就选择一个用处很广的温湿度传感器,与服务器连接,实时传输并显示采样的数据,以便更好地管理和控制不同的应用场景。
实用场景:
制药行业:制药行业的风险控制中,灭菌效果是重中之重。大多数灭菌采用的是热力灭菌,因此对温度数据的监测在制药行业里有相当重要的地位。对于无菌制剂,制药行业规范要求需定期进行温度验证。因此,在制药行业中对温度数据采集的准确性要求非常高。
空气净化器:随着消费者对大气污染关注度的不断提高,空气净化产品逐渐成为市场上的焦点,很多人家里都安装了空气净化器。空气净化器包含温湿度传感器,其作用是检测室内湿度(干燥状态),净化器根据该数据控制加湿量,即可保证室内环境在一定的湿度范围内,以保持最舒适的湿度。
智能农业监测:温湿度传感器推广了“智能大棚”建设。技术员在家里通过电脑或者是手机,都可直接遥控指挥。如发现棚内的温度超过某值,就可以通过手机遥控直接把整个设施棚内的风机打开。土壤湿度低于某个值,立即开始喷淋灌溉,人可以做到在任何时间任何地点来进行这一块管控。实现了智能大棚远程管理模式。
以上提到了温湿度传感器的个别应用场景,除此之外还有很多,根据不同的需求也可以使用更多的传感器来实现不同效果。

2.所需材料

NanoC 1,ESP-01S WiFi 模块 1,dht11 温湿度模块 1,母对母杜邦线 8。

3.系统框架

file

框架介绍:

整个硬件设备是由一块兼容 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/topics/177

4.设备接线

file

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());
  }
}

运行后打开串口监视器

file

在串口i监视器中输入如下AT指令设置波特率,输入后点击发送。

AT+UART_DEF=9600,8,1,0,0

file

如图则为成功设置

file

6. NanoC 端代码

代码流程图

file

#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 的端口打开,在安全组中添加如下端口。

file

把代码上传到硬件中,打开串口监视器,可以看到硬件先连接上 WiFi ,再连接上 Things Board ,然后显示测得数据。

file

8.结果

如果仪表盘已经设置好,那么打开 Things Board 网页点击仪表板库,就可以看到数据以仪表盘的形式显示出来。

file

把仪表盘和对应的设备数据都设为公开,会生成一个链接,访问这个链接就能直接看到所设置的仪表盘,如下是我设置好的仪表盘,可点击访问。点我查看

成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter