/*
-------------------------------------------------------------------------
Programa de controle de Robô limpador de placa solar
Empresa: SUN CLEAR
Autor: Gabriel Luz
Versão: alpha 1.0
-------------------------------------------------------------------------
*/
//inclusão de biblioteca
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// Definições dos pinos
#define M_ROBO 13 // Motor de movimento do robô
#define M_ESCOV 12 // Motor das escovas
#define M_BOMBA 26 // Motor da bomba
#define FC_INI 14 // Fim de curso do robô do lado inicial
#define FC_END 27 // Fim de curso do robô do lado final
#define BT_A 5 // Botão 1 (Esquerda)
#define BT_B 16 // Botão 2 (Direita)
#define BT_C 17 // Botão 3 (sel)
#define BT_D 4 // Botão 4 (Voltar)
// Inicialização do LCD e RTC
LiquidCrystal_I2C lcd(0x27, 20, 4); // Endereço 0x27 para LCD 16x2
RTC_DS3231 rtc;
int menu = 0, sel_s = 1;
int sel = 0, m_s = 1;
int timedis = 0;
bool bt_s1 = 0,bt_s2 = 0,bt_s3 = 0,bt_s4 = 0;
//caracteres especiais-----------------------------------------
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 SIMB5[8] = {
B00101,
B00000,
B00010,
B00011,
B00000,
B00000,
B00000,
B00000
};
byte SIMB6[8] = {
B11111,
B11111,
B01110,
B00000,
B01110,
B00100,
B00000,
B00000
};
byte SIMB7[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();
// Configuração de pinos
pinMode(M_ROBO, OUTPUT);
pinMode(M_ESCOV, OUTPUT);
pinMode(M_BOMBA, OUTPUT);
pinMode(FC_INI, INPUT);
pinMode(FC_END, INPUT);
pinMode(BT_A, INPUT);
pinMode(BT_B, INPUT);
pinMode(BT_C, INPUT);
pinMode(BT_D, INPUT);
lcd.createChar(6, SIMB3);
lcd.createChar(7, SIMB5);
lcd.createChar(8, SIMB6);
lcd.createChar(9, SIMB7);
lcd.createChar(4, SIMB1);
lcd.createChar(5, SIMB2);
lcd.setCursor(8,0);
lcd.write(4);
lcd.write(5);
lcd.write(6);
lcd.setCursor(8,1);
lcd.write(7);
lcd.write(8);
lcd.write(9);
lcd.setCursor(5,2);
lcd.print("SUN CLEAR");
delay(2000); // Espera para mostrar mensagem inicial
lcd.clear();
}
void loop() {
if(menu == 0)BTMENU1();
if(menu == 1 && sel == 0)menu_edit_h();
if(menu == 0)displaymenu0();
delay(10);
Serial.println("DEBUG: sel: "+String(sel)+" menu: "+String(menu));
}
void displaymenu0(){
timedis++;
if(menu == 0 && sel != m_s){
m_s = sel;
if(sel == 0){
lcd.setCursor(0,0);
lcd.print(">");
lcd.print("Hora (Editar)");
}else{
lcd.setCursor(0,0);
lcd.print(" ");
lcd.print("Hora ");
}
if(sel == 1){
lcd.setCursor(0,1);
lcd.print(">");
lcd.print("Agenda (Editar)");
}else{
lcd.setCursor(0,1);
lcd.print(" ");
lcd.print("Agenda ");
}
if(sel == 2){
lcd.setCursor(0,2);
lcd.print(">");
lcd.print("limpar agora");
}else{
lcd.setCursor(0,2);
lcd.print(" ");
lcd.print("limpar ");
}
}
if (digitalRead(BT_D) == HIGH && bt_s4 == 0) {
bt_s4 = 1;
menu = 0;
}
if (digitalRead(BT_D) == LOW && bt_s4 == 1) {
bt_s4 = 0;
}
if(timedis == 45){
DateTime now = rtc.now();
if(rtc.now().hour() < 10){
lcd.setCursor(0, 3);
lcd.print("0");
lcd.print(rtc.now().hour()); // Imprime a Hora
}else{
lcd.setCursor(0, 3);
lcd.print(rtc.now().hour()); // Imprime a Hora
}
lcd.setCursor(2, 3);
lcd.print(":"); // Imprime o texto entre aspas
if(rtc.now().minute() < 10){
lcd.setCursor(3, 3);
lcd.print("0");
lcd.print(rtc.now().minute()); // Imprime a Hora
}else{
lcd.setCursor(3, 3);
lcd.print(rtc.now().minute()); // Imprime a Hora
}
lcd.setCursor(5, 3);
lcd.print(":"); // Imprime o texto entre aspas
if(rtc.now().second() < 10){
lcd.setCursor(6, 3);
lcd.print("0");
lcd.print(rtc.now().second()); // Imprime o Segundo
}else{
lcd.setCursor(6, 3);
lcd.print(rtc.now().second()); // Imprime o Segundo
}
if(rtc.now().day() < 10){
lcd.setCursor(10, 3);
lcd.print("0");
lcd.print(rtc.now().day());
}else{
lcd.setCursor(10, 3);
lcd.print(rtc.now().day());
}
lcd.setCursor(12, 3);
lcd.print("/"); // Imprime o texto entre aspas
if(rtc.now().month() < 10){
lcd.setCursor(13, 3);
lcd.print("0");
lcd.print(rtc.now().month());
}else{
lcd.setCursor(13, 3);
lcd.print(rtc.now().month());
}
lcd.setCursor(15, 3);
lcd.print("/"); // Imprime o texto entre aspas
lcd.print(rtc.now().year()); // Imprime o Ano
}
if(timedis == 90)timedis = 0;
}
void BTMENU1(){
if (digitalRead(BT_A) == HIGH && bt_s1 == 0) {
sel += -1;
if (sel < 0) {
sel = 2;
}
bt_s1 = 1;
}
if (digitalRead(BT_A) == LOW && bt_s1 == 1) {
bt_s1 = 0;
}
if (digitalRead(BT_B) == HIGH && bt_s2 == 0) {
sel += 1;
if (sel > 2) {
sel = 0;
}
bt_s2 = 1;
}
if (digitalRead(BT_B) == LOW && bt_s2 == 1) {
bt_s2 = 0;
}
if (digitalRead(BT_C) == HIGH && bt_s3 == 0) {
bt_s3 = 1;
menu = 1;
}
if (digitalRead(BT_C) == LOW && bt_s3 == 1) {
bt_s3 = 0;
}
}
void menu_edit_h(){
int time = 0;
int select = 0;
lcd.clear();
DateTime now = rtc.now();
lcd.setCursor(0, 0); // Posiciona o cursor na primeira linha
lcd.print("Hora: "); // Imprime o texto "Hora: "
lcd.setCursor(6, 0);
lcd.print(rtc.now().hour()); // Imprime a Hora
lcd.setCursor(8, 0);
lcd.print(":"); // Imprime o texto entre aspas
lcd.setCursor(9, 0);
lcd.print(rtc.now().minute()); // Imprime o Minuto
lcd.setCursor(11, 0);
lcd.print(":"); // Imprime o texto entre aspas
lcd.setCursor(12, 0);
lcd.print(rtc.now().second()); // Imprime o Segundo
lcd.setCursor(0, 1); // Posiciona o cursor na segunda linha
lcd.print("Data: "); // Imprime o texto entre aspas
lcd.print(rtc.now().day()); // Imprime o Dia
lcd.setCursor(8, 1);
lcd.print("/"); // Imprime o texto entre aspas
lcd.print(rtc.now().month()); // Imprime o Mês
lcd.setCursor(11, 1);
lcd.print("/"); // Imprime o texto entre aspas
lcd.print(rtc.now().year()); // Imprime o Ano
int H = rtc.now().hour();
int M = rtc.now().minute();
int S = rtc.now().second();
int DAY = rtc.now().day();
int MONTH = rtc.now().month();
int Y = rtc.now().year();
while(menu == 1){
time++;
if(time > 50){
lcd.setCursor(6, 0);
lcd.print(H);
lcd.setCursor(9, 0);
lcd.print(M);
lcd.setCursor(12, 0);
lcd.print(S);
lcd.setCursor(6, 1);
lcd.print(DAY);
lcd.setCursor(9, 1);
lcd.print(MONTH);
lcd.setCursor(12, 1);
lcd.print(Y);
time = 0;
}
// tela ----------------------------------------------------------
if(time == 0 && select == 0){
lcd.setCursor(6, 0);
lcd.print(H);
if(H < 10)lcd.print(" ");
}
if(time == 25 && select == 0){
lcd.setCursor(6, 0);
lcd.print(" ");
}
if(time == 0 && select == 1){
lcd.setCursor(9, 0);
lcd.print(M);
if(M < 10)lcd.print(" ");
}
if(time == 25 && select == 1){
lcd.setCursor(9, 0);
lcd.print(" ");
}
if(time == 0 && select == 2){
lcd.setCursor(12, 0);
lcd.print(S);
if(S < 10)lcd.print(" ");
}
if(time == 25 && select == 2){
lcd.setCursor(12, 0);
lcd.print(" ");
}
if(time == 0 && select == 3){
lcd.setCursor(6, 1);
lcd.print(DAY);
if(DAY < 10)lcd.print(" ");
}
if(time == 25 && select == 3){
lcd.setCursor(6, 1);
lcd.print(" ");
}
if(time == 0 && select == 4){
lcd.setCursor(9, 1);
lcd.print(MONTH);
if(MONTH < 10)lcd.print(" ");
}
if(time == 25 && select == 4){
lcd.setCursor(9, 1);
lcd.print(" ");
}
if(time == 0 && select == 5){
lcd.setCursor(12, 1);
lcd.print(Y);
}
if(time == 25 && select == 5){
lcd.setCursor(12, 1);
lcd.print(" ");
}
// botoes -------------------------------------------------------------
if (digitalRead(BT_A) == HIGH && bt_s1 == 0) {
bt_s1 = 1;
time = -1;
if(select == 0){
H++;
if(H > 23)H=0;
}
if(select == 1){
M++;
if(M > 59)M=0;
}
if(select == 2){
S++;
if(S > 59)S=0;
}
if(select == 3){
DAY++;
if(DAY > 31 && (MONTH == 1 || MONTH == 3 || MONTH == 5 || MONTH == 7 || MONTH == 8 || MONTH == 10 || MONTH == 12))DAY=1;
if(DAY > 30 && (MONTH == 4 || MONTH == 6 || MONTH == 9 || MONTH == 11 ))DAY=1;
if(DAY > 28 && (MONTH == 2))DAY=1;
}
if(select == 4){
MONTH++;
if(MONTH > 12)MONTH=1;
}
if(select == 5){
Y++;
if(Y > 2100)Y=2020;
}
}
if (digitalRead(BT_A) == LOW && bt_s1 == 1) {
bt_s1 = 0;
}
if (digitalRead(BT_B) == HIGH && bt_s2 == 0) {
time = -1;
if(select == 0){
H--;
if(H < 0)H=23;
}
if(select == 1){
M--;
if(M < 0)M=59;
}
if(select == 2){
S--;
if(S < 0)S=59;
}
if(select == 3){
DAY--;
if(DAY < 1)DAY=31;
}
if(select == 4){
MONTH--;
if(MONTH < 1)MONTH=12;
}
if(select == 6){
Y--;
if(Y < 2020)Y=2100;
}
bt_s2 = 1;
}
if (digitalRead(BT_B) == LOW && bt_s2 == 1) {
bt_s2 = 0;
}
if (digitalRead(BT_C) == HIGH && bt_s3 == 0) {
bt_s3 = 1;
select++;
if(select > 5)select=0;
}
if (digitalRead(BT_C) == LOW && bt_s3 == 1) {
bt_s3 = 0;
}
if (digitalRead(BT_D) == HIGH && bt_s4 == 0) {
bt_s4 = 1;
menu = 0;
}
if (digitalRead(BT_D) == LOW && bt_s4 == 1) {
bt_s4 = 0;
}
delay(10);
}
lcd.clear();
m_s = 4;
rtc.adjust(DateTime(Y, MONTH, DAY, H, M, S)); // Ajuste Manual (Ano, Mês, Dia, Hora, Min, Seg)
bt_s1 = 1;
}