// ===================================================
// ===== CONFIGURAÇÃO GERAL DO PROJETO ================
// ===================================================
// --------- SELECIONE A PLACA ---------
// Descomente APENAS UMA
#define USE_ESP32
// #define USE_ESP01
// --------- DEBUG SERIAL ---------
#define DEBUG_SERIAL true
#define SERIAL_BAUD 115200
// --------- PINOS ---------
#ifdef USE_ESP32
#define PIN_LED D4
#define PIN_SDA 8
#define PIN_SCL 9
#endif
#ifdef USE_ESP01
#define PIN_LED 1 // TX
#define PIN_SDA 0
#define PIN_SCL 2
#endif
// --------- HORÁRIOS PADRÃO ---------
#define DEFAULT_HORA_ON 20
#define DEFAULT_HORA_OFF 6
// --------- TEMPO DO WIFI ---------
#define WIFI_TIMEOUT_MS 300000UL // 5 minutos
// --------- EEPROM ---------
#define EEPROM_SIZE 8
// ===================================================
// --------- BIBLIOTECAS ---------
#ifdef USE_ESP32
#include <WiFi.h>
#include <WebServer.h>
#endif
#ifdef USE_ESP01
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#endif
#include <Wire.h>
#include <RTClib.h>
#include <EEPROM.h>
// --------- DEBUG MACROS ---------
#if DEBUG_SERIAL
#define DBG(x) Serial.print(x)
#define DBGLN(x) Serial.println(x)
#else
#define DBG(x)
#define DBGLN(x)
#endif
// --------- OBJETOS ---------
RTC_DS3231 rtc;
#ifdef USE_ESP32
WebServer server(80);
#endif
#ifdef USE_ESP01
ESP8266WebServer server(80);
#endif
// --------- VARIÁVEIS ---------
unsigned long wifiStart;
bool wifiAtivo = true;
uint8_t horaOn;
uint8_t horaOff;
// ---------- FUNÇÕES DE CONFIGURAÇÃO ----------
void loadConfig() {
EEPROM.begin(EEPROM_SIZE);
horaOn = EEPROM.read(0);
horaOff = EEPROM.read(1);
if (horaOn > 23) horaOn = DEFAULT_HORA_ON;
if (horaOff > 23) horaOff = DEFAULT_HORA_OFF;
DBGLN("Config carregada:");
DBG("Hora ON: "); DBGLN(horaOn);
DBG("Hora OFF: "); DBGLN(horaOff);
}
void saveConfig() {
EEPROM.write(0, horaOn);
EEPROM.write(1, horaOff);
EEPROM.commit();
DBGLN("Config salva na EEPROM");
}
// ---------- FUNÇÕES WEB ----------
void handleRoot() {
DBGLN("Pagina acessada");
String page =
"<html><body>"
"<h2>Luminaria Lua</h2>"
"<form action='/save'>"
"Hora LIGA: <input name='on' type='number' min='0' max='23'><br>"
"Hora DESLIGA: <input name='off' type='number' min='0' max='23'><br>"
"<input type='submit' value='Salvar'>"
"</form>"
"</body></html>";
server.send(200, "text/html", page);
}
void handleSave() {
if (server.hasArg("on")) horaOn = server.arg("on").toInt();
if (server.hasArg("off")) horaOff = server.arg("off").toInt();
saveConfig();
server.send(200, "text/html", "<h3>Configuracao salva!</h3>");
}
// ---------- SETUP ----------
void setup() {
if (DEBUG_SERIAL) Serial.begin(SERIAL_BAUD);
DBGLN("\nBoot iniciado");
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, LOW);
Wire.begin(PIN_SDA, PIN_SCL);
if (!rtc.begin()) {
DBGLN("ERRO: RTC NAO ENCONTRADO");
} else {
DBGLN("RTC OK");
}
loadConfig();
DBGLN("Ligando WiFi (AP)");
WiFi.mode(WIFI_AP);
WiFi.softAP("Lua_Config");
server.on("/", handleRoot);
server.on("/save", handleSave);
server.begin();
wifiStart = millis();
}
// ---------- LOOP ----------
void loop() {
// ---- JANELA DE CONFIGURAÇÃO ----
if (wifiAtivo) {
server.handleClient();
if (millis() - wifiStart > WIFI_TIMEOUT_MS) {
DBGLN("Tempo de configuracao expirou");
DBGLN("Desligando WiFi");
server.stop();
WiFi.mode(WIFI_OFF);
wifiAtivo = false;
}
}
// ---- MODO NORMAL ----
DateTime now = rtc.now();
int horaAtual = now.hour();
DBG("Hora atual: ");
DBGLN(horaAtual);
bool ledOn;
if (horaOn < horaOff) {
ledOn = (horaAtual >= horaOn && horaAtual < horaOff);
} else {
ledOn = (horaAtual >= horaOn || horaAtual < horaOff);
}
if (ledOn) {
DBGLN("LED LIGADO");
digitalWrite(PIN_LED, HIGH);
} else {
DBGLN("LED DESLIGADO");
digitalWrite(PIN_LED, LOW);
}
delay(1000);
}
Loading
xiao-esp32-c3
xiao-esp32-c3