#include <I2C_RTC.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <SD.h>
#include <SPI.h>
//ESPERA DO USUÁRIO
#define tempodeespera 10000
#define pinup 3
#define pindown 2
#define pinback 5
#define pinselect 6
#define Qtd_menu 7
#define Qtd_submenu 3
#define dly 1000
const int chipSelect = 10;
File Archive;
//Dando nome ao RTC
static PCF8563 RTC;
//Dando nome ao lcd
LiquidCrystal_I2C lcd_1(0x27, 16, 2);
// Variáveis temporais
unsigned long aperto, tempo, capturado;
//Variaveis DATALOGGER
int temp_amost=5, ent_ut=1;
// Variáveis de movimentos
bool ok = false, on = false, confirma= false, gravando, select;
int ano, mes, dia, hora, minuto, segundo;
// Variáveis localizadoras
int y = 1, y1 = 0;
String printer;
String menu[] = {"AJUSTE RELOGIO", "DATA LOGGER", "COMUNIC RF", "CONT PULSOS", "PWM MONOFASICO", "PWM TRIFASICO", "DATA E HORA"};
String submenu[] = {"TEMPO DE AMOSTRAGEM", "ENTRADA UTILIZADA", "INICIAR REGISTRO"};
char dia_semana [7][12]={"Domingo", "Segunda", "Terca", "Quarta","Quinta","Sexta","Sabado"};
//array que grava dados do menu de edição de datas
int data[6];
void setup() {
Serial.begin(9600);
//ORDEM DO RTC (Ano, mês, Dia, Hora, Minutos, Segundos)
//Inicia o RTC
Serial.println(">BEM VINDO!<");
RTC.begin();
data[0] = RTC.getYear();
data[1] = RTC.getMonth();
data[2] = RTC.getDay();
data[3] = RTC.getHours();
data[4] = RTC.getMinutes();
// Inicializa o LCD
lcd_1.init();
lcd_1.backlight();
//LOCALIDADES DAS ENTRADAS
pinMode(pinup, INPUT);
pinMode(pindown, INPUT);
pinMode(pinselect, INPUT);
pinMode(pinback, INPUT);
lcd_1.begin(16, 2);
lcd_1.setCursor(2, 0);
//TELA DE INICIO
lcd_1.print(">BEM VINDO!<");
delay(2000);
lcd_1.clear();
}
void loop() {
if(!select){
on=true;
lcd_1.setCursor(0,0);
lcd_1.print("->"+ menu[y - 1]);
Serial.print(y);
Serial.print(" - ");
Serial.println(menu[y - 1]);
lcd_1.setCursor(0, 1);
lcd_1.print(menu[y]);
}else{
aperto=millis();
ok = true;
lcd_1.clear();
lcd_1.clear();
select = HIGH;
on = false;
}
while (on) {
if (millis() - aperto > dly) {
if (digitalRead(pinup)) {
lcd_1.clear();
if (y != Qtd_menu+1) y++;
if (y == Qtd_menu+1) y = 1;
lcd_1.print("->" + menu[y - 1]);
if (y < Qtd_menu) {
lcd_1.setCursor(0, 1);
lcd_1.print(menu[y]);
}
aperto = millis();
Serial.print(y);
Serial.print(" - ");
Serial.println(menu[y - 1]);
}
if (digitalRead(pindown)) {
lcd_1.clear();
if (y != 0) y--;
if (y == 0) y = Qtd_menu;
if (y == 1) {
lcd_1.print("->" + menu[0]);
lcd_1.setCursor(0, 1);
lcd_1.print(menu[1]);
} else {
lcd_1.setCursor(0, 1);
lcd_1.print("->"+ menu[y - 1]);
lcd_1.setCursor(0, 0);
lcd_1.print(menu[y - 2]);
}
aperto = millis();
Serial.print(y);
Serial.print(" - ");
Serial.println(menu[y - 1]);
}
if (digitalRead(pinselect)) {
aperto=millis();
ok = true;
lcd_1.clear();
lcd_1.clear();
select = HIGH;
on = false;
}
if (digitalRead(pinback)) {
aperto=millis();
y = 1;
lcd_1.clear();
break;
}
if(aperto+tempodeespera<millis()){
aperto=millis();
on=false;
lcd_1.clear();
y=1;
}
}
tempo = millis();
}
if (ok) {
switch (y) {
case 1:
int j;
j=0;
// AJUSTE REDUZIDO COM ARRAY
while (j < 6) {
lcd_1.clear();
lcd_1.setCursor(0, 0);
if(j == 0)
lcd_1.print("Ano");
else if(j==1)
lcd_1.print("Mes");
else if(j==2)
lcd_1.print("Dia");
else if(j==3)
lcd_1.print("Hora");
else if(j==4)
lcd_1.print("Minuto");
else if(j==5){
lcd_1.print("Dia");
lcd_1.print(" ");
lcd_1.print("da");
lcd_1.print(" ");
lcd_1.print("semana");
}
lcd_1.setCursor(0, 1);
if(data[j]<10)
lcd_1.print("0");
lcd_1.print(data[j]);
confirma = false;
while (confirma == false && select) {
if (aperto + dly / 5 < tempo) {
if (digitalRead(pindown)) {
aperto = millis();
data[j]++;
switch (j) {
case 1:
if (data[j] == 13)
data[j] = 1;
break;
case 2:
if (data[j] == 32 && (data[j - 1] == 1 || data[j - 1] == 3 || data[j - 1] == 5 || data[j - 1] == 7 || data[j - 1] == 8 || data[j - 1] == 10 || data[j - 1] == 12)) {
data[j] = 1;
} else if (data[j] == 31 && (data[j - 1] == 2 || data[j - 1] == 4 || data[j - 1] == 6 || data[j - 1] == 9 || data[j - 1] == 11)) {
data[j] = 1;
}
break;
case 3:
if (data[j] == 24)
data[j] = 0;
break;
case 4:
if (data[j] == 60)
data[j] = 0;
break;
case 5:
if (data[j] == 8)
data[j] = 1;
break;
}
lcd_1.setCursor(0, 0);
lcd_1.print(dia_semana[j+7]);
lcd_1.setCursor(0, 1);
if(data[j]<10)
lcd_1.print("0");
lcd_1.print(data[j]);
}
if (digitalRead(pinup)) {
aperto = millis();
data[j]--;
switch (j) {
case 1:
if (data[j] == 0)
data[j] = 12;
break;
case 2:
if (data[j] == 0 && (data[j - 1] == 1 || data[j - 1] == 3 || data[j - 1] == 5 || data[j - 1] == 7 || data[j - 1] == 8 || data[j - 1] == 10 || data[j - 1] == 12)) {
data[j] = 31;
} else if (data[j] == 0 && (data[j - 1] == 2 || data[j - 1] == 4 || data[j - 1] == 6 || data[j - 1] == 9 || data[j - 1] == 11)) {
data[j] = 30;
}
break;
case 3:
if (data[j] == -1)
data[j] = 23;
break;
case 4:
if (data[j] == -1)
data[j] = 59;
break;
case 5:
if (data[j] == 0)
data[j] = 7;
break;
}
lcd_1.setCursor(0, 0);
lcd_1.print(dia_semana[j+7]);
lcd_1.setCursor(0, 1);
if(data[j]<10)
lcd_1.print("0");
}
lcd_1.print(data[j]);
if(j == 5 && data[j]<6){
lcd_1.print(data[j]);
lcd_1.print("-");
lcd_1.print("feira");
}else if( j == 5 && data[j] == 6){
lcd_1.print("-");
lcd_1.print("Sabado");
}else if(j == 5 && data[j] == 7){
lcd_1.print("-");
lcd_1.print("Domingo");
}
if (digitalRead(pinselect)) {
aperto = millis();
confirma = true;
if (j == 5)
select = false;
break;
}
if (digitalRead(pinback)) {
aperto = millis();
select = false;
}
}
tempo = millis();
}
if (!select) {
lcd_1.print("CANCELADO!");
break;
}
i++; // Incrementa i após cada iteração
}
Serial.println(data[0]);
Serial.println(data[1]);
Serial.println(data[2]);
Serial.println(data[3]);
Serial.println(data[4]);
RTC.setDate(data[2], data[1], data[0]);
RTC.setTime(data[3], data[4], 00);
RTC.setWeek(data[5]);
ok = false;
on = false;
lcd_1.clear();
break;
// DATA LOGGER
case 2:
lcd_1.clear();
lcd_1.setCursor(0,0);
lcd_1.print("->");
lcd_1.print(submenu[0]);
lcd_1.setCursor(0,1);
lcd_1.print(submenu[1]);
y1=1;
while (ok) {
if (millis() - aperto > dly) {
if (digitalRead(pinup)) {
aperto = millis();
lcd_1.clear();
if (y1 != Qtd_submenu + 1 ) y1++;
if (y1 == Qtd_submenu+1 ) y1 = 1;
lcd_1.print("->"+ submenu[y1 - 1]);
lcd_1.setCursor(0,1);
if(y1<Qtd_submenu)
lcd_1.print(submenu[y1]);
Serial.print(y1);
Serial.print(" - ");
Serial.println(submenu[y1 - 1]);
}
if (digitalRead(pindown)) {
aperto = millis();
lcd_1.clear();
if (y1 != 0) y1--;
if (y1 == 0) y1 = Qtd_submenu;
lcd_1.print("->"+ submenu[y1 - 1]);
lcd_1.setCursor(0,1);
if(y1<Qtd_submenu)
lcd_1.print(submenu[y1]);
Serial.print(y1);
Serial.print(" - ");
Serial.println(submenu[y1 - 1]);
}
if (digitalRead(pinselect)) {
select= true;
aperto=millis();
lcd_1.clear();
on = false;
break;
}
if (digitalRead(pinback)) {
select=false;
aperto=millis();
on = false;
ok = false;
}
}
}
//tempo de amostragem
if(y1==1 && select){
lcd_1.clear();
lcd_1.print("TEMPO DE AMOSTRA:");
lcd_1.setCursor(0,1);
lcd_1.print(temp_amost);
while(ok){
tempo=millis();
if(aperto+(dly/2)<tempo){
if(digitalRead(pindown)){
temp_amost++;
aperto=millis();
lcd_1.setCursor(0,1);
lcd_1.print(temp_amost);
}
if(digitalRead(pinup)){
if(temp_amost!=0)
temp_amost--;
aperto=millis();
lcd_1.setCursor(0,1);
lcd_1.print(" ");
lcd_1.setCursor(0,1);
lcd_1.print(temp_amost);
}
if(digitalRead(pinselect)){
ok=false;
aperto=millis();
}
}}
}
//ENTRADA UTILIZADA
if(y1==2 && select){
lcd_1.clear();
lcd_1.print("ENTRADA UTILIZADA:");
lcd_1.setCursor(0,1);
lcd_1.print(ent_ut);
while(ok){
tempo=millis();
if(aperto+(dly/2)<tempo){
if(digitalRead(pindown)){
if(ent_ut<3)
ent_ut++;
aperto=millis();
lcd_1.setCursor(0,1);
lcd_1.print(ent_ut);
}
if(digitalRead(pinup)){
if(ent_ut!=1)
ent_ut--;
aperto=millis();
lcd_1.setCursor(0,1);
lcd_1.print(ent_ut);
}
if(digitalRead(pinselect)){
aperto=millis();
ok=false;
}
}
}
}
// INICIAR REGISTRO
if (y1 == 3 && select) {
// USANDO O SERIAL PRINT :(
Serial.println("REGISTRANDO");
Serial.print(temp_amost);
Serial.println("\t");
Serial.print(ent_ut);
gravando = true;
int i = 0, printado;
while (gravando == true) {
// printando informações no lcd
if (printado + 400 < tempo) {
lcd_1.scrollDisplayLeft();
printado = millis();
lcd_1.setCursor(i + 1, 0);
lcd_1.print("REGISTRANDO!");
lcd_1.setCursor(0, 1);
lcd_1.print(" APERTE VOLTAR PARA FINALIZAR");
i++;
if (i == 16) {
lcd_1.clear();
i = 0;
}
}
if (capturado + (temp_amost * 1000) < millis()) {
minuto = RTC.getMinutes();
hora = RTC.getHours();
segundo = RTC.getSeconds();
capturado = millis();
Serial.print(capturado);
Serial.print("\t");
if (hora < 10)
Serial.print("0");
Serial.print(hora);
Serial.print(":");
if (minuto < 10)
Serial.print("0");
Serial.print(minuto);
Serial.print(":");
if (segundo < 10)
Serial.print("0");
Serial.println(segundo);
Archive.println(capturado + printer);
}
if (digitalRead(pinback)) {
gravando = false;
ok = false;
on = false;
lcd_1.clear();
lcd_1.print("GRAVACAO PARADA!");
delay(dly * 3);
}
tempo = millis();
}
}
lcd_1.clear();
break;
// DATA E HORA ATUAL- PRINTA EM TEMPO REAL A DATA E HORA DO ARDUINO (HORA SETADA AUTOMATICAMENTE OU MANUALMENTE PELO USUÁRIO)
case 7:
lcd_1.print(dia_semana[RTC.getWeek()]);
lcd_1.setCursor(3, 0);
lcd_1.print(" ");
if (RTC.getDay() < 10)
lcd_1.print("0");
lcd_1.print(RTC.getDay());
lcd_1.print("/");
if (RTC.getMonth() < 10)
lcd_1.print("0");
lcd_1.print(RTC.getMonth());
lcd_1.print("/");
lcd_1.print(RTC.getYear());
do {
lcd_1.setCursor(3, 1);
if (RTC.getHours() < 10)
lcd_1.print("0");
lcd_1.print(RTC.getHours());
lcd_1.print(":");
if (RTC.getMinutes() < 10)
lcd_1.print("0");
lcd_1.print(RTC.getMinutes());
lcd_1.print(":");
if (RTC.getSeconds() < 10)
lcd_1.print("0");
lcd_1.print(RTC.getSeconds());
ok = false;
on = false;
} while (!digitalRead(pinback));
aperto = millis();
select = false;
lcd_1.clear();
break;
default:
lcd_1.print("SELECIONADO:");
lcd_1.setCursor(0, 1);
lcd_1.print(menu[y - 1]);
do {
ok = false;
on = false;
} while (!digitalRead(pinback));
aperto = millis();
lcd_1.clear();
break;
}
tempo = millis();
}}