// быстрый старт
#include <Arduino.h>
#include <EEPROM.h>
struct LoginPass {
char ssid[20];
char pass[20];
};
LoginPass lp;
bool flag = false;
uint32_t btnTimer = 0;
bool hold = 0;
bool valve = 0;
// подключаем библиотеку и настраиваем устройство
#include <GyverHub.h>
GyverHub hub("MyDevices", "ESP8266", "");
// иконки
// https://fontawesome.com/v5/cheatsheet/free/solid
// https://fontawesome.com/v5/search?o=r&m=free&s=solid
// переменные для интерфейса
//GH_BOOL button=0;
bool button = 0;
GHbutton b2;
GHbutton open; //переменная для программной кнопки открыть
GHbutton close; //переменная для программной кнопки закрыть
GHbutton save; //переменная для программной кнопки сохранить настройки сети
bool start; //переменная-флаг для запуска настройки сети если при старте нажата кнопка
uint8_t sld_i;
float sld_f;
String inp_str;
char inp_cstr[11]; // строка на 10 символов (+1 нулевой)
int16_t inp_int;
// это наш билдер. Он будет вызываться библиотекой
// для сборки интерфейса, чтения значений и проч.
void build() {
if (start) { //если при запуске была нажата кнопка, запускаем настройщик сети
hub.Input(lp.ssid, GH_CSTR, F("название сети")); //поле с назаванием сети, после ввода, нужно нажать стрелочку в конце поля
hub.Input(lp.pass, GH_CSTR, F("пароль сети"), GH_RED); //поле для ввода пароля, после ввода, нужно нажать стрелочку в конце поля
hub.Button(&save, F("сохранить"), GH_RED); //кнока сохранить настройки
if (save) { //если кнопку таки надавили...
EEPROM.put(0, lp); // сохраняем
EEPROM.commit(); // записываем
Serial.println();
Serial.println(lp.ssid);
Serial.println(lp.pass);
WiFi.softAPdisconnect(); // отключаем AP
start = 0; //убираем флаг
}
} else { //если кнопку при старте не давили, то запускаем основную морду
// сделаем интерфейс в виде стильных виджетов
// BeginWidgets() начинает новую горизонтальную строку виджетов
hub.BeginWidgets();
// ширина следующих виджетов задаётся в %
hub.WidgetSize(50);
// это кнопка без настроек
// Кнопка - активный компонент: вернёт 1 если нажата
if (hub.Button(&open, F("Открыть"), GH_GREEN)) valve = 1;
// ко второй кнопке подключим переменную b2
// она будет true, пока кнопка удерживается. Опросим её ниже в loop
// добавим название и цвет
if (hub.Button(&close, F("Закрыть"), GH_PINK)) valve = 0;
hub.WidgetSize(50);
hub.LED_(F("valveopen"), 0, "Открыто");
hub.LED_(F("valveclose"), 0, "Закрыто");
hub.WidgetSize(50);
hub.LED_(F("btnState"), 0, "кнопка"); //индикатор нажатой кнопки
hub.LED_(F("valve1"), 0, "сервер"); //индикатор ответа сервера
hub.EndWidgets();
}
}
void setup() {
// hub.setupMQTT("m6.wqtt.ru", 15143); что то не заработало
// читаем логин пароль из памяти
EEPROM.begin(100);
EEPROM.get(0, lp);
Serial.begin(115200);
pinMode(D1, INPUT_PULLUP); //кнопка сидит тут
pinMode(D4, OUTPUT); // реле сидит тут
if (digitalRead(D1)) { //если кнопка нажата...
start = 1; //поворачиваем флаг для выбора морды конфигурации сети
WiFi.mode(WIFI_AP); // сеть как точка доступа
WiFi.softAP("Vankin_Wi-FI"); //название сети
Serial.println();
Serial.println("Точка доступа создана");
Serial.println(WiFi.localIP());
} else { //если кнопка не нажата...
// если это ESP - подключаемся к WiFI
#ifdef GH_ESP_BUILD
start = 0; //флаг для выбора морды основной программы
WiFi.mode(WIFI_STA); //сеть как клиент
WiFi.begin(lp.ssid, lp.pass); //параметры сети берем из памяти
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println(lp.ssid);
Serial.println(lp.pass);
Serial.println(WiFi.localIP());
const char* login = "***";
const char* pass = "***";
hub.setupMQTT("m6.wqtt.ru", 15140, "[B][I]", "[/I][/B]", 0, 0);
if (hub.online()) Serial.println("MQTT подключен"); // MQTT подключен)
#endif
}
// можно подключить обработчик веб-консоли
// зайди в info/cli в приложении
// или нажми ~ при открытом устройстве
hub.onCLI([](String& s) {
Serial.println(s);
hub.print(s); // отправить обратно
// вдогонку отправим строку из Input inp_str
hub.print(inp_str, GH_BLUE);
});
hub.onBuild(build); // подключаем билдер
hub.begin(); // запускаем систему
}
void loop() {
hub.tick(); // обязательно тикаем тут
bool btnState = digitalRead(D1); //читаем состояние кнопки
//button = digitalRead(D1);
// Serial.println(button);
static GHtimer tmr(1000); //таймер обновления состояния 1 сек
if (tmr) {
hub.sendUpdate("btnState", String(btnState)); //отправляем на морду состояние кноки
hub.sendUpdate("valveopen", String(valve));
hub.sendUpdate("valveclose", String(!valve));
// hub.sendGet("valve", String(valve));
//Serial.println(
hub.sendGet("valve1", String(valve));
// hub.sendGetAuto(valve);
//hub.sendUpdate("valve1", String(valve));
}
if (open) valve = 1;
if (close) valve = 0;
// читаем инвертированное значение для удобства
if (btnState && !flag && millis() - btnTimer > 100) {
flag = 1;
valve = !valve;
btnTimer = millis();
Serial.println(valve);
hub.sendGet("btnState", String(btnState));
}
if (!btnState && flag && millis() - btnTimer > 100) {
flag = false;
btnTimer = millis();
hub.sendGet("btnState", String(btnState));
}
if (valve) digitalWrite(D4, 1);
else digitalWrite(D4, 0);
}