У меня в наличие уже спаянная схема гирлянды на элементах написанных в заголовке.
Пытаюсь теперь довести до ума код, который я писал больше года назад. В коде могут быть лишние и неиспользуемые пока переменные, массивы.
Код:
Спойлер
#include <ESP8266WiFi.h>
#define lenArr(sizedArr) sizeof(sizedArr)/sizeof(*sizedArr)
#define FASTLED_ESP8266_RAW_PIN_ORDER
#include "FastLED.h"
constexpr uint8_t numLeds = 50;
constexpr uint8_t pinLeds = D8;
constexpr uint8_t COLOR_ORDER = RGB;
CRGB leds[numLeds];
constexpr uint8_t nameSTR = 16;
constexpr uint8_t errorParsing = 0;
constexpr uint8_t modeLeds = 1;
constexpr uint8_t numLed = 2;
constexpr uint8_t brightLed = 3;
constexpr uint8_t redColor = 4;
constexpr uint8_t greenColor = 5;
constexpr uint8_t blueColor = 6;
constexpr uint8_t speedModeLeds = 7;
const char* ssid = "New_year_lights";
const char* password = "12345678";
IPAddress local_IP(10, 10, 10, 1);
IPAddress gateway(10, 10, 10, 1);
IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);
constexpr char nameP[][nameSTR]{
{"Error"},
{"mode"},
{"num"},
{"bright"},
{"red"},
{"green"},
{"blue"},
{"speed"}
};
constexpr uint8_t lenNameP = lenArr(nameP);
uint8_t valueP[lenNameP] {};
#define ERROR 0
#define MODE 1
#define NUM 2
#define BRIGHT 3
#define RED_C 4
#define GREEN_C 5
#define BLUE_C 6
#define SPEED 7
const CRGB rainbow[]{0xff0000, 0xffa500, 0xffff00, 0x008000, 0x0000ff, 0x4b0082, 0xee82ee};
const CRGB color16[]{0xFFFFFF, 0xC0C0C0, 0xFF0000, 0xFF00FF, 0xFFFF00, 0x00FF00, 0x008000,
0x008080, 0x00FFFF, 0x0000FF, 0x000080, 0x800080, 0x808000, 0x800000,
0x808080, 0x000000 };
constexpr uint8_t brigth16[]{15, 31, 47, 63, 79, 95, 111, 127, 143, 159, 175, 191, 207, 223, 239, 255};
//constexpr uint8_t brigth16[]{ 0, 10, 20, 100, 10, 200, 50, 127, 143, 159, 175, 191, 207, 223, 239, 255 };
void parsing(WiFiClient& client, uint8_t valueP[]) {
static char c, nameStr[nameSTR]{};
static uint8_t iNameP = 0, value = 0, iValue = 0;
Serial.println("Start parsing");
/*for (uint8_t i = 0; i < lenNameP; i++) {
Serial.print(i); Serial.print(" ");
Serial.print(nameP[i]); Serial.print(" = ");
Serial.print(valueP[i]); Serial.print(" ");
}
Serial.println(" ");*/
while (client.available()) {
c = client.read();
if (c == '?') {
while (c != ' ' && c != -1) {
c = client.read();
if (c == '\n' || c == '\r') break;
if (c >= 'a' && c <= 'z' && iNameP < (nameSTR - 1)) {
nameStr[iNameP] = c;
iNameP++;
}
if (c == '=') {
nameStr[iNameP] = 0;
iNameP = 0;
for (uint8_t i = 0; i < lenNameP; i++)
if (strcmp(nameP[i], nameStr) == 0) { iValue = i; break; }
}
if (c >= '0' && c <= '9') {
value = value * 10 + (uint8_t(c) - 48);
}
if ((c == '&' || c == ' ') && iValue) {
valueP[iValue] = value;
value = 0; iValue = 0;
}
}
}
}
client.println(F("HTTP/1.1 200 OK"));
client.println(F("Content-Type: text/plain"));
client.println(F("Connection: close"));
//client.println();
//client.print('?');
for (uint8_t i = 0; i < lenNameP; i++) {
//client.print(nameP[i]);
//client.print('=');
//client.print(valueP[i]);
//client.print('&');
Serial.print(i); Serial.print(" ");
Serial.print(nameP[i]); Serial.print("=");
Serial.print(valueP[i]); Serial.print("");
}
Serial.println("");
Serial.println("Stop parsing");
client.stop();
}
void setOneLed(uint8_t num, const uint8_t& bright, const CRGB& rgb) {
//Serial.print("num = "); Serial.println(num);
//Serial.print("bright = "); Serial.println(bright);
if (num > 0 && num <= numLeds) {
num--;
leds[num] = CRGB(rgb);
leds[num].maximizeBrightness();
leds[num] %= brighten8_video(bright);
}
}
void setup() {
Serial.begin(9600);
Serial.println("");
Serial.println("Start");
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(local_IP, gateway, subnet);
WiFi.softAP(ssid, password);
server.begin();
FastLED.addLeds<WS2811, pinLeds>(leds, numLeds);
}
void loop() {
WiFiClient client = server.available();
while (client.connected())
if (client.available() && !valueP[MODE]) parsing(client, valueP);
if (!client.connected())
client.stop();
if (valueP[MODE]) {
//Serial.print("mode = "); Serial.println(valueP[MODE]);
switch (valueP[MODE]) {
case 1: {
for (uint8_t i = 0; i < numLeds; i++)
setOneLed(i, valueP[0], CRGB(valueP[0], valueP[0], valueP[0]));
break;
}
case 2: {
setOneLed(valueP[NUM], valueP[BRIGHT], CRGB(valueP[RED_C], valueP[GREEN_C], valueP[BLUE_C]));
break;
}
}
FastLED.show();
for (uint8_t i = 0; i < lenNameP; i++) valueP[i] = 0;
}
delay(100);
}
Вопрос на данный момент. Я отправляю команду с компьютера через браузер:
http://10.10.10.1/?mode=2&num=1&bright=50&red=200&green=0&blue=0&
Светодиод загорается, но почему-то функция parsing() отрабатывает дважды.
Монитор порта:
Start parsing
0 Error=0 1 mode=2 2 num=1 3 bright=50 4 red=200 5 green=0 6 blue=0 7 speed=0
Stop parsing
Start parsing
0 Error=0 1 mode=2 2 num=1 3 bright=50 4 red=200 5 green=0 6 blue=0 7 speed=0
Stop parsing
Почему так получается? Где я ошибся?