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