FAQ ESP8266

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

VladPTZ
Сообщения: 395
Зарегистрирован: Вт май 31, 2016 6:56 pm
Откуда: Россия Карелия Петрозаводск
Благодарил (а): 95 раз
Поблагодарили: 57 раз

Re: FAQ ESP8266

Сообщение VladPTZ » Пн июн 25, 2018 8:04 pm

Энергосбережение в esp8266 изпользовали в своих проектах?
Интересна стратегия как уменьшать потребление, например если выключить wifi то тогда я не смогу управлять устройствами. Как быть?
Сервер МД на x86 micro pc ssd + HDD, OC Debian, терминал Xiaomi Redmi note 7
Мои исходники для мд управляемых устройств https://github.com/vgamaev/ESPMDDEVICE
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: FAQ ESP8266

Сообщение nick7zmail » Пн июн 25, 2018 8:23 pm

Никак. Если хотите девайсы с низким энергопотреблением - используйте платы ардуино, и, к примеру, передачу инфы по радиоканалу (nrf). Вайфай жрёт много, и должен быть постоянно подключён для быстроты реакции. С этим ничего не поделаешь.

Отправлено с моего Xperia XZ1 Compact через Tapatalk

Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
samolet
Сообщения: 472
Зарегистрирован: Чт июн 29, 2017 10:29 am
Благодарил (а): 46 раз
Поблагодарили: 45 раз

Re: FAQ ESP8266

Сообщение samolet » Пт июн 29, 2018 8:17 pm

Доброго всем времени суток, есть у меня интересная задумка по распределению по комнатам голосового ввода команд и соответственно вывода Алисы на колонки в ту комнату где была голосовая команда, может кто подскажет где ковырять мажорку? Железо имеется разное, от микрофонов до усилителей, есть модули WI-FI, и порты ввода вывода на 16 входов выходов. Имеются электронные ключи нч сигналов.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: FAQ ESP8266

Сообщение nick7zmail » Пт июн 29, 2018 8:23 pm

Ковыряйте команду say. Можете, к примеру, глянуть на SayReply, там есть пример ответа на терминалы, примерно так же придётся переписать say, только не с терминалами а с вашими релюшками уже.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
samolet
Сообщения: 472
Зарегистрирован: Чт июн 29, 2017 10:29 am
Благодарил (а): 46 раз
Поблагодарили: 45 раз

Re: FAQ ESP8266

Сообщение samolet » Пт июн 29, 2018 10:07 pm

как реализую(если) то отпишу что получилось, а пока впереди пайка мукрух управления потоками нч.
karapus
Сообщения: 37
Зарегистрирован: Вс фев 25, 2018 1:50 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: FAQ ESP8266

Сообщение karapus » Ср авг 01, 2018 3:31 pm

Здравствуйте форумчане, имею несколько esp8266 для управления светом по схеме esp8266-MQQT-major. Прошивку заливал через Ардуино IDE, в программировании не особо силен, поэтому использовал готовые примеры измененные под свои условия. Для физического переключения света используется кнопочный выключатель, в мажоре объекты реле. Но в процессе эксплуатации Мажор частенько теряет связь с ЕСП - такое ощущение, что контроллер просто подвисает, но сама прошивка ЕСП работает и нормально включает и выключает свет через физическую кнопку. Помогает перезагрузка ЕСП. ЕСП у меня nodemcu lua 8266, в качестве сервера Ноутбук с виндой, с раздачей Вай фай проблем нет, код прилагаю. Подскажите, как сделать так, чтобы контроллеры работали стабильно и в случае потери связи или подвисания самостоятельно смогли восстановить связь. Заранее благодарен за дельные советы.

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

#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "Lavrova";   //Название WIFI
const char* password = "30041988l";             //пароль WIFI
const char* mqtt_server = "192.168.100.2";       //адрес брокера MQTT
const char* host = "esp8266-webupdate2";
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

#define ESPClient "ESP12345678"             //имя MQTT клиента, должно быть уникальным

#define RELAY_5 14                              //Выход на реле или светодиод
#define BUTTON_5 4                            //Кнопка
#define relays_topic_5 "kuhnya/relay_5"        //публикуемый топик
#define RELAY_6 16                              //Выход на реле или светодиод
#define BUTTON_6 5                            //Кнопка
#define relays_topic_6 "kuhnya/relay_6"        //публикуемый топик

#define RELAY_7 12                              //Выход на реле или светодиод
#define BUTTON_7 13                            //Кнопка
#define relays_topic_7 "kuhnya/relay_7"        //публикуемый топик

#define RELAY_8 2                              //Выход на реле или светодиод
#define BUTTON_8 3                            //Кнопка
#define relays_topic_8 "kuhnya/relay_8"        //публикуемый топик



ESP8266WebServer server(80);                   //инициализация веб сервера на 80 порту
WiFiClient espClient;                          //инициализация WiFi клиента
PubSubClient client(espClient);                //инициализация MQTT клиента

/* переменные времени*/
long last_mls = millis();                      //функция времени для проверки подключения
long last_mls2 = millis();                     //функция времени для отправки топиков


/*реле*/

boolean Status_5 = false;                      //объявляем статус реле в 0
boolean btnPress_5 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat_5 = false;

boolean Status_6 = false;                      //объявляем статус реле в 0
boolean btnPress_6 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat_6 = false;

boolean Status_7 = false;                      //объявляем статус реле в 0
boolean btnPress_7 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat_7 = false;

boolean Status_8 = false;                      //объявляем статус реле в 0
boolean btnPress_8 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat_8 = false;


int regim_5 = 0;
int regim_6 = 0;
int regim_7 = 0;
int regim_8 = 0;


/*разовый цикл*/
void setup() {
  
  pinMode(RELAY_5, OUTPUT);                    //Выход на реле или светодиод
  pinMode(BUTTON_5, INPUT);                    //Кнопка
  digitalWrite(RELAY_5, Status_5);             //устанавливаем на выходе статус реле

  pinMode(RELAY_6, OUTPUT);                    //Выход на реле или светодиод
  pinMode(BUTTON_6, INPUT);                    //Кнопка
  digitalWrite(RELAY_6, Status_6);             //устанавливаем на выходе статус реле

  pinMode(RELAY_7, OUTPUT);                    //Выход на реле или светодиод
  pinMode(BUTTON_7, INPUT);                    //Кнопка
  digitalWrite(RELAY_7, Status_7);             //устанавливаем на выходе статус реле

  pinMode(RELAY_8, OUTPUT);                    //Выход на реле или светодиод
  pinMode(BUTTON_8, INPUT);                    //Кнопка
  digitalWrite(RELAY_8, Status_8);             //устанавливаем на выходе статус реле

  

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

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

  client.connect(ESPClient);                   //конектимся с брокером как клиент
  
   client.subscribe(relays_topic_5);            //подписываемся на топик
    client.subscribe(relays_topic_6);            //подписываемся на топик
    client.subscribe(relays_topic_7);            //подписываемся на топик
    client.subscribe(relays_topic_8);            //подписываемся на топик
   
    
  /*прошивка по воздуху*/
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    MDNS.begin(host);
    Serial.println("WiFi start");
    server.on("/", HTTP_GET, []() {
      server.sendHeader("Connection", "close");
      server.sendHeader("Access-Control-Allow-Origin", "*");
      server.send(200, "text/html", serverIndex);
    });
    server.on("/update", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.sendHeader("Access-Control-Allow-Origin", "*");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
    }, []() {
      HTTPUpload& upload = server.upload();
      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        WiFiUDP::stopAll();
        Serial.printf("Update: %s\n", upload.filename.c_str());
        uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
        if (!Update.begin(maxSketchSpace)) { //start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) { //true to set the size to the current progress
          Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
        } else {
          Update.printError(Serial);
        }
        Serial.setDebugOutput(false);
      }
      yield();
    });
    server.begin();
    MDNS.addService("http", "tcp", 80);

    Serial.printf("Ready! Open http://%s.local in your browser\n", host);
  } else {
    Serial.println("WiFi Failed");
  }
}


/*чтение топиков MQTT*/
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 == relays_topic_5) {            //если получили с нужного топика
    if ((char)payload[0] == '0') {             //если полученное значение 0
      Status_5 = false;                        //статус выключено 
      regim_5 = 0;                             //переключаем режим в выключено
    }
    else if ((char)payload[0] == '1') {        //если получена 1
      Status_5 = true;                         //статус включено
      regim_5 = 1;                             //режим включено
    } 
}
if (strTopic == relays_topic_6) {            //если получили с нужного топика
    if ((char)payload[0] == '0') {             //если полученное значение 0
      Status_6 = false;                        //статус выключено 
      regim_6 = 0;                             //переключаем режим в выключено
    }
    else if ((char)payload[0] == '1') {        //если получена 1
      Status_6 = true;                         //статус включено
      regim_6 = 1;                             //режим включено
    } 
}

if (strTopic == relays_topic_7) {            //если получили с нужного топика
    if ((char)payload[0] == '0') {             //если полученное значение 0
      Status_7 = false;                        //статус выключено 
      regim_7 = 0;                             //переключаем режим в выключено
    }
    else if ((char)payload[0] == '1') {        //если получена 1
      Status_7 = true;                         //статус включено
      regim_7 = 1;                             //режим включено
    } 
}

if (strTopic == relays_topic_8) {            //если получили с нужного топика
    if ((char)payload[0] == '0') {             //если полученное значение 0
      Status_8 = false;                        //статус выключено 
      regim_8 = 0;                             //переключаем режим в выключено
    }
    else if ((char)payload[0] == '1') {        //если получена 1
      Status_8 = true;                         //статус включено
      regim_8 = 1;                             //режим включено
    } 
}


}
/*кнопка 1*/

/*кнопка 4*/
void button5() {
  btnPress_5 = digitalRead(BUTTON_5);
  Status_5 = digitalRead(RELAY_5);
  if (btnPress_5 == LOW && lastbtnStat_5 == false) {
    delay(30); 
    regim_5++;
    lastbtnStat_5 = true;
    if (regim_5 > 1) {
      regim_5 = 0;
    }
  }
  if (btnPress_5 == HIGH && lastbtnStat_5 == true) {
    lastbtnStat_5 = false;
    client.publish(relays_topic_5, String(regim_5).c_str());
  }
  if (regim_5 == 0) {
    Status_5 = false;
    digitalWrite(RELAY_5, Status_5);
  }
  if (regim_5 == 1) {
    Status_5 = true;
    digitalWrite(RELAY_5, Status_5);
  }
}
/*кнопка 5*/
void button6() {
  btnPress_6 = digitalRead(BUTTON_6);
  Status_6 = digitalRead(RELAY_6);
  if (btnPress_6 == LOW && lastbtnStat_6 == false) {
    delay(30); 
    regim_6++;
    lastbtnStat_6 = true;
    if (regim_6 > 1) {
      regim_6 = 0;
    }
  }
  if (btnPress_6 == HIGH && lastbtnStat_6 == true) {
    lastbtnStat_6 = false;
    client.publish(relays_topic_6, String(regim_6).c_str());
  }
  if (regim_6 == 0) {
    Status_6 = false;
    digitalWrite(RELAY_6, Status_6);
  }
  if (regim_6 == 1) {
    Status_6 = true;
    digitalWrite(RELAY_6, Status_6);
  }
}

/*кнопка 5*/
void button7() {
  btnPress_7 = digitalRead(BUTTON_7);
  Status_7 = digitalRead(RELAY_7);
  if (btnPress_7 == LOW && lastbtnStat_7 == false) {
    delay(30); 
    regim_7++;
    lastbtnStat_7 = true;
    if (regim_7 > 1) {
      regim_7 = 0;
    }
  }
  if (btnPress_7 == HIGH && lastbtnStat_7 == true) {
    lastbtnStat_7 = false;
    client.publish(relays_topic_7, String(regim_7).c_str());
  }
  if (regim_7 == 0) {
    Status_7 = false;
    digitalWrite(RELAY_7, Status_7);
  }
  if (regim_7 == 1) {
    Status_7 = true;
    digitalWrite(RELAY_7, Status_7);
  }
}

/*кнопка 5*/
void button8() {
  btnPress_8 = digitalRead(BUTTON_8);
  Status_8 = digitalRead(RELAY_8);
  if (btnPress_8 == LOW && lastbtnStat_8 == false) {
    delay(30); 
    regim_8++;
    lastbtnStat_8 = true;
    if (regim_8 > 1) {
      regim_8 = 0;
    }
  }
  if (btnPress_8 == HIGH && lastbtnStat_8 == true) {
    lastbtnStat_8 = false;
    client.publish(relays_topic_8, String(regim_8).c_str());
  }
  if (regim_8 == 0) {
    Status_8 = false;
    digitalWrite(RELAY_8, Status_8);
  }
  if (regim_8 == 1) {
    Status_8 = true;
    digitalWrite(RELAY_8, Status_8);
  }
}



/*проверка подключений*/
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());           //выводим в монитор порта текущий ip
  }
  if (!client.connected() && WiFi.status() == WL_CONNECTED) { //если к сети подключились но к MQTT нет
    if (client.connect(ESPClient)) {
      client.subscribe(relays_topic_5);
      client.subscribe(relays_topic_6);//подписываемся на топик
       client.subscribe(relays_topic_7);//подписываемся на топик
       client.subscribe(relays_topic_8);//подписываемся на топик
       
      Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
    } else                                    //если не получилось
    {
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}

/*основной цикл*/
void loop() {
  client.loop();
 
  button5();
  button6();
  button7();
  button8();
  
  
if (millis() - last_mls > 15000)             //проверка подключений раз в 15 сек
  {
    last_mls = millis();
    reconnect_server();
  }
   
  server.handleClient();
  delay(50);                                   //защита от помех электросети, без нее свет живет своей жизнью
}
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: FAQ ESP8266

Сообщение nick7zmail » Ср авг 01, 2018 4:00 pm

Ну во первых странно вы делаете)) и millis используете и delay...обычно либо то либо другое...
Во вторых - подробности то где? Подробностей хотим)) На чем МД? на чем москит? какая версия? Что в сериал порте пишет на момент отсутствия связи?
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
karapus
Сообщения: 37
Зарегистрирован: Вс фев 25, 2018 1:50 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: FAQ ESP8266

Сообщение karapus » Ср авг 01, 2018 4:24 pm

nick7zmail писал(а):
Ср авг 01, 2018 4:00 pm
Ну во первых странно вы делаете)) и millis используете и delay...обычно либо то либо другое...
Во вторых - подробности то где? Подробностей хотим)) На чем МД? на чем москит? какая версия? Что в сериал порте пишет на момент отсутствия связи?
Нууу.....миллис и делэй использует парень с ютуба) МД на Windows 7, москит запускается службой там же, в сериале я ничего не пишу, просто вижу, что МД ника не реагирует на отдельную плату. Плюс по сети нет связи с платой. Не могу к ней подключиться для загрузки БИН файла
sega6549
Сообщения: 530
Зарегистрирован: Чт авг 20, 2015 11:32 am
Откуда: Ярославль
Благодарил (а): 61 раз
Поблагодарили: 75 раз
Контактная информация:

Re: FAQ ESP8266

Сообщение sega6549 » Ср авг 01, 2018 4:43 pm

karapus писал(а):
Ср авг 01, 2018 4:24 pm
nick7zmail писал(а):
Ср авг 01, 2018 4:00 pm
Ну во первых странно вы делаете)) и millis используете и delay...обычно либо то либо другое...
Во вторых - подробности то где? Подробностей хотим)) На чем МД? на чем москит? какая версия? Что в сериал порте пишет на момент отсутствия связи?
Нууу.....миллис и делэй использует парень с ютуба) МД на Windows 7, москит запускается службой там же, в сериале я ничего не пишу, просто вижу, что МД ника не реагирует на отдельную плату. Плюс по сети нет связи с платой. Не могу к ней подключиться для загрузки БИН файла
парень с ютуба)
Тут можно задать вопрос по MajorDoMo VK
Канал по MajorDoMo youtube
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: FAQ ESP8266

Сообщение nick7zmail » Ср авг 01, 2018 5:12 pm

Как это в порте ничего нет? У вас в каждой второй функции вывод в сериал.

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

    Serial.println("");
    Serial.println("WiFi connected");         
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());           //выводим в монитор порта текущий ip
Вопрос что именно пишет в момент отсутствия связи.

А, ну если парень с ютуба - то нет вопросов... =D
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить