Протокол MQTT, код из видео

Примеры из видео

 

// работа с thingspeak
// https://youtu.be/PWeCdzc8tRw

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h> 
#include <Wire.h> 
 
OneWire ds(5);                                      // вход датчика 18b20, SDA/D2


        // Настройки сети 
#define ssid "WLAN1"                                // настройки подключения к wifi                       
#define password "1231234123" 

#define mqtt_server "mqtt.thingspeak.com"          // mqtt брокер      
#define mqtt_port 1883                             // порт подключения к mqtt
#define mqtt_topic "channels/205419/publish/fields/field1/Q8QDQ3WJ2QUSSQXY"     // топик с которым будем работать

WiFiClient espClient;
PubSubClient client(espClient);

long lastMsg = 0;  
                                                    // вызывается когда приходят данные от брокера
//void callback(char* topic, byte* payload, unsigned int length) {
//  Serial.print("Message arrived [");
//  Serial.print(topic);                              // отправляем в монитор порта название топика                     
//  Serial.print("] ");
//  for (int i = 0; i < length; i++) {                // отправляем данные из топика
//    Serial.print((char)payload[i]);
//  }
//  Serial.println();  
//}
//////////////
                                                    // подключение к wifi
void setup_wifi() { 
  
  delay(10);
  // We start by connecting to a WiFi network
  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());
}

//                                                    // подключение к mqtt брокеру            
void reconnect() {                                                      
  while (!client.connected()) {                       // крутимся пока не подключемся.
    Serial.print("Attempting MQTT connection...");
                                                      // создаем случайный идентификатор клиента
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
                                                      // подключаемся, в client.connect передаем ID, логин и пасс
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");                    // если подключились 
 //     client.subscribe(mqtt_topic);                   // НЕ!подписываемся на топик, иначе сервер нас отключит
    } else {                                          // иначе ругаемся в монитор порта  
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {  
  Serial.begin(115200);
  setup_wifi();                                       // подключаемся к wifi
  
  client.setServer(mqtt_server, mqtt_port);           // указываем адрес брокера и порт
//  client.setCallback(callback);                       // подписатся на топик в thingspeak нельзя
}
 

float getTemp(){                                      // возвращает температуру с градусника ds18b20
  byte data[12];  
  byte addr[8]; 
  if (!ds.search(addr)) {
    Serial.println("No more addresses.");  
  }
   ds.reset_search(); 
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!"); 
  }

  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          

  for (int i = 0; i < 9; i++) {           
    data[i] = ds.read();  
  }

  int raw = (data[1] << 8) | data[0]; 
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  return raw / 16.0;
    
} 
 //////////////////////
 
void loop() {
  
  char msg[5];                                            // забераем температуру и конвертируем её в char
  float tmp = getTemp();  
  dtostrf(tmp, 5, 2, msg);
   
  if (!client.connected()) {                             // проверяем подключение к брокеру
    reconnect();                                            // еще бы проверить подкючение к wifi...
  }
  client.loop();

  long now = millis();                                   // каждые 10 секунд
  if (now - lastMsg > 10000) {
    lastMsg = now; 
    client.publish(mqtt_topic, msg);                     // пишем в топик 
    Serial.println(msg); 
  }
}


// работа с cloudmqtt.com
// https://youtu.be/PWeCdzc8tRw

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h> 
#include <Wire.h> 
 
OneWire ds(5);                                      // вход датчика 18b20, SDA/D2


        // Настройки сети 
#define ssid "WLAN1"                                // настройки подключения к wifi                       
#define password "1231234123" 

#define mqtt_server "m21.cloudmqtt.com"             // mqtt брокер
#define mqtt_login "kkbyfuon"                        
#define mqtt_password "2Qg0vFlIWCFF"                 
#define mqtt_port 12843                             // порт подключения к mqtt, у cloudmqtt порт отличный от 1883
#define mqtt_topic "temp"                           // топик с которым будем работать

WiFiClient espClient;
PubSubClient client(espClient);

long lastMsg = 0;  
                                                    // вызывается когда приходят данные от брокера
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);                              // отправляем в монитор порта название топика                     
  Serial.print("] ");
  for (int i = 0; i < length; i++) {                // отправляем данные из топика
    Serial.print((char)payload[i]);
  }
  Serial.println();  
}
//////////////
                                                    // подключение к wifi
void setup_wifi() { 
  
  delay(10);
  // We start by connecting to a WiFi network
  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());
}

//                                                    // подключение к mqtt брокеру            
void reconnect() {                                                      
  while (!client.connected()) {                       // крутимся пока не подключемся.
    Serial.print("Attempting MQTT connection...");
                                                      // создаем случайный идентификатор клиента
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
                                                      // подключаемся, в client.connect передаем ID, логин и пасс
    if (client.connect(clientId.c_str(), mqtt_login, mqtt_password)) {
      Serial.println("connected");                    // если подключились 
      client.subscribe(mqtt_topic);                   // подписываемся на топик, в который же пишем данные
    } else {                                          // иначе ругаемся в монитор порта  
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {  
  Serial.begin(115200);
  setup_wifi();                                       // подключаемся к wifi
  
  client.setServer(mqtt_server, mqtt_port);           // указываем адрес брокера и порт
  client.setCallback(callback);                       // указываем функцию которая вызывается когда приходят данные от брокера
}
 

float getTemp(){                                      // возвращает температуру с градусника ds18b20
  byte data[12];  
  byte addr[8]; 
  if (!ds.search(addr)) {
    Serial.println("No more addresses.");  
  }
   ds.reset_search(); 
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!"); 
  }

  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          

  for (int i = 0; i < 9; i++) {           
    data[i] = ds.read();  
  }

  int raw = (data[1] << 8) | data[0]; 
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  return raw / 16.0;
    
} 
 //////////////////////
 
void loop() {
  
  char msg[5];                                            // забераем температуру и конвертируем её в char
  float tmp = getTemp();  
  dtostrf(tmp, 6, 2, msg);
   
  if (!client.connected()) {                             // проверяем подключение к брокеру
    reconnect();                                            // еще бы проверить подкючение к wifi...
  }
  client.loop();

  long now = millis();                                   // каждые 10 секунд
  if (now - lastMsg > 10000) {
    lastMsg = now; 
    client.publish(mqtt_topic, msg);                     // пишем в топик 
  }
}