• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Выключатель с фиксацией + esp8266

YDen

Member
Здравствуйте.
Подскажите пожалуйста. ESP8266, разные. Обычный выключатель, с фиксацией. При включении его на ногу esp приходит ноль (к земле через резистор притянут). Кодом предусмотрена реакция на изменение состояния выключателя. Если выключатель стоит в положении "выключено", то при перезагрузке esp все отрабатывает нормально. Но если оставить выключатель в положении "включено" то при подаче питания на esp она виснет. Передергиваешь выключатель - стартует нормально.
Посоветуйте плиз, как можно излечить этот недуг.

благодарю
 

nikolz

Well-known member
Здравствуйте.
Подскажите пожалуйста. ESP8266, разные. Обычный выключатель, с фиксацией. При включении его на ногу esp приходит ноль (к земле через резистор притянут). Кодом предусмотрена реакция на изменение состояния выключателя. Если выключатель стоит в положении "выключено", то при перезагрузке esp все отрабатывает нормально. Но если оставить выключатель в положении "включено" то при подаче питания на esp она виснет. Передергиваешь выключатель - стартует нормально.
Посоветуйте плиз, как можно излечить этот недуг.

благодарю
исправить программу.
Не понятно зачем притягиваете пин к нулю. По Вашей логике его надо притягивать к Vcc. т е когда выключено на пине 1, а когда включаете , то приходит ноль и на пине 0..
 

CodeNameHawk

Moderator
Команда форума
Если выключатель стоит в положении "выключено", то при перезагрузке esp все отрабатывает нормально. Но если оставить выключатель в положении "включено" то при подаче питания на esp она виснет.
Буду угадывать, используете ногу, которая предназначена для перевода есп в режим программирования.
Используйте другую ногу.
 

YDen

Member
исправить программу.
Не понятно зачем притягиваете пин к нулю. По Вашей логике его надо притягивать к Vcc. т е когда выключено на пине 1, а когда включаете , то приходит ноль и на пине 0..
Извините, неверно написал.
При включении выключателя на ногу прилетает единица. Нога через резистор притянута к земле. Вольтаж - 3.5 в.
 

nikolz

Well-known member
Извините, неверно написал.
При включении выключателя на ногу прилетает единица. Нога через резистор притянута к земле. Вольтаж - 3.5 в.
1) программу сами писали или халява?
2) на какой пин подключен контакт?
3) проверьте как исполняется ваш алгоритм если на пине сразу 1.
 

YDen

Member
1) программу сами писали или халява?
2) на какой пин подключен контакт?
3) проверьте как исполняется ваш алгоритм если
на пине сразу 1.
1. сам
2. d4 и на другой esp d8

Код:
#include <Bounce.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>

// =======================================================================
// Конфигурация устройства:

const char* ssid     = "****";                      // SSID
const char* password = "*****";                    // пароль

const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "****"; // Логи от сервер
const char *mqtt_pass = "*******"; // Пароль от сервера

WiFiClient wclient;
PubSubClient client(wclient);

boolean buttonState = false; //состояние выключателя

boolean flag_button1 = false; //флаг кнопка 1

boolean mqtt_light_kux = false; //флаг включения свет раковина по mqtt

//выходы нагрузки
const byte outPin1 = D1; // реле

//кнопки
const byte inButton1 = D4; //вход кнопка1

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(inButton1, 500);

//подсчет времени
//mqtt
long previousMillis_mqtt = 0;  // храним время последнего подключения
long interval_mqtt = 10000;     //интервал 3 сек

//wifi
long previousMillis_wifi = 0;  // храним время последнего подключения
long interval_wifi = 10000;     //интервал
unsigned long currentMillis_wifi = 0;

// =======================================================================
// Функция получения данных от сервера
void callback(char* topic, byte* payload, unsigned int length)
{
  //--------------------------------------------------------------------------------------
  if (String(topic) == "ihouse/svet/kux")
  {
    if ((char)payload[0] == '1') flag_button1 = true;
    if ((char)payload[0] == '0') flag_button1 = false;
    digitalWrite(outPin1, flag_button1);
    //Serial.println(flag_button1);
  }
}

// =======================================================================
void reconnect()
{
  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED)
  {
    if (!client.connected())
    {
      Serial.print("Attempting MQTT connection...");
      if (client.connect("esp_kux",mqtt_user, mqtt_pass))
      {
        Serial.println("connected");
        //подписываемся по топики
        client.subscribe("ihouse/svet/kux");
      }
    }  
  }
}

// =======================================================================
void setup_wifi()
{
    if (currentMillis_wifi - previousMillis_wifi > interval_wifi)
    {
      WiFi.begin(ssid, password); //конектимся
      previousMillis_wifi = currentMillis_wifi;
    }
}

// =======================================================================
void setup()
{
  // Удаляем предыдущие конфигурации WIFI сети
  WiFi.disconnect(); // обрываем WIFI соединения
  WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
  WiFi.mode(WIFI_OFF); // отключаем WIFI
  delay(500);

  // присваиваем статичесий IP адрес
  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.config(IPAddress(192, 168, 1, 75), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  delay(10);

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  //для выключателя
  pinMode(inButton1, INPUT);

  //для релюшек
  //свет мойка
  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

}

// =======================================================================
void loop()
{
  unsigned long currentMillis_wifi = millis();

  //--------------------------------------------------------------------------------------
  if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
  {
    setup_wifi();
  }

  //--------------------------------------------------------------------------------------
  if (!client.connected())
  {
    reconnect();                                         
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки1 - предбанник
  if ( bouncer1.update() )
  {
    //если считано значение 1
    if (bouncer1.read() == !buttonState)
    {
      buttonState = bouncer1.read();
      flag_button1 = !flag_button1;

      digitalWrite(outPin1, flag_button1);
      client.publish("ihouse/svet/kux", String(flag_button1).c_str());
    }
  }

  client.loop();
  MQTT_Send();
}

// =======================================================================
// Функция отправки в топик
void MQTT_Send()
{
  unsigned long currentMillis_mqtt = millis();

  if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
  {
    previousMillis_mqtt = currentMillis_mqtt;
    client.publish("ihouse/work/kux", String(random(100)).c_str());
  }
  delay(10);
}
[/code]
 
Последнее редактирование:

nikolz

Well-known member
1. сам
2. d4 и на другой esp d8

Код:
#include <Bounce.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>

// =======================================================================
// Конфигурация устройства:

const char* ssid     = "****";                      // SSID
const char* password = "*****";                    // пароль

const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "****"; // Логи от сервер
const char *mqtt_pass = "*******"; // Пароль от сервера

WiFiClient wclient;
PubSubClient client(wclient);

boolean buttonState = false; //состояние выключателя

boolean flag_button1 = false; //флаг кнопка 1

boolean mqtt_light_kux = false; //флаг включения свет раковина по mqtt

//выходы нагрузки
const byte outPin1 = D1; // реле

//кнопки
const byte inButton1 = D4; //вход кнопка1

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer1 = Bounce(inButton1, 500);

//подсчет времени
//mqtt
long previousMillis_mqtt = 0;  // храним время последнего подключения
long interval_mqtt = 10000;     //интервал 3 сек

//wifi
long previousMillis_wifi = 0;  // храним время последнего подключения
long interval_wifi = 10000;     //интервал
unsigned long currentMillis_wifi = 0;

// =======================================================================
// Функция получения данных от сервера
void callback(char* topic, byte* payload, unsigned int length)
{
  //--------------------------------------------------------------------------------------
  if (String(topic) == "ihouse/svet/kux")
  {
    if ((char)payload[0] == '1') flag_button1 = true;
    if ((char)payload[0] == '0') flag_button1 = false;
    digitalWrite(outPin1, flag_button1);
    //Serial.println(flag_button1);
  }
}

// =======================================================================
void reconnect()
{
  // подключаемся к MQTT серверу
  if (WiFi.status() == WL_CONNECTED)
  {
    if (!client.connected())
    {
      Serial.print("Attempting MQTT connection...");
      if (client.connect("esp_kux",mqtt_user, mqtt_pass))
      {
        Serial.println("connected");
        //подписываемся по топики
        client.subscribe("ihouse/svet/kux");
      }
    }
  }
}

// =======================================================================
void setup_wifi()
{
    if (currentMillis_wifi - previousMillis_wifi > interval_wifi)
    {
      WiFi.begin(ssid, password); //конектимся
      previousMillis_wifi = currentMillis_wifi;
    }
}

// =======================================================================
void setup()
{
  // Удаляем предыдущие конфигурации WIFI сети
  WiFi.disconnect(); // обрываем WIFI соединения
  WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
  WiFi.mode(WIFI_OFF); // отключаем WIFI
  delay(500);

  // присваиваем статичесий IP адрес
  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.config(IPAddress(192, 168, 1, 75), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  delay(10);

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  //для выключателя
  pinMode(inButton1, INPUT);

  //для релюшек
  //свет мойка
  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

}

// =======================================================================
void loop()
{
  unsigned long currentMillis_wifi = millis();

  //--------------------------------------------------------------------------------------
  if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
  {
    setup_wifi();
  }

  //--------------------------------------------------------------------------------------
  if (!client.connected())
  {
    reconnect();                                       
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки1 - предбанник
  if ( bouncer1.update() )
  {
    //если считано значение 1
    if (bouncer1.read() == !buttonState)
    {
      buttonState = bouncer1.read();
      flag_button1 = !flag_button1;

      digitalWrite(outPin1, flag_button1);
      client.publish("ihouse/svet/kux", String(flag_button1).c_str());
    }
  }

  client.loop();
  MQTT_Send();
}

// =======================================================================
// Функция отправки в топик
void MQTT_Send()
{
  unsigned long currentMillis_mqtt = millis();

  if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
  {
    previousMillis_mqtt = currentMillis_mqtt;
    client.publish("ihouse/work/kux", String(random(100)).c_str());
  }
  delay(10);
}
[/code]
------------------
Предположу, что у Вас при пуске с включенным выключателем это состояние отрабатывается раньше чем установлено соединение и подключение к серверу.
В результате все виснет.
------------------
В качестве совета .
Надо использовать работу по колбекам пина wifi и таймера для опроса.
Так как пишите сами, то рекомендую изучать СИ и переходить на SDK.
-------------------
относительно пинов. Проще всего использовать D1 (GPIO5) и D2(GPIO4) . рекомендую начинать с них.
 
  • Like
Реакции: YDen

YDen

Member
Предположу, что у Вас при пуске с включенным выключателем это состояние отрабатывается раньше чем установлено соединение и подключение к серверу.
В результате все виснет.
А если в сетапе так:
Код:
void setup()
{
  // Удаляем предыдущие конфигурации WIFI сети
  WiFi.disconnect(); // обрываем WIFI соединения
  WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
  WiFi.mode(WIFI_OFF); // отключаем WIFI
  delay(500);

  // присваиваем статичесий IP адрес
  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.config(IPAddress(192, 168, 1, 75), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  delay(5000);

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  delay(5000);

  //для выключателя
  pinMode(inButton1, INPUT);

  //для релюшек
  //свет мойка
  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

}
 

nikolz

Well-known member
А если в сетапе так:
Код:
void setup()
{
  // Удаляем предыдущие конфигурации WIFI сети
  WiFi.disconnect(); // обрываем WIFI соединения
  WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
  WiFi.mode(WIFI_OFF); // отключаем WIFI
  delay(500);

  // присваиваем статичесий IP адрес
  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.config(IPAddress(192, 168, 1, 75), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  delay(5000);

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  delay(5000);

  //для выключателя
  pinMode(inButton1, INPUT);

  //для релюшек
  //свет мойка
  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

}
Я пишу на СИ.
Могу дать предложения на СИ в дурину их можно включать.
Вообще считается дурным тоном в системах реального времени таких как устройства управления, обработки сигналов использовать циклы и задержки
В дурине это спллошником используется, так как она ориентирована на начинающих.
Но учится читать по букварю не значит уметь писать романы.
-------------------------------
Не надо ни чего уничтожать в сетапе.
Обычно сетап или инит для установки начальных значений.
-------------------
Перед присваиванием статического адреса надо выключить dhcp
на СИ это функция wifi_station_dhcpc_stop()
-------------------------
В SDK есть такая функция
wifi_station_get_connect_status()
найдите ее аналог и прежде чем что отсылать на сервер получите от нее код=5
-------------------
Если хотите сделать хорошую программу то установите себе UDK (см на форуме) там очень много примеров, они понятно написаны и создают прошивки на порядок меньше чем дурина и работают быстрее. короче говоря, прочитав букварь, читайте художественную литературу.
 
  • Like
Реакции: YDen

Алексей.

Active member
YDen,
NodeMCU
D8 = gpio15
D4 = gpio2
высокий уровень на gpio15 при включении = boot from sd card
у вас модуль просто не стартует,
смотрите что нужно для нормального старта (загрузка с флеша)
 

Вложения

Сверху Снизу