#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_I2C_Menu_Btns.h>
# include "button.h"
LiquidCrystal_I2C_Menu_Btns lcd(0x27, 20, 4);
// Пины, к которым подключены кнопки
#define pinLeft 5
#define pinRight 18
#define pinEnter 19
#define pinBack 14 // Back - необязательная кнопка
#define pinsw1 32
#define pinsw2 33
#define relayPin 12
#define pinsensor 35
// Объявим перечисление, используемое в качестве ключа пунктов меню
enum {mkBack, mkRoot, mkY, mkN,
mkMainLt, mkSensor1, mkActTime1, mkNightLt, mkSensor2, mkActTime2,
mkAlarm, mkTurnOn, mkSetAlarm, mkAddLoad, mkNetwork, mkSSID, mkPwd,
mkTime, mkSetTime, mkSynchTime};
sMenuItem menu[] = {
{mkBack, mkRoot, "SMART HOME SETTINGS:"},
{mkRoot, mkMainLt, "Main lighting"},
{mkMainLt, mkSensor1, "Turn on by sensor"},
{mkSensor1, mkY, "Yes", NULL},
{mkSensor1, mkN, "No", NULL},
{mkMainLt, mkActTime1, "Activity time"},
{mkRoot, mkNightLt, "Night lighting"},
{mkNightLt, mkSensor2, "Turn on by sensor"},
{mkNightLt, mkActTime2, "Activity time"},
{mkRoot, mkAlarm, "Alarm clock"},
{mkAlarm, mkTurnOn, "Turn on alarm clock"},
{mkAlarm, mkSetAlarm, "Set an alarm"},
{mkAlarm, mkAddLoad, "Power supply time"},
{mkRoot, mkNetwork, "Network settings"},
{mkNetwork, mkSSID, "Enter SSID"},
{mkNetwork, mkPwd, "Enter password"},
{mkRoot, mkTime, "Time setting"},
{mkTime, mkSetTime, "Set the time"},
{mkTime, mkSynchTime, "Synchronize time"},
{mkRoot, mkBack, "Exit menu"}
};
uint8_t menuLen = sizeof(menu) / sizeof(sMenuItem);
//volatile int relayState = LOW;
int t = 10;
int relayState = LOW;
bool on = false;
unsigned long time_mark;
volatile uint32_t debounce;
bool privFlag = false;
bool curFlag = false;
void IRAM_ATTR lightOnOff() {
digitalWrite(relayPin, !digitalRead(relayPin));
}
void intro() {
lcd.printAt(4,0,"SMART HOUSE");
lcd.printAt(4,2,"Press button");
lcd.printAt(5,3,"to set up");
}
void myF() {
if (millis() - debounce >= 50) {
debounce = millis();
}
digitalWrite(relayPin, !digitalRead(relayPin));
}
void f() {
if (relayState == LOW && t == 10) {
digitalWrite(relayPin, HIGH);
on = true;
time_mark=millis();
}
else if (relayState == HIGH &&(millis()-time_mark > (t*1000))) { // 1000 = 1 сек
digitalWrite(relayPin, LOW);
on = false;
}
}
void fff() {
privFlag = curFlag;
curFlag = !curFlag;
}
//================================================================================
void setup() {
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
pinMode(pinsw1, INPUT_PULLUP);
pinMode(pinsw2, INPUT_PULLUP);
attachInterrupt(pinsw1, myF, CHANGE);
attachInterrupt(pinsw2, myF, CHANGE);
attachInterrupt(pinsensor, fff, RISING);
lcd.begin();
intro();
delay(100);
lcd.attachButtons(pinLeft, pinRight, pinEnter);
//lcd.attachIdleFunc(f);
}
void loop() {
//Serial.print(relayState);
//f();
if (curFlag != privFlag) Serial.println("!!!");
uint8_t selectedMenuItem = lcd.showMenu(menu, menuLen, 1);
if (selectedMenuItem == mkMainLt)
lcd.print("MAIN LIGHTING");
else if (selectedMenuItem == mkSensor1);
else if (selectedMenuItem == mkY)
lcd.print("yes");
else if (selectedMenuItem == mkN)
lcd.print("No");
else if (selectedMenuItem == mkActTime1)
lcd.print("Activity time");
else if (selectedMenuItem == mkNightLt)
lcd.print("NIGHT LIGHTING");
else if (selectedMenuItem == mkSensor2)
lcd.print("Turn on by sensor");
else if (selectedMenuItem == mkActTime2)
lcd.print("Activity time");
else if (selectedMenuItem == mkAlarm)
lcd.print("ALARM CLOCK");
else if (selectedMenuItem == mkTurnOn)
lcd.print("Turn on alarm clock");
else if (selectedMenuItem == mkSetAlarm)
lcd.print("Set an alarm");
else if (selectedMenuItem == mkAddLoad)
lcd.print("Power supply time");
else if (selectedMenuItem == mkNetwork)
lcd.print("NETWORK SETTINGS");
else if (selectedMenuItem == mkSSID)
lcd.print("Enter SSID");
else if (selectedMenuItem == mkPwd)
lcd.print("Enter password");
else if (selectedMenuItem == mkTime)
lcd.print("TIME SETTING");
else if (selectedMenuItem == mkSetTime)
lcd.print("Set the time");
else if (selectedMenuItem == mkSynchTime)
lcd.print("Synchronize time");
else if (selectedMenuItem == mkBack)
//lcd.print("Exit selected");
intro();
while (lcd.getButtonsState() == eNone);
}
// /* Пример использования меню для ввода параметров
// * с отображением их текущих значений в пунктах меню
// * и сохранением в EEPROM.
// * Обработка выбранных пунктов осуществляется в обработчиках.
// */
// #include <Wire.h>
// #include <LiquidCrystal_I2C_Menu_Btns.h>
// #include <EEPROM.h>
// //#include <ESP_EEPROM.h>
// LiquidCrystal_I2C_Menu_Btns lcd(0x27, 20, 4);
// // Пины, к которым подключены кнопки
// #define pinLeft 4
// #define pinRight 2
// #define pinEnter 16
// #define pinBack 14 // Back - необязательная кнопка
// uint8_t brightness; // Параметры, которые мы будем именять
// uint8_t _delay;
// // Объявим перечисление, используемое в качестве ключа пунктов меню
// enum {mkBack, mkRoot, mkSetBrightness, mkSetDelay, mkDefaults};
// // Прототипы обработчиков пунктов меню:
// void SetBrightness();
// void SetDelay();
// void SetDefaults();
// // Описание меню
// // структура пункта меню: {ParentKey, Key, Caption, [Handler]}
// sMenuItem menu[] = {
// // {ParentKey, Key, Caption, [Handler]} - структура пункта меню
// {mkBack, mkRoot, "Options", NULL},
// {mkRoot, mkSetBrightness, NULL, SetBrightness}, // Названия этих пунктов
// {mkRoot, mkSetDelay, NULL, SetDelay}, // будут сгенерированы позже
// {mkRoot, mkDefaults, "Defaults", SetDefaults},
// {mkRoot, mkBack, "Back", NULL}
// };
// uint8_t menuLen = sizeof(menu) / sizeof(sMenuItem);
// // Функция поиска индекса пункта по его ключу
// int getItemIndexByKey(uint8_t key){
// for (uint8_t i = 0; i < menuLen; i++)
// if (menu[i].key == key)
// return i;
// return -1;
// }
// // Функция формирования названия пункта меню, содержащего значение параметра
// void updateCaption(uint8_t key, char format[], int value){
// // key - ключ пункта меню, для которого обновляется навание
// // format - шаблон названия со значением
// // value - значение, добавляемое в название
// uint8_t index = getItemIndexByKey(key);
// char* buf = (char*) malloc(40);
// sprintf(buf, format, value);
// menu[index].caption = (char*) realloc(menu[index].caption, strlen(buf)+1);
// strcpy(menu[index].caption, buf);
// free(buf);
// }
// // Обработчик для пункта меню Brightness
// void SetBrightness(){
// // Запрашиваем новое значение
// brightness = lcd.inputVal<uint8_t>("Input brightness(%)", 0, 100, brightness, 5);
// // Сохраняем его в EEPROM
// EEPROM.put(0, brightness);
// // Обновляем название пункта меню
// updateCaption(mkSetBrightness, "Brightness (%d%%)", brightness);
// // Далее может распологаться код - реакция на изменение значения Brightness
// }
// // Обработчик для пункта меню Delay
// void SetDelay(){
// // Запрашиваем новое значение
// _delay = lcd.inputVal<uint8_t>("Input delay(ms)", 0, 20, _delay);
// // Сохраняем его в EEPROM
// EEPROM.put(1, _delay);
// // Обновляем название пункта меню
// updateCaption(mkSetDelay, "Delay (%dms)", _delay);
// // Далее может распологаться код - реакция на изменение значения Delay
// }
// // Обработчик для пункта меню Defaults
// void SetDefaults(){
// brightness = 50;
// _delay = 10;
// EEPROM.put(0, brightness);
// EEPROM.put(1, _delay);
// updateCaption(mkSetBrightness, "Brightness (%d%%)", brightness);
// updateCaption(mkSetDelay, "Delay (%dms)", _delay);
// // Далее может распологаться код - реакция на изменение значений Delay и Brightness
// }
// // Перерисовка информации на экране
// void LCDRepaint(){
// lcd.clear();
// lcd.printfAt(0, 0, "Brightness (%d%%)", brightness);
// lcd.printfAt(0, 1, "Delay (%dms)", _delay);
// lcd.printAt(0, 3, "Press enter for menu");
// }
// void setup() {
// lcd.begin();
// lcd.attachButtons(pinLeft, pinRight, pinEnter, pinBack);
// // Считываем значения brightness и _delay из EEPROM
// brightness = EEPROM.read(0);
// if (brightness > 100) {
// brightness = 50;
// EEPROM.write(0, brightness);
// }
// _delay = EEPROM.read(1);
// if(_delay > 20) {
// _delay = 10;
// EEPROM.write(1, _delay);
// }
// // Формируем названия пунктов меню
// updateCaption(mkSetBrightness, "Brightness (%d%%)", brightness);
// updateCaption(mkSetDelay, "Delay (%dms)", _delay);
// LCDRepaint();
// }
// void loop() {
// // Для изменения параметров необходимо нажать кнопку enter
// if (lcd.getButtonsState() == eButton) { // При нажатии
// lcd.showMenu(menu, menuLen, 1); // показываем меню
// LCDRepaint(); // после чего обновляем информацию на дисплее
// }
// // Далее может располагаться основной функционал программы
// }
// // Пример использования меню для построения диалога
// #include <Wire.h>
// #include <LiquidCrystal_I2C_Menu_Btns.h>
// LiquidCrystal_I2C_Menu_Btns lcd(0x27, 20, 4);
// // Пины, к которым подключены кнопки
// #define pinLeft 4
// #define pinRight 2
// #define pinEnter 16
// #define pinBack 14 // Back - необязательная кнопка
// void setup() {
// lcd.begin();
// lcd.attachButtons(pinLeft, pinRight, pinEnter, pinBack);
// }
// void loop() {
// sMenuItem formatConfirmation[] = { // Опишем наше меню:
// {0, 1, "SMART HOME SETTINGS:", NULL}, // Это будет заголовок
// {1, 2, "lighting", NULL}, // и два пункта для выбора
// {1, 3, "alarm clock", NULL},
// {1, 4, "network&time", NULL}
// };
// // Показываем меню и анализируем результат
// if (lcd.showMenu(formatConfirmation, 4, 1) == 4)
// lcd.print("Yes selected");
// else
// lcd.print("No selected");
// while (lcd.getButtonsState() == eNone);
// }
// #include "WiFi.h"
// #include <Wire.h>
// #include <LiquidCrystal_I2C.h>
// #include "button.h"
// #include "LiquidMenu.h"
// //#include <HTTPClient.h>
// //#include <ArduinoJson.h>
// Button btnUp(4);
// Button btnDown(2);
// Button btnSelect(16);
// Button btnReturn(14);
// LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
// struct items {
// char *item1;
// char *item2;
// char *item3;
// };
// struct menuItem {
// int id;
// char *name;
// struct items *i;
// struct menuItem *prev;
// struct menuItem *next1;
// struct menuItem *next2;
// struct menuItem *next3;
// };
// items it0 = {"lighting", "alarm clock", "network&time"};
// items it1 = {"main lighting", "night lighting", "return"};
// items it2 = {"turn on the alarm", "set the alarm time", "return"};
// items it3 = {"network settings", "synchronize clock", "return"};
// menuItem m = {0, "SMART HOME SETTINGS:", &it0, NULL, NULL, NULL, NULL};
// menuItem m1 = {1, "LIGHTING:", &it1, &m, NULL, NULL, NULL};
// menuItem m2 = {2, "ALARM CLOCK:", &it2, &m, NULL, NULL, NULL};
// menuItem m3 = {3, "NETWORK&TIME:", &it3, &m, NULL, NULL, NULL};
// uint8_t row = 1;
// menuItem *current = &m;
// bool flag = true;
// //=====================================================
// void setup() {
// //Serial.begin(115200);
// m.next1 = &m1;
// m.next2 = &m2;
// m.next3 = &m3;
// lcd.init();
// printMenu(&m);
// }
// void loop() {
// lcd.setCursor(0,row);
// if(btnDown.click()) {
// if(row > 0 && row < 3) {
// row ++ ;
// moveCursor(row);
// }
// }
// if(btnUp.click()) {
// if(row < 4 && row > 1) {
// row --;
// moveCursor(row);
// }
// }
// if(btnSelect.click()) {
// switch(row) {
// case 1:
// //current = &m1;
// current->next1 ? current = current->next1 : NULL;
// break;
// case 2:
// current = &m2;
// break;
// case 3:
// current->prev ? current = current->prev : current = &m3;
// //current = &m3;
// break;
// }
// printMenu(current);
// //flag = false;
// }
// //
// delay(100);
// }
// //========================================================
// void moveCursor(uint8_t pos) {
// lcd.print(" ");
// lcd.setCursor(0,pos);
// lcd.print(">");
// }
// void printMenu(menuItem *m) {
// lcd.clear();
// //lcd.setCursor(0,0);
// lcd.print(m->name);
// lcd.setCursor(0,1);
// lcd.print(">");
// lcd.setCursor(2,1);
// lcd.print(m->i->item1);
// lcd.setCursor(2,2);
// lcd.print(m->i->item2);
// lcd.setCursor(2,3);
// lcd.print(m->i->item3);
// }