mirror of
https://github.com/gunner47/GyverLamp.git
synced 2025-08-08 01:20:31 +03:00
Обновлено android приложение, сканирование сети для добавления лампы, + 2 эффекта, откат к стандартной библиотеке GyverButton
This commit is contained in:
@@ -30,6 +30,13 @@
|
||||
-- работает при подключенной кнопке (потому что режим прошивки активируется кнопкой)
|
||||
--- 16.07.2019
|
||||
- Исправлено регулярное подвисание матрицы на 1-2 секунды при отсутствии подключения к интернету (но при успешном подключении к WiFi)
|
||||
--- 28.07.2019
|
||||
- Доработано взаимодействие с android приложением (отправка состояния после каждой операции)
|
||||
--- 01.08.2019
|
||||
- Возврат к стандартной библиотеке GyverButton (изменениё из неё перенесено в button.ino
|
||||
- Добавлены 2 эффекта: Светлячки со шлейфом и Белый свет
|
||||
- При запросе обновления по воздуху (2 четверных касания к кнопке) лампа переключается в режим "Матрица" для визуального подтверждения готовности к прошивке
|
||||
- В android приложение добавлена функция сканирования сети и добавления ламп с помощью multicast пакетов, доработка прошивки под это
|
||||
*/
|
||||
|
||||
// Ссылка для менеджера плат:
|
||||
@@ -88,7 +95,7 @@ uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статичес
|
||||
// ============= ДЛЯ РАЗРАБОТЧИКОВ =====
|
||||
#define LED_PIN (2U) // пин ленты
|
||||
#define BTN_PIN (4U) // пин кнопки
|
||||
#define MODE_AMOUNT (18U)
|
||||
#define MODE_AMOUNT (20U) // количество режимов
|
||||
|
||||
#define NUM_LEDS (WIDTH * HEIGHT)
|
||||
#define SEGMENTS (1U) // диодов в одном "пикселе" (для создания матрицы из кусков ленты)
|
||||
|
@@ -32,7 +32,7 @@ class OtaManager
|
||||
public:
|
||||
static OtaPhase OtaFlag;
|
||||
|
||||
void RequestOtaUpdate() // пользователь однократно запросил обновление по воздуху
|
||||
bool RequestOtaUpdate() // пользователь однократно запросил обновление по воздуху; возвращает true, когда переходит в режим обновления - startOtaUpdate()
|
||||
{
|
||||
if (ESP_MODE != 1)
|
||||
{
|
||||
@@ -40,7 +40,7 @@ class OtaManager
|
||||
Serial.printf("Запрос обновления по воздуху поддерживается только в режиме ESP_MODE = 1\n");
|
||||
#endif
|
||||
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (OtaFlag == OtaPhase::None)
|
||||
@@ -52,7 +52,7 @@ class OtaManager
|
||||
Serial.printf("Получено первое подтверждение обновления по воздуху\nОжидание второго подтверждения\n");
|
||||
#endif
|
||||
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (OtaFlag == OtaPhase::GotFirstConfirm)
|
||||
@@ -64,8 +64,10 @@ class OtaManager
|
||||
#endif
|
||||
|
||||
startOtaUpdate();
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void HandleOtaUpdate()
|
||||
|
@@ -34,7 +34,7 @@ void buttonTick()
|
||||
|
||||
if (ONflag && touch.isTriple())
|
||||
{
|
||||
if (--currentMode < 0) currentMode = 0;
|
||||
if (--currentMode < 0) currentMode = MODE_AMOUNT - 1;
|
||||
FastLED.setBrightness(modes[currentMode].brightness);
|
||||
loadingFlag = true;
|
||||
settChanged = true;
|
||||
@@ -43,10 +43,15 @@ void buttonTick()
|
||||
delay(1);
|
||||
}
|
||||
|
||||
if (ONflag && touch.isQuadruple())
|
||||
if (ONflag && touch.hasClicks() && touch.getClicks() >= 4)
|
||||
{
|
||||
#ifdef OTA
|
||||
otaManager.RequestOtaUpdate();
|
||||
if (otaManager.RequestOtaUpdate())
|
||||
{
|
||||
currentMode = 16; // принудительное включение режима "Матрица" для индикации перехода в режим обновления по воздуху
|
||||
FastLED.clear();
|
||||
delay(1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -45,6 +45,10 @@ void effectsTick()
|
||||
break;
|
||||
case 17: lightersRoutine();
|
||||
break;
|
||||
case 18: lightBalls();
|
||||
break;
|
||||
case 19: whiteColor();
|
||||
break;
|
||||
}
|
||||
FastLED.show();
|
||||
}
|
||||
|
@@ -329,6 +329,61 @@ void lightersRoutine()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ------------- LightBalls (светлячки со шлейфом) -------------
|
||||
const uint8_t BorderWidth = 2;
|
||||
|
||||
void lightBalls()
|
||||
{
|
||||
// Apply some blurring to whatever's already on the matrix
|
||||
// Note that we never actually clear the matrix, we just constantly
|
||||
// blur it repeatedly. Since the blurring is 'lossy', there's
|
||||
// an automatic trend toward black -- by design.
|
||||
uint8_t blurAmount = dim8_raw(beatsin8(3,64,100));
|
||||
blur2d(leds, WIDTH, HEIGHT, blurAmount);
|
||||
|
||||
// Use two out-of-sync sine waves
|
||||
uint8_t i = beatsin8( 91, BorderWidth, WIDTH-BorderWidth);
|
||||
uint8_t j = beatsin8( 109, BorderWidth, WIDTH-BorderWidth);
|
||||
uint8_t k = beatsin8( 73, BorderWidth, WIDTH-BorderWidth);
|
||||
uint8_t m = beatsin8( 123, BorderWidth, WIDTH-BorderWidth);
|
||||
|
||||
// The color of each point shifts over time, each at a different speed.
|
||||
uint16_t ms = millis();
|
||||
leds[XY( i, j)] += CHSV( ms / 29, 200, 255);
|
||||
leds[XY( j, k)] += CHSV( ms / 41, 200, 255);
|
||||
leds[XY( k, m)] += CHSV( ms / 73, 200, 255);
|
||||
leds[XY( m, i)] += CHSV( ms / 97, 200, 255);
|
||||
|
||||
}
|
||||
// Trivial XY function for the SmartMatrix; use a different XY
|
||||
// function for different matrix grids. See XYMatrix example for code.
|
||||
uint16_t XY(uint8_t x, uint8_t y)
|
||||
{
|
||||
uint16_t i;
|
||||
if (y & 0x01)
|
||||
{
|
||||
// Odd rows run backwards
|
||||
uint8_t reverseX = (WIDTH - 1) - x;
|
||||
i = (y * WIDTH) + reverseX;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Even rows run forwards
|
||||
i = (y * WIDTH) + x;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
// ------------- белый свет -------------
|
||||
void whiteColor()
|
||||
{
|
||||
for (int i = 0; i < NUM_LEDS; i++)
|
||||
{
|
||||
leds[i] = CHSV(0, 0, 255);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void lightersRoutine()
|
||||
{
|
||||
|
@@ -183,7 +183,7 @@ void fillNoiseLED()
|
||||
data = qsub8(data, 16);
|
||||
data = qadd8(data, scale8(data, 39));
|
||||
|
||||
if ( dataSmoothing )
|
||||
if (dataSmoothing)
|
||||
{
|
||||
uint8_t olddata = noise[i][j];
|
||||
uint8_t newdata = scale8( olddata, dataSmoothing) + scale8( data, 256 - dataSmoothing);
|
||||
|
@@ -4,6 +4,8 @@ void parseUDP()
|
||||
|
||||
if (packetSize)
|
||||
{
|
||||
Serial.print("income");
|
||||
|
||||
int32_t n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
|
||||
packetBuffer[n] = 0;
|
||||
inputBuffer = packetBuffer;
|
||||
@@ -118,8 +120,39 @@ void parseUDP()
|
||||
saveDawnMmode();
|
||||
}
|
||||
|
||||
else if (inputBuffer.startsWith("DISCOVER")) // обнаружение приложением модуля esp в локальной сети
|
||||
{
|
||||
if (ESP_MODE == 1) // работает только в режиме WiFi клиента
|
||||
{
|
||||
inputBuffer = "IP";
|
||||
inputBuffer += " ";
|
||||
inputBuffer += String(WiFi.localIP()[0]) + "." +
|
||||
String(WiFi.localIP()[1]) + "." +
|
||||
String(WiFi.localIP()[2]) + "." +
|
||||
String(WiFi.localIP()[3]);
|
||||
inputBuffer += ":";
|
||||
inputBuffer += String(ESP_UDP_PORT);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
inputBuffer = "";
|
||||
}
|
||||
|
||||
if (inputBuffer.length() <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Udp.remoteIP() == WiFi.localIP()) // не реагировать на свои же пакеты
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
char reply[inputBuffer.length() + 1];
|
||||
inputBuffer.toCharArray(reply, inputBuffer.length() + 1);
|
||||
inputBuffer.remove(0); // очистка буфера, читобы не он не интерпретировался, как следующий udp пакет
|
||||
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
|
||||
Udp.write(reply);
|
||||
Udp.endPacket();
|
||||
@@ -145,6 +178,14 @@ void sendCurrent()
|
||||
inputBuffer += String(modes[currentMode].scale);
|
||||
inputBuffer += " ";
|
||||
inputBuffer += String(ONflag);
|
||||
inputBuffer += " ";
|
||||
inputBuffer += String(ESP_MODE);
|
||||
inputBuffer += " ";
|
||||
#ifdef USE_NTP
|
||||
inputBuffer += "1";
|
||||
#else
|
||||
inputBuffer += "0";
|
||||
#endif
|
||||
|
||||
#ifdef GENERAL_DEBUG
|
||||
Serial.println(inputBuffer);
|
||||
|
Reference in New Issue
Block a user