|
本帖最后由 点点&木木 于 2019-4-12 20:37 编辑 在这项研究中,硬件设计使用ESP8266微控制器作为传感器节点和英特尔Edison微型计算机作为代理。
硬件组件 ESP Wemos D1 Mini × 1 英特尔爱迪生 × 1 适用于英特尔®Edison的SparkFunBlock - Base × 1 DHT22温度传感器 × 1 介绍 一个物联网应用是一个监控和控制系统,将传感器和执行器连接到一个环境。来自传感器的测量数据可以被发送到云服务器,以便想要知道来自该环境的物理量的状况或测量的用户可以访问它。可以响应于从环境获得的传感器值的读数来控制致动器。从物联网构建的系统的重要期望是在机器和其他机器之间运行通信,以便系统可以提供准确的信息。因此,系统可以在决策中变得更聪明。现在变得流行的一件事是增加廉价的电子硬件和软件的可用性 在编写这个独立的任务时,需要提出问题的界限,以便让受试者更专注: 如何设计和实现基于英特尔Edison的硬件作为代理,EPS8266作为传感器节点,Node-RED软件作为测量数据的可视化。 如何使用Message Queue遥测传输(MQTT)协议发送和接收数据。
Sparkfun英特尔Edison模块 消息队列遥测传输(MQTT) 消息队列遥测传输(MQTT)是基于发布者和订户模型的机器(M2M)通信协议,其中该协议具有小的数据包大小(最小2字节),因此电力消耗也非常小。MQTT工作系统由三个主要组件组成,即发布者,订阅者和代理。Publisher的任务是向服务器/代理发送特定主题的消息。订阅者有责任从服务器/代理接收特定主题的消息。发布者和订阅者可以是传感器,执行器和移动应用程序,连接到使通信异步的代理。 MQTT协议工作系统的图示如下图所示,客户端订户(移动应用程序)可以接收客户端发布者(传感器节点/执行器)发送的传感器数据,因此客户端订户可以使用与主题提供的主题相同的主题。发布者客户。同样,如果传感器/执行器节点被给予执行动作的命令,则移动客户端应用程序给出的主题必须与传感器/执行器节点上的主题相同。
MQTT协议工作系统 发布/子系统的优点是发送源(发布者)和数据接收者(订阅者)之间不相互了解,因为它们之间存在代理,其中发布者和客户端订阅者不需要同时连接例如,客户订阅者在订阅代理后可以断开连接,片刻之后客户端连接回代理并仍然会收到延迟数据,此过程称为脱机模式。MQTT协议被广泛用于制作物联网(IoT)解决方案,因为MQTT易于使用。支持MQTT的代理的例子包括mosquitto,RabbitMQ,HiveMQ,ActiveMQ等。同时对于支持物联网的硬件,有很多,像Arduino,Esp8266,STM32,Raspberry Pi等。 履行 将使用在英特尔Edison微型计算机中编程的ESP8266和Node-RED微控制器,即通过模拟室内和室外的温度和湿度监测来设计该系统的2个传感器节点的设计。微控制器可用于执行以下过程:测量和控制,数据检索,从传感器客户端节点向代理发送数据,从代理接收数据到客户端,例如移动应用程序或个人计算机(PC)。 在设计该系统时,数据处理的主要元素是ESP8266型微型卷积机。该微控制器负责通过微控制器的数字输出端口处理DHT22传感器数据。通过使用MQTT协议,可以无线地完成微控制器与移动应用程序或PC之间的通信。图1.3是一个硬件系统设计,由两个DHT22传感器组成,这两个传感器连接到每个称为传感器节点的ESP8266 wemos微控制器。模拟两个传感器节点的场景具有不同的功能: 节点1用于测量房间(室内)的温度和湿度。 节点2用于测量室外的温度和湿度。
图1.3 英特尔Edison代理使用MQTT协议的数据采集设计系统可以从两个传感器节点接收传感器数据,然后用户可以接收传感器数据,以便传感器测量数据可以存储并显示在实时图表上。图1.4显示了安装在英特尔Edison上的Node-RED程序的设计,该程序用作两个传感器节点和Edison Intel的接口。作为订户的节点RED被赋予与传感器节点发布的主题。来自传感器节点的有效载荷数据格式(来自DHT22的测量数据)是json数据格式,因此订户(Node-RED)将接受相同的数据格式。
图1.4 在程序的循环功能中,发送由读取温度和湿度数据组成的有效载荷传感器的过程具有json的格式。用于向服务器发送数据的MQTT的已发布主题是“sensordht / inside”和“sensordht /outside”。已安装Node-RED的Edison Intel可通过提供相同的订阅主题来接收传感器有效负载。因此,发送和接收有效载荷传感器的过程可以根据传感器节点和英特尔Edison作为MQTT服务器的设计或集成来运行。总的来说,硬件设计系统的实现可以在图1.5中看到。
图1.5:硬件设计系统的实现 在Influxdb上可视化数据实时节点RED和数据收集 在测试硬件(即ESP8266传感器节点和英特尔Edison微控制器作为MQTT服务器的集成)之后,通过Node-RED仪表板实现测量数据的可视化。接口软件设计的实现旨在实时显示来自两个传感器节点(ESP8266微控制器)的测量数据。
图1.6。 Node-RED数据板上有4个物理量可视化,包括Tout(室外温度),Tin(室内温度),Hout(室外湿度),Hin(室内湿度)。可视化Node-RED仪表板上的整个数据,如图1.7所示。
图1.7 通过将Wemos ESP8266微控制器作为传感器节点和英特尔Edison作为代理进行集成,成功测试了使用MQTT协议的数据采集系统的设计。使用Node-RED软件成功地将温度和湿度测量模拟的场景作为整个系统的实现可视化。来自两个传感器节点的DHT22测量/有效载荷数据已成功存储在Influxdb数据库中。 原理图
代码 #include <PubSubClient.h> #include <ESP8266WiFi.h> #include <Adafruit_Sensor.h> #include <DHT.h> //library JSON #define DHTPIN D4 #define DHTTYPE DHT22 const char* ssid = ""; const char* password = ""; const char* mqtt_server = ""; WiFiClient espClient; PubSubClient client(espClient); long lastData = 0; DHT dht(DHTPIN, DHTTYPE); void setup_wifi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned intlength) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload); } Serial.println(); if ((char)payload[0] == '1') { digitalWrite(D2, HIGH); } if((char)payload[0] == '0'){ digitalWrite(D2, LOW); } } void reconnect() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("connected"); client.publish("sensordht", "Data sensor"); client.subscribe("inputKendali"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { pinMode(D4, OUTPUT); Serial.begin(115200); dht.begin(); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); float h = dht.readHumidity(); float t = dht.readTemperature(); if(isnan(h) || isnan(t)){ Serial.println("Failed to read from DHT sensor"); return; } String temperature = String(t); String humidity = String(h); String payload = temperature; payload += ","; payload += humidity; String payload = "{"; payload += "temperature: "; payload += temperature; payload += ","; payload += "humidity: "; payload += humidity; payload += ","; payload += "}"; char dataSensor[200]; long now = millis(); if (now - lastData > 5000) { lastData = now; payload.toCharArray(dataSensor, 200); client.publish("sensordht", dataSensor); Serial.print(dataSensor); } } |
微信公众号
手机版