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

esp 01 сама перезагружается

tegor

New member
Здравствуйте!

Я разрабатываю проект адресной светодиодной ленты, которая будет работать через MQTT. В основе проекта лежит микроконтроллер ESP 01. Однако через полчаса - час работы ESP перезагружается. Насколько я понимаю, это происходит из-за зависания микроконтроллера, и перезагрузки с помощью watchdog.

Буду очень признателен за вашу помощь в решении этой проблемы.


1718360169292.png

2024-06-14_13-18-50.png2024-06-14_13-15-29.png
 

tegor

New member
извините, вот

C:
#include <Adafruit_NeoPixel.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>


int col[12];
char str[12] = "0,0,0";
char on = '0';
char brit[3];

unsigned int mil = 0;

const char* mqtt_server = "*";
const int mqtt_port = *;
const char* mqtt_user = "*";
const char* mqtt_password = "*";


const String color = "svt/lenta/col";
const String britness = "svt/lenta/brit";
const String ont = "svt/lenta/on";

WiFiClient espClient;
PubSubClient client(espClient);

Adafruit_NeoPixel pixels(151, 0, NEO_GRB + NEO_KHZ800);

void setup() {
  wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
  pixels.begin();
}

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

  if (on == '1') {
    pixels.setBrightness(atoi(brit));
    for (int i = 0; i < 151; i++) {
        pixels.setPixelColor(i, pixels.Color(col[0],col[1],col[2]));
    }
  } else {
    pixels.clear();
  }
  pixels.show();
}


void pars() {

  int count = 0;
  char* offset = str;
  while (true) {
    col[count++] = atoi(offset);
    offset = strchr(offset, ',');
    if (offset) offset++;
    else break;
  }
}

void wifi() {
  delay(10);
  int cout = 0;
  WiFi.mode(WIFI_STA);
  WiFi.begin("*", "*");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    cout++;
    if (cout == 30) {
      while (true) {
      }
    }
  }

  randomSeed(micros());

}


void callback(char* topic, byte* payload, unsigned int length) {
  if (String(topic) == color) {
    for (int x = 0; x < sizeof(str) / sizeof(str[0]); x++) {
      str[x] = char(0);
    }
    for (int i = 0; i < length; i++) {
      str[i] = char(payload[i]);
    }
    pars();
  } else if (String(topic) == britness) {
    for (int o = 0; o < sizeof(brit) / sizeof(brit[0]); o++) {
      brit[o] = char(0);
    }
    for (int y = 0; y < length; y++) {
      brit[y] = char(payload[y]);
    }
  } else if (String(topic) == ont) {
    on = char(payload[0]);
  }
}


void reconnect() {
  while (!client.connected()) {
    String clientId = "ESP8266-" + WiFi.macAddress();
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {

      client.subscribe((color + "/#").c_str());
      client.subscribe((britness + "/#").c_str());
      client.subscribe((ont + "/#").c_str());

    } else {
      delay(5000);
    }
  }
}
 

CodeNameHawk

Moderator
Команда форума
Включите вывод отладочной информации и посмотрите, что происходит перед перезагрузкой.
А также добавьте код отслеживания свободной памяти.
 

tegor

New member
перед перезагрузкой выдало это


ets Jan 8 2013,rst cause:4, boot mode: (3,6)

wdt reset
load 0x4010f000, len 3424, room 16
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8
tail 0
chksum 0x2b
csum 0x2b
v00045d20
~ld


с переменными всё было нормально, с памятью тоже
 

aZholtikov

Active member
Я могу ошибаться, но сия прекрасная задержка "delay(5000)" находится в loop c помощью reconnect(). И иногда срабатывает. Я бы порекомендовал уменьшить до 500 и потестить.
 

aZholtikov

Active member
И будет все время в reconect, если сервер не работает, скажем нет интернета или сеть не работает.
Снимаю шляпу! Такими, закрытыми для общего понимания, тонкостями делитесь, что я, не обремененный большими знаниями и опытом, искренне их "впитываю" для использования (с Вашего позволения конечно) в свой дальнейшей практике работы с Ардуино и иже с ним.
 

CodeNameHawk

Moderator
Команда форума
Такими, закрытыми для общего понимания, тонкостями делитесь
Такое видно сразу, что только одно условие для выхода, ведь ничего не мешает добавить выход по истечении задонного интервала времени.
 
Сверху Снизу