ESP8266 по MQTT

Если вы только начинаете осваивать систему MajorDoMo и чего-то не знаете или не можете понять, то задавайте свои вопросы в этой ветке.

Модератор: immortal

Forth
Сообщения: 48
Зарегистрирован: Вс янв 13, 2019 4:37 pm
Благодарил (а): 39 раз
Поблагодарили: 0

ESP8266 по MQTT

Сообщение Forth » Вт апр 16, 2019 9:29 pm

Добрый вечер!
Помогите разобраться, пытаюсь настроить, чтоб из МД по кнопке управлять реле, нашел в Интернете 2 скетча, подправил под себя, чтоб попроще было разобраться как работает, 1 скетч включает реле на 2 секунды и выключает, хотя статус в МД не меняется за эти 2 секунды.
2 скетч не публикует топик в МД и в MQTTLens пусто.
1 скетч

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "SD 2.4G_2";             //Название сети
const char* password = "xxxxxxxxx";       //пароль
const char* mqtt_server = "192.168.2.3";    //ip брокера mqtt

#define RELAY_2 14                            //Выход на реле или светодиод на ESP 
#define relays_topic2 "ESP04/relay_2"         //публикуемый топик

WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента

long last_mls = millis();                    //функция времени в милисекундах
long last_mls3 = millis();                   //функция времени для отправки топиков

boolean Status2 = true;                       //объявляем статус реле в 0 (true, false
// boolean lastbtnStat2 = false;

int status2 = 0;                               //режим по умолчанию при включении

void setup()                                 //Выполняется при запуске 1 раз
{
  pinMode(RELAY_2, OUTPUT);                  //Выход на реле или светодиод
  digitalWrite(RELAY_2, Status2);             //устанавливаем на выходе статус реле

  Serial.begin(115200);                      //инициализация монитора порта
  client.setServer(mqtt_server, 1883);       //подключаемся к MQTT
  client.setCallback(callback);              //функция получения топиков с брокера
  delay(100);                                //ждем 100 милисекунд

  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(5000);                               //ждем 5 секунд

  client.connect("ESP04Client");             //конектимся с брокером как клиент
  client.subscribe(relays_topic2);            //подписываемся на топик

}

void callback(char* topic, byte* payload, unsigned int length) //читаем топики
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  if (strTopic == "ESP04/relay_2") {
    if ((char)payload[0] == '0') {
      Status2 = false;
      digitalWrite(RELAY_2, Status2);
    }
    else if ((char)payload[0] == '1') {
      Status2 = true;
      digitalWrite(RELAY_2, Status2);
    }
  }
}


void reconnect_server()                      //функция проверки подключения
{
  if (WiFi.status() != WL_CONNECTED)         //если нет подключения с сети
  {
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");       //выводим в монитор порта что пытаемся подключиться
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
  if (!client.connected() && WiFi.status() == WL_CONNECTED) { //если к сети подключились но к MQTT нет
    client.subscribe(relays_topic2);            //подписываемся на топик
    Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
  }
}

void MQTT()                                   //публикуем топик с состоянием режима
{
  if (millis() - last_mls3 > 2000)            //периодичность публикации топика
  { last_mls3 = millis();
    client.publish(relays_topic2, String(status2).c_str(), true);
    Serial.println("WiFinnected");
  }
}

void loop()
{
  client.loop();
  MQTT();
  if (millis() - last_mls > 60000)     //проверка подключений раз в 60 сек
  {
    last_mls = millis();
    reconnect_server();
  }
}
2 скетч

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "SD 2.4G_2";             //Название сети
const char* password = "xxxxxxxx";       //пароль
const char* mqtt_server = "192.168.2.3";    //ip брокера mqtt

#define RELE_1 14                       // Реле №1
#define BUTTON_1 13                       // Кнопочный выключатель №1
#define relays_topic1 "ESP01/RELE_1"          // Топик реле №1

WiFiClient espClient;             //инициализация WiFi клиента
PubSubClient client(espClient);   //инициализация MQTT клиента
long lastMsg = 0;
long last_mls = millis();         //функция времени в милисекундах
char msg[50];
int value = 0;
int hum = 0;
int diff = 1;
boolean rState1 = false;
boolean btnPress1 = false;
boolean lastbtnStat1 = false;

void setup() {
// инициализируем последовательный порт (для отладочных целей):
  Serial.begin(115200);
  delay(10);
  pinMode(RELE_1, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  digitalWrite(RELE_1, rState1);
  Serial.begin(115200); 
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  delay(100);
  WiFi.begin(ssid, password);
  delay(6000);
  client.connect("ESP8266Client");
  client.subscribe(relays_topic1);
  lastbtnStat1 = digitalRead(BUTTON_1);
}



void reconnect_server() {
  
  if (WiFi.status() != WL_CONNECTED){
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
    
  if(!client.connected() && WiFi.status() == WL_CONNECTED){  
    if (client.connect("ESP8266Client")) {    
      Serial.println("Mosquitto connect...");
  client.subscribe(relays_topic1);
     } else {    
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}


// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
    if ((char)payload[0] == '1') {
        rState1 = true;
        digitalWrite(RELE_1, rState1);
    }
    else {
        rState1 = false;
        digitalWrite(RELE_1, rState1);
    }
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
}
// END Блок [обратная связь] ************************************************



bool checkBound(float newValue, float prevValue, float maxDiff) {
  return newValue < prevValue - maxDiff || newValue > prevValue + maxDiff;
}

// Выключатель №1
void buttonWF(){
  btnPress1 = digitalRead(BUTTON_1);
  if (btnPress1 && !lastbtnStat1){
    delay(400); // защита от дребезга (600 мсек.)
    btnPress1 = digitalRead(BUTTON_1);
  
    if(btnPress1){
      rState1 = !rState1;
      digitalWrite(RELE_1, rState1);
      // публикуем изменение состояния реле на брокер    
      client.publish(relays_topic1, String(rState1).c_str(), true);
    }
  }
  lastbtnStat1 = btnPress1;
}
// END Выключатель №1

void loop() {

  client.loop();
  // 120 секунд периодичность проверки переподключения
  if (millis() - last_mls > 120000) {
    last_mls = millis();
    reconnect_server();
  }
  buttonWF(); // Функция кнопки №1 без фиксации и публикация статуса реле на MQTT
}
ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: ESP8266 по MQTT

Сообщение ZyaK » Ср апр 17, 2019 6:23 am

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#include <ESP8266mDNS.h>

const char* ssid = "***********"; //Название сети
const char* password = "***********";           //пароль
const char* Smart_Home = "*************";    //ip брокера mqtt


#define BUTTON_1 3
#define BUTTON_2 5                           //Кнопка
#define BUTTON_3 4
#define BUTTON_4 0
#define BUTTON_5 2
#define BUTTON_6 14
#define BUTTON_7 12
#define BUTTON_8 13

#define relays_topic "ESP01/#"
#define relays_topic1 "ESP01/r_1"
#define relays_topic2 "ESP01/r_2"
#define relays_topic3 "ESP01/r_3"
#define relays_topic4 "ESP01/r_4"
#define relays_topic5 "ESP01/r_5"
#define relays_topic6 "ESP01/r_6"
#define relays_topic7 "ESP01/r_7"
#define relays_topic8 "ESP01/r_8"


#define clk 15
#define data 16
#define latch 1

WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента

long last_mls = millis();                    //функция времени в милисекундах

boolean Status1 = false;                       //объявляем статус реле в 0
boolean btnPress1 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false;                 //временная переменная для хранения статуса
boolean Status2 = false;
boolean btnPress2 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat2 = false;
boolean Status3 = false;
boolean btnPress3 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat3 = false;
boolean Status4 = false;
boolean btnPress4 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat4 = false;
boolean Status5 = false;
boolean btnPress5 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat5 = false;
boolean Status6 = false;
boolean btnPress6 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat6 = false;
boolean Status7 = false;
boolean btnPress7 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat7 = false;
boolean Status8 = false;
boolean btnPress8 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat8 = false;

int regim1 = 0;                               //режим по умолчанию при включении
int regim2 = 0;
int regim3 = 0;
int regim4 = 0;
int regim5 = 0;
int regim6 = 0;
int regim7 = 0;
int regim8 = 0;

int Dannie = 0;

void setup() {

  pinMode(clk, OUTPUT);
  pinMode(data, OUTPUT);
  pinMode(latch, OUTPUT);
  digitalWrite(latch, HIGH);

  digitalWrite(latch, LOW);
  shiftOut(data, clk, LSBFIRST, 0b11111111);
  digitalWrite(latch, HIGH);

  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
  pinMode(BUTTON_3, INPUT);
  pinMode(BUTTON_4, INPUT);
  pinMode(BUTTON_5, INPUT);
  pinMode(BUTTON_6, INPUT);
  pinMode(BUTTON_7, INPUT);
  pinMode(BUTTON_8, INPUT);
  //Кнопка

  //Serial.begin(9600);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(6000);

  client.setServer(Smart_Home, 1883);       //подключаемся к MQTT
  client.setCallback(callback);              //функция получения топиков с брокера
  delay(100);

  //Serial.println("");
  //Serial.println("WiFi connected");
  //Serial.println("IP address: ");
  //Serial.println(WiFi.localIP());

  client.connect("ESP01Client");
  delay (100);//конектимся с брокером как клиент

  client.subscribe(relays_topic);
  client.loop();
  client.publish(relays_topic1, String(regim1).c_str());
  client.loop();
  client.publish(relays_topic2, String(regim2).c_str());
  client.loop();
  client.publish(relays_topic3, String(regim3).c_str());
  client.loop();
  client.publish(relays_topic4, String(regim4).c_str());
  client.loop();
  client.publish(relays_topic5, String(regim5).c_str());
  client.loop();
  client.publish(relays_topic6, String(regim6).c_str());
  client.loop();
  client.publish(relays_topic7, String(regim7).c_str());
  client.loop();
  client.publish(relays_topic8, String(regim8).c_str());
  client.loop();


}

void callback(char* topic, uint8_t* payload, unsigned int length) {
  //Serial.print("Message arrived [");
  //Serial.print(topic);
  //Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (unsigned int i = 0; i < length; i++) {
    //Serial.print((char)payload[i]);
  }
  //Serial.println();
  if (strTopic == "ESP01/r_1") {
    if ((char)payload[0] == '0') {
      Status1 = false;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status1 = true;
      regim1 = 1;
    }
  }

  if (strTopic == "ESP01/r_2") {
    if ((char)payload[0] == '0') {
      Status2 = false;
      regim2 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status2 = true;
      regim2 = 1;
    }
  }
  if (strTopic == "ESP01/r_3") {
    if ((char)payload[0] == '0') {
      Status3 = false;
      regim3 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status3 = true;
      regim3 = 1;
    }
  }
  if (strTopic == "ESP01/r_4") {
    if ((char)payload[0] == '0') {
      Status4 = true;
      regim4 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status4 = false;
      regim4 = 1;
    }
  }
  if (strTopic == "ESP01/r_5") {
    if ((char)payload[0] == '0') {
      Status5 = false;
      regim5 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status5 = true;
      regim5 = 1;
    }
  }
  if (strTopic == "ESP01/r_6") {
    if ((char)payload[0] == '0') {
      Status6 = false;
      regim6 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status6 = true;
      regim6 = 1;
    }
  }
  if (strTopic == "ESP01/r_7") {
    if ((char)payload[0] == '0') {
      Status7 = false;
      regim7 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status7 = true;
      regim7 = 1;
    }
  }
  if (strTopic == "ESP01/r_8") {
    if ((char)payload[0] == '0') {
      Status8 = false;
      regim8 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status8 = true;
      regim8 = 1;
    }
  }
  Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
  client.loop();

}

void button1()
{
  btnPress1 = digitalRead(BUTTON_1);
  if (btnPress1 == LOW && lastbtnStat1 == false)
  {
    delay(100); // защита от дребезга
    btnPress1 = digitalRead(BUTTON_1);
    if (btnPress1 == LOW && lastbtnStat1 == false)
    {
      regim1++;
      lastbtnStat1 = true;
      if (regim1 > 1)
      {
        regim1 = 0;
      }
      client.publish(relays_topic1, String(regim1).c_str());

    }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true)
  {
    lastbtnStat1 = false;
  }

  if (regim1 == 0)
  {
    Status1 = false;

  }
  if (regim1 == 1)
  {
    Status1 = true;

  }
  client.loop();
}
void button2()
{
  btnPress2 = digitalRead(BUTTON_2);
  if (btnPress2 == LOW && lastbtnStat2 == false)
  {
    delay(100); // защита от дребезга
    btnPress2 = digitalRead(BUTTON_2);
    if (btnPress2 == LOW && lastbtnStat2 == false)
    {
      regim2++;
      lastbtnStat2 = true;
      if (regim2 > 1)
      {
        regim2 = 0;
      }
      client.publish(relays_topic2, String(regim2).c_str());

    }
  }
  if (btnPress2 == HIGH && lastbtnStat2 == true)
  {
    lastbtnStat2 = false;
  }

  if (regim2 == 0)
  {
    Status2 = false;

  }
  if (regim2 == 1)
  {
    Status2 = true;

  }
  client.loop();
}
void button3()
{
  btnPress3 = digitalRead(BUTTON_3);

  if (btnPress3 == LOW && lastbtnStat3 == false)
  {
    delay(100); // защита от дребезга
    btnPress3 = digitalRead(BUTTON_3);
    if (btnPress3 == LOW && lastbtnStat3 == false)
    {
      regim3++;
      lastbtnStat3 = true;
      if (regim3 > 1)
      {
        regim3 = 0;
      }
      client.publish(relays_topic3, String(regim3).c_str());

    }
  }
  if (btnPress3 == HIGH && lastbtnStat3 == true)
  {
    lastbtnStat3 = false;
  }

  if (regim3 == 0)
  {
    Status3 = false;

  }
  if (regim3 == 1)
  {
    Status3 = true;

  }
  client.loop();
}
void button4()
{
  btnPress4 = digitalRead(BUTTON_4);

  if (btnPress4 == LOW && lastbtnStat4 == false)
  {
    delay(100); // защита от дребезга
    btnPress4 = digitalRead(BUTTON_4);
    if (btnPress4 == LOW && lastbtnStat4 == false)
    {
      regim4++;
      lastbtnStat4 = true;
      if (regim4 > 1)
      {
        regim4 = 0;
      }
      client.publish(relays_topic4, String(regim4).c_str());

    }
  }
  if (btnPress4 == HIGH && lastbtnStat4 == true)
  {
    lastbtnStat4 = false;
  }

  if (regim4 == 0)
  {
    Status4 = false;

  }
  if (regim4 == 1)
  {
    Status4 = true;

  }
  client.loop();
}
void button5()
{
  btnPress5 = digitalRead(BUTTON_5);

  if (btnPress5 == LOW && lastbtnStat5 == false)
  {
    delay(100); // защита от дребезга
    btnPress5 = digitalRead(BUTTON_5);

    if (btnPress5 == LOW && lastbtnStat5 == false)
    {
      regim5++;
      lastbtnStat5 = true;
      if (regim5 > 1)
      {
        regim5 = 0;
      }
      client.publish(relays_topic5, String(regim5).c_str());

    }
  }
  if (btnPress5 == HIGH && lastbtnStat5 == true)
  {
    lastbtnStat5 = false;
  }

  if (regim5 == 0)
  {
    Status5 = false;

  }
  if (regim5 == 1)
  {
    Status5 = true;

  }
  client.loop();
}
void button6()
{
  btnPress6 = digitalRead(BUTTON_6);

  if (btnPress6 == LOW && lastbtnStat6 == false)
  {
    delay(100); // защита от дребезга
    btnPress6 = digitalRead(BUTTON_6);

    if (btnPress6 == LOW && lastbtnStat6 == false)
    {
      regim6++;
      lastbtnStat6 = true;
      if (regim6 > 1)
      {
        regim6 = 0;
      }
      client.publish(relays_topic6, String(regim6).c_str());

    }
  }
  if (btnPress6 == HIGH && lastbtnStat6 == true)
  {
    lastbtnStat6 = false;
  }

  if (regim6 == 0)
  {
    Status6 = false;

  }
  if (regim6 == 1)
  {
    Status6 = true;

  }
  client.loop();
}
void button7()
{
  btnPress7 = digitalRead(BUTTON_7);

  if (btnPress7 == LOW && lastbtnStat7 == false)
  {
    delay(100); // защита от дребезга
    btnPress7 = digitalRead(BUTTON_7);

    if (btnPress7 == LOW && lastbtnStat7 == false)
    {
      regim7++;
      lastbtnStat7 = true;
      if (regim7 > 1)
      {
        regim7 = 0;
      }
      client.publish(relays_topic7, String(regim7).c_str());

    }
  }
  if (btnPress7 == HIGH && lastbtnStat7 == true)
  {
    lastbtnStat7 = false;
  }

  if (regim7 == 0)
  {
    Status7 = false;

  }
  if (regim7 == 1)
  {
    Status7 = true;

  }
  client.loop();
}
void button8()
{
  btnPress8 = digitalRead(BUTTON_8);
  if (btnPress8 == LOW && lastbtnStat8 == false)
  {
    delay(100); // защита от дребезга
    btnPress8 = digitalRead(BUTTON_8);
    if (btnPress8 == LOW && lastbtnStat8 == false)
    {
      regim8++;
      lastbtnStat8 = true;
      if (regim8 > 1)
      {
        regim8 = 0;
      }
      client.publish(relays_topic8, String(regim8).c_str());

    }
  }
  if (btnPress8 == HIGH && lastbtnStat8 == true)
  {
    lastbtnStat8 = false;
  }

  if (regim8 == 0)
  {
    Status8 = false;

  }
  if (regim8 == 1)
  {
    Status8 = true;

  }
  client.loop();
}
void reconnect_server() //функция проверки подключения
{
  //Serial.println("");
  //Serial.println("WiFi connected");
  //Serial.println("IP address: ");
  //Serial.println(WiFi.localIP());

  if (WiFi.status() != WL_CONNECTED) //если нет подключения с сети
  {
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);                //подключаемся к WiFi
    delay(6000);
   // Serial.println("");
    //Serial.println("WiFi connect..."); //выводим в монитор порта что пытаемся подключиться
  }
  if (!client.connected() && WiFi.status() == WL_CONNECTED) {
    if (client.connect("ESP01Client")) {
   // Serial.println("Mosquitto connect...");
      client.setServer(Smart_Home, 1883);       //подключаемся к MQTT
      client.setCallback(callback);              //функция получения топиков с брокера
      delay(100);
      client.connect("ESP01Client");
      delay (100);//конектимся с брокером как клиент
      client.subscribe(relays_topic);
      client.loop();
      client.publish(relays_topic1, String(regim1).c_str());
      client.loop();
      client.publish(relays_topic2, String(regim2).c_str());
      client.loop();
      client.publish(relays_topic3, String(regim3).c_str());
      client.loop();
      client.publish(relays_topic4, String(regim4).c_str());
      client.loop();
      client.publish(relays_topic5, String(regim5).c_str());
      client.loop();
      client.publish(relays_topic6, String(regim6).c_str());
      client.loop();
      client.publish(relays_topic7, String(regim7).c_str());
      client.loop();
      client.publish(relays_topic8, String(regim8).c_str());
      client.loop();
       //подписываемся на топики
    }
  }
  Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
  Dannie = ~Dannie;
  digitalWrite(latch, LOW);
  shiftOut(data, clk, LSBFIRST, Dannie);
  digitalWrite(latch, HIGH);
}
void loop()
{
  client.loop();
  button1();
  button2();
  button3();
  button4();
  button5();
  button6();
  button7();
  button8();

  Dannie = (regim1 << 7) | (regim2 << 6) | (regim3 << 5) | (regim4 << 4) | (regim5 << 3) | (regim6 << 2) | (regim7 << 1) | (regim8);
  Dannie = ~Dannie;
  digitalWrite(latch, LOW);
  shiftOut(data, clk, LSBFIRST, Dannie);
  digitalWrite(latch, HIGH);
  //delay(200);
  if (millis() - last_mls > 10000)     //проверка подключений раз в 60 сек
  {
    last_mls = millis();
    reconnect_server();

  }
}
мало ли интересно будет, управление 8-ю реле по 8 кнопкам
Вложения
Esp_8Channel.rar
(29.45 КБ) 269 скачиваний
За это сообщение автора ZyaK поблагодарил:
Forth (Чт апр 18, 2019 8:52 pm)
Рейтинг: 1.16%
PI2 + MQTT + 5 ESP8266 + Atmega16
Forth
Сообщения: 48
Зарегистрирован: Вс янв 13, 2019 4:37 pm
Благодарил (а): 39 раз
Поблагодарили: 0

Re: ESP8266 по MQTT

Сообщение Forth » Чт апр 18, 2019 6:03 am

ZyaK писал(а):
Ср апр 17, 2019 6:23 am

Код: Выделить всё

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//#include <ESP8266mDNS.h>

const char* ssid = "***********"; //Название сети
const char* password = "***********";           //пароль
const char* Smart_Home = "*************";    //ip брокера mqtt

мало ли интересно будет, управление 8-ю реле по 8 кнопкам
По моему 1 вопросу никто не может подсказать?
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: ESP8266 по MQTT

Сообщение ZyaK » Чт апр 18, 2019 6:21 am

Forth писал(а):
Чт апр 18, 2019 6:03 am
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
там в архиве лежит печатная плата, управление 8-ю реле осуществляется сдвиговым регистром.
код переписать 2 минуты чтоб убрать всё лишнее.
За это сообщение автора ZyaK поблагодарил:
Forth (Чт апр 18, 2019 8:52 pm)
Рейтинг: 1.16%
PI2 + MQTT + 5 ESP8266 + Atmega16
Forth
Сообщения: 48
Зарегистрирован: Вс янв 13, 2019 4:37 pm
Благодарил (а): 39 раз
Поблагодарили: 0

Re: ESP8266 по MQTT

Сообщение Forth » Чт апр 18, 2019 6:59 pm

ZyaK писал(а):
Чт апр 18, 2019 6:21 am
Forth писал(а):
Чт апр 18, 2019 6:03 am
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
там в архиве лежит печатная плата, управление 8-ю реле осуществляется сдвиговым регистром.
код переписать 2 минуты чтоб убрать всё лишнее.
У меня архив не открывается, пишет архив поврежден.
Если Вам не тяжело можете скорректировать скетч под 3 кнопки и 3 реле, желательно без использования сдвигового регистра, а с использованием конкретных GPIO?!
Forth
Сообщения: 48
Зарегистрирован: Вс янв 13, 2019 4:37 pm
Благодарил (а): 39 раз
Поблагодарили: 0

Re: ESP8266 по MQTT

Сообщение Forth » Вс апр 21, 2019 6:42 pm

На просторах Интернета нашел работающий скетч, на 3 кнопки и 3 реле, спасибо Интернету.
Может еще кому то пригодится.

Код: Выделить всё

// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
 
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "ХХХХХХХХ";                // Имя WI-FI сети
const char* password = "ХХХХХХХХХХХХ";        // Пароль WI-FI сети
const char* mqtt_server = "192.168.2.3";      // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************
 
#define RELE_1 14                               // Реле №1
#define RELE_2 12                               // Реле №2
#define RELE_3 13                               // Реле №3
#define BUTTON_1 16                               // Кнопочный выключатель №1
#define BUTTON_2 5                                // Кнопочный выключатель №2
#define BUTTON_3 4                                // Кнопочный выключатель №3
#define relays_topic1 "ESP01/RELE_1"              // Топик реле №1
#define relays_topic2 "ESP01/RELE_2"              // Топик реле №2
#define relays_topic3 "ESP01/RELE_3"            // Топик реле №3
 
 
 
WiFiClient espClient;
PubSubClient client(espClient);
 
long last_mls = millis();
char msg[50];
boolean rState1 = false;
boolean rState2 = false;
boolean rState3 = false;
boolean btnPress1 = false;
boolean btnPress2 = false;
boolean btnPress3 = false;
boolean lastbtnStat1 = false;
boolean lastbtnStat2 = false;
boolean lastbtnStat3 = false;
 
void setup() {
  pinMode(RELE_1, OUTPUT);
  pinMode(RELE_2, OUTPUT);
  pinMode(RELE_3, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
  pinMode(BUTTON_3, INPUT);
  digitalWrite(RELE_1, rState1);
  digitalWrite(RELE_2, rState2);
  digitalWrite(RELE_3, rState3);
  Serial.begin(115200);
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
 
  delay(100);
  WiFi.begin(ssid, password);
  delay(6000);
  client.connect("ESP8266Client");
  client.subscribe(relays_topic1);
  client.subscribe(relays_topic2);
  client.subscribe(relays_topic3);
 
  lastbtnStat1 = digitalRead(BUTTON_1);
  lastbtnStat2 = digitalRead(BUTTON_2);
  lastbtnStat3 = digitalRead(BUTTON_3);
}
 
void reconnect_server() {
 
  if (WiFi.status() != WL_CONNECTED){
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("");
  }
 
  if(!client.connected() && WiFi.status() == WL_CONNECTED){
    if (client.connect("ESP8266Client")) {
      Serial.println("Mosquitto connect...");
  client.subscribe(relays_topic1);
  client.subscribe(relays_topic2);
  client.subscribe(relays_topic3);
    } else {
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
    if ((char)payload[0] == '1') {
        rState1 = true;
        digitalWrite(RELE_1, rState1);
    }
    else {
        rState1 = false;
        digitalWrite(RELE_1, rState1);
    }
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
 
// Блок [Управление Реле 2 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_2") {
    if ((char)payload[0] == '1') {
        rState2 = true;
        digitalWrite(RELE_2, rState2);
    }
    else {
        rState2 = false;
        digitalWrite(RELE_2, rState2);
    }
}
// Блок [Управление Реле 2 из MajorDomo] ************************************
 
// Блок [Управление Реле 3 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_3") {
    if ((char)payload[0] == '1') {
        rState3 = true;
        digitalWrite(RELE_3, rState3);
    }
    else {
        rState3 = false;
        digitalWrite(RELE_3, rState3);
    }
}
// Блок [Управление Реле 3 из MajorDomo] ************************************
}
// END Блок [обратная связь] ************************************************
 
// Блок [Управление Реле 1 с кнопки] ****************************************
void button_1(){
  btnPress1 = digitalRead(BUTTON_1);
 
  if (btnPress1 && !lastbtnStat1){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress1 = digitalRead(BUTTON_1);
 
    if(btnPress1){
      rState1 = !rState1;
      digitalWrite(RELE_1, rState1);
      client.publish(relays_topic1, String(rState1).c_str(), true); // Публикуем состояние реле 1 на MQTT
    }
  }
  lastbtnStat1 = btnPress1;
}
// END Блок [Управление Реле 1 с кнопки] ************************************
 
// Блок [Управление Реле 2 с кнопки] ****************************************
void button_2(){
  btnPress2 = digitalRead(BUTTON_2);
 
  if (btnPress2 && !lastbtnStat2){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress2 = digitalRead(BUTTON_2);
 
    if(btnPress2){
      rState2 = !rState2;
      digitalWrite(RELE_2, rState2);
      client.publish(relays_topic2, String(rState2).c_str(), true); // Публикуем состояние реле 2 на MQTT
    }
  }
  lastbtnStat2 = btnPress2;
}
// END Блок [Управление Реле 2 с кнопки] ************************************
 
// Блок [Управление Реле 3 с кнопки] ****************************************
void button_3(){
  btnPress3 = digitalRead(BUTTON_3);
 
  if (btnPress3 && !lastbtnStat3){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress3 = digitalRead(BUTTON_3);
 
    if(btnPress3){
      rState3 = !rState3;
      digitalWrite(RELE_3, rState3);
      client.publish(relays_topic3, String(rState3).c_str(), true); // Публикуем состояние реле 3 на MQTT
    }
  }
  lastbtnStat3 = btnPress3;
}
// END Блок [Управление Реле 3 с кнопки] ************************************
 
 
void loop(){
 
client.loop();
 
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проеверка подключения к сети (раз в 60 сек.)
    last_mls = millis();
    reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
 
  button_1(); // Функция кнопки №1 и публикация статуса реле 1 на MQTT
  button_2(); // Функция кнопки №2 и публикация статуса реле 2 на MQTT
  button_3(); // Функция кнопки №3 и публикация статуса реле 3 на MQTT
}
Аватара пользователя
Strangeman
Сообщения: 208
Зарегистрирован: Ср янв 16, 2013 6:35 pm
Откуда: Золотарево
Благодарил (а): 101 раз
Поблагодарили: 19 раз
Контактная информация:

Re: ESP8266 по MQTT

Сообщение Strangeman » Пн май 06, 2019 12:20 am

ZyaK писал(а):
Чт апр 18, 2019 6:21 am
Forth писал(а):
Чт апр 18, 2019 6:03 am
А по примеру ZyaK не понятно, как происходит управление 8-ю реле, на какие GPIO они подключаются?
там в архиве лежит печатная плата, управление 8-ю реле осуществляется сдвиговым регистром.
код переписать 2 минуты чтоб убрать всё лишнее.
Нет ли схемы принципиальной в pdf? Не всем будет удобно открывать lay формат.
Основной: Z99Le, Debian 10, модули на ESP-12F с собственной логикой. С сервером связаны, но работоспособны и без него.
Тестовый: Cubieboard2, Armbian Buster (сейчас Bionic) 5.4.y
ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: ESP8266 по MQTT

Сообщение ZyaK » Пн май 06, 2019 5:51 am

Strangeman писал(а):
Пн май 06, 2019 12:20 am
Нет ли схемы принципиальной в pdf? Не всем будет удобно открывать lay формат.
Схему не рисовал, сразу на печатку и в бой :D
Вложения
1.JPG
1.JPG (302.75 КБ) 6980 просмотров
За это сообщение автора ZyaK поблагодарил:
Strangeman (Пн май 06, 2019 9:48 pm)
Рейтинг: 1.16%
PI2 + MQTT + 5 ESP8266 + Atmega16
Аватара пользователя
prmres
Сообщения: 428
Зарегистрирован: Пт ноя 24, 2017 2:24 am
Откуда: оттуда
Благодарил (а): 113 раз
Поблагодарили: 123 раза

Re: ESP8266 по MQTT

Сообщение prmres » Ср май 08, 2019 9:51 am

Forth писал(а):
Чт апр 18, 2019 6:59 pm
У меня архив не открывается, пишет архив поврежден.
Winrar 5.61 открыл без проблем
Не только лишь все!
AlexFox
Сообщения: 55
Зарегистрирован: Пн апр 24, 2017 12:58 pm
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Re: ESP8266 по MQTT

Сообщение AlexFox » Сб сен 07, 2019 6:53 am

Forth писал(а):
Вс апр 21, 2019 6:42 pm
На просторах Интернета нашел работающий скетч, на 3 кнопки и 3 реле, спасибо Интернету.
Может еще кому то пригодится.

Код: Выделить всё

// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// END Блок [Подключение библиотек] ********************************************
 
// Блок [Подключение к сети WI-FI] *********************************************
const char* ssid = "ХХХХХХХХ";                // Имя WI-FI сети
const char* password = "ХХХХХХХХХХХХ";        // Пароль WI-FI сети
const char* mqtt_server = "192.168.2.3";      // IP адрес MQTT сервер
// END Блок [Подключение к сети WI-FI] *****************************************
 
#define RELE_1 14                               // Реле №1
#define RELE_2 12                               // Реле №2
#define RELE_3 13                               // Реле №3
#define BUTTON_1 16                               // Кнопочный выключатель №1
#define BUTTON_2 5                                // Кнопочный выключатель №2
#define BUTTON_3 4                                // Кнопочный выключатель №3
#define relays_topic1 "ESP01/RELE_1"              // Топик реле №1
#define relays_topic2 "ESP01/RELE_2"              // Топик реле №2
#define relays_topic3 "ESP01/RELE_3"            // Топик реле №3
 
 
 
WiFiClient espClient;
PubSubClient client(espClient);
 
long last_mls = millis();
char msg[50];
boolean rState1 = false;
boolean rState2 = false;
boolean rState3 = false;
boolean btnPress1 = false;
boolean btnPress2 = false;
boolean btnPress3 = false;
boolean lastbtnStat1 = false;
boolean lastbtnStat2 = false;
boolean lastbtnStat3 = false;
 
void setup() {
  pinMode(RELE_1, OUTPUT);
  pinMode(RELE_2, OUTPUT);
  pinMode(RELE_3, OUTPUT);
  pinMode(BUTTON_1, INPUT);
  pinMode(BUTTON_2, INPUT);
  pinMode(BUTTON_3, INPUT);
  digitalWrite(RELE_1, rState1);
  digitalWrite(RELE_2, rState2);
  digitalWrite(RELE_3, rState3);
  Serial.begin(115200);
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
 
  delay(100);
  WiFi.begin(ssid, password);
  delay(6000);
  client.connect("ESP8266Client");
  client.subscribe(relays_topic1);
  client.subscribe(relays_topic2);
  client.subscribe(relays_topic3);
 
  lastbtnStat1 = digitalRead(BUTTON_1);
  lastbtnStat2 = digitalRead(BUTTON_2);
  lastbtnStat3 = digitalRead(BUTTON_3);
}
 
void reconnect_server() {
 
  if (WiFi.status() != WL_CONNECTED){
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("");
  }
 
  if(!client.connected() && WiFi.status() == WL_CONNECTED){
    if (client.connect("ESP8266Client")) {
      Serial.println("Mosquitto connect...");
  client.subscribe(relays_topic1);
  client.subscribe(relays_topic2);
  client.subscribe(relays_topic3);
    } else {
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}
// Блок [обратная связь] ****************************************************
void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    String strTopic = String(topic);
    String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
// Блок [Управление Реле 1 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_1") {
    if ((char)payload[0] == '1') {
        rState1 = true;
        digitalWrite(RELE_1, rState1);
    }
    else {
        rState1 = false;
        digitalWrite(RELE_1, rState1);
    }
}
// END Блок [Управление Реле 1 из MajorDomo] ********************************
 
// Блок [Управление Реле 2 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_2") {
    if ((char)payload[0] == '1') {
        rState2 = true;
        digitalWrite(RELE_2, rState2);
    }
    else {
        rState2 = false;
        digitalWrite(RELE_2, rState2);
    }
}
// Блок [Управление Реле 2 из MajorDomo] ************************************
 
// Блок [Управление Реле 3 из MajorDomo] ************************************
if (strTopic == "ESP01/RELE_3") {
    if ((char)payload[0] == '1') {
        rState3 = true;
        digitalWrite(RELE_3, rState3);
    }
    else {
        rState3 = false;
        digitalWrite(RELE_3, rState3);
    }
}
// Блок [Управление Реле 3 из MajorDomo] ************************************
}
// END Блок [обратная связь] ************************************************
 
// Блок [Управление Реле 1 с кнопки] ****************************************
void button_1(){
  btnPress1 = digitalRead(BUTTON_1);
 
  if (btnPress1 && !lastbtnStat1){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress1 = digitalRead(BUTTON_1);
 
    if(btnPress1){
      rState1 = !rState1;
      digitalWrite(RELE_1, rState1);
      client.publish(relays_topic1, String(rState1).c_str(), true); // Публикуем состояние реле 1 на MQTT
    }
  }
  lastbtnStat1 = btnPress1;
}
// END Блок [Управление Реле 1 с кнопки] ************************************
 
// Блок [Управление Реле 2 с кнопки] ****************************************
void button_2(){
  btnPress2 = digitalRead(BUTTON_2);
 
  if (btnPress2 && !lastbtnStat2){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress2 = digitalRead(BUTTON_2);
 
    if(btnPress2){
      rState2 = !rState2;
      digitalWrite(RELE_2, rState2);
      client.publish(relays_topic2, String(rState2).c_str(), true); // Публикуем состояние реле 2 на MQTT
    }
  }
  lastbtnStat2 = btnPress2;
}
// END Блок [Управление Реле 2 с кнопки] ************************************
 
// Блок [Управление Реле 3 с кнопки] ****************************************
void button_3(){
  btnPress3 = digitalRead(BUTTON_3);
 
  if (btnPress3 && !lastbtnStat3){
    delay(300); // защита от дребезга (300 мсек.)
    btnPress3 = digitalRead(BUTTON_3);
 
    if(btnPress3){
      rState3 = !rState3;
      digitalWrite(RELE_3, rState3);
      client.publish(relays_topic3, String(rState3).c_str(), true); // Публикуем состояние реле 3 на MQTT
    }
  }
  lastbtnStat3 = btnPress3;
}
// END Блок [Управление Реле 3 с кнопки] ************************************
 
 
void loop(){
 
client.loop();
 
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проеверка подключения к сети (раз в 60 сек.)
    last_mls = millis();
    reconnect_server();
}
// END Блок [Проверка подключения] ******************************************
 
  button_1(); // Функция кнопки №1 и публикация статуса реле 1 на MQTT
  button_2(); // Функция кнопки №2 и публикация статуса реле 2 на MQTT
  button_3(); // Функция кнопки №3 и публикация статуса реле 3 на MQTT
}
Доброго времени суток! Взял ваш скрипт, на ESP8266, Ip адрес берет, а по mqtt уже не конектится
2019-09-07_0951.png
2019-09-07_0951.png (44.01 КБ) 6343 просмотра
За это сообщение автора AlexFox поблагодарил:
viktor6 (Вс май 24, 2020 11:54 pm)
Рейтинг: 1.16%
Ответить