Отже, щось згадуємо, а щось знаходимо в інтернеті.
І практично перше що знаходжу (esp8266+dht22+mqtt) https://gist.github.com/chaeplin/ee0fef774d2e79e0c236 скетч в якому є майже все що мені потрібно:
// Code based on
// https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino
// https://gist.github.com/igrr/7f7e7973366fc01d6393
// https://github.com/iot-playground/Arduino/blob/master/ESP8266ArduinoIDE/DS18B20_temperature_sensor/DS18B20_temperature_sensor.ino // esp8266 + dht22 + mqtt #include "DHT.h"
#include <PubSubClient.h>
#include <ESP8266WiFi.h> const char* ssid = "..........";
const char* password = ".........."; char* topic = "................";
char* server = "ip_of_mqtt_sv";
char* hellotopic = "hello_topic"; #define DHTPIN 5 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define REPORT_INTERVAL 30 // in sec String clientName;
DHT dht(DHTPIN, DHTTYPE, 15);
WiFiClient wifiClient;
PubSubClient client(server, 1883, callback, wifiClient); float oldH ;
float oldT ; void setup() {
Serial.begin(38400);
Serial.println("DHTxx test!");
delay(20); Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid); WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
clientName += "-";
clientName += String(micros() & 0xff, 16); Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName); if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.print("Topic is: ");
Serial.println(topic);
if (client.publish(hellotopic, "hello from ESP8266")) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
} dht.begin();
oldH = -1;
oldT = -1;
} void loop() { float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
} float hi = dht.computeHeatIndex(f, h); Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hi);
Serial.println(" *F"); String payload = "{\"Humidity\":";
payload += h;
payload += ",\"Temperature\":";
payload += t;
payload += "}";
if (t != oldT || h != oldH )
{
sendTemperature(payload);
oldT = t;
oldH = h;
} int cnt = REPORT_INTERVAL; while (cnt--)
delay(1000);
} void sendTemperature(String payload) {
if (!client.connected()) {
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker again");
Serial.print("Topic is: ");
Serial.println(topic);
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
} if (client.connected()) {
Serial.print("Sending payload: ");
Serial.println(payload); if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
} } void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
} String macToStr(const uint8_t* mac)
{
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5)
result += ':';
}
return result;
}
// https://github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino
// https://gist.github.com/igrr/7f7e7973366fc01d6393
// https://github.com/iot-playground/Arduino/blob/master/ESP8266ArduinoIDE/DS18B20_temperature_sensor/DS18B20_temperature_sensor.ino // esp8266 + dht22 + mqtt #include "DHT.h"
#include <PubSubClient.h>
#include <ESP8266WiFi.h> const char* ssid = "..........";
const char* password = ".........."; char* topic = "................";
char* server = "ip_of_mqtt_sv";
char* hellotopic = "hello_topic"; #define DHTPIN 5 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define REPORT_INTERVAL 30 // in sec String clientName;
DHT dht(DHTPIN, DHTTYPE, 15);
WiFiClient wifiClient;
PubSubClient client(server, 1883, callback, wifiClient); float oldH ;
float oldT ; void setup() {
Serial.begin(38400);
Serial.println("DHTxx test!");
delay(20); Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid); WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
clientName += "-";
clientName += String(micros() & 0xff, 16); Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName); if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.print("Topic is: ");
Serial.println(topic);
if (client.publish(hellotopic, "hello from ESP8266")) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
} dht.begin();
oldH = -1;
oldT = -1;
} void loop() { float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
} float hi = dht.computeHeatIndex(f, h); Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hi);
Serial.println(" *F"); String payload = "{\"Humidity\":";
payload += h;
payload += ",\"Temperature\":";
payload += t;
payload += "}";
if (t != oldT || h != oldH )
{
sendTemperature(payload);
oldT = t;
oldH = h;
} int cnt = REPORT_INTERVAL; while (cnt--)
delay(1000);
} void sendTemperature(String payload) {
if (!client.connected()) {
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker again");
Serial.print("Topic is: ");
Serial.println(topic);
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
} if (client.connected()) {
Serial.print("Sending payload: ");
Serial.println(payload); if (client.publish(topic, (char*) payload.c_str())) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
} } void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
} String macToStr(const uint8_t* mac)
{
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5)
result += ':';
}
return result;
}
#include <PubSubClient.h> під час компіляції всерівно вникала помилка, тому довелося модифікувати частину коду: PubSubClient client(server, 1883, callback, wifiClient); >> PubSubClient client(server, 1883, wifiClient);
Також в ArduinoIDE необхідно додати підтримку ESP8266 додавши в менеджері плат http://arduino.esp8266.com/stable/package_esp8266com_index.json
та встановивши необхідну:
Після цього скетч має скомпілюватись без помилок.
Підключаемо esp8266 через USB-TTL конвертер BTE13-009 (детально описано http://www.sast.in.ua/2017/01/esp-link.html) як вказано на малюнку:
І вибравши необхідний порт та налаштування вивантажуємо скетч.
Відключаемо пін IO0 від землі, а на пін IO2 підключаємо модуль DHT22, перезавантажуемо esp8266 і
відкривши монітор послідовного порту перевіряємо як працює система.
відкривши монітор послідовного порту перевіряємо як працює система.
Але мене не зовсім влаштовує те в якому форматі передається інформація на MQTT-брокер, так як мені необхідно щоб параметри вологості і температури записувались в окремі гілки. Тому дещо модифікований скетч:
// esp8266 + dht22 + mqtt
#include "DHT.h"
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
const char* ssid = "........";
const char* password = "..........";
char* topict = "/sast/spf01/t";
char* topich = "/sast/spf01/h";
char* server = "..............";
char* hellotopic = "hello_topic";
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define REPORT_INTERVAL 600 // in sec
String clientName;
DHT dht(DHTPIN, DHTTYPE, 15);
WiFiClient wifiClient;
PubSubClient client(server, 1883, wifiClient);
float oldH ;
float oldT ;
void setup() {
Serial.begin(115200);
Serial.println("DHTxx test!");
delay(20);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
clientName = "SAST-SPF01";
Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName);
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.println("Topic is: ");
Serial.println(topict);
Serial.println(topich);
if (client.publish(hellotopic, "hello from ESP8266")) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
dht.begin();
oldH = -1;
oldT = -1;
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float hi = dht.computeHeatIndex(f, h);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hi);
Serial.println(" *F");
String payloadt = "";
String payloadh = "";
payloadt += t;
payloadh += h;
if (t != oldT || h != oldH )
{
sendTemperature(payloadt, payloadh);
oldT = t;
oldH = h;
}
int cnt = REPORT_INTERVAL;
while (cnt--)
delay(1000);
}
void sendTemperature(String payloadt,String payloadh) {
if (!client.connected()) {
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker again");
Serial.println("Topic is: ");
Serial.println(topict);
Serial.println(topich);
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
}
if (client.connected()) {
Serial.println("Sending payload: ");
Serial.println(payloadt);
Serial.println(payloadh);
if (client.publish(topich, (char*) payloadh.c_str())) {
Serial.println("Publish H ok");
}
else {
Serial.println("Publish H failed");
}
if (client.publish(topict, (char*) payloadt.c_str())) {
Serial.println("Publish T ok");
}
else {
Serial.println("Publish T failed");
}
}
}
// esp8266 + dht22 + mqtt
#include "DHT.h"
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
const char* ssid = "........";
const char* password = "..........";
char* topict = "/sast/spf01/t";
char* topich = "/sast/spf01/h";
char* server = "..............";
char* hellotopic = "hello_topic";
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define REPORT_INTERVAL 600 // in sec
String clientName;
DHT dht(DHTPIN, DHTTYPE, 15);
WiFiClient wifiClient;
PubSubClient client(server, 1883, wifiClient);
float oldH ;
float oldT ;
void setup() {
Serial.begin(115200);
Serial.println("DHTxx test!");
delay(20);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
clientName = "SAST-SPF01";
Serial.print("Connecting to ");
Serial.print(server);
Serial.print(" as ");
Serial.println(clientName);
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
Serial.println("Topic is: ");
Serial.println(topict);
Serial.println(topich);
if (client.publish(hellotopic, "hello from ESP8266")) {
Serial.println("Publish ok");
}
else {
Serial.println("Publish failed");
}
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
dht.begin();
oldH = -1;
oldT = -1;
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float hi = dht.computeHeatIndex(f, h);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hi);
Serial.println(" *F");
String payloadt = "";
String payloadh = "";
payloadt += t;
payloadh += h;
if (t != oldT || h != oldH )
{
sendTemperature(payloadt, payloadh);
oldT = t;
oldH = h;
}
int cnt = REPORT_INTERVAL;
while (cnt--)
delay(1000);
}
void sendTemperature(String payloadt,String payloadh) {
if (!client.connected()) {
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker again");
Serial.println("Topic is: ");
Serial.println(topict);
Serial.println(topich);
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
}
if (client.connected()) {
Serial.println("Sending payload: ");
Serial.println(payloadt);
Serial.println(payloadh);
if (client.publish(topich, (char*) payloadh.c_str())) {
Serial.println("Publish H ok");
}
else {
Serial.println("Publish H failed");
}
if (client.publish(topict, (char*) payloadt.c_str())) {
Serial.println("Publish T ok");
}
else {
Serial.println("Publish T failed");
}
}
}
За допомогою досить зручного мобільного клієнта MQTT Dashboard дивимось, що публікується на нашому MQTT-сервері, для чого підписуємось на канал /# і спостерігаємо:
Отже все працює, збираємо конструкцію, розміщуємо в корпусі і відправляємо на постійне місце дислокації.
Наступним кроком необхідно отриману інформацію опублікувати в зручному для мониторингу форматі. Я для цього використовую NODE-RED який встановлений на тому ж сервері що і MQTT-брокер, але про це іншим разом.
Отже все працює, збираємо конструкцію, розміщуємо в корпусі і відправляємо на постійне місце дислокації.
Наступним кроком необхідно отриману інформацію опублікувати в зручному для мониторингу форматі. Я для цього використовую NODE-RED який встановлений на тому ж сервері що і MQTT-брокер, але про це іншим разом.
Немає коментарів:
Дописати коментар