You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
857 lines
39 KiB
857 lines
39 KiB
#define DEBUG |
|
|
|
#include "FastLED.h" |
|
#include "GyverButton.h" |
|
|
|
#define VER "6.101" |
|
|
|
#include "ESP8266WiFi.h" |
|
#include "PubSubClient.h" |
|
#include <ESP8266WebServer.h> |
|
#include <ESP8266mDNS.h> |
|
#include <ESP8266HTTPUpdateServer.h> |
|
|
|
// #include <GyverNTP.h> |
|
// #include <EEPROM.h> |
|
|
|
// #include <ESP8266HTTPClient.h> |
|
//#include <WiFiClient.h> |
|
|
|
#include "ArduinoJson.h" |
|
// #include <GyverPortal.h> |
|
// GyverPortal ui; |
|
|
|
#define AP_SSID "WT24" |
|
#define AP_PASS "repytwjd" |
|
|
|
String ID = ""; |
|
const char *mqtt_server = "192.168.121.72"; // Имя сервера MQTT |
|
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT |
|
const char *mqtt_user = "mqtt"; |
|
const char *mqtt_pass = "mqtt"; |
|
|
|
bool valSwitch = false; |
|
int valNum = 2; |
|
bool valLed = false; |
|
String valStr; |
|
|
|
|
|
// GyverNTP ntp(3); |
|
WiFiClient wclient; |
|
|
|
#ifndef DEBUG |
|
IPAddress ipa(192, 168, 121, 161); |
|
#else |
|
IPAddress ipa(192, 168, 121, 166); |
|
#endif |
|
IPAddress server(192,168,121,72); |
|
IPAddress gateway(192, 168, 121, 2); |
|
IPAddress dns(192, 168, 121, 2); |
|
IPAddress subnet(255, 255, 255, 0); |
|
|
|
#define BTN_PIN D2 |
|
GButton butt1(BTN_PIN, INPUT, HIGH); |
|
StaticJsonDocument<100> parsed; |
|
int value = 0; |
|
volatile bool enable = false; |
|
volatile bool test = false; |
|
byte counter; |
|
|
|
#define LED_PIN D4 |
|
#define NUM_LEDS 129 |
|
#define LED_TYPE WS2812 |
|
#define COLOR_ORDER GRB |
|
CRGB leds[NUM_LEDS]; |
|
|
|
#pragma region Arrays |
|
const byte PROGMEM stage[][129] = { |
|
{105,106,107,108}, |
|
{103,104,105,106,107,108,109,110,65,66,67,68}, |
|
{101,102,103,104,105,106,107,108,109,110,111,112,63,64,65,66,67,68,69,70,36,37,38}, |
|
{16,17,18,34,35,36,37,38,39,40,62,63,64,65,66,67,68,69,70,71,100,101,102,103,104,105,106,107,108,109,110,111,112,113}, |
|
{4,5,6,15,16,17,18,19,34,35,36,37,38,39,40,61,62,63,64,65,66,67,68,69,70,71,72,100,101,102,103,104,105,106,107,108,109,110,111,112,113}, |
|
{0,3,4,5,6,7,13,14,15,16,17,18,19,20,21,32,33,34,35,36,37,38,39,40,41,42,60,61,62,63,64,65,66,67,68,69,70,71,72,73,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114}, |
|
{0,1,2,3,4,5,6,7,8,12,13,14,15,16,17,18,19,20,21,22,31,32,33,34,35,36,37,38,39,40,41,42,43,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115}, |
|
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116}, |
|
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117}, |
|
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118}, |
|
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128} |
|
}; |
|
const byte l_stage[] = {4,12,23,34,41,56,67,78,91,108,129}; |
|
|
|
const byte stager[][2] PROGMEM = {{0,0},{1,8},{9,24},{25,48},{49,83},{84,128}}; |
|
|
|
const byte PROGMEM stagen[][16] = { |
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, //1 |
|
{1,2,3,4,5,6,7,8,9,11,13,15,17,19,21,23}, //16 |
|
{9,11,13,15,17,19,21,23,25,28,31,34,37,40,43,46}, //16 |
|
{25,28,31,34,37,40,43,46,49,54,58,62,67,71,76,80}, //16 |
|
{49,54,58,62,67,71,76,80,84,90,95,101,107,112,118,123}, //16 |
|
{84,90,95,101,107,112,118,123,123,123,123,123,123,123,123,123} //8 |
|
}; |
|
const byte l_stagen[] = {1,16,16,16,16,8}; |
|
|
|
#pragma endregion |
|
|
|
#define UPDATES_PER_SECOND 100 |
|
#ifndef DEBUG |
|
const char *top_s = "Sunny6/status"; |
|
const char *top_c = "Sunny6/config"; |
|
const char *topic = "Sunny6/"; |
|
#else |
|
const char *top_s = "Sunny6debug/status"; |
|
const char *top_c = "Sunny6debug/config"; |
|
const char *topic = "Sunny6debug/"; |
|
#endif |
|
|
|
byte baza = 0; |
|
|
|
void btn(); |
|
void reconnect(); |
|
void mqtt_callback(char* topic, byte* payload, unsigned int length); |
|
void pub_new_set(); |
|
|
|
PubSubClient mclient(server, 1883, mqtt_callback, wclient); |
|
ESP8266WebServer httpServer(80); |
|
ESP8266HTTPUpdateServer httpUpdater; |
|
|
|
volatile byte mode = 0; |
|
volatile byte mode2 = 0; |
|
byte vv2 = 0; |
|
uint16_t light = 0; |
|
uint8_t tmp = 0; |
|
String d = String(__DATE__) + " " + String(__TIME__); |
|
String v = VER; |
|
volatile bool enable3 = false; |
|
|
|
// GPtime valTime_on; |
|
// GPtime valTime_off; |
|
// GPtime valTime; |
|
// Datime dt; |
|
// Datime ttt; |
|
|
|
String lt = ""; |
|
int bri = 250; |
|
bool iswd = false; |
|
bool _allow = false; |
|
byte h_on = 0; |
|
byte m_on = 0; |
|
byte h_off = 0; |
|
byte m_off = 0; |
|
byte rd = 0; |
|
byte vd = 0; |
|
// byte vd = 0; |
|
String clientId = ""; |
|
bool flag_one = true; |
|
|
|
#pragma region setup |
|
void setup() |
|
{ |
|
delay(500); // power-up safety delay |
|
FastLED.clear(); |
|
FastLED.show(); |
|
FastLED.addLeds <WS2812, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); |
|
FastLED.setBrightness(0); |
|
Serial.begin(115200); |
|
randomSeed(analogRead(0)); |
|
butt1.setDebounce(20); |
|
for(int i = 0; i < 5; i++) |
|
FastLED.show(); |
|
|
|
leds[0] = CRGB::Yellow; |
|
FastLED.setBrightness(10); |
|
FastLED.show(); |
|
|
|
Serial.begin(115200); |
|
|
|
Serial.print("\r\n\r\nVersion: "); |
|
Serial.println(v); |
|
Serial.print("Compiled: "); |
|
Serial.println(d); |
|
|
|
WiFi.mode(WIFI_STA); |
|
WiFi.config(ipa, gateway, subnet, dns); |
|
WiFi.begin(AP_SSID, AP_PASS); |
|
FastLED.setBrightness(10); |
|
ID = "Sunny_06"; |
|
clientId = ID + String(random(1000)); |
|
reconnect(); |
|
|
|
mclient.publish(top_s, "Выключено",true); |
|
valStr = "Выключено"; |
|
leds[0] = CRGB::Green; |
|
FastLED.setBrightness(10); |
|
FastLED.show(); |
|
delay(500); |
|
leds[0] = CRGB::Black; |
|
FastLED.setBrightness(10); |
|
FastLED.show(); |
|
|
|
httpServer.on("/", handleRoot); |
|
httpServer.on("/inline", []() |
|
{ |
|
httpServer.send(200, "text/plain", "this works as well"); |
|
}); |
|
httpServer.send(200, "text/plain", "hello from esp8266!"); |
|
httpServer.onNotFound(handleNotFound); |
|
|
|
MDNS.begin(ID.c_str()); |
|
Serial.print("Web server..."); |
|
Serial.println(" running."); |
|
|
|
httpUpdater.setup(&httpServer); |
|
httpServer.begin(); |
|
Serial.printf("HTTP Update Server running. Open http://%s.local/update\n\n", ID.c_str()); |
|
|
|
// pub_new_set(); |
|
} |
|
|
|
char* concat(const char *s1, const char *s2) |
|
{ |
|
const size_t len1 = strlen(s1); |
|
const size_t len2 = strlen(s2); |
|
char *result = (char *)malloc(len1 + len2 + 1); // +1 for the null-terminator |
|
// in real code you would check for errors in malloc here |
|
memcpy(result, s1, len1); |
|
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator |
|
return result; |
|
} |
|
|
|
char* newtop(const char *s2) |
|
{ |
|
const size_t len2 = strlen(s2); |
|
const size_t len1 = strlen(topic); |
|
char *result = (char *)malloc(len1 + len2 + 1); // +1 for the null-terminator |
|
// in real code you would check for errors in malloc here |
|
memcpy(result, topic, len1); |
|
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator |
|
return result; |
|
} |
|
|
|
#pragma endregion |
|
void loop() |
|
{ |
|
static long dot = 0; |
|
static long update = 0; |
|
static long update2 = 0; |
|
static long iwd = 0; |
|
static long voshod = 0; |
|
static long testing = 0; |
|
static byte vvv = 0; |
|
static byte klc = 0; |
|
static byte vv1 = 0; |
|
static byte vv2 = 0; |
|
httpServer.handleClient(); |
|
butt1.tick(); |
|
if (butt1.isPress()) |
|
{ |
|
Serial.println("press 0"); |
|
if(enable) |
|
{ |
|
Serial.println("press 1"); |
|
enable = false; |
|
test = false; |
|
#ifdef DEBUG |
|
Serial.printf("test = %d ena = %d mode = %d\r\n", test, enable, mode); |
|
#endif |
|
} |
|
else |
|
{ |
|
Serial.println("press 2"); |
|
test = true; |
|
#ifdef DEBUG |
|
Serial.printf("test = %d ena = %d mode = %d\r\n", test, enable, mode); |
|
#endif |
|
} |
|
} |
|
mclient.loop(); |
|
reconnect(); |
|
if ((millis() - dot) >= 1000) |
|
{ |
|
dot = millis(); |
|
} |
|
if ((millis () - update) >= 1000 * 60 * 10) |
|
{ |
|
update = millis(); |
|
} |
|
if ((millis () - update2) >= 1000 * 60 * 120) |
|
{ |
|
ESP.reset(); |
|
} |
|
if((enable) || test) |
|
{ |
|
switch (mode) |
|
{ |
|
case 0: |
|
if(test) |
|
{ |
|
if ((millis () - voshod) >= 40 * 13) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Восход",true); |
|
valStr = "Восход"; |
|
flag_one = false; |
|
} |
|
mclient.publish(newtop("status"), "Восход",true); |
|
valStr = "Восход"; |
|
voshod2(vvv); |
|
if(vvv++ == 10) |
|
{ |
|
vvv = 0; |
|
mode = 1; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
} |
|
else |
|
{ |
|
#ifdef DEBUG |
|
if ((millis () - voshod) >= 50 * 13) |
|
#else |
|
if ((millis () - voshod) >= 1000 * 13) |
|
#endif |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Восход",true); |
|
valStr = "Восход"; |
|
flag_one = false; |
|
} |
|
voshod2(vvv); |
|
if(vvv++ == 10) |
|
{ |
|
vvv = 0; |
|
mode = 1; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
} |
|
break; |
|
case 1: |
|
if ((millis() - voshod) >= 100) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Кольца",true); |
|
valStr = "Кольца"; |
|
flag_one = false; |
|
} |
|
kolca2(vv1); |
|
if(vv1++ == 26) |
|
{ |
|
vv1 = 0; |
|
mode = 2; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 2: |
|
if ((millis() - voshod) >= 20) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Циклон 1",true); |
|
valStr = "Циклон 1"; |
|
flag_one = false; |
|
} |
|
cyclon(vv1); |
|
if(vv1++ == NUM_LEDS - 1) |
|
{ |
|
vv1 = (NUM_LEDS) - 1; |
|
mode = 3; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 3: |
|
if ((millis() - voshod) >= 20) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Циклон 2",true); |
|
valStr = "Циклон 2"; |
|
flag_one = false; |
|
} |
|
cyclon(vv1); |
|
if(vv1-- == 0) |
|
{ |
|
vv1 = 0; |
|
mode = 4; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 4: |
|
if ((millis() - voshod) >= 20) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Циклон 1",true); |
|
valStr = "Циклон 1"; |
|
flag_one = false; |
|
} |
|
cyclon(vv1); |
|
if(vv1++ == NUM_LEDS - 1) |
|
{ |
|
vv1 = (NUM_LEDS) - 1; |
|
mode = 5; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 5: |
|
if ((millis() - voshod) >= 20) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Циклон 2",true); |
|
valStr = "Циклон 2"; |
|
flag_one = false; |
|
} |
|
cyclon(vv1); |
|
if(vv1-- == 0) |
|
{ |
|
vv1 = 0; |
|
mode = 6; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 6: |
|
if ((millis() - voshod) >= 30) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Бегунок",true); |
|
valStr = "Бегунок"; |
|
flag_one = false; |
|
} |
|
begunok(vv1); |
|
// if(vvv++ == 11) |
|
if(vv1++ == 120) |
|
{ |
|
vv1 = 0; |
|
mode = 7; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 7: |
|
if ((millis() - voshod) >= 10) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Радуга 1",true); |
|
valStr = "Радуга 1"; |
|
flag_one = false; |
|
} |
|
raduga(vv1); |
|
if(vv1++ == 255) |
|
{ |
|
vv1 = 0; |
|
mode = 8; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 8: |
|
if ((millis() - voshod) >= 100) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Лучи",true); |
|
valStr = "Лучи"; |
|
flag_one = false; |
|
} |
|
luchi2(vv1); |
|
// if(vvv++ == 11) |
|
if(vv1++ == 30) |
|
{ |
|
vv1 = 0; |
|
mode = 9; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 9: |
|
if ((millis() - voshod) >= 10) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Радуга 2",true); |
|
flag_one = false; |
|
valStr = "Радуга 2"; |
|
} |
|
raduga(vv1); |
|
if(vv1++ == 255) |
|
{ |
|
vv1 = 0; |
|
mode = 10; |
|
voshod = 0; |
|
flag_one = true; |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
case 10: |
|
if ((millis() - voshod) >= 100) |
|
{ |
|
if(flag_one) |
|
{ |
|
mclient.publish(newtop("status"), "Кольца 3",true); |
|
valStr = "Кольца 3"; |
|
flag_one = false; |
|
} |
|
kolca3(vv1); |
|
if(vv1++ == 26) |
|
{ |
|
vv1 = 0; |
|
mode = 1; |
|
voshod = 0; |
|
flag_one = true; |
|
if(test) |
|
{ |
|
mode = 0; |
|
test = false; |
|
} |
|
} |
|
voshod = millis(); |
|
} |
|
break; |
|
} |
|
} |
|
else |
|
{ |
|
if(leds[105] != CRGB::Black || leds[128] != CRGB::Black ) |
|
{ |
|
#ifdef DEBUG |
|
Serial.printf("test = %d ena = %d ena2 = %d ena3 = %d mode = %d\r\n", test, enable, mode); |
|
#endif |
|
fill_solid(leds, NUM_LEDS, CRGB::Black); |
|
FastLED.show(); |
|
FastLED.show(); |
|
FastLED.show(); |
|
mclient.publish(newtop("status"), "Выключено",true); |
|
valStr = "Выключено"; |
|
vvv = 0; |
|
vv1 = 0; |
|
mode = 0; |
|
} |
|
} |
|
delay(1); |
|
} |
|
#pragma region LEDS function |
|
void fadetoblack() |
|
{ |
|
for(int i = 0; i < NUM_LEDS; i++) |
|
{ |
|
fadeToBlackBy(leds, NUM_LEDS, 10); |
|
FastLED.show(); |
|
FastLED.delay(1000 / UPDATES_PER_SECOND); |
|
} |
|
} |
|
void voshod2(int num) |
|
{ |
|
for(int c = 0; c < l_stage[num]; c++) |
|
{ |
|
byte x = pgm_read_byte(&(stage[num][c])); |
|
leds[x] = HeatColor(num * 13 + 10); |
|
} |
|
FastLED.setBrightness(bri); |
|
FastLED.show(); |
|
FastLED.show(); |
|
if(leds[105] != HeatColor(num * 13 + 10) && leds[106] != HeatColor(num * 13 + 10)) |
|
{ |
|
for(int c = 0; c < l_stage[num]; c++) |
|
{ |
|
byte x = pgm_read_byte(&(stage[num][c])); |
|
leds[x] = HeatColor(num * 13 + 10); |
|
} |
|
} |
|
} |
|
void kolca2(int num) |
|
{ |
|
num = num % 7; |
|
if(num < 6) |
|
{ |
|
fill_solid(leds, NUM_LEDS, HeatColor(142)); |
|
for(int i = pgm_read_byte_near(&(stager[num][0])); i < pgm_read_byte_near(&(stager[num][1])) + 1; i++) |
|
{ |
|
leds[i] = HeatColor(200); |
|
} |
|
} |
|
else |
|
fill_solid(leds, NUM_LEDS, HeatColor(142)); |
|
FastLED.setBrightness(bri); |
|
FastLED.show(); |
|
FastLED.show(); |
|
} |
|
void kolca3(int num) |
|
{ |
|
num = num % 7; |
|
if(num < 6) |
|
{ |
|
fill_solid(leds, NUM_LEDS, HeatColor(142)); |
|
for(int i = pgm_read_byte_near(&(stager[num][0])); i < pgm_read_byte_near(&(stager[num][1])) + 1; i++) |
|
{ |
|
leds[i] = HeatColor(200); |
|
} |
|
} |
|
else |
|
fill_solid(leds, NUM_LEDS, HeatColor(142)); |
|
FastLED.setBrightness(bri); |
|
fadeToBlackBy(leds, NUM_LEDS, 10); |
|
FastLED.show(); |
|
FastLED.show(); |
|
} |
|
void luchi2(int num) |
|
{ |
|
num = num % 6; |
|
fill_solid(leds, NUM_LEDS, HeatColor(142)); |
|
for(int c = 0; c < l_stagen[num]; c++) |
|
{ |
|
byte x = pgm_read_byte_near(&(stagen[num][c])); |
|
leds[x] = HeatColor(200); |
|
} |
|
FastLED.setBrightness(bri); |
|
FastLED.show(); |
|
FastLED.show(); |
|
} |
|
void begunok(int num) |
|
{ |
|
int col = 255; |
|
fill_solid(leds, NUM_LEDS, HeatColor(142)); |
|
leds[num % 45 + 84] = HeatColor(col); |
|
leds[83 - num % 35] = HeatColor(col); |
|
leds[num % 24 + 25] = HeatColor(col); |
|
leds[24 - num % 16] = HeatColor(col); |
|
leds[num % 8] = HeatColor(col); |
|
FastLED.setBrightness(bri); |
|
FastLED.show(); |
|
} |
|
void raduga(int num) |
|
{ |
|
for (int i = 0; i < NUM_LEDS; i++ ) |
|
{ |
|
leds[i] = CHSV(num + i * 2, 255, 255); |
|
} |
|
FastLED.show(); |
|
} |
|
void konfetti(int num) |
|
{ |
|
fill_solid(leds, NUM_LEDS, HeatColor(0)); |
|
for(int ii = 0; ii < num; ii++) |
|
{ |
|
fadeToBlackBy(leds, NUM_LEDS, 2); |
|
for (int i = 0; i < 8; i++) |
|
{ |
|
leds[beatsin16(i + 7, 0, NUM_LEDS - 1)] |= CHSV(baza+=16, 200, 255); |
|
} |
|
FastLED.setBrightness(bri); |
|
FastLED.show(); |
|
delay(20); |
|
} |
|
} |
|
void raduga2(int num) |
|
{ |
|
byte gHue = 0; |
|
byte chanceOfGlitter = 100; |
|
if (num == 0) |
|
fill_solid(leds, NUM_LEDS, HeatColor(0)); |
|
fill_rainbow( leds, NUM_LEDS, gHue, 2); |
|
if(random8() < chanceOfGlitter) |
|
leds[random16(NUM_LEDS)] += CRGB::White; |
|
gHue++; |
|
FastLED.show(); |
|
} |
|
void cyclon3(int num) |
|
{ |
|
leds[num] = 0xAAAAAA; |
|
FastLED.show(); |
|
leds[num] = CRGB::Black; |
|
leds[num] = CHSV(num, 255, 255); |
|
FastLED.show(); |
|
for(int i = 0; i < NUM_LEDS; i++) |
|
leds[i].nscale8(250); |
|
} |
|
void cyclon(int num) |
|
{ |
|
leds[num] = CHSV(num, 255, 255); |
|
FastLED.show(); |
|
for(int i = 0; i < NUM_LEDS; i++) |
|
leds[i].nscale8(250); |
|
} |
|
#pragma endregion |
|
|
|
#pragma region service |
|
void reconnect() |
|
{ |
|
if(WiFi.status() != WL_CONNECTED) |
|
{ |
|
WiFi.begin(AP_SSID, AP_PASS); |
|
FastLED.setBrightness(10); |
|
Serial.print("Attempting WiFi connection "); |
|
while (WiFi.status() != WL_CONNECTED) |
|
{ |
|
Serial.print("."); |
|
leds[0] = CRGB::Red; |
|
FastLED.show(); |
|
delay(500); |
|
leds[0] = CRGB::Yellow; |
|
FastLED.show(); |
|
delay(500); |
|
} |
|
// Serial.println(); |
|
Serial.print(" connected "); |
|
Serial.print("ip: "); |
|
Serial.println(WiFi.localIP()); |
|
|
|
} |
|
// Serial.print("mqtt state "); |
|
// Serial.println(mclient.state()); |
|
if(!mclient.connected()) |
|
{ |
|
Serial.print("Attempting MQTT connection... "); |
|
while (!mclient.connected()) |
|
{ |
|
Serial.print("."); |
|
if (mclient.connect(clientId.c_str(), mqtt_user, mqtt_pass)) |
|
{ |
|
Serial.println("connected"); |
|
// mclient.subscribe(newtop("config")); |
|
mclient.subscribe(top_c); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void mqtt_callback(char* topic, byte* payload, unsigned int length) |
|
{ |
|
payload[length] = 0; |
|
String a = (const char*)payload; |
|
String top = (const char*)topic; |
|
#ifdef DEBUG |
|
Serial.printf("-- MQTT: %s %s --\r\n", topic, payload); |
|
#endif |
|
a.toLowerCase(); |
|
a.replace("\r",""); |
|
a.replace("\n",""); |
|
if(top == String(top_c)) |
|
{ |
|
DeserializationError error = deserializeJson(parsed, a); |
|
if (error) |
|
{ |
|
Serial.print(F("deserializeJson() failed: ")); |
|
Serial.println(error.f_str()); |
|
return; |
|
} |
|
else |
|
{ |
|
if (parsed["on"] == "on") |
|
{ |
|
enable = true; |
|
test = false; |
|
} |
|
else |
|
{ |
|
enable = false; |
|
test = false; |
|
} |
|
bri = parsed["bri"]; |
|
#ifdef DEBUG |
|
Serial.printf("%s %d\r\n", String(parsed["on"]), bri); |
|
#endif |
|
} |
|
} |
|
} |
|
|
|
void reboot() |
|
{ |
|
ESP.reset(); |
|
} |
|
void web() |
|
{ |
|
// char temp[1000]; |
|
// snprintf(temp,1000, |
|
// "<html>\ |
|
// <head>\ |
|
// <meta http-equiv='content-type' content='text/html; charset=utf-8'>\ |
|
// <title>%s</title>\ |
|
// <link rel='icon' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGmSURBVHgBjVNtTsJAEJ3Z1sREIXgCywnkBtgo+ldPAJxAPYFwAuAEwgnEX0bBgDfgBtYTWEETo2zHt1ts+CiGlyxMpzNvZt5siVIgD5kzGWx7yXMve0lroNKcfDrpkt5qSG/3cEZRkEEu90e+EJtUecxUiDlH7neX/a8ACR7paICINonkSThAOaGI3rk0bq4QxCQ7BVLOLbwhAu+I5QXuNk6Ak7Mnoio5vA/SgI8nHU4bwXaj+BqWR+kYItlPOpD7mWCu6yExtiP8s1zMKi+ji5GeETRyoXANgQc20GggUoiHE1qLiPZsaZEwfQSj+HQKPVQjIVwGc42PxvV1BB796C5UN52FtDyGcN2IiC49Xk3GJjQ2EQtoVthBNayTR7A9aNMhJWVynDz7YbhwkaSfKZNWA1gBgn0oXbW6GGhp4XeE2QNocEXTyN7OhECeslgbVZB4blbEpY/hrF2jQcAnkzaS0Q151iYdGq3cOBl71/KKF/6qWFIEScvaysEV10XrLn02aRNgrLeFD6ufuaFNYa72coLd0BzUvwxKQXWnNe+C8sH88y/T07ahJJUsXgAAAABJRU5ErkJggg==' type='image/x-icon'> \ |
|
// </head>\ |
|
// <body>\ |
|
// <h2>Привет от %s!<br>Версия %s</h2>\ |
|
// <p>\ |
|
// <a href='/update' >Загрузка прошивки</a>\ |
|
// </p>\ |
|
// </body>\ |
|
// </html>",ID.c_str(),ID.c_str(),VER); |
|
// httpServer.send(200,"text/html",temp); |
|
} |
|
void handleRoot() |
|
{ |
|
String temp; |
|
temp += F("<html>"); |
|
temp += F("<head><meta http-equiv='content-type' content='text/html; charset=utf-8'>"); |
|
temp += F("<title>"); |
|
temp += ID.c_str(); |
|
temp += F("</title>"); |
|
temp += F("<link rel='icon' href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGmSURBVHgBjVNtTsJAEJ3Z1sREIXgCywnkBtgo+ldPAJxAPYFwAuAEwgnEX0bBgDfgBtYTWEETo2zHt1ts+CiGlyxMpzNvZt5siVIgD5kzGWx7yXMve0lroNKcfDrpkt5qSG/3cEZRkEEu90e+EJtUecxUiDlH7neX/a8ACR7paICINonkSThAOaGI3rk0bq4QxCQ7BVLOLbwhAu+I5QXuNk6Ak7Mnoio5vA/SgI8nHU4bwXaj+BqWR+kYItlPOpD7mWCu6yExtiP8s1zMKi+ji5GeETRyoXANgQc20GggUoiHE1qLiPZsaZEwfQSj+HQKPVQjIVwGc42PxvV1BB796C5UN52FtDyGcN2IiC49Xk3GJjQ2EQtoVthBNayTR7A9aNMhJWVynDz7YbhwkaSfKZNWA1gBgn0oXbW6GGhp4XeE2QNocEXTyN7OhECeslgbVZB4blbEpY/hrF2jQcAnkzaS0Q151iYdGq3cOBl71/KKF/6qWFIEScvaysEV10XrLn02aRNgrLeFD6ufuaFNYa72coLd0BzUvwxKQXWnNe+C8sH88y/T07ahJJUsXgAAAABJRU5ErkJggg==' type='image/x-icon'>"); |
|
temp += F("</head>"); |
|
temp += F("<style>"); |
|
temp += F(".button-style {display: inline-block; width: 248px; padding: 5px 10px; background: #f2f2f2; border: 1px solid #000;color: #333; text-decoration: none; text-align: center;}"); |
|
temp += F(".button-style:hover, .button-style:focus {background: #e2e2f2;}"); |
|
temp += F("</style>"); |
|
temp += F("<body style='background-color: #f9e79f; text-align: center'><h2>Солнышко</h2>"); |
|
temp += F("<h4>Версия "); |
|
temp += VER; |
|
temp += F("<br>Сборка "); |
|
temp += __DATE__; |
|
temp += " "; |
|
temp += __TIME__; |
|
temp += F("</h4>"); |
|
temp += F("<p><img width='248' height='200' src='data:image/png;base64,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'></p>"); |
|
temp += F("<p><a href='/update' class='button-style'>Загрузка прошивки</a></p>"); |
|
temp += F("</body></html>"); |
|
httpServer.send(200,"text/html",temp); |
|
} |
|
|
|
void handleNotFound() |
|
{ |
|
// digitalWrite(LEDR, 1); |
|
String message = "File Not Found\n\n"; |
|
message += "URI: "; |
|
message += httpServer.uri(); |
|
message += "\nMethod: "; |
|
message += (httpServer.method() == HTTP_GET)?"GET":"POST"; |
|
message += "\nArguments: "; |
|
message += httpServer.args(); |
|
message += "\n"; |
|
for (uint8_t i=0; i<httpServer.args(); i++){ |
|
message += " " + httpServer.argName(i) + ": " + httpServer.arg(i) + "\n"; |
|
} |
|
httpServer.send(404, "text/plain", message); |
|
} |
|
|
|
#pragma endregion
|
|
|