Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Светомузыка через телефон. #15

Open
wants to merge 59 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
0965f3d
WiFi подключение переработано, код переформатирован, добавлены коммен…
gunner47 Jul 16, 2019
70c7fdc
Добавлена документация по тестированию
gunner47 Jul 16, 2019
e1c537c
Исправлено выключение будильника, если он сработал при выключенной ма…
gunner47 Jul 16, 2019
26afb40
Исправлено выключение будильника, если он сработал при выключенной ма…
gunner47 Jul 16, 2019
036ae4c
Исправлена синхронизация времени при старте без интернета
gunner47 Jul 16, 2019
b5b8123
Добавлен сброс WiFi настроек при старте с зажатой кнопкой
gunner47 Jul 16, 2019
5da7bb8
Добавлено android приложение для управления лампой (профили нескольки…
gunner47 Jul 28, 2019
7e8dbfd
Обновлено android приложение, сканирование сети для добавления лампы,…
gunner47 Aug 1, 2019
4a5245a
Исправлены ошибки взаимодействия приложения с лампой; учтены "особенн…
gunner47 Aug 3, 2019
8ebace5
Добавлена точная настройка яркости, скорости и масштаба эффектов; Доб…
gunner47 Aug 9, 2019
754dde2
Добавлена индикация взаимодействия лампы и android приложения; исправ…
gunner47 Aug 10, 2019
b2d0110
Добавлена функция таймера отключения; исправлены ошибки
gunner47 Aug 13, 2019
5012ee3
Добавлен режим автоматического переключения избранных эффектов; Реорг…
gunner47 Aug 26, 2019
53c5155
Исправлена ошибка работы режима избранных эффектов
gunner47 Aug 26, 2019
00696c2
Добавлен вызов режима обновления модуля esp из android приложения
gunner47 Aug 28, 2019
0f9e5af
Добавлен вызов режима обновления модуля esp из android приложения
gunner47 Aug 28, 2019
dcdeb2a
Добавлен вызов режима обновления модуля esp из android приложения; Ис…
gunner47 Aug 28, 2019
c197342
Добавлены 4 новых эффекта; Исправлены ошибки
gunner47 Aug 30, 2019
774bff0
Исправлена ошибка неправильного сохранения в EEPROM настроек будильни…
gunner47 Aug 31, 2019
7bb8526
Скорректированы настройки некоторых эффектов
gunner47 Aug 31, 2019
b1a3131
Испралена история изменений
gunner47 Aug 31, 2019
b065ee4
Исправлена ошибка
gunner47 Aug 31, 2019
763770d
Исправлена ошибка инициализации яркости сразу после включения
gunner47 Aug 31, 2019
2d5a709
Исправлены ошибки режима Избранное и эффекта "Белый свет"; Оптимизаци…
gunner47 Sep 5, 2019
798aa66
Оптимизация использования памяти
gunner47 Sep 15, 2019
fa2c26b
Добавлен экспериментальный эффект белого света (горизонтальной полосой)
gunner47 Sep 16, 2019
d919889
Добавлено сохранение состояния (вкл/выкл) лампы в EEPROM память; Мино…
gunner47 Sep 17, 2019
2eedfc6
Исправлена ошибка работы будильника
gunner47 Sep 18, 2019
54b76a5
Исправлена ошибка работы таймера
gunner47 Sep 18, 2019
0a95e3e
Добавлена регулировка "холодный - тёплый" для белого света
gunner47 Sep 18, 2019
8277bd8
Добавлена возможность сохранять состояние (вкл/выкл) режима "Избранно…
gunner47 Sep 20, 2019
d0c21ce
Добавлены изменения из прошивка от Alex Gyver v1.5: бегущая строка с …
gunner47 Sep 24, 2019
d92b060
Исправлена ошибка при выводе бегущей строки
gunner47 Sep 24, 2019
921a25b
Добавлено управление по протоколу MQTT; добавлена возможность вывода …
gunner47 Oct 5, 2019
b998f01
Вывод в telnet отключен по умолчанию
gunner47 Oct 5, 2019
ef87b97
Управление по MQTT отключено по умолчанию
gunner47 Oct 5, 2019
894d9cb
Исправлена ошибка обработки входящих MQTT команд
gunner47 Oct 5, 2019
5da01d9
Исправлены опечатки
gunner47 Oct 5, 2019
baa8223
Добавлены библиотеки для работы с MQTT
gunner47 Oct 6, 2019
33c811a
Добавлена возможность смены ESP_MODE без перепрошивки; доработан буди…
gunner47 Oct 12, 2019
8c90148
Исправлен эффект "Радуга диагональная"
gunner47 Oct 12, 2019
a09da9b
Добавлен вывод времени по запросу и/или периодически; Добавлен переза…
gunner47 Oct 14, 2019
3002638
Добавлен комментарий
gunner47 Oct 14, 2019
4c63552
Обновлена метка первой записи в EEPROM
gunner47 Oct 15, 2019
39e3044
Изменено управление кнопкой: удержание - изменение яркости, 1 клик + …
gunner47 Oct 16, 2019
ec67904
Добавлены "ночные часы" с регулировкой яркости для вывода времени
gunner47 Oct 19, 2019
772d2b5
Добавлена блокировка кнопки на лампе из android приложения
gunner47 Oct 20, 2019
271b09c
Добавлена блокировка кнопки на лампе из android приложения
gunner47 Oct 20, 2019
45d4099
Добавлена блокировка кнопки на лампе из android приложения
gunner47 Oct 20, 2019
ada756d
Оптимизировано отображение раздела Сервис android приложения
gunner47 Oct 21, 2019
08d5d60
Добавлен вывод сигнала (HIGH/LOW - настраивается) синхронно с вкл/вык…
gunner47 Oct 24, 2019
0413e43
Добавлен переход на летнее/зимнее время; Добавлен эффект Белый огонь;…
gunner47 Nov 2, 2019
171fcc0
Добавлена библиотека Time
gunner47 Nov 3, 2019
f6e0514
Исправлена ошибка невключения MOSFET'а матрицы при срабатывании "расс…
gunner47 Nov 4, 2019
96475bd
Исправлена ошибка невключения MOSFET'а матрицы при выводе времени и I…
gunner47 Nov 5, 2019
4e8a1a6
Исправлены ошибки назначения статического IP адреса; Добавлен набросо…
gunner47 Nov 9, 2019
3ce7db0
Убран автоматический переход на летнее/зимнее время по умолчанию
gunner47 Nov 10, 2019
c551a70
Обновление библиотек
gunner47 Dec 5, 2019
b4f76c6
Исправление ошибок в рабочем режиме точки доступа
gunner47 Dec 9, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file added android/LedLamp.aia
Binary file not shown.
Binary file added android/LedLamp.apk
Binary file not shown.
241 changes: 241 additions & 0 deletions android/Декомпозиция.txt

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions firmware/GyverLamp_v1.4/CaptivePortalManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#pragma once

#include <WiFiManager.h>


class CaptivePortalManager
{
public:
static bool captivePortalCalled;

CaptivePortalManager(WiFiManager *wifiManager);
~CaptivePortalManager();
static void captivePortalManagerCallback(WiFiManager *wifiManager);

private:
WiFiManager *wifiManager = NULL;
};


CaptivePortalManager::CaptivePortalManager(WiFiManager *wifiManager)
{
this->wifiManager = wifiManager;

// добавление пользовательских параметров: id, placeholder, prompt/default value, length[, custom html]
// ...

if (wifiManager != NULL)
{
wifiManager->setAPCallback(CaptivePortalManager::captivePortalManagerCallback);
}
}

CaptivePortalManager::~CaptivePortalManager()
{
this->wifiManager = NULL;
}

void CaptivePortalManager::captivePortalManagerCallback(WiFiManager *wifiManager)
{
CaptivePortalManager::captivePortalCalled = true;
// сохранение введённых значений пользовательских параметров
// ...
}
153 changes: 153 additions & 0 deletions firmware/GyverLamp_v1.4/Constants.h

Large diffs are not rendered by default.

274 changes: 274 additions & 0 deletions firmware/GyverLamp_v1.4/EepromManager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
#pragma once

/*
* Схема использования EEPROM памяти:
* Используются адреса:
* Начало Длина Описание
* массив alarm
* 0 1 будильник пн вкл/выкл
* 1-2 2 будильник пн время в минутах от начала суток (0 - 1440), 2 байта
* 3 1 будильник вт вкл/выкл
* 4-5 2 будильник вт время в минутах от начала суток (0 - 1440), 2 байта
* 6 1 будильник ср вкл/выкл
* 7-8 2 будильник ср время в минутах от начала суток (0 - 1440), 2 байта
* 9 1 будильник чт вкл/выкл
* 10-11 2 будильник чт время в минутах от начала суток (0 - 1440), 2 байта
* 12 1 будильник пт вкл/выкл
* 13-14 2 будильник пт время в минутах от начала суток (0 - 1440), 2 байта
* 15 1 будильник сб вкл/выкл
* 16-17 2 будильник сб время в минутах от начала суток (0 - 1440), 2 байта
* 18 1 будильник вс вкл/выкл
* 19-20 2 будильник вс время в минутах от начала суток (0 - 1440), 2 байта
* массив modes
* 21-23 3 режим №1: яркость, скорость, масштаб (по одному байту)
* 24-26 3 режим №2: яркость, скорость, масштаб (по одному байту)
* 27-29 3 режим №3: яркость, скорость, масштаб (по одному байту)
* 30-32 3 режим №4: яркость, скорость, масштаб (по одному байту)
* 33-35 3 режим №5: яркость, скорость, масштаб (по одному байту)
* 36-38 3 режим №6: яркость, скорость, масштаб (по одному байту)
* 39-41 3 режим №7: яркость, скорость, масштаб (по одному байту)
* 42-44 3 режим №8: яркость, скорость, масштаб (по одному байту)
* 45-47 3 режим №9: яркость, скорость, масштаб (по одному байту)
* 48-50 3 режим №10: яркость, скорость, масштаб (по одному байту)
* 51-53 3 режим №11: яркость, скорость, масштаб (по одному байту)
* 54-56 3 режим №12: яркость, скорость, масштаб (по одному байту)
* 57-59 3 режим №13: яркость, скорость, масштаб (по одному байту)
* 60-62 3 режим №14: яркость, скорость, масштаб (по одному байту)
* 63-65 3 режим №15: яркость, скорость, масштаб (по одному байту)
* 66-68 3 режим №16: яркость, скорость, масштаб (по одному байту)
* 69-71 3 режим №17: яркость, скорость, масштаб (по одному байту)
* 72-74 3 режим №18: яркость, скорость, масштаб (по одному байту)
* 75-77 3 режим №19: яркость, скорость, масштаб (по одному байту)
* 78-80 3 режим №20: яркость, скорость, масштаб (по одному байту)
* 81-83 3 режим №21: яркость, скорость, масштаб (по одному байту)
* 84-86 3 режим №22: яркость, скорость, масштаб (по одному байту)
* 87-89 3 режим №23: яркость, скорость, масштаб (по одному байту)
* 90-92 3 режим №24: яркость, скорость, масштаб (по одному байту)
* 93-95 3 режим №25: яркость, скорость, масштаб (по одному байту)
*
* 111-141 31 настройки режима избранных эффектов (вкл/выкл - 1 байт; интервал - 2 байта; разброс - 2 байта; инициализировать вкл/выкл - 1 байт; вкл/выкл каждого эффекта - 25 (MODE_AMOUNT) байт; вкл/выкл не хранится в EEPROM)
*
* 195 1 признак "кнопка разблокирована"
* 196 1 рабочий режим лампы (ESP_MODE)
* 197 1 состояние лампы (вкл/выкл)
* 198 1 признак первого запуска (определяет необходимость первоначальной записи всех хранимых настроек)
* 199 1 время до "рассвета" (dawnMode)
* 200 1 текущий режим (currentMode)
*
* Не используются адреса:
* 96-110 15 резерв, можно добавить ещё 5 эффектов
* 142-194 53 если добавить ещё 5 эффектов, начальный адрес неиспользуемой памяти сдвинется с 142 на 147
*/

#include <EEPROM.h>
#include "Types.h"
#define EEPROM_TOTAL_BYTES_USED (201U) // общий размер используемой EEPROM памяти (сумма всех хранимых настроек + 1 байт)
#define EEPROM_ALARM_START_ADDRESS (0U) // начальный адрес в EEPROM памяти для записи настроек будильников
#define EEPROM_MODES_START_ADDRESS (21U) // начальный адрес в EEPROM памяти для записи настроек эффектов (яркость, скорость, масштаб)
#define EEPROM_FAVORITES_START_ADDRESS (111U) // начальный адрес в EEPROM памяти для записи настроек режима избранных эффектов
#define EEPROM_ESP_BUTTON_ENABLED_ADDRESS (195U) // адрес в EEPROM памяти для записи признака разблокированной кнопки
#define EEPROM_ESP_MODE (196U) // адрес в EEPROM памяти для записи режима работы модуля ESP (точка доступа/WiFi клиент)
#define EEPROM_LAMP_ON_ADDRESS (197U) // адрес в EEPROM памяти для записи состояния лампы (вкл/выкл)
#define EEPROM_FIRST_RUN_ADDRESS (198U) // адрес в EEPROM памяти для записи признака первого запуска (определяет необходимость первоначальной записи всех хранимых настроек)
#define EEPROM_DAWN_MODE_ADDRESS (199U) // адрес в EEPROM памяти для записи времени до "рассвета"
#define EEPROM_CURRENT_MODE_ADDRESS (200U) // адрес в EEPROM памяти для записи номера текущего эффекта лампы

#define EEPROM_ALARM_STRUCT_SIZE (3U) // 1 байт - вкл/выкл; 2 байта - время от начала суток в минутах (0 - 1440)
#define EEPROM_MODE_STRUCT_SIZE (3U) // 1 байт - яркость; 1 байт - скорость; 1 байт - масштаб

#define EEPROM_FIRST_RUN_MARK (24U) // счисло-метка, если ещё не записно в EEPROM_FIRST_RUN_ADDRESS, значит нужно проинициализировать EEPROM и записать все первоначальные настройки
#define EEPROM_WRITE_DELAY (30000UL) // отсрочка записи в EEPROM после последнего изменения хранимых настроек, позволяет уменьшить количество операций записи в EEPROM


class EepromManager
{
public:
static void InitEepromSettings(ModeType modes[], AlarmType alarms[], uint8_t* espMode, bool* onFlag, uint8_t* dawnMode, int8_t* currentMode, bool* buttonEnabled,
void (*readFavoritesSettings)(), void (*saveFavoritesSettings)())
{
// записываем в EEPROM начальное состояние настроек, если их там ещё нет
EEPROM.begin(EEPROM_TOTAL_BYTES_USED);
delay(50);

if (EEPROM.read(EEPROM_FIRST_RUN_ADDRESS) != EEPROM_FIRST_RUN_MARK)
{
EEPROM.write(EEPROM_FIRST_RUN_ADDRESS, EEPROM_FIRST_RUN_MARK);
EEPROM.commit();

for (uint8_t i = 0; i < MODE_AMOUNT; i++)
{
EEPROM.put(EEPROM_MODES_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * i, modes[i]);
EEPROM.commit();
}

for (uint8_t i = 0; i < 7; i++)
{
EEPROM.write(EEPROM_ALARM_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * i, alarms[i].State);
WriteUint16(EEPROM_ALARM_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * i + 1, alarms[i].Time);
EEPROM.commit();
}

EEPROM.write(EEPROM_ESP_MODE, ESP_MODE);
EEPROM.write(EEPROM_LAMP_ON_ADDRESS, 0);
EEPROM.write(EEPROM_DAWN_MODE_ADDRESS, 0);
EEPROM.write(EEPROM_CURRENT_MODE_ADDRESS, 0);
EEPROM.write(EEPROM_ESP_BUTTON_ENABLED_ADDRESS, 1);

saveFavoritesSettings();

EEPROM.commit();
}

// инициализируем настройки лампы значениями из EEPROM
for (uint8_t i = 0; i < MODE_AMOUNT; i++)
{
EEPROM.get(EEPROM_MODES_START_ADDRESS + EEPROM_MODE_STRUCT_SIZE * i, modes[i]);
}

for (uint8_t i = 0; i < 7; i++)
{
alarms[i].State = EEPROM.read(EEPROM_ALARM_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * i);
alarms[i].Time = ReadInt16(EEPROM_ALARM_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * i + 1);
}

readFavoritesSettings();

*espMode = (uint8_t)EEPROM.read(EEPROM_ESP_MODE);
*onFlag = (bool)EEPROM.read(EEPROM_LAMP_ON_ADDRESS);
*dawnMode = EEPROM.read(EEPROM_DAWN_MODE_ADDRESS);
*currentMode = EEPROM.read(EEPROM_CURRENT_MODE_ADDRESS);
*buttonEnabled = EEPROM.read(EEPROM_ESP_BUTTON_ENABLED_ADDRESS);
}

static void SaveModesSettings(int8_t* currentMode, ModeType modes[])
{
EEPROM.put(EEPROM_MODES_START_ADDRESS + EEPROM_MODE_STRUCT_SIZE * (*currentMode), modes[*currentMode]);
EEPROM.commit();
}

static void HandleEepromTick(bool* settChanged, uint32_t* eepromTimeout, bool* onFlag, int8_t* currentMode, ModeType modes[], void (*saveFavoritesSettings)())
{
if (*settChanged && millis() - *eepromTimeout > EEPROM_WRITE_DELAY)
{
*settChanged = false;
*eepromTimeout = millis();
SaveOnFlag(onFlag);
SaveModesSettings(currentMode, modes);
if (EEPROM.read(EEPROM_CURRENT_MODE_ADDRESS) != *currentMode)
{
EEPROM.write(EEPROM_CURRENT_MODE_ADDRESS, *currentMode);
}
saveFavoritesSettings();
EEPROM.commit();
}
}

static void SaveAlarmsSettings(uint8_t* alarmNumber, AlarmType alarms[])
{
EEPROM.write(EEPROM_ALARM_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * (*alarmNumber), alarms[*alarmNumber].State);
WriteUint16(EEPROM_ALARM_START_ADDRESS + EEPROM_ALARM_STRUCT_SIZE * (*alarmNumber) + 1, alarms[*alarmNumber].Time);
EEPROM.commit();
}

static void SaveEspMode(uint8_t* espMode)
{
EEPROM.write(EEPROM_ESP_MODE, *espMode);
EEPROM.commit();
}

static void SaveOnFlag(bool* onFlag)
{
EEPROM.write(EEPROM_LAMP_ON_ADDRESS, *onFlag);
EEPROM.commit();
}

static void SaveDawnMode(uint8_t* dawnMode)
{
EEPROM.write(EEPROM_DAWN_MODE_ADDRESS, *dawnMode);
EEPROM.commit();
}

static void SaveButtonEnabled(bool* buttonEnabled)
{
EEPROM.write(EEPROM_ESP_BUTTON_ENABLED_ADDRESS, *buttonEnabled);
EEPROM.commit();
}

static uint16_t ReadUint16(uint16_t address)
{
uint16_t val;
uint8_t* p = (uint8_t*)&val;
*p = EEPROM.read(address);
*(p + 1) = EEPROM.read(address + 1);
return val;
}

static void WriteUint16(uint16_t address, uint16_t val)
{
uint8_t* p = (uint8_t*)&val;
EEPROM.write(address, *p);
EEPROM.write(address + 1, *(p + 1));
EEPROM.commit();
}

static int16_t ReadInt16(uint16_t address)
{
int16_t val;
uint8_t* p = (uint8_t*)&val;
*p = EEPROM.read(address);
*(p + 1) = EEPROM.read(address + 1);
return val;
}

static void WriteInt16(uint16_t address, int16_t val)
{
uint8_t* p = (uint8_t*)&val;
EEPROM.write(address, *p);
EEPROM.write(address + 1, *(p + 1));
EEPROM.commit();
}

static uint32_t ReadUint32(uint16_t address)
{
uint32_t val;
uint8_t* p = (uint8_t*)&val;
*p = EEPROM.read(address);
*(p + 1) = EEPROM.read(address + 1);
*(p + 2) = EEPROM.read(address + 2);
*(p + 3) = EEPROM.read(address + 3);
return val;
}

static void WriteUint32(uint16_t address, uint32_t val)
{
uint8_t* p = (uint8_t*)&val;
EEPROM.write(address, *p);
EEPROM.write(address + 1, *(p + 1));
EEPROM.write(address + 2, *(p + 2));
EEPROM.write(address + 3, *(p + 3));
EEPROM.commit();
}

static int32_t ReadInt32(uint16_t address)
{
int32_t val;
uint8_t* p = (uint8_t*)&val;
*p = EEPROM.read(address);
*(p + 1) = EEPROM.read(address + 1);
*(p + 2) = EEPROM.read(address + 2);
*(p + 3) = EEPROM.read(address + 3);
return val;
}

static void WriteInt32(uint16_t address, int32_t val)
{
uint8_t* p = (uint8_t*)&val;
EEPROM.write(address, *p);
EEPROM.write(address + 1, *(p + 1));
EEPROM.write(address + 2, *(p + 2));
EEPROM.write(address + 3, *(p + 3));
EEPROM.commit();
}

private:
};
Loading