//----------------inclusão de biblioteca---------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <EEPROM.h>
//----------------Definições dos pinos-----------------------------------
const int M_ROBO = 25; // Motor de movimento do robô
const int M_ROBO_REV = 26; // Motor de movimento do robô
const int M_ESCOV = 27; // Motor das escovas
const int M_BOMBA = 14; // Motor da bomba
const int FC_INI = 18; // Fim de curso do robô do lado inicial
const int FC_END = 19; // Fim de curso do robô do lado final
const int BT_A = 5; // Botão 1 (Esquerda)
const int BT_B = 16; // Botão 2 (Direita)
const int BT_C = 17; // Botão 3 (sel)
const int BT_D = 4; // Botão 4 (Voltar)
const int BRILHO_TELA = 15;
const int led = 23;
const int mem1 = 0;
const int mem2 = 1;
const int mem3 = 2;
//----------------Inicialização do LCD e RTC-----------------------------
LiquidCrystal_I2C lcd(0x27, 20, 4); // Endereço 0x27 para LCD 16x2
RTC_DS3231 rtc;
//----------------variaveis globais--------------------------------------
int diasNoMes[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool ehBissexto(int ano) {
return (ano % 4 == 0 && ano % 100 != 0) || (ano % 400 == 0);
}
int H_agenda = 24; //usado para salvar a agenda definida pelo usuario
int M_agenda = 0; //usado para salvar a agenda definida pelo usuario
int S_agenda = 0; //usado para salvar a agenda definida pelo usuario
int proxima_limpeza = 1;
int proxima_limpeza_M = 1;
int proxima_limpeza_Y = 2025;
int intervalo = 30; //usado para salvar a agenda definida pelo usuario
bool menu = 0; //define quando algum menu foi acessado
int sel_s = 1; //esse valor e usado quando a variavel "sel" é alterado
int sel = 0; //diz ao código qual menu está selecionado
int tempo = 0; //usado para contar tempo
int tempo_bomba = 20;
int tempo_escova = 5;
int brilho = 100;
bool bt_s1 = 0; //usado para travar botao no seu estado
bool bt_s2 = 0; //usado para travar botao no seu estado
bool bt_s3 = 0; //usado para travar botao no seu estado
bool bt_s4 = 0; //usado para travar botao no seu estado
int tempo_bt1 = 0;
int tempo_bt2 = 0;
int tempo_sus = 0;
int limite_sus = 6000;
int suspencao = 60;
bool resultBool;
int resultInt;
int result_t;
int result_tempo_b;
//----------------caracteres especiais logo da empresa------------------------
byte SIMB1[8] = {B00000,B00000,B00000,B00011,B00010,B00000,B00101,B01101};
byte SIMB2[8] = {B00000,B00100,B01110,B00000,B01110,B11111,B11111,B11111};
byte SIMB3[8] = {B00000,B00000,B00000,B11000,B01000,B00000,B10100,B10110};
byte SIMB4[8] = {B00101,B00000,B00010,B00011,B00000,B00000,B00000,B00000};
byte SIMB5[8] = {B11111,B11111,B01110,B00000,B01110,B00100,B00000,B00000};
byte SIMB6[8] = {B10100,B00000,B01000,B11000,B00000,B00000,B00000,B00000};
//----------------------------------------------------------------------------------------------------------
void setup() {
// Inicializar comunicação
Serial.begin(115200);
Wire.begin();
lcd.begin(20, 4);
rtc.begin();
lcd.clear();
EEPROM.begin(64);
lcd.backlight();
// Configuração de pinos
pinMode(M_ROBO, OUTPUT);
pinMode(M_ROBO_REV, OUTPUT);
pinMode(M_ESCOV, OUTPUT);
pinMode(M_BOMBA, OUTPUT);
pinMode(led, OUTPUT);
pinMode(FC_INI, INPUT_PULLDOWN);
pinMode(FC_END, INPUT_PULLDOWN);
pinMode(BT_A, INPUT_PULLDOWN);
pinMode(BT_B, INPUT_PULLDOWN);
pinMode(BT_C, INPUT_PULLDOWN);
pinMode(BT_D, INPUT_PULLDOWN);
//declara caracters especiais
lcd.createChar(1, SIMB1);
lcd.createChar(2, SIMB2);
lcd.createChar(3, SIMB3);
lcd.createChar(4, SIMB4);
lcd.createChar(5, SIMB5);
lcd.createChar(6, SIMB6);
//escreve logo da empresa
lcd.setCursor(8,0);
lcd.write(1);
lcd.write(2);
lcd.write(3);
lcd.setCursor(8,1);
lcd.write(4);
lcd.write(5);
lcd.write(6);
brilho = 100;
writeTexLCD("SUN CLEAR",5,2);
analogWrite(BRILHO_TELA, 250);
lcd.display();
delay(2000);
lcd.clear();
if(EEPROM.readInt(0) >= 0)H_agenda = EEPROM.readInt(0);
if(EEPROM.readInt(4) >= 0)M_agenda = EEPROM.readInt(4);
if(EEPROM.readInt(8) >= 0)intervalo = EEPROM.readInt(8);
if(EEPROM.readInt(12) >= 0)proxima_limpeza = EEPROM.readInt(12);
if(EEPROM.readInt(16) >= 0)proxima_limpeza_M = EEPROM.readInt(16);
if(EEPROM.readInt(20) >= 0)proxima_limpeza_Y = EEPROM.readInt(20);
if(EEPROM.readInt(30) >= 0)tempo_bomba = EEPROM.readInt(30);
if(EEPROM.readInt(34) >= 0)tempo_escova = EEPROM.readInt(34);
if(EEPROM.readInt(38) >= 1)brilho = EEPROM.readInt(38);
if(EEPROM.readInt(42) >= 0)suspencao = EEPROM.readInt(42);
limite_sus = map(suspencao,0,60,0,6000);
}
//----------------------------------------------------------------------------------------------------------
void loop() {
if(!menu)MenuHome();
delay(20);
digitalWrite(led, 0);
if(menu && sel == 0)menu_limpeza();
if(menu && sel == 1)agenda();
if(menu && sel == 2)menu_edit_h();
if(menu && sel == 3)menu_reset();
if(menu && sel == 4)config();
if(menu && sel == 5)menu_hardreset();
tempo_sus++;
digitalWrite(M_ROBO, 0);
digitalWrite(M_ROBO_REV, 0);
digitalWrite(M_BOMBA, 0);
digitalWrite(M_ESCOV, 0);
if(tempo_sus > limite_sus){
sel = 0;
menu = 0;
tempo_sus = limite_sus;
brilho = 0;
lcd.noDisplay();
}else if(tempo_sus < 10){
brilho = EEPROM.readInt(38);
lcd.display();
}
if((H_agenda <= rtc.now().hour()) &&
(M_agenda <= rtc.now().minute()) &&
(proxima_limpeza <= rtc.now().day()) &&
(proxima_limpeza_M <= rtc.now().month()) &&
(proxima_limpeza_Y <= rtc.now().year())){
sel = 0;
menu = 1;
tempo_sus = 0;
brilho = EEPROM.readInt(38);
menu_limpeza();
}
}
void MenuHome(){
tempo++;
if(sel != sel_s){
sel_s = sel;
if(sel < 3){
if(sel == 0)writeTexLCD(">Limpeza (ativar)1/2",0,0);
if(sel != 0)writeTexLCD(" Limpeza 1/2",0,0);
if(sel == 1)writeTexLCD(">Agenda (editar) ",0,1);
if(sel != 1)writeTexLCD(" Agenda ",0,1);
if(sel == 2)writeTexLCD(">Hora (editar) ",0,2);
if(sel != 2)writeTexLCD(" Hora ",0,2);
}else{
if(sel == 3)writeTexLCD(">Reiniciar 2/2",0,0);
if(sel != 3)writeTexLCD(" Reiniciar 2/2",0,0);
if(sel == 4)writeTexLCD(">Config ",0,1);
if(sel != 4)writeTexLCD(" Config ",0,1);
if(sel == 5)writeTexLCD(">Reset de Fab. ",0,2);
if(sel != 5)writeTexLCD(" Reset de Fab. ",0,2);
}
}
if(tempo == 40){
digitalWrite(led, 1);
DateTime now = rtc.now();
writeNumberLCD(rtc.now().hour(),0,3);
writeNumberLCD(rtc.now().minute(),3,3);
writeNumberLCD(rtc.now().second(),6,3);
writeNumberLCD(rtc.now().day(),10,3);
writeNumberLCD(rtc.now().month(),13,3);
writeNumberLCD(rtc.now().year(),16,3);
writeTexLCD(":",2,3);
writeTexLCD(":",5,3);
writeTexLCD("/",12,3);
writeTexLCD("/",15,3);
tempo = 0;
}
ReadInput(BT_A, bt_s1, sel, 0, 5, true);
sel = resultInt;
bt_s1 = resultBool;
ReadInput(BT_B, bt_s2, sel, 0, 5, false);
sel = resultInt;
bt_s2 = resultBool;
if(digitalRead(BT_C) && tempo_sus < limite_sus)menu = 1;
}
void menu_edit_h(){
int time = 0;
int select = 0;
bool save = true;
lcd.clear();
DateTime now = rtc.now();
writeTexLCD("Hora: ",0,0);
writeTexLCD(":",8,0);
writeTexLCD(":",11,0);
writeTexLCD("Data: ",0,1);
writeTexLCD("/",8,1);
writeTexLCD("/",11,1);
int H = rtc.now().hour(), M = rtc.now().minute(), S = rtc.now().second();
int DAY = rtc.now().day(), MONTH = rtc.now().month(), Y = rtc.now().year();
while(menu == 1){
time++;
if(time > 49)time = 0;
// tela ----------------------------------------------------------
writeNumberEdit(6,0,H,time,select,0);
writeNumberEdit(9,0,M,time,select,1);
writeNumberEdit(12,0,S,time,select,2);
writeNumberEdit(6,1,DAY,time,select,3);
writeNumberEdit(9,1,MONTH,time,select,4);
writeNumberEdit(12,1,Y,time,select,5);
if(select == 6 && time == 0)writeTexLCD("Cancelar?",0,3);
if(select != 6 && time == 0)writeTexLCD(" ",0,3);
// botoes -------------------------------------------------------------
if (select == 0){
IncReadIn(BT_A, bt_s1, H, 0, 23, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
H = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, H, 0, 23, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
H = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 1){
IncReadIn(BT_A, bt_s1, M, 0, 59, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
M = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, M, 0, 59, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
M = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 2){
IncReadIn(BT_A, bt_s1, S, 0, 59, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
S = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, S, 0, 59, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
S = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 3){
IncReadIn(BT_A, bt_s1, DAY, 0, diasNoMes[MONTH - 1], true, time, -1, tempo_bt1);
bt_s1 = resultBool;
DAY = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, DAY, 0, diasNoMes[MONTH - 1], false, time, -1, tempo_bt2);
bt_s2 = resultBool;
DAY = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 4){
IncReadIn(BT_A, bt_s1, MONTH, 1, 12, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
MONTH = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, MONTH, 1, 12, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
MONTH = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 5){
IncReadIn(BT_A, bt_s1, Y, 2020, 2100, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
Y = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, Y, 2020, 2100, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
Y = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 6){
if(digitalRead(BT_A) || digitalRead(BT_B)){
menu = 0;
save = false;
}
}
tempo_sus++;
if(tempo_sus > limite_sus)return;
ReadInput(BT_C,bt_s3,select,0,6,true);
bt_s3 = resultBool;
if(bt_s3) time = -1;
select = resultInt;
if(digitalRead(BT_D))menu = 0;
delay(10);
}
lcd.clear();
sel_s = 4;
if(save)rtc.adjust(DateTime(Y, MONTH, DAY, H, M, S)); // Ajuste Manual (Ano, Mês, Dia, Hora, Min, Seg)
}
void agenda(){
lcd.clear();
int save = true;
//cria variaveis locais
int time = 0; //time para contagem de tempo
int select = 0; //para seleção do que vai ser editado
//desenha a tela
writeTexLCD("Hora",0,0);
writeTexLCD(":",8,0);
writeTexLCD("intervalo em dias:",0,1);
//cria um loop interno enquanto estiver editandoo
while(menu == 1){
tempo_sus++;
if(tempo_sus > limite_sus)return;
time++;// conta uma volta
if(time > 49)time = 0; //se a contagem de tempo chegar a 50, ele volta para 0
// tela ----------------------------------------------------------
// funcao "writeNumberEdit" explicação:
// (numero da coluna do lcd, numero da linha do lcd, variavel que vai aparecer na tela, ...
// ... conntagem de tempo, selecao atual do que esta editando, valor da selecao pra ser editado)
writeNumberEdit(6,0,H_agenda,time,select,0);
writeNumberEdit(9,0,M_agenda,time,select,1);
writeNumberEdit(9,2,intervalo,time,select,2);
if(select == 3 && time == 0)writeTexLCD("Cancelar?",0,3);
if(select != 3 && time == 0)writeTexLCD(" ",0,3);
// botoes -------------------------------------------------------------
// funcao "verificarBotao" explicação:
// (botao há ser verificado, set do botao, variavel que vai ser editado , ...
// ... numero minimo, numero maximo, escolhe se incrementa ou decrementa, contagem de tempo,...
// ... valor pra editar contagem de tempo)
// para trazer a variavel modificada são:
// result traz a variavel incrementada ou decrementada
// result_t traz o tempo resetado
// result_b traz o set do botao atualizado
if (select == 0){
IncReadIn(BT_A, bt_s1, H_agenda, 0, 23, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
H_agenda = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, H_agenda, 0, 23, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
H_agenda = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 1){
IncReadIn(BT_A, bt_s1, M_agenda, 0, 59, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
M_agenda = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, M_agenda, 0, 59, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
M_agenda = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 2){
IncReadIn(BT_A, bt_s1, intervalo, 1, 59, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
intervalo = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, intervalo, 1, 59, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
intervalo = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 3){
if(digitalRead(BT_A) || digitalRead(BT_B)){
menu = 0;
save = false;
}
}
ReadInput(BT_C,bt_s3,select,0,3,true);
bt_s3 = resultBool;
if(bt_s3) time = -1;
select = resultInt;
if(digitalRead(BT_D))menu = 0;
delay(10);
}
lcd.clear();
sel_s = 4;
if(save){
calcularProximoAlarme(rtc.now().day(), rtc.now().month(), rtc.now().year(), intervalo);
EEPROM.writeInt(0, H_agenda);
EEPROM.writeInt(4, M_agenda);
EEPROM.writeInt(8, intervalo);
EEPROM.commit(); // Salvar na memória
}
}
void menu_reset(){
bool teste = 0;
lcd.clear();
writeTexLCD("Reiniciar?",0,0);
writeTexLCD(" D C ",0,2);
writeTexLCD("Nao Sim ",0,3);
while(digitalRead(BT_C)){}
while(menu == 1){
if(digitalRead(BT_C))teste = true;
delay(10);
if(digitalRead(BT_D))menu = 0;
if(teste)menu = 0;
tempo_sus++;
if(tempo_sus > limite_sus)return;
}
lcd.clear();
sel = 4;
if (teste){
writeTexLCD("Reiniciando...",0,0);
delay(1000);
lcd.clear();
ESP.restart();
}
}
void menu_hardreset(){
bool teste = 0;
lcd.clear();
writeTexLCD("Resetar de fabrica?",0,0);
writeTexLCD(" D C ",0,2);
writeTexLCD("Nao Sim ",0,3);
while(digitalRead(BT_C)){}
while(menu == 1){
if(digitalRead(BT_C))teste = true;
delay(10);
if(digitalRead(BT_D))menu = 0;
if(teste)menu = 0;
tempo_sus++;
if(tempo_sus > limite_sus)return;
}
lcd.clear();
sel = 4;
if (teste){
writeTexLCD("Resetando...",0,0);
delay(1000);
lcd.clear();
EEPROM.writeInt(0, -1);
EEPROM.writeInt(4, -1);
EEPROM.writeInt(8, -1);
EEPROM.writeInt(12, -1);
EEPROM.writeInt(16, -1);
EEPROM.writeInt(20, -1);
EEPROM.writeInt(30, -1);
EEPROM.writeInt(34, -1);
EEPROM.writeInt(38, -1);
EEPROM.writeInt(42, -1);
EEPROM.commit(); // Salvar na memória
ESP.restart();
}
}
void menu_limpeza(){
lcd.clear();
lcd.display();
writeTexLCD("iniciando",0,0);
writeTexLCD("limpeza...",0,1);
int tempo_lim = 0;
int tempo_h = 0;
int tmepo_escova_cont = 0;
int tmepo_bomba_cont = 0;
int tmepo_escova_cont_reg = tempo_escova;
int tmepo_bomba_cont_reg = tempo_bomba;
int tempow = 0;
int refresh = 0;
bool falha;
tempo_sus = 0;
digitalWrite(M_BOMBA, 1);
writeTexLCD("ligando bomba ",0,2);
while(tmepo_bomba_cont < tempo_bomba){
delay(10);
tempow++;
if(tempow == 100){
tempow = 0;
tmepo_bomba_cont++;
tmepo_bomba_cont_reg--;
writeNumberEdit3(16,3,tmepo_bomba_cont_reg,0,0,0,"s");
}
}
tempow = 0;
digitalWrite(M_ESCOV, 1);
writeTexLCD("ligando escovas",0,2);
while(tmepo_escova_cont < tempo_escova){
delay(10);
tempow++;
if(tempow == 100){
tempow = 0;
tmepo_escova_cont++;
tmepo_escova_cont_reg--;
writeNumberEdit3(16,3,tmepo_escova_cont_reg,0,0,0,"s");
}
}
tempow = 0;
lcd.clear();
digitalWrite(M_ROBO, 1);
writeTexLCD("executando ",0,0);
writeTexLCD("limpeza... ",0,1);
writeTexLCD("movendo... ",0,2);
while(!digitalRead(FC_END) && tempo_lim <3000){
delay(10);
tempo_lim++;
if(digitalRead(BT_D)){
lcd.clear();
tempo_lim = 4000;
}
}
lcd.clear();
if(tempo_lim == 4000)writeTexLCD("cancelado",0,3);
writeTexLCD("fim da ",0,0);
writeTexLCD("limpeza... ",0,1);
digitalWrite(M_BOMBA, 1);
digitalWrite(M_ESCOV, 1);
digitalWrite(M_ROBO, 0);
delay(1000);
lcd.clear();
writeTexLCD("voltando para",0,0);
writeTexLCD("posicao inicial",0,1);
digitalWrite(M_ROBO_REV, 1);
while(!digitalRead(FC_INI) && tempo_h <2000){
delay(10);
tempo_h++;
}
menu = 0;
digitalWrite(M_ROBO_REV, 0);
digitalWrite(M_BOMBA, 0);
digitalWrite(M_ESCOV, 0);
lcd.clear();
sel_s = 10;
calcularProximoAlarme(rtc.now().day(), rtc.now().month(), rtc.now().year(), intervalo);
}
void config(){
lcd.clear();
int save = true;
//cria variaveis locais
int time = 0; //time para contagem de tempo
int select = 0; //para seleção do que vai ser editado
if(brilho < 0)brilho = 100;
//desenha a tela
writeTexLCD("Tempo bomba:",0,0);
writeTexLCD("Tempo escova:",0,1);
writeTexLCD("brilho LCD:",0,2);
writeTexLCD("Suspencao LCD:",0,3);
//cria um loop interno enquanto estiver editandoo
while(menu == 1){
time++;// conta uma volta
tempo_sus++;
if(tempo_sus > limite_sus)return;
if(time > 49)time = 0; //se a contagem de tempo chegar a 50, ele volta para 0
// tela ----------------------------------------------------------
// funcao "writeNumberEdit" explicação:
// (numero da coluna do lcd, numero da linha do lcd, variavel que vai aparecer na tela, ...
// ... conntagem de tempo, selecao atual do que esta editando, valor da selecao pra ser editado)
writeNumberEdit3(16,0,tempo_bomba,time,select,0,"s");
writeNumberEdit3(16,1,tempo_escova,time,select,1,"s");
writeNumberEdit3(16,2,brilho,time,select,2,"%");
writeNumberEdit3(16,3,suspencao,time,select,3,"s");
// botoes -------------------------------------------------------------
// funcao "verificarBotao" explicação:
// (botao há ser verificado, set do botao, variavel que vai ser editado , ...
// ... numero minimo, numero maximo, escolhe se incrementa ou decrementa, contagem de tempo,...
// ... valor pra editar contagem de tempo)
// para trazer a variavel modificada são:
// result traz a variavel incrementada ou decrementada
// result_t traz o tempo resetado
// result_b traz o set do botao atualizado
if (select == 0){
IncReadIn(BT_A, bt_s1, tempo_bomba, 1, 999, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
tempo_bomba = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, tempo_bomba, 1, 999, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
tempo_bomba = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 1){
IncReadIn(BT_A, bt_s1, tempo_escova, 1, 999, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
tempo_escova = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, tempo_escova, 1, 999, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
tempo_escova = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 2){
IncReadIn(BT_A, bt_s1, brilho, 1, 100, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
brilho = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, brilho, 1, 100, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
brilho = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
if (select == 3){
IncReadIn(BT_A, bt_s1, suspencao, 5, 999, true, time, -1, tempo_bt1);
bt_s1 = resultBool;
suspencao = resultInt;
time = result_t;
tempo_bt1 = result_tempo_b;
IncReadIn(BT_B, bt_s2, suspencao, 5, 999, false, time, -1, tempo_bt2);
bt_s2 = resultBool;
suspencao = resultInt;
time = result_t;
tempo_bt2 = result_tempo_b;
}
ReadInput(BT_C,bt_s3,select,0,3,true);
bt_s3 = resultBool;
if(bt_s3) time = -1;
select = resultInt;
if(digitalRead(BT_D))menu = 0;
delay(10);
analogWrite(BRILHO_TELA, map(brilho,0,100,0,250));
}
lcd.clear();
sel_s = 7;
if(save){
limite_sus = map(suspencao,0,60,0,6000);
EEPROM.writeInt(30, tempo_bomba);
EEPROM.writeInt(34, tempo_escova);
EEPROM.writeInt(38, brilho);
EEPROM.writeInt(42, suspencao);
EEPROM.commit(); // Salvar na memória
}
}
//-----------------------------------------------------------------------------------------------------------
void writeNumberEdit(int NC, int NL, int number,int t,int setsel, int testsel){
// recebe as variaveis quando foi chamado
if(t <= 0){ //se a contagem de tempo for 0 ou menos ele escreve o numero na tela
// nessa parte ve se o numero tem 1 ou dois digitos e formata ele
if(number < 10 && number > -10){ //se tiver um digito
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print("0"); // coloca um 0 para mandar um digito pro lado
lcd.print(number); // escreve o numero na tela
}else{
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(number);// escreve o numero na tela
}
}
// essa parte é para fazer o numero picar na tela
// se a contagem de tempo for maior que 25 e o numero for menor que 100
if(t == 25 && number < 100 && setsel == testsel){
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(" ");// apaga o numero na tela
}
// se a contagem de tempo for maior que 25 e o numero for maior que 100
if(t == 25 && number >= 100 && setsel == testsel){
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(" ");// apaga o numero na tela
}
}
void writeNumberEdit3(int NC, int NL, int number,int t,int setsel, int testsel, String tex){
// recebe as variaveis quando foi chamado
if(t <= 0){ //se a contagem de tempo for 0 ou menos ele escreve o numero na tela
// nessa parte ve se o numero tem 1 ou dois digitos e formata ele
if(number < 10 && number > -10){ //se tiver um digito
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(" "); // coloca um 0 para mandar um digito pro lado
lcd.print(number); // escreve o numero na tela
lcd.print(tex);
}
else if(number < 100 && number > -100){
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(" ");
lcd.print(number);// escreve o numero na tela
lcd.print(tex);
}
else{
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(number);// escreve o numero na tela
lcd.print(tex);
}
}
// essa parte é para fazer o numero picar na tela
// se a contagem de tempo for maior que 25 e o numero for menor que 100
if(t == 25 && number < 100 && setsel == testsel){
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(" ");// apaga o numero na tela
}
// se a contagem de tempo for maior que 25 e o numero for maior que 100
if(t == 25 && number >= 100 && setsel == testsel){
lcd.setCursor(NC, NL); //numero da linha e coluna escolhida no chamado da funcao
lcd.print(" ");// apaga o numero na tela
}
}
//funcao para escrever texto no lcd
void writeTexLCD(String Tex, int nc, int nl){// texto, numero da coluna, numero da linha
if(tempo_sus < limite_sus){
lcd.setCursor(nc,nl);
lcd.print(Tex);
}
analogWrite(BRILHO_TELA, map(brilho,0,100,0,250));
}
//funcao escreve numero no lcd
void writeNumberLCD(int number, int nc, int nl){// numero, numero da coluna, numero da linha
if(tempo_sus < limite_sus){
if(number > 9){ //se o numero for de um digito acressentara o 0
lcd.setCursor(nc,nl);
lcd.print(number);
return;
}
lcd.setCursor(nc,nl);
lcd.print(0);
lcd.print(number);
}
}
// leitura de entrada
// (entrada, set dessa entrada, valor para ser editado, valor minimo , valor maximo , incremento ou decremento)
void ReadInput(int input, bool set_r, int valor, int v_minimo, int v_maximo, bool sinal) {
if ((digitalRead(input) && !set_r)) {
set_r = true;
tempo_sus = 0;
if (sinal) {
valor++;
if (valor > v_maximo) valor = v_minimo;
} else {
valor--;
if (valor < v_minimo) valor = v_maximo;
}
}
if (!digitalRead(input)) {
set_r = false;
}
resultInt = valor;
resultBool = set_r;
}
void IncReadIn(int input, bool set_r, int valor, int v_minimo, int v_maximo, bool sinal,int time,int time_set,int ts) {
result_t = time;
if (digitalRead(input) && !set_r && ts == 0) {
set_r = true;
tempo_sus = 0;
if (sinal) {
valor++;
if (valor > v_maximo) valor = v_minimo;
} else {
valor--;
if (valor < v_minimo) valor = v_maximo;
}
result_t = time_set;
}
if (!digitalRead(input)) {
set_r = false;
ts = 0;
}
if(digitalRead(input) && set_r){
ts++;
tempo_sus = 0;
result_t = time_set;
if (ts > 15) {
ts = 14;
if (sinal) {
valor++;
if (valor > v_maximo) valor = v_minimo;
} else {
valor--;
if (valor < v_minimo) valor = v_maximo;
}
}
}
resultInt = valor;
resultBool = set_r;
result_tempo_b = ts;
}
void calcularProximoAlarme(int diaAtual, int mesAtual, int anoAtual, int intervaloDias) {
// Ajusta fevereiro se o ano for bissexto
if (ehBissexto(anoAtual)) {
diasNoMes[1] = 29;
} else {
diasNoMes[1] = 28;
}
int novoDia = diaAtual + intervaloDias;
int novoMes = mesAtual;
int novoAno = anoAtual;
// Se o dia ultrapassar o total do mês, passa para o próximo mês
while (novoDia > diasNoMes[novoMes - 1]) {
novoDia -= diasNoMes[novoMes - 1];
novoMes++;
// Se passar de dezembro, muda para janeiro do próximo ano
if (novoMes > 12) {
novoMes = 1;
novoAno++;
}
// Atualiza fevereiro caso o novo ano seja bissexto
if (ehBissexto(novoAno)) {
diasNoMes[1] = 29;
} else {
diasNoMes[1] = 28;
}
}
proxima_limpeza = novoDia;
proxima_limpeza_M = novoMes;
proxima_limpeza_Y = novoAno;
Serial.printf("Próxima limpeza será em: %02d/%02d/%d\n", novoDia, novoMes, novoAno);
writeTexLCD("Proxima limpeza:",3,0);
writeTexLCD(String(proxima_limpeza)+"/"+String(proxima_limpeza_M)+"/"+String(proxima_limpeza_Y),3,1);
delay(3000);
EEPROM.writeInt(12, proxima_limpeza);
EEPROM.writeInt(16, proxima_limpeza_M);
EEPROM.writeInt(20, proxima_limpeza_Y);
EEPROM.commit(); // Salvar na memória
}
A
B
C
D