// Inclusão da biblioteca do módulo teclado
#include <Keypad.h>
#include <Wire.h> // requried to run I2C SH1106
#include <Adafruit_GFX.h>
#include "SPI.h"
#include <Adafruit_ILI9341.h>
//#include "dragon.h"
#define DRAGON_WIDTH 110
#define DRAGON_HEIGHT 83
// Feather 32u4 or M0 with TFT FeatherWing:
#define TFT_DC 10
#define TFT_CS 12
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//USADO para controlar o tempo e contagem
unsigned long tempoAnterior = 0;
const long intervalo = 1000; //Intervalor para contagem do conometro (1 segundo)
int alertaBuzzer = 0;
int tempoSemUso = false;
/************************ DEFINIÇÃO Do ARREY para armazenar TEMPO ******************************* */
char digitado [4] = {0,0,0,0};
char digitadoBiz [4];
int x = 0;
char segundos [2] = {0,0};
char minutos [2] = {0,0};
int ms;
int ss;
int conometro = 0;
int pausa = 0;
int tocar = 0;
int inverter = 0;
int valorFixo = 0;
int hopen = 1;
int hclose = 0;
int fimTempo = 0;
bool estadoInicial = 0;
/************************ CONFIGURAÇÕES TECLADO ******************************* */
const byte LINHAS = 4; // quantidade de linhas do teclado
const byte COLUNAS = 4; // quantidade de colunas do teclado
char digitos[LINHAS][COLUNAS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}}; // todos os caracteres do teclado
byte pinosLinha[LINHAS] = { 10, 9, 8, 7 }; // pinos de conexão das linhas no arduino
byte pinosColuna[COLUNAS] = { 6, 5, 4, 3 }; // pinos de conexão das colunas no arduino
Keypad keypad = Keypad( makeKeymap(digitos), pinosLinha, pinosColuna, LINHAS, COLUNAS ); // objeto de leitura das teclas com os parâmetros lidos
/************************ VARIÁVEIS AUXILIARES ******************************* */
//USADO para controlar o tempo e contagem
char digito;
bool botaoPorta;
int portaFechada = 0;
const int pinMagnetron = A0; //AQUECIMENTO
const int pinMotor = A1; // Rele do Motod do Prato
const int pinLuz = A2; //Luz da Porta
const int buzzer = A3; // Som das teclas e do alarme
const int pinBotao = A4;
const int pinBrilho = A5;
int estadoLuz = LOW;
int estadoMotor = LOW;
int estadoMagnetron = LOW;
int autoReset = 0;
int alertaPausa = 0;
int umaVez = 0;
int brilhoTime = 0;
int estadoBrilho = HIGH;
void setup() {
tft.begin();
tft.fillScreen(ILI9341_BLACK);
//INPUT_PULLUP
//pinMode(ledVermelho,OUTPUT);
pinMode(pinLuz,OUTPUT);
pinMode(pinMotor,OUTPUT);
pinMode(pinMagnetron,OUTPUT);
pinMode(buzzer,OUTPUT); // define os pinos de saída do arduino
pinMode(pinBotao, INPUT_PULLUP);
digitalWrite(pinBrilho, HIGH);
//digitalWrite(ledVermelho, HIGH);
digitalWrite(pinMotor, LOW);
digitalWrite(pinLuz, LOW);
digitalWrite(pinMagnetron, LOW);
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
delay(50);
digitalWrite(buzzer, HIGH);
delay(50);
digitalWrite(buzzer, LOW);
}
void loop()
{
tft.setRotation(1);
botaoPorta = digitalRead(pinBotao);
/*if(botaoPorta == hclose){ //Se botão da Porta esta Fechado?
portaFechada = hclose; //portaFechada = a Porta Fechada!
}else{ //Caso Contrario
portaFechada = hopen; //portaFechada = a Porta Aberta!
}
*/
if(botaoPorta == hopen){ // (0)Aberta / (1)Fechada
umaVez = 2;
while(botaoPorta == hopen){ //Enquanto porta esta Aberta
botaoPorta = digitalRead(pinBotao);
if(umaVez == 2){ // EXECUTA UMA VEZ SÓ
digitalWrite(pinLuz, HIGH);
digitalWrite(pinBrilho, HIGH);
estadoBrilho = HIGH;
brilhoTime = 0;
estadoInicial = 1;
umaVez = 0;
//--------------------------------
conometroOled();
//---------------------------------
}
delay(100);
}
}
if(botaoPorta == hclose) { //porta Aberta (0) / Fechada (1)
if(umaVez == 0){ // EXECUTA UMA VEZ SÓ
digitalWrite(pinLuz, LOW);
umaVez = 2;
//--------------------------------
conometroOled();
//---------------------------------
}
}
//---- FAZ A LEITURA DO TECLADO
digito = keypad.getKey();
if (digito != 0){
tft.fillScreen(ILI9341_BLACK);
portaFechada = 0;
umaVez = 0;
digitalWrite(pinBrilho, HIGH);
estadoBrilho = HIGH;
digitalWrite(buzzer, HIGH);// acionamento do buzzer ao apertar qualquer tecla
delay(30); //Pausa Buzzer
digitalWrite(buzzer, LOW);
tft.setTextSize(3);
tft.setCursor(95,180); //Coluna, Linha
//-------- ARMAZENA OS DIGITOS PRESIONADO PELO TECLADO NO ARREY
if(digito != '*' && digito != '#' && digito != 'A' && digito != 'B' && digito != 'C' && digito != 'D' && digito != '?'){
digitado[x] = digito;
x++;
estadoInicial = 1;
}
if (x == 4){ //RETORNA AO INICIO DO ARREY CASO SEJA DIGITADO MAIS DE 4 DIGITOS
x = 0;
}
//------ Caso seja digitado * Limpa o arrey "digitado"
if((digito == '*') && (digitado[0] != 0)){
for (int i=0; i<4; i++) {
digitado[i] = 0;
x = 0; //RETORNA AO INICIO DO ARREY "digitado" (usado pela função pra armazena os digitos do teclado)
estadoInicial = 0;
}
valorFixo = 0;
}
//------ SE FOI DIGITADO ALGUM TEMPO, INICIA O ESTADO DE LIGAÇAO DO FORNO E COMEÇA A CONTAGEM
if((digito == '#')&&(digitado[0] != 0)){
digitadoBiz[0] = digitado[0];
digitadoBiz[1] = digitado[1];
digitadoBiz[2] = digitado[2];
digitadoBiz[3] = digitado[3];
autoReset = 0;
brilhoTime = 0;
contador();
contagemRegreciva();
}
//*
if((digito == 'D')&&(digitadoBiz[0] != 0)){
digitado[0] = digitadoBiz[0];
digitado[1] = digitadoBiz[1];
digitado[2] = digitadoBiz[2];
digitado[3] = digitadoBiz[3];
estadoInicial = 1;
}
if(digito == 'B'){
valorFixo = valorFixo + 15;
itoa(valorFixo, digitado, 10); //(Valor INT, Varialvel CHAR, Casa Decimal)
estadoInicial = 1;
}
if(digito == 'C'){
valorFixo = valorFixo + 30;
itoa(valorFixo, digitado, 10); //(Valor INT, Varialvel CHAR, Casa Decimal)
estadoInicial = 1;
}
//------ SE FOI DIGITADO Pipoca, Entra o tempo programado pra Pipoca
if(digito == 'A'){
digitado[0] = '3';
digitado[1] = '0';
digitado[2] = '0';
estadoInicial = 1;
}
// =================================
conometroOled ();
// =================================
}
} // FIM DO LOOP
// Organiza os dados digitados na ordem correta pra a conometragem do tempo
// e converte os valores dos caracteres do arrey para um valor inteiro nas variaveis "ms" e "ss"
// de forma que possamos usar o valor em uma contagem regreciva...
void contador(){
if(digitado[2] == 0){
segundos[0]= digitado[0];
segundos[1] = digitado[1];
ss = atoi(segundos);
conometro = ss;
}
if((digitado[3] == 0) && (digitado[2] != 0)){
minutos[0] = digitado[0];
ms = atoi(minutos);
segundos[0]= digitado[1];
segundos[1]= digitado[2];
ss = atoi(segundos);
conometro = (ms*60) + ss;
}
if(digitado[3] != 0){
minutos[0] = digitado[0];
minutos[1] = digitado[1];
ms = atoi(minutos);
segundos[0]= digitado[2];
segundos[1]= digitado[3];
ss = atoi(segundos);
conometro = (ms*60) + ss;
}
}
void contagemRegreciva(){
//***** INICIA O LIGAMENTO DO FORNO MICROONDAS
fimTempo = 0;
estadoLuz = HIGH;
estadoMotor = HIGH;
estadoMagnetron = HIGH;
digitalWrite(pinMotor, estadoMotor);
digitalWrite(pinLuz, estadoLuz);
digitalWrite(pinMagnetron, estadoMagnetron);
//*** ORGANIZA A POSICAO DOS VALORES MINUTOS E SEGUNDOS DE FORMA CORRETA NO OLED
while(conometro > -1){
unsigned long tempoAtual=millis();
if (tempoAtual-tempoAnterior>=intervalo){ //Não foi usado o playStart.repeat pois não fez a contagem com perfeição (gera atrazos de 2-seg por cada 1-min)
tempoAnterior=tempoAtual;
autoReset++;
alertaPausa = !alertaPausa;
//tft.setFont(tft_font_fub30_tf);
tft.setCursor(95,180); //Coluna, Linha (NUMEROS) 15,48
if(pausa == 0){
alertaPausa = 0;
}
//****** MONITORA A ABERTURA DA PORTA E DURANTE O PRECESSO DE AQUECIMENTO ******
botaoPorta = digitalRead(pinBotao);
if (botaoPorta == 0){
digitalWrite(pinMotor, LOW);
digitalWrite(pinLuz, HIGH);
digitalWrite(pinMagnetron, LOW);
pausa = 1;
inverter = 1;
digitalWrite(pinLuz, LOW);
//tft.setFont(tft_font_ncenB10_tr);
//tft.drawStr(10, 15, "Porta ABERTA!"); // escrever algo na memória interna
tft.setTextSize(3);
tft.setCursor(30, 40);
tft.fillScreen(ILI9341_BLACK);
tft.print("Porta ABERTA!");
//tft.setFont(tft_font_fub30_tf);
//tft.setCursor(15,52); //Coluna, Linha (NUMEROS)
}
if((pausa == 1) && (botaoPorta == 1)){
//tft.setFont(tft_font_ncenB10_tr);
// tft.drawStr(27, 15, "...PAUSA..."); // escrever algo na memória interna
//tft.setFont(tft_font_fub30_tf);
//tft.setCursor(15,52); //Coluna, Linha (NUMEROS)
tft.setTextSize(3);
tft.setCursor(30, 40);
tft.fillScreen(ILI9341_BLACK);
tft.print("...PAUSA...");
}
if(pausa == 0){
if (botaoPorta == 1){
//tft.setFont(tft_font_ncenB10_tr);
//tft.drawStr(35, 15, "START!"); // escrever algo na memória interna
//tft.setFont(tft_font_fub30_tf);
//tft.setCursor(15,52); //Coluna, Linha (NUMEROS)
tft.setTextSize(3);
tft.setCursor(30, 40);
tft.fillScreen(ILI9341_BLACK);
tft.print("...START!...");
}
}
//Exibição na tela em 4 Digitos (20:23)
if(ms > 9){ // de 10 pra cima
tft.fillScreen(ILI9341_BLACK);
tft.print(ms);
tft.print(":");
if(ss > 9){ // Segundos Acima de 10
tft.print(ss);
}
if((ss < 10) && (ss >= 0)){ // Segundos 0 a 9
tft.fillScreen(ILI9341_BLACK);
tft.print("0");
tft.print(ss);
}
}
//Exibição na tela em 3 Digitos (02:23)
if((ms >= 0) && (ms < 10)){ // Minutos 0 ate 9
tft.fillScreen(ILI9341_BLACK);
tft.print("0");
tft.print(ms);
tft.print(":");
if(ss > 9){ // Segundos Acima de 10
tft.print(ss);
}
if((ss < 10) && (ss >= 0)){ // Segundos 0 a 9
tft.fillScreen(ILI9341_BLACK);
tft.print("0");
tft.print(ss);
}
}
//tft.sendBuffer();
//tft.clearBuffer();
tft.fillScreen(ILI9341_BLACK);
// -- CONTROLA A CONTAGEM REGRECIVA do TIMER
if(pausa == 0){
conometro--;
if(ss == 0){
ms--;
if(conometro > 60){
ss = 60;
}
}
if((ms == 0) && (conometro >= 59) && (ss < 61)){
ss = 60;
}
ss--;
}
}//**** Fim da contagem com Millis responsavel pelo tempo do Conometro
digito = keypad.getKey();
if(digito != 0){
digitalWrite(buzzer, HIGH);
delay(30); //tempoBuzz
digitalWrite(buzzer, LOW);
if(digito == '#'){ // AVALIA O ESTADO START OU PAUSA
inverter = !inverter; // Verificar se a contagem esta em pausa ou start e inverte a opção
if(inverter == 1){
pausa = 1;
digitalWrite(pinMotor, LOW);
digitalWrite(pinLuz, LOW);
digitalWrite(pinMagnetron, LOW);
}
if(inverter == 0){
pausa = 0;
digitalWrite(pinMotor, HIGH);
digitalWrite(pinLuz, HIGH);
digitalWrite(pinMagnetron, HIGH);
}
}
if(digito == '*'){ // Reseta o Forno pra estado inicial encerando o aquecimento
pausa = 0;
fimTempo = 1;
estadoInicial = 0;
break;
}
}
//-- Se ficar por um longo tempo em pausa Zera a programação e volta ao estado inicial
if(pausa == 1){
if(autoReset == 90){
pausa = 0;
fimTempo = 1;
estadoInicial = 0;
break;
}
}else{autoReset = 0;}
} // ******* FIM do while "conometro > -1"
// ------ ZERA A CONTAGEM dos ARREYS DESLIGA O RELE E LIMPA O LCD
for (int i=0; i<4; i++) {
digitado[i] = 0;
segundos[i] = 0;
minutos[i] = 0;
inverter = 0;
ss = 0;
ms = 0;
x = 0;
tocar = 1;
}
digitalWrite(pinMagnetron, LOW);
digitalWrite(pinLuz, LOW);
digitalWrite(pinMotor, LOW);
// ******** Mensagem de Aquecimento Concluido + Bips de Alertas de fim de tempo
while (fimTempo == 0){
//tft.setDrawColor(1);
//tft.setFont(tft_font_ncenB10_tr); // escolher uma fonte adequada
//tft.drawStr(40, 25, "TEMPO"); // escrever algo na memória interna
//tft.drawStr(17, 45, "CONCLUIDO!"); // escrever algo na memória interna
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3);
tft.setCursor(30, 40);
tft.print("CONCLUIDO");
unsigned long tempoAtual=millis();
if (tempoAtual-tempoAnterior>=intervalo){
tempoAnterior=tempoAtual;
alertaBuzzer++;
}
if(alertaBuzzer == 60){
tocar = 1;
alertaBuzzer = 0;
}
if(tocar > 0){
digitalWrite(buzzer, HIGH);
digitalWrite(pinBrilho, HIGH);
digito = keypad.getKey();
delay(70);
digitalWrite(buzzer, LOW);
digitalWrite(pinBrilho, LOW);
digito = keypad.getKey();
delay(50);
digitalWrite(buzzer, HIGH);
digitalWrite(pinBrilho, HIGH);
digito = keypad.getKey();
delay(70);
digitalWrite(buzzer, LOW);
digitalWrite(pinBrilho, LOW);
digito = keypad.getKey();
delay(50);
digitalWrite(pinBrilho, HIGH);
tocar++;
}
if(tocar == 4){
tocar = 0;
}
//tft.sendBuffer();
//tft.clearBuffer();
tft.fillScreen(ILI9341_BLACK);
//MONITORA A ABERTURA DA PORTA E EXECUTA UMA AÇÃO CASO SEJA ABERTA
botaoPorta = digitalRead(pinBotao);
if(botaoPorta == 0){ // ENCERRA O BUZZER E VOLTA AO ESTADO INICIAL caso a porta seja aberta
estadoInicial = 0;
fimTempo = 1;
}
digito = keypad.getKey();
if(digito != 0){
digitalWrite(buzzer, HIGH);
delay(30); //tempoBuzz
digitalWrite(buzzer, LOW);
if(digito == '*'){ // ENCERRA o BUZZER E VOLTA AO ESTADO INICIAL
estadoInicial = 0;
fimTempo = 1;
break;
}
}
} // ******** FINAL do "WHILE" Mensagem de Aquecimento Concluido + Bips de Alertas de fim de tempo
}
void conometroOled (){
if(botaoPorta == hopen){
tft.fillScreen(ILI9341_RED);
tft.fillRoundRect(100, 80, DRAGON_WIDTH, DRAGON_HEIGHT, 10, ILI9341_BLUE); //X-Coluna, Y-Linha, XW-Largura, YH-Altura, Valor-Borda, COR
tft.setTextColor(ILI9341_YELLOW);
tft.setTextSize(3);
tft.setCursor(30, 40);
tft.println(" PORTA ABERTA");
}else{
tft.fillScreen(ILI9341_BLACK);
tft.fillRoundRect(100, 80, DRAGON_WIDTH, DRAGON_HEIGHT, 10, ILI9341_BLUE); //X-Coluna, Y-Linha, XW-Largura, YH-Altura, Valor-Borda, COR
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.setCursor(30, 40);
tft.println("DIGITE O TEMPO");
}
tft.setTextSize(5);
tft.setCursor(85,180); //15,48
if((digitado[3] == 0) && (digitado[2] == 0) && (digitado[1] == 0) && (digitado[0] == 0)){
tft.print("00:00");
}
if((digitado[3] == 0) && (digitado[2] == 0) && (digitado[1] == 0) && (digitado[0] != 0)){
tft.print("00:0");
tft.print(digitado[0]);
}
if((digitado[3] == 0) && (digitado[2] == 0) && (digitado[1] != 0)){
tft.print("00:");
tft.print(digitado[0]);
tft.print(digitado[1]);
}
if((digitado[3] == 0) && (digitado[2] != 0)){
tft.print("0");
tft.print(digitado[0]);
tft.print(":");
tft.print(digitado[1]);
tft.print(digitado[2]);
}
if((digitado[3] != 0)){
tft.print(digitado[0]);
tft.print(digitado[1]);
tft.print(":");
tft.print(digitado[2]);
tft.print(digitado[3]);
}
}