1 (edited by lenarik-86 2021-09-22 21:52:34)

Topic: отключается Wi-Fi на esp8266

добрый день, хочу собрать спортивное табло использую nodemcu v2, и светодиодные матрицы на ws2812.
в процессе работы может произвольно отключиться Wi-Fi, устройство пропадает из сети до перезагрузки.
замечено что чаще это происходит сразу после ввода данных в поле ввода. контроллер принимает эти данные, но изменившиеся значения на телефон не возвращаются, соответственно wi-fi отключается где-то после приёма данных, возможно в момент отправки данных на дисплей из ws2812, либо при попытке отправить новые данные обратно на телефон. при этом программа продолжает выполняться, по прошествии нескольких минут nodemcu перезагружается.
можете подсказать где я не прав, и что с этим делать?

#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT 
#include <ESP8266WiFi.h>

#include <RemoteXY.h>

// настройки соединения 
#define REMOTEXY_WIFI_SSID "RemoteXY"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377


// конфигурация интерфейса  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,70,0,0,0,68,0,13,24,2,
  7,37,10,4,80,10,2,19,58,8,
  2,26,2,65,2,1,28,18,42,15,
  10,31,42,11,134,26,31,31,83,84,
  65,82,84,0,83,84,79,80,0,7,
  20,10,35,20,19,4,47,20,17,2,
  26,2,7,20,63,35,20,19,36,48,
  20,16,2,26,2 };
  
// структура определяет все переменные и события вашего интерфейса управления 
struct {

    // input variables
  char name_1[65];  // =строка UTF8 оканчивающаяся нулем  
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен 
  int16_t play_1;  // 32767.. +32767 
  int16_t play_2;  // 32767.. +32767 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

// настройка табло

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#include  <Fonts/TomThumb.h>  

#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

 // назначаем пины 
#define PIN1 5               
#define PIN2 12
#define PIN3 4
#define PIN4 14

Adafruit_NeoMatrix matrix_1 = Adafruit_NeoMatrix(96, 8, PIN1, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ400); //строка названия команд
Adafruit_NeoMatrix matrix_2 = Adafruit_NeoMatrix(36, 8, PIN2, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ400); //строка таймера
Adafruit_NeoMatrix matrix_3 = Adafruit_NeoMatrix(16, 16, PIN3, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ400); //счёт1
Adafruit_NeoMatrix matrix_4 = Adafruit_NeoMatrix(16, 16, PIN4, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ400); //счёт2

const uint16_t colors[] = {
 matrix_1.Color(255, 0, 0), matrix_1.Color(255, 125, 0), matrix_1.Color(255, 255, 0), matrix_1.Color(125, 255, 0), matrix_1.Color(0, 255, 0), matrix_1.Color(0, 255, 125), matrix_1.Color(0, 255, 255), matrix_1.Color(0, 125, 255), matrix_1.Color(0, 0, 255), matrix_1.Color(125, 0, 255), matrix_1.Color(255, 0, 255), matrix_1.Color(255, 0, 125),
 matrix_2.Color(255, 0, 0), matrix_2.Color(255, 125, 0), matrix_2.Color(255, 255, 0), matrix_2.Color(125, 255, 0), matrix_2.Color(0, 255, 0), matrix_2.Color(0, 255, 125), matrix_2.Color(0, 255, 255), matrix_2.Color(0, 125, 255), matrix_2.Color(0, 0, 255), matrix_2.Color(125, 0, 255), matrix_2.Color(255, 0, 255), matrix_2.Color(255, 0, 125),
 matrix_3.Color(255, 0, 0), matrix_3.Color(255, 125, 0), matrix_3.Color(255, 255, 0), matrix_3.Color(125, 255, 0), matrix_3.Color(0, 255, 0), matrix_3.Color(0, 255, 125), matrix_3.Color(0, 255, 255), matrix_3.Color(0, 125, 255), matrix_3.Color(0, 0, 255), matrix_3.Color(125, 0, 255), matrix_3.Color(255, 0, 255), matrix_3.Color(255, 0, 125),
 matrix_4.Color(255, 0, 0), matrix_4.Color(255, 125, 0), matrix_4.Color(255, 255, 0), matrix_4.Color(125, 255, 0), matrix_4.Color(0, 255, 0), matrix_4.Color(0, 255, 125), matrix_4.Color(0, 255, 255), matrix_4.Color(0, 125, 255), matrix_4.Color(0, 0, 255), matrix_4.Color(125, 0, 255), matrix_4.Color(255, 0, 255), matrix_4.Color(255, 0, 125),
} ;

  char name1[65];  // контрольное значение строки - команды 
  int16_t play_1 = 0 ;  // 32767.. +32767 
  int16_t play_2 = 0;  // 32767.. +32767 
  int16_t PO = 3 ;             // текущий переуд
  int16_t Period = 3;     // колличество переудов
  uint32_t myTimer1 = 0;  //временная переменная таймера
  int GT = 20 ;           // время периода
  int GTs = 0 ;           // отсчёт секунд игры
  int GTm = 20;           // отсчёт минут игры
  int dim = 50;          // яркость экрана
  int col = 1;           // цвет
  

void setup() 
{
  RemoteXY_Init (); 

  // TODO you setup code
  matrix_1.begin();                  
  matrix_1.cp437(true);
  matrix_1.setTextWrap(0);
  matrix_1.setTextColor(colors[col]);
  matrix_1.show();
  matrix_2.begin();
  matrix_2.setTextWrap(0);
  matrix_2.setTextColor(colors[col]);
  matrix_2.show();
  matrix_3.begin();
  matrix_3.setTextWrap(0);
  matrix_3.setTextSize(2);
  matrix_3.setFont(& TomThumb);
  matrix_3.setTextColor(colors[col]);
  matrix_3.show();
  matrix_4.begin();
  matrix_4.setTextWrap(0);
  matrix_4.setFont(& TomThumb);
  matrix_4.setTextSize(2);
  matrix_4.setTextColor(colors[col]);
  matrix_4.show();
  rest();
}

void loop() 
{ 
  RemoteXY_Handler ();
  
   if (strcmp (RemoteXY.name_1, name1)!= 0) { strncpy( name1, RemoteXY.name_1,65); disp1();} //при изменении строки названия, записываем в память и отправляем на табло
   if (RemoteXY.play_1 != play_1 && RemoteXY.play_1 <100){  play_1 = RemoteXY.play_1; disp3();}     //при изменении счёта, записываем новый в память и  отправляем на табло
   if (RemoteXY.play_2 != play_2 && RemoteXY.play_2 <100){  play_2 = RemoteXY.play_2; disp4();}     //при изменении счёта, записываем новый в память и  отправляем на табло
   if (RemoteXY.switch_1 == 1 && PO > 0 ) { timer();}     // игра
   if (RemoteXY.switch_1 == 1 && PO == 0 ) { RemoteXY.switch_1 = 0; PO = Period ; RemoteXY.play_1 = 0 ; RemoteXY.play_2 = 0 ; } // при попытке запуска нулевого периода обнуляется счёт и период, но игра не начинается
   if (RemoteXY.play_1 > 1000 && RemoteXY.play_1 <= 1255) {dim =  RemoteXY.play_1 - 1000; dimm();}  // настройка яркости
   if (RemoteXY.play_1 > 2000 && RemoteXY.play_1 <= 2012) {col =  RemoteXY.play_1 - 2000; dimm();}  // выбор цвета
   if (RemoteXY.switch_1 == 0 && RemoteXY.play_1 > 100  && RemoteXY.play_1 <= 109 ) {Period = RemoteXY.play_1 - 100; rest();}  // установка количества периодов
   if (RemoteXY.switch_1 == 0 && RemoteXY.play_2 > 100  && RemoteXY.play_2 <= 160 ) {GT = RemoteXY.play_2 - 100; rest();} // установка времени периода
   if (RemoteXY.switch_1 == 1 && RemoteXY.play_1 > 200  && RemoteXY.play_1 <= 109 ) {PO = RemoteXY.play_1 - 100;  disp2(); RemoteXY.play_1=play_1;}  // корректировка текущего периода
   if (RemoteXY.switch_1 == 1 && RemoteXY.play_2 > 200  && RemoteXY.play_2 <= 160 ) {GTm = RemoteXY.play_2 - 100; disp2(); RemoteXY.play_2=play_2;} // корректировка текущего времени


}
void rest(){
  play_1 = 0 ;  // обнуляем счёт
  play_2 = 0 ;  // обнуляем счёт 
  PO = Period ;       // обнуляем таймер игры 
  GTs = 0 ;           // секунды
  GTm = GT;           // минуты
  dimm();           
}

void dimm(){
  matrix_1.setTextColor(colors[col]);
  matrix_2.setTextColor(colors[col]);
  matrix_3.setTextColor(colors[col]);
  matrix_4.setTextColor(colors[col]);
disp1();
disp2();
disp3();
disp4();
RemoteXY.play_1=play_1;
RemoteXY.play_2=play_2;
}
void timer() 
{
  if (millis() - myTimer1 >= 1000) {   // ищем разницу ( 1 с)   //каждую секунду обновляем переменные
      myTimer1 = millis();               // сброс таймера
      GTs--;                            // убавляем секунду
      if ( GTs < 0 ){                  // по прошествии секунды вычитаем минуту
        GTs = 59;
        GTm--;                           // вычитаем игровую минуту
         if ( GTm < 0 ){                 // по окончании времени периода
         GTm = GT ;                 // обнуляем время
         GTs = 0;
         PO--;                           // вычетаем период
         RemoteXY.switch_1 = 0;              // ставим игру на паузу, отправляем на телефон
        } 
      }
   disp2();
   }
}

void disp1(){
  matrix_1.setBrightness(dim);
  matrix_1.fillScreen(0);
  matrix_1.setCursor(0, 0);
  matrix_1.print(utf8rus(name1));
  matrix_1.show();
  Serial.println("disp1");
}


void disp2(){
  matrix_2.setBrightness(dim);
  matrix_2.fillScreen(0);
  matrix_2.setCursor(0, 0);
  matrix_2.print(PO);
  matrix_2.setCursor(9, 0);
  matrix_2.print(GTm/10);
  matrix_2.setCursor(14, 0);
  matrix_2.print(GTm%10);
  matrix_2.setCursor(22, 0);
  matrix_2.print(GTs/10);
  matrix_2.setCursor(27, 0);
  matrix_2.print(GTs%10);
  matrix_2.drawLine(6, 7, 6, 0, colors[col]);
  matrix_2.drawPixel(20, 2, colors[col]);
  matrix_2.drawPixel(20, 5, colors[col]);
  matrix_2.show();


}
void disp3(){
  matrix_3.setBrightness(dim);
  matrix_3.fillScreen(0);
  matrix_3.setCursor(0, 10);
  matrix_3.print(play_1);
  matrix_3.show();

}

void disp4(){
  matrix_4.setBrightness(dim);
  matrix_4.fillScreen(0);
  matrix_4.setCursor(0, 10);
  matrix_4.print(play_2);
  matrix_4.show();

}

2

Re: отключается Wi-Fi на esp8266

Processing ws2812 functions can take time.

If some function takes too long to perform in the

void loop()

causing a delay in-between calling the

RemoteXY_Handler()

then the connection will drop. 

I do not know the timeout period, but experimenting with making quicker functions and/or adding extra handler calls during long functions may be needed.

"And voila, which is French for.......'and then I found out.'" - Ready Player One