Программирую ESP8266 в среде Arduino IDE
Получаю частые подключения (читай частый дисконнект) к WiFi. Последний замер показал 360 переподключений за сутки. 149 секунд отсутствия в сети. Чем мне не нравится: если придет команда во время отсутствия в сети, устройство может не узнать о задаче.
Ну и вторая проблема: если кнопка или датчик движения на одной ESP а реле на другой, то не получается оперативно включить свет.
Тестировал питание от компьютера через USB Питание КМК должно быть стабилизировано.
Питал от блока питания. Конденсаторы на вход ESP поставил. электролит 470 мкФ и керамику 0.1 мкФ
Код привел ниже. Может кто подскажет решение моей задачи.
PS Поиском пользоваться умею. Не могу сформулировать проблему.
Код: Выделить всё
const char* EspNaveVer = "Test WiFi";
//2022-05-17
// Test WiFi
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
// Change the credentials below, so your ESP8266 connects to your router
const char* ssid = "ubuntu24";
const char* password = "l";
// Change the variable to your Raspberry Pi IP address, so it connects to your MQTT broker
const char* AIO_SERVER = "192.168.0.112";
#define AIO_SERVERPORT 1883
// Initializes the espClient. You should change the espClient name if you have multiple ESPs running in your home automation system
WiFiClient espClient0003;
PubSubClient client(espClient0003);
int publikuem = 0;
int count = 0;
char countchar[6];
int countWiFiConnect = 0;
int timeWiFiConnect = 0;
long lastMsg = 0;
long now = millis();
long lastMeasure = millis() - 100000;
int FirstZapusk = 1;
//int D0status = 0;
String lastCmd = "EspRestart";
// Don't change the function below. This functions connects your ESP8266 to your router
void setup_wifi() {
long now = millis();
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
//countWiFiConnect = countWiFiConnect + 1;
timeWiFiConnect = timeWiFiConnect + millis() - now;
dtostrf(countWiFiConnect, 6, 0, countchar);
client.publish("ESP0003/countWiFiConnect", countchar);
dtostrf(timeWiFiConnect, 6, 0, countchar);
client.publish("ESP0003/timeWiFiConnect", countchar);
}
void callback(String topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
}
// This functions reconnects your ESP8266 to your MQTT broker
// Change the function below if you want to subscribe to more topics with your ESP8266
void reconnect() {
// Loop until we're reconnected
long now = millis();
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP0003_Client")) {
Serial.println("connected");
countWiFiConnect = countWiFiConnect + 1;
// Subscribe or resubscribe to a topic
// You can subscribe to more topics (to control more LEDs in this example)
client.subscribe("ESP0003/LED/D0set");
timeWiFiConnect = timeWiFiConnect + millis() - now;
}
else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 1 seconds");
// Wait 1 seconds before retrying
delay(1000);
}
}
}
void setup() {
Serial.begin(9600, SERIAL_8N1, SERIAL_TX_ONLY);
setup_wifi();
client.setServer(AIO_SERVER, AIO_SERVERPORT);
client.setCallback(callback);
}
// For this project, you don't need to change anything in the loop function. Basically it ensures that you ESP is connected to your broker
void loop() {
byte i;
now = millis();
if (now - lastMeasure > 10000) {
if (!client.connected()) {
reconnect();
}
if(!client.loop())
client.connect("ESP8266Client");
lastMeasure = millis();
if (FirstZapusk == 1) {
publikuem = 1;
FirstZapusk = 0;
lastCmd = "EspRestart";
}
if (UINT32_MAX - millis() < 20000 ) { // за 20 секунд до переполнения millis Переполнение происходит раз в 49 дней
lastCmd = "perepolnenie millis";
publikuem = 1;
}
// раз в указанный период устанавливаем флаг publikuem в 1
if (now - lastMsg > 10000) {
publikuem = 1;
}
// Публикуем необходимые данные
if (publikuem == 1) {
publikuem = 0;
lastMsg = now;
Serial.println("Публикуем наши данные");
if ((String)lastCmd != (String)"") {
char charBufVar[80];
lastCmd.toCharArray(charBufVar, 80);
client.publish("ESP0003/LastCmd", charBufVar);
lastCmd = "";
}
}
count = count + 1;
dtostrf(count, 6, 0, countchar);
client.publish("ESP0003_count", countchar);
client.publish("ESP0003/name", EspNaveVer);
Serial.print("Count: ");
Serial.println(count);
Serial.print("countWiFiConnect: ");
Serial.println(countWiFiConnect);
Serial.print("timeWiFiConnect: ");
Serial.println(timeWiFiConnect);
dtostrf(countWiFiConnect, 6, 0, countchar);
client.publish("ESP0003/countWiFiConnect", countchar);
dtostrf(timeWiFiConnect, 6, 0, countchar);
client.publish("ESP0003/timeWiFiConnect", countchar);
}
}