Ситуация такова, решил скрестить анолог WS2812 с MQTT, с целью создать цветовое табло с управлением по MQTT. Скрестил два кода стыренных с просторов интернета, получилось вот что:
В целом всё работает как нужно, отправляю в топик SetAlarm/command_01 единицу, диоды мерцают красным, когда двойку - горят зелёным, ноль выключает...
Но есть непонятная проблема. Хаотично и непонятно отчего и как ESP12S "вылетает" в перезагрузку. Иногда просто зависает и не восстанавливает рабочий режим. Изредка отваливается MQTT, она постоянно пытается подключиться, но не подключается, а лог сервера вообще не видит никакой активности.
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//++++++++++++++++++++++++++++++
#include <Adafruit_NeoPixel.h>
#define LED_PIN 5
#define LED_COUNT 12
#define NUMPIXELS 12 //
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
//++++++++++++++++++++++++++++++
#define wifi_ssid "111"
#define wifi_password "#12345678#"
#define mqtt_server "192.168.1.15"
#define mqtt_port 1885
#define mqtt_user "Sup"
#define mqtt_password "2222"
#define mqtt_client_name "Soooo"
#define GPIO4 4
int msgString = 0;
int *msgString_ptr = &msgString;
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char *command_01, byte *payload, unsigned int length)
{
char buff_p[length];
for (int i = 0; i < length; i++)
{
//Serial.println((char)payload[i]);
buff_p[i] = (char)payload[i];
}
buff_p[length] = '\0';
String msg_p = String(buff_p);
int msgString = msg_p.toInt(); // to Int
*msgString_ptr = msgString;
Serial.println(msgString);
}
void BlinkRED(){
if (msgString == 1)
{
digitalWrite(GPIO4, HIGH);
pixels.clear();
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //RED
pixels.setPixelColor(1, pixels.Color(0, 255, 0));
pixels.setPixelColor(2, pixels.Color(0, 255, 0));
pixels.setPixelColor(3, pixels.Color(0, 255, 0));
pixels.setPixelColor(4, pixels.Color(0, 255, 0));
pixels.setPixelColor(5, pixels.Color(0, 255, 0));
pixels.setPixelColor(6, pixels.Color(0, 255, 0)); //RED
pixels.setPixelColor(7, pixels.Color(0, 255, 0));
pixels.setPixelColor(8, pixels.Color(0, 255, 0));
pixels.setPixelColor(9, pixels.Color(0, 255, 0));
pixels.setPixelColor(10, pixels.Color(0, 255, 0));
pixels.setPixelColor(11, pixels.Color(0, 255, 0));
pixels.show();
delay(50);
pixels.clear();
pixels.show();
delay(50);
}
}
void BlinkGREEN(){
if (msgString == 2)
{
digitalWrite(GPIO4, HIGH);
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); //RED
pixels.setPixelColor(1, pixels.Color(255, 0, 0));
pixels.setPixelColor(2, pixels.Color(255, 0, 0));
pixels.setPixelColor(3, pixels.Color(255, 0, 0));
pixels.setPixelColor(4, pixels.Color(255, 0, 0));
pixels.setPixelColor(5, pixels.Color(255, 0, 0));
pixels.setPixelColor(6, pixels.Color(255, 0, 0)); //RED
pixels.setPixelColor(7, pixels.Color(255, 0, 0));
pixels.setPixelColor(8, pixels.Color(255, 0, 0));
pixels.setPixelColor(9, pixels.Color(255, 0, 0));
pixels.setPixelColor(10, pixels.Color(255, 0, 0));
pixels.setPixelColor(11, pixels.Color(255, 0, 0));
pixels.show();
}
}
void ledOff(){
if (msgString == 0)
{
pixels.clear();
pixels.show();
digitalWrite(GPIO4, LOW);
}
}
//=================================================================================
//=================================================================================
void setup(void)
{
Serial.begin(115200);
pinMode(GPIO4, OUTPUT);
client.setCallback(callback);
/////////////////////////////////////////////////////
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
/////////////////////////////////////////////////////
//++++++++++++++++++++++++++++++
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
strip.show(); // Turn OFF all pixels ASAP
strip.setBrightness(10); // Set BRIGHTNESS to about 1/5 (max = 255)
pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
//++++++++++++++++++++++++++++++
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
// blink_red();
delay(480);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
//////////////////////////////////////////////////////////////////////////////////////
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.println("Attempting MQTT connection.....");
if (client.connect(mqtt_client_name, mqtt_user, mqtt_password)) {
Serial.println("MQTT connected");
client.subscribe("SetAlarm/command_01");
} else {
Serial.print("Connect failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
// blink_red();
delay(200);
//blink_red();
delay(4760);
}
}
}
void loop(void)
{
if (!client.connected()) {
reconnect();
}
client.loop();
BlinkRED();
ledOff();
BlinkGREEN();
}
Но есть непонятная проблема. Хаотично и непонятно отчего и как ESP12S "вылетает" в перезагрузку. Иногда просто зависает и не восстанавливает рабочий режим. Изредка отваливается MQTT, она постоянно пытается подключиться, но не подключается, а лог сервера вообще не видит никакой активности.