This commit is contained in:
Alex
2021-02-14 20:14:33 +03:00
parent 34ec597d53
commit a4f098250b
8 changed files with 224 additions and 132 deletions

View File

@@ -1,4 +1,20 @@
// LOLIN(WEMOS) D1 R2 & mini // 0.10
// исправлена обработка ключа
// добавлена совместимость с nodemcu
// поворот матрицы
// обновление прошивок для разных схем
// исправлен цвет огня
// индикация обновления при запуске
// мигает 8:
// красным - не смог подключиться к АР
// зелёным - смог подключиться к АР
// жёлтым - создал свою АП
// бирюзовым - успешно обновился на новую версию
// синим - обновился на ту же версию
// розовым - сброс всех настроек (первый запуск)
// Generic ESP8266, 4MB (FS:2MB OTA)
// ESP core 2.7.4+ http://arduino.esp8266.com/stable/package_esp8266com_index.json // ESP core 2.7.4+ http://arduino.esp8266.com/stable/package_esp8266com_index.json
// FastLED 3.4.0+ https://github.com/FastLED/FastLED/releases // FastLED 3.4.0+ https://github.com/FastLED/FastLED/releases
@@ -6,12 +22,17 @@
#define GL_KEY "GL" // ключ сети #define GL_KEY "GL" // ключ сети
// ------------ Кнопка ------------- // ------------ Кнопка -------------
#define BTN_PIN 4 // пин кнопки GPIO4 (D2). Или 0 для схемы с ESP-01 !! #define BTN_PIN 4 // пин кнопки GPIO4 (D2 на wemos/node), 0 для схемы с ESP-01
#define USE_BTN 1 // 1 использовать кнопку, 0 нет #define USE_BTN 1 // 1 использовать кнопку, 0 нет
// ------------- АЦП --------------
#define USE_ADC 1 // можно выпилить АЦП
#define MIC_VCC 12 // питание микрофона GPIO12 (D6 на wemos/node)
#define PHOT_VCC 14 // питание фоторезистора GPIO14 (D5 на wemos/node)
// ------------ Лента ------------- // ------------ Лента -------------
#define STRIP_PIN 2 // пин ленты GPIO2 (D4) #define STRIP_PIN 2 // пин ленты GPIO2 (D4 на wemos/node)
#define MAX_LEDS 512 // макс. светодиодов #define MAX_LEDS 600 // макс. светодиодов
#define STRIP_CHIP WS2812 // чип ленты #define STRIP_CHIP WS2812 // чип ленты
#define STRIP_COLOR GRB // порядок цветов в ленте #define STRIP_COLOR GRB // порядок цветов в ленте
#define STRIP_VOLT 5 // напряжение ленты, V #define STRIP_VOLT 5 // напряжение ленты, V
@@ -28,13 +49,23 @@ const char AP_NameChar[] = "GyverLamp2";
const char WiFiPassword[] = "12345678"; const char WiFiPassword[] = "12345678";
// ------------ Прочее ------------- // ------------ Прочее -------------
#define MIC_VCC D6 // питание микрофона #define GL_VERSION 010
#define PHOT_VCC D5 // питание фоторезистора
#define EE_TOUT 30000 // таймаут сохранения епром после изменения, мс #define EE_TOUT 30000 // таймаут сохранения епром после изменения, мс
//#define DEBUG_SERIAL // закомментируй чтобы выключить отладку (скорость 115200) #define DEBUG_SERIAL // закомментируй чтобы выключить отладку (скорость 115200)
#define EE_KEY 42 // ключ сброса WiFi (измени для сброса всех настроек) #define EE_KEY 44 // ключ сброса WiFi (измени для сброса всех настроек)
#define NTP_UPD_PRD 5 // период обновления времени с NTP сервера, минут #define NTP_UPD_PRD 5 // период обновления времени с NTP сервера, минут
// ------------ БИЛДЕР -------------
//#define MAX_LEDS 1200
// esp01
//#define BTN_PIN 0
//#define STRIP_PIN 2
//#define USE_ADC 0
// GL2 module
//#define STRIP_PIN 5 // GPIO5 на gl module (D1 на wemos/node)
// ---------- БИБЛИОТЕКИ ----------- // ---------- БИБЛИОТЕКИ -----------
#include "data.h" // данные #include "data.h" // данные
#include "Time.h" // часы #include "Time.h" // часы
@@ -71,18 +102,22 @@ FastFilter phot;
byte btnClicks = 0, brTicks = 0; byte btnClicks = 0, brTicks = 0;
unsigned char matrixValue[11][16]; unsigned char matrixValue[11][16];
bool gotNTP = false; bool gotNTP = false;
void blink8(CRGB color);
// ------------------- SETUP -------------------- // ------------------- SETUP --------------------
void setup() { void setup() {
delay(800);
memset(matrixValue, 0, sizeof(matrixValue)); memset(matrixValue, 0, sizeof(matrixValue));
#ifdef DEBUG_SERIAL #ifdef DEBUG_SERIAL
Serial.begin(115200); Serial.begin(115200);
DEBUGLN(); DEBUGLN();
#endif #endif
EEPROM.begin(512); // старт епром EEPROM.begin(512); // старт епром
startStrip(); // показываем РГБ startStrip(); // старт ленты
btn.setLevel(digitalRead(BTN_PIN)); // смотрим что за кнопка btn.setLevel(digitalRead(BTN_PIN)); // смотрим что за кнопка
EE_startup(); // читаем епром EE_startup(); // читаем епром
checkUpdate(); // индикация было ли обновление
showRGB(); // показываем ргб
checkGroup(); // показываем или меняем адрес checkGroup(); // показываем или меняем адрес
checkButton(); // проверяем кнопку на удержание checkButton(); // проверяем кнопку на удержание
startWiFi(); // старт вайфай startWiFi(); // старт вайфай

View File

@@ -1,3 +1,4 @@
#if (USE_ADC == 1)
void setupADC() { void setupADC() {
low.setDt(0); low.setDt(0);
low.setPeriod(0); low.setPeriod(0);
@@ -104,3 +105,15 @@ void disableADC() {
digitalWrite(MIC_VCC, 0); digitalWrite(MIC_VCC, 0);
pinMode(MIC_VCC, INPUT); pinMode(MIC_VCC, INPUT);
} }
#else
void setupADC() {}
void checkAnalog() {}
void checkMusic() {}
void checkPhot() {}
byte getSoundVol() {
return 0;
}
void switchToMic() {}
void switchToPhot() {}
void disableADC() {}
#endif

View File

@@ -37,7 +37,16 @@ int mapFF(byte x, byte min, byte max) {
return (((max - min) * x + (min << 8) + 1) >> 8); return (((max - min) * x + (min << 8) + 1) >> 8);
} }
const char OTAhost[] = "http://ota.alexgyver.ru/GL2_latest.bin"; const char OTAhost[] = "http://ota.alexgyver.ru/";
const char *OTAfile[] = {
"GL2_latest.bin",
"com_600.bin",
"com_1200.bin",
"esp1_600.bin",
"esp1_1200.bin",
"module_600.bin",
"module_1200.bin",
};
const char *NTPservers[] = { const char *NTPservers[] = {
"pool.ntp.org", "pool.ntp.org",
@@ -62,9 +71,9 @@ struct Config {
byte maxCur = 5; // макс ток (мА/100) byte maxCur = 5; // макс ток (мА/100)
byte workFrom = 0; // часы работы (0,1.. 23) byte workFrom = 0; // часы работы (0,1.. 23)
byte workTo = 0; // часы работы (0,1.. 23) byte workTo = 0; // часы работы (0,1.. 23)
int16_t length = 100; // длина ленты int16_t length = 100; // длина ленты
int16_t width = 1; // ширина матрицы int16_t width = 1; // ширина матрицы
byte mTurn = 0;
byte state = 1; // состояние 0 выкл, 1 вкл byte state = 1; // состояние 0 выкл, 1 вкл
byte group = 1; // группа девайса (1-10) byte group = 1; // группа девайса (1-10)
@@ -77,6 +86,8 @@ struct Config {
int16_t maxLight = 1023; // макс освещённость int16_t maxLight = 1023; // макс освещённость
char ssid[32]; // логин wifi char ssid[32]; // логин wifi
char pass[32]; // пароль wifi char pass[32]; // пароль wifi
byte version = GL_VERSION;
byte update = 0;
}; };
#define PRES_SIZE 13 #define PRES_SIZE 13

View File

@@ -10,6 +10,7 @@ void EE_startup() {
EEPROM.put(sizeof(cfg), dawn); EEPROM.put(sizeof(cfg), dawn);
EEPROM.put(sizeof(cfg) + sizeof(dawn), preset); EEPROM.put(sizeof(cfg) + sizeof(dawn), preset);
EEPROM.commit(); EEPROM.commit();
blink8(CRGB::Pink);
DEBUGLN("First start"); DEBUGLN("First start");
} }
EEPROM.get(0, cfg); EEPROM.get(0, cfg);

View File

@@ -203,8 +203,24 @@ void fillRow(int row, CRGB color) {
FOR_i(cfg.width * row, cfg.width * (row + 1)) leds[i] = color; FOR_i(cfg.width * row, cfg.width * (row + 1)) leds[i] = color;
} }
void blink8(CRGB color) {
FOR_i(0, 3) {
fill_solid(leds, 8, color);
FastLED.show();
delay(300);
FastLED.clear();
FastLED.show();
delay(300);
}
}
// получить номер пикселя в ленте по координатам // получить номер пикселя в ленте по координатам
uint16_t getPix(int x, int y) { uint16_t getPix(int x, int y) {
if (cfg.mTurn) {
byte b = x;
x = y;
y = b;
}
if ( !(y & 1) || (cfg.deviceType - 2) ) return (y * cfg.width + x); // если чётная строка if ( !(y & 1) || (cfg.deviceType - 2) ) return (y * cfg.width + x); // если чётная строка
else return (y * cfg.width + cfg.width - x - 1); // если нечётная строка else return (y * cfg.width + cfg.width - x - 1); // если нечётная строка
} }

View File

@@ -63,7 +63,7 @@ void drawFrame(int pcnt) {
- pgm_read_byte(&(valueMask[y][newX])); - pgm_read_byte(&(valueMask[y][newX]));
leds[getPix(x, y)] = CHSV( leds[getPix(x, y)] = CHSV(
CUR_PRES.color * 2.5 + pgm_read_byte(&(hueMask[y][newX])), // H CUR_PRES.color + pgm_read_byte(&(hueMask[y][newX])), // H
255, // S 255, // S
(uint8_t)max(0, nextv) // V (uint8_t)max(0, nextv) // V
); );
@@ -75,7 +75,7 @@ void drawFrame(int pcnt) {
int newX = x; int newX = x;
if (x > 15) newX = x - 15; if (x > 15) newX = x - 15;
leds[getPix(newX, 0)] = CHSV( leds[getPix(newX, 0)] = CHSV(
CUR_PRES.color * 2.5 + pgm_read_byte(&(hueMask[0][newX])), // H CUR_PRES.color + pgm_read_byte(&(hueMask[0][newX])), // H
255, // S 255, // S
(uint8_t)(((100.0 - pcnt) * matrixValue[0][newX] + pcnt * fireLine[newX]) / 100.0) // V (uint8_t)(((100.0 - pcnt) * matrixValue[0][newX] + pcnt * fireLine[newX]) / 100.0) // V
); );

View File

@@ -10,10 +10,11 @@ void parsing() {
buf[n] = NULL; buf[n] = NULL;
DEBUGLN(buf); // пакет вида <ключ>,<канал>,<тип>,<дата1>,<дата2>... DEBUGLN(buf); // пакет вида <ключ>,<канал>,<тип>,<дата1>,<дата2>...
byte keyLen = strlen(GL_KEY); byte keyLen = strchr(buf, ',') - buf; // indexof
if (!strncmp(buf, GL_KEY, keyLen)) { // парсим если это наша "сеть" if (strncmp(buf, GL_KEY, keyLen)) return; // не наш ключ
byte data[MAX_PRESETS * PRES_SIZE + keyLen]; byte data[MAX_PRESETS * PRES_SIZE + keyLen];
memset(data, 0, 30); memset(data, 0, MAX_PRESETS * PRES_SIZE + keyLen);
int count = 0; int count = 0;
char *str, *p = buf + keyLen; // сдвиг до даты char *str, *p = buf + keyLen; // сдвиг до даты
char *ssid, *pass; char *ssid, *pass;
@@ -51,10 +52,15 @@ void parsing() {
break; break;
case 11: EE_updCfgRst(); break; // рестарт case 11: EE_updCfgRst(); break; // рестарт
case 12: if (gotNTP) { // OTA обновление, если есть интернет case 12: if (gotNTP) { // OTA обновление, если есть интернет
cfg.update = 1;
EE_updCfg();
delay(100); delay(100);
FastLED.clear(); FastLED.clear();
FastLED.show(); FastLED.show();
ESPhttpUpdate.update(OTAhost); char OTA[60];
strcpy(OTA, OTAhost);
strcpy(OTA + strlen(OTAhost), OTAfile[data[3]]);
ESPhttpUpdate.update(OTA);
} break; } break;
case 13: // выключить через case 13: // выключить через
if (data[3] == 0) turnoffTmr.stop(); if (data[3] == 0) turnoffTmr.stop();
@@ -71,8 +77,10 @@ void parsing() {
FOR_i(0, CFG_SIZE) { FOR_i(0, CFG_SIZE) {
*((byte*)&cfg + i) = data[i + 2]; // загоняем в структуру *((byte*)&cfg + i) = data[i + 2]; // загоняем в структуру
} }
cfg.mTurn = data[21];
cfg.length = data[17] | (data[16] << 8); // склеиваем cfg.length = data[17] | (data[16] << 8); // склеиваем
cfg.width = data[20] | (data[19] << 8); // склеиваем cfg.width = data[20] | (data[19] << 8); // склеиваем
if (cfg.length > MAX_LEDS) cfg.length = MAX_LEDS; if (cfg.length > MAX_LEDS) cfg.length = MAX_LEDS;
if (cfg.deviceType == GL_TYPE_STRIP) cfg.width = 1; if (cfg.deviceType == GL_TYPE_STRIP) cfg.width = 1;
if (cfg.length * cfg.width > MAX_LEDS) cfg.width = MAX_LEDS / cfg.length; if (cfg.length * cfg.width > MAX_LEDS) cfg.width = MAX_LEDS / cfg.length;
@@ -115,7 +123,7 @@ void parsing() {
break; break;
} }
FastLED.clear(); // на всякий случай FastLED.clear(); // на всякий случай
}
} }
} }

View File

@@ -67,10 +67,13 @@ void checkGroup() {
} }
void startStrip() { void startStrip() {
delay(500);
FastLED.addLeds<STRIP_CHIP, STRIP_PIN, STRIP_COLOR>(leds, MAX_LEDS).setCorrection(TypicalLEDStrip); FastLED.addLeds<STRIP_CHIP, STRIP_PIN, STRIP_COLOR>(leds, MAX_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setMaxPowerInVoltsAndMilliamps(STRIP_VOLT, 500); FastLED.setMaxPowerInVoltsAndMilliamps(STRIP_VOLT, 500);
FastLED.setBrightness(50); FastLED.setBrightness(50);
FastLED.show();
}
void showRGB() {
leds[0] = CRGB::Red; leds[0] = CRGB::Red;
leds[1] = CRGB::Green; leds[1] = CRGB::Green;
leds[2] = CRGB::Blue; leds[2] = CRGB::Blue;
@@ -91,9 +94,7 @@ void startWiFi() {
} }
void setupAP() { void setupAP() {
fill_solid(leds, 8, CRGB::Yellow); blink8(CRGB::Yellow);
FastLED.show();
delay(500);
WiFi.disconnect(); WiFi.disconnect();
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
delay(100); delay(100);
@@ -134,8 +135,7 @@ void setupLocal() {
delay(50); delay(50);
} }
if (connect) { if (connect) {
fill_solid(leds, 8, CRGB::Green); blink8(CRGB::Green);
FastLED.show();
server.begin(); server.begin();
DEBUG("Connected! Local IP: "); DEBUG("Connected! Local IP: ");
DEBUGLN(WiFi.localIP()); DEBUGLN(WiFi.localIP());
@@ -143,14 +143,7 @@ void setupLocal() {
return; return;
} else { } else {
DEBUGLN("Failed!"); DEBUGLN("Failed!");
FOR_i(0, 3) { blink8(CRGB::Red);
fill_solid(leds, 8, CRGB::Red);
FastLED.show();
delay(300);
FastLED.clear();
FastLED.show();
delay(300);
}
failCount++; failCount++;
tmr = millis(); tmr = millis();
if (failCount >= 3) { if (failCount >= 3) {
@@ -166,3 +159,18 @@ void setupLocal() {
} }
} }
} }
void checkUpdate() {
if (cfg.update) {
if (cfg.version != GL_VERSION) {
cfg.version = GL_VERSION;
blink8(CRGB::Cyan);
DEBUG("Update to");
DEBUGLN(GL_VERSION);
} else {
blink8(CRGB::Blue);
DEBUG("Update to current");
}
cfg.update = 0;
}
}