FAQ ESP8266

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

Модератор: immortal

ZyaK
Сообщения: 407
Зарегистрирован: Вт окт 24, 2017 2:01 pm
Откуда: Ижевск
Благодарил (а): 45 раз
Поблагодарили: 69 раз

Re: FAQ ESP8266

Сообщение ZyaK » Сб май 30, 2020 7:03 am

Проверяли, работает нормально?
я бы избавился от цикла вайл
Wire.begin();
while(!bme280.begin())
{
Serial.println("Could not find BME280 sensor 76!");
delay(1000);
}
потому, что если отвалится датчик, он будет постоянно крутиться в этом цикле и дальше не пойдет.

так же по датчикам температуры нет смысла отправлять данные если они не изменились ну и усреднение тоже не помешает

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

if (isnan(t1) || isnan(h1)) {
      Serial.println("Failed to read from DHT #1");
    }
    else
    {
      if (old_t1 == t1)
      {
        Serial.println("dannie ne izmenilis");
      }
      else
      {
        client.publish(DHT_Temp_spalna, String(t1, 1).c_str());
        client.loop();
        client.publish(DHT_Hum_spalna, String(h1, 1).c_str());
        client.loop();
        old_t1 = t1;
        old_h1 = h1;
      }
    }
За это сообщение автора ZyaK поблагодарил:
Semendey (Пн июн 01, 2020 10:45 am)
Рейтинг: 1.16%
PI2 + MQTT + 5 ESP8266 + Atmega16
Semendey
Сообщения: 68
Зарегистрирован: Чт сен 26, 2019 4:14 pm
Откуда: Ярославль
Благодарил (а): 19 раз
Поблагодарили: 6 раз

Re: FAQ ESP8266

Сообщение Semendey » Пн июн 01, 2020 11:20 am

ZyaK писал(а):
Сб май 30, 2020 7:03 am
Проверяли, работает нормально?
я бы избавился от цикла вайл
Wire.begin();
while(!bme280.begin())
{
Serial.println("Could not find BME280 sensor 76!");
delay(1000);
}
потому, что если отвалится датчик, он будет постоянно крутиться в этом цикле и дальше не пойдет.

так же по датчикам температуры нет смысла отправлять данные если они не изменились ну и усреднение тоже не помешает

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

if (isnan(t1) || isnan(h1)) {
      Serial.println("Failed to read from DHT #1");
    }
    else
    {
      if (old_t1 == t1)
      {
        Serial.println("dannie ne izmenilis");
      }
      else
      {
        client.publish(DHT_Temp_spalna, String(t1, 1).c_str());
        client.loop();
        client.publish(DHT_Hum_spalna, String(h1, 1).c_str());
        client.loop();
        old_t1 = t1;
        old_h1 = h1;
      }
    }
Спасибо.
Нет не проверял, железка не собрана до конца.
Но сам нашел несколько ошибок.
По проверке датчика я с вами согласен, все верно, так и происходит изменил в коде на простую проверку без цикла, учел ваши замечания.

Единственное пока я не понимаю верно ли назначено функциям прерывания значение "CHANGE".
Идея была такая, отловить момент когда на пине что то поменялось поставить флаг события и потом в loop уже это обработать.

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

// Блок [Подключение библиотек] ************************************************
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <BME280I2C.h>
#include <Wire.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 motionSensorD6   D6 // пин, к которому подключен датчик Движения 
#define openSensorD3   D3 // пин, к которому подключен датчик Окна 1 
#define openSensorD4   D4 // пин, к которому подключен датчик Окна 2 
#define smokeSensorD5   D5 // пин, к которому подключен датчик Дыма  


#define Temp_topic "ESP/Temp"      // Топик Температуры 
#define Humidity_topic "ESP/Humidity"      // Топик Влажности
#define Pressure_topic "ESP/Pressure"      // Топик Давления
#define motionSensor_topic "ESP/Motion"      // Топик датчика движения
#define openSensor_topic1 "ESP/WINDOWS_1"     // Топик датчика окна 1
#define openSensor_topic2 "ESP/WINDOWS_2"     // Топик датчика окна 2
#define smokeSensor_topic "ESP/SMOKE"     // Топик датчика Дыма 
 
 
WiFiClient espClient;
PubSubClient client(espClient);
BME280I2C bme280;
 
long last_mls = millis();
long last_mls_temp = millis();
long last_mls_move = millis();
long last_mls_moveOff = millis();

boolean moveOn = false;
boolean Win1On = false;
boolean Win2On = false;
boolean SmokeOn = false;

int Win1Old;
int Win2Old;
int SmokeOld;

void IRAM_ATTR detectsMovementD6() { // Функция при обнаружении движения на D6
    if(digitalRead(motionSensorD6)){
    delay(10);
        if(digitalRead(motionSensorD6)){
          client.publish(motionSensor_topic, "1" , false); // Публикуем состояние датчика движения  
          Serial.println("Движение D6!!!");
          moveOn = true;
        }
    }
}


void IRAM_ATTR detectsOpenD3() { // Функция при обнаружении Открытия окна D3
    Win1On = true;
    Win1Old = digitalRead(openSensorD3);
 }

void IRAM_ATTR detectsOpenD4() { // Функция при обнаружении Открытия окна D4
    Win2On = true;
    Win2Old = digitalRead(openSensorD4);
 }

void IRAM_ATTR detectsSmokeD5() { // Функция при обнаружении движения на D6
  SmokeOn = true;
  SmokeOld = digitalRead(smokeSensorD5);
}


void setup() {

  Serial.begin(115200);
  client.setServer(mqtt_server, 1883);
 
  delay(100);
  WiFi.begin(ssid, password);
  delay(6000);
  client.connect("ESP8266Client");
  
  
  pinMode(motionSensorD6, INPUT_PULLUP); // уставливаем пин D6 на прием и включаем внутренний подтягивающий резистор
    // Первоначальные данные по датчику движения
    if(digitalRead(motionSensorD6)){
    client.publish(motionSensor_topic, "1", true); // Публикуем состояние датчика движения  
    Serial.println("Движение D6!!!");
    }else{
    client.publish(motionSensor_topic, "0", true); // Публикуем состояние датчика движения   
    Serial.println("Все тихо D6!!!");
    }

    
  pinMode(openSensorD3, INPUT_PULLUP); // уставливаем пин D3 на прием и включаем внутренний подтягивающий резистор
  attachInterrupt(openSensorD3, detectsOpenD3, CHANGE); // Прерывание для датчика окна запуск функции  detectsOpenD3  
    // Первоначальные данные по датчику окна 1
    if(digitalRead(openSensorD3)){
    client.publish(openSensor_topic1, "1", false); // Публикуем состояние окна 1   
    Serial.println("Открыто окно D3!!!");
    }else{
    client.publish(openSensor_topic1, "0", false); // Публикуем состояние окна 1  
    Serial.println("Закрыто окно D3!!!");
    } 
  pinMode(openSensorD4, INPUT_PULLUP); // уставливаем пин D4 на прием и включаем внутренний подтягивающий резистор
  attachInterrupt(openSensorD4, detectsOpenD4, CHANGE); // Прерывание для датчика окна запуск функции  detectsOpenD4    
    // Первоначальные данные по датчику окна 2 
    if(digitalRead(openSensorD4)){
     client.publish(openSensor_topic2, "1", false); // Публикуем состояние окна 2  
    Serial.println("Открыто окно D4!!!");
    }else{
     client.publish(openSensor_topic2, "0", false); // Публикуем состояние окна 2  
    Serial.println("Закрыто окно D4!!!");
    }

  pinMode(smokeSensorD5, INPUT_PULLUP); // уставливаем пин D6 на прием и включаем внутренний подтягивающий резистор
  attachInterrupt(smokeSensorD5, detectsSmokeD5, CHANGE); // Прерывание для датчика движения запуск функции  detectsMovementD6
    // Первоначальные данные по датчика дыма
    if(digitalRead(smokeSensorD5)){
    client.publish(smokeSensor_topic, "1", false); // Публикуем состояние датчика дыма  
    Serial.println("Пожар D5!!!");
    }else{
     client.publish(smokeSensor_topic, "0", false); // Публикуем состояние датчика дыма  
    Serial.println("Дыма нет D5!!!");
    }
    
Wire.begin();
  if (!bme280.begin()){Serial.println("Could not find BME280 sensor 76!");}

    
}
 
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(motionSensor_topic);
  client.subscribe(openSensor_topic1);
  client.subscribe(openSensor_topic2);
    } else {
      Serial.print("failed connect Mosquitto, rc=");
      Serial.print(client.state());
      Serial.println("");
    }
  }
}



void IRAM_ATTR ChangeTemp() { // Функция считывания и публикации данных о температуре
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);

// Датчик температуры на адресе 0х76
float temp76(NAN), hum76(NAN), pres76(NAN);
float old_temp(NAN), old_hum(NAN), old_pres(NAN);
bme280.read(pres76,temp76,hum76,tempUnit,presUnit);

if (isnan(temp76) || isnan(hum76) || isnan(pres76) ) {
      Serial.println("Ошибка чтения датчика BME280");
    }
    else
    {
        if (old_temp == temp76)
         {
         Serial.println("Данные температуры не изменились !");
         }
        else
        {
          Serial.print("Temp76: ");
          Serial.print(temp76);
          Serial.println("°C");
          client.publish(Temp_topic, String(temp76,1).c_str(), false); // Публикуем температуру          
          client.loop();
          old_temp == temp76;
        }

      if (old_hum == hum76)
         {
         Serial.println("Данные влажности не изменились !");
         }
        else
        {
          Serial.print("Humidity76: ");
          Serial.print(hum76);
          Serial.println("% RH");
          client.publish(Humidity_topic, String(hum76,1).c_str(), false); // Публикуем влажность         
          client.loop();
          old_hum = hum76;
        }   

      if (old_pres == pres76)
         {
         Serial.println("Данные давления не изменились !");
         }
        else
        {
          Serial.print("Pressure76: ");
          Serial.print(pres76*0.00750062,2);
          Serial.println(" mmHg");
          client.publish(Pressure_topic, String(pres76*0.00750062,2).c_str(), false); // Публикуем давление        
          client.loop();
          old_pres = pres76;
        }   
             
    }











}


void loop(){
 
client.loop();
 
// Блок [Проверка подключения] **********************************************
if (millis() - last_mls > 60000) { // Проверка подключения к сети (раз в 60 сек.)
    last_mls = millis();
    reconnect_server();
}
// END Блок [Проверка подключения] ******************************************


// Блок [Проверка температуры ] **********************************************
if (millis() - last_mls_temp > 60000) { // Проверка температуры  (раз в 60 сек.)
    last_mls_temp = millis();
    ChangeTemp();
}
// END Блок [Проверка температуры] ****************************************** 


// Блок [Проверка движения ] **********************************************
if (moveOn = false) { // будем проверять если не зафиксировано сработки датчика
  if (millis() - last_mls_move > 3000) { // Проверка датчика движения (раз в 3 сек.)
      last_mls_move = millis();
      detectsMovementD6();
  }
}
if (moveOn = true) { // будем проверять если Зафиксировано сработка датчика
  if (millis() - last_mls_moveOff > 15000) { // Проверка  (раз в 15 сек.)
      last_mls_moveOff = millis();
      moveOn=false; // Обнуляем сработку датчика 
  }
}
// END Блок [Проверка движения] ****************************************** 


if (Win1On == true) { 
    delay(10);
    if (Win1Old == digitalRead(openSensorD3)){
    
      if(digitalRead(openSensorD3)){
        client.publish(openSensor_topic1, "1", false); // Публикуем состояние окна 1   
        Serial.println("Открыто окно D3!!!");
      }else{
        client.publish(openSensor_topic1, "0", false); // Публикуем состояние окна 1  
        Serial.println("Закрыто окно D3!!!");
      }
    Win1Old = digitalRead(openSensorD3);  
    }
  Win1On = false;
}

if (Win2On == true) { 
    delay(10);
    if (Win2Old == digitalRead(openSensorD4)){
      if(digitalRead(openSensorD4)){
        client.publish(openSensor_topic2, "1", false); // Публикуем состояние окна 2  
        Serial.println("Открыто окно D4!!!");
      }else{
        client.publish(openSensor_topic2, "0", false); // Публикуем состояние окна 2  
        Serial.println("Закрыто окно D4!!!");
      }
    Win2Old = digitalRead(openSensorD4);
    }
  Win2On = false;
}
if (SmokeOn == true) { 
    delay(10);
    if (SmokeOld == digitalRead(smokeSensorD5)){  
      if(digitalRead(smokeSensorD5)){
        client.publish(smokeSensor_topic, "1", false); // Публикуем состояние датчика дыма  
        Serial.println("Пожар D5!!!");
      }else{
        client.publish(smokeSensor_topic, "0", false); // Публикуем состояние датчика дыма  
        Serial.println("Дыма нет D5!!!");
      }
    SmokeOld = digitalRead(smokeSensorD5);
    }
  SmokeOn = false;
}
}

Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: FAQ ESP8266

Сообщение woow » Пт июл 24, 2020 10:23 pm

Divan писал(а):
Ср май 27, 2020 3:06 am
TrDA писал(а):
Вт май 26, 2020 8:48 pm
Divan писал(а):
Вт май 26, 2020 8:05 pm
wifi-iot - пробовал, прошивается так-же:
https://wifi-iot.com/p/wiki/169/ru/
Спасибо вам за эту статью, благодаря нее я смог на ESP32 залить ESPEasy, нужно было очистить мусор перед прошивкой и нашел рабочую прошивку
Перед первой прошивкой в некоторых случаях, когда модуль не стартует из-за мусора в памяти требуется прошить пустой файл. Или воспользоваться опцией ERASE в настройках Flash tools

Сначала стираем прошивку с памяти
СпойлерПоказать
Стираем мусор.jpg
Заливаем прошивку
СпойлерПоказать
Заливаем прошивку.jpg
С помощью программы Монитор порта про я перезапустил плату (не хочется перезагружать плату, нажимая на нее физически) и по логам увидел, что пошло соединение.
1) соединиться с платой
2) перезагрузить плату
СпойлерПоказать
Монитор порта про.jpg

Настройки ESP Flasher, прошивку не выбираем, указываем только имя сети и пароль, а когда зайдем в веб консоль, то вводим логин и пароль
Логин: admin
Пароль: тот, который указали в настройке ESP Flasher Admin password
СпойлерПоказать
Настройки ESPFlasher.jpg
ESP Easy Mega
СпойлерПоказать
web.jpg
Неплохо бы это всё внести на о дельную ветку про ESP32. Эта ещё та штучка.
Raspberry Pi 3B+
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: FAQ ESP8266

Сообщение woow » Ср июл 29, 2020 1:14 pm

Как впихнуть статический IP адрес В MQTT скетч. Скетч я беру из https://github.com/knolleary/pubsubclie ... sp8266.ino . Потом ещё буду из него издеваться , но сейчас нужен статический IP адрес, а не чтобы маршрутизатор прикручивал.
Не ругайтесь что весь код из образца вывалил, это творение и та лежит в библиотеках, если есть мысли поделитесь пожалуйста.
А то потом комментарии не фига не понимает чужой код стирил в интернете, а сча другие пускай копаются.
СпойлерПоказать

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

//https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino

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

// Update these with values suitable for your network.

const char* ssid = "........";
const char* password = "........";
const char* mqtt_server = "broker.mqtt-dashboard.com";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  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(".");
  }

  randomSeed(micros());

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

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();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } 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() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);
  }
}
в просторах нашёл предложение ещё с проверкой, но оно не заработало
СпойлерПоказать

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


#include <ESP8266WebServer.h>
const char* ssid = "*****";
const char* password = "*****";
IPAddress ip(192,168,1,17);  //статический IP
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
ESP8266WebServer server(80);
void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(led, 0);
}
Raspberry Pi 3B+
homester
Сообщения: 194
Зарегистрирован: Вт дек 24, 2019 2:09 pm
Благодарил (а): 112 раз
Поблагодарили: 34 раза

Re: FAQ ESP8266

Сообщение homester » Ср июл 29, 2020 1:32 pm

Вот это видео наверно поможет: https://www.youtube.com/watch?v=hgF6Pc_b0uY
За это сообщение автора homester поблагодарил:
woow (Ср июл 29, 2020 10:06 pm)
Рейтинг: 1.16%
Raspberry Pi3 B+, v4.44, внешняя з/к
Gasinskiy
Сообщения: 70
Зарегистрирован: Вс мар 22, 2020 12:04 pm
Откуда: Харьков
Благодарил (а): 113 раз
Поблагодарили: 4 раза

Re: FAQ ESP8266

Сообщение Gasinskiy » Чт авг 13, 2020 9:01 pm

Кто нибудь к Sonoff или ESP на Tasmota подключал несколько кнопок привязанных к одному реле?
Аватара пользователя
woow
Сообщения: 821
Зарегистрирован: Пн июл 04, 2016 8:46 am
Откуда: Mazeikiai
Благодарил (а): 125 раз
Поблагодарили: 46 раз

Re: FAQ ESP8266

Сообщение woow » Пт авг 14, 2020 1:26 pm

Не подключал но на ESPeasy можно рулс написать и должно работать, на тасмоте тоже рулсу есть только я не пробовал писать то и не комментирую.
Raspberry Pi 3B+
Gasinskiy
Сообщения: 70
Зарегистрирован: Вс мар 22, 2020 12:04 pm
Откуда: Харьков
Благодарил (а): 113 раз
Поблагодарили: 4 раза

Re: FAQ ESP8266

Сообщение Gasinskiy » Сб авг 15, 2020 8:12 am

Спасибо) уже разобрался. Оказалось нужно было просто вместо Кнопка1, Кн... 1, Кн.. 1, Кн.. 1 назначать Кнопка1, Кнопка2, Кнопка3, Кнопка4. И они все управляют Реле1. Правилами никакими не пришлось заморачиваться)
Аватара пользователя
Fantom
Сообщения: 31
Зарегистрирован: Чт фев 06, 2014 9:56 pm
Благодарил (а): 9 раз
Поблагодарили: 2 раза

Re: FAQ ESP8266

Сообщение Fantom » Пн фев 08, 2021 12:16 pm

Всем привет. Подскажите кто нибудь, не появляются еспшки, система чистая, только установил, поставил модуль ESP из маркета, на еспшках прошивка wifi-iot.com. По уарт смотрю данные вроде шлют mjd get: ... socket send success. Send 284 b.
Вбиваю в браузере

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

http://192.168.1.2/objects/?script=espdata&idesp=ESP82660003c8d1&hostname=ESP32&dsw1=2.9&dsw2=-4.5&uptime=3600&errconn=9&wanip=10.10.14.188&freemem=32968&ver=0.1.1_21:31:56_29.08.2019&vdd=3416&rssi=-30&gpiout3=1
вылетает ошибка (см.скрин). Куда копать? Че ей не нравиться?
СкринПоказать
Снимок.PNG
Снимок.PNG (148.15 КБ) 2370 просмотров
UPD. Решил проблему, надо в phpmyadmin выполнить запрос SET @@global.sql_mode= '';
Решение нашел здесь https://stackoverflow.com/questions/159 ... lumn-mysql
Banana PI (Armbian 21.02.1 Buster) + Arduino + esp8266
Ответить