#include <Arduino.h>
#include <SimpleRotary.h>
#include <TM1637Display.h>
SimpleRotary rotary(3, 4, 5);
#define CLKD 6 //--> Mudar pinos
#define DIO 7 //--> Mudar pinos
#define CLKE 3
#define DT 4
#define SW 5
#define PIR 8
#define MQ 9
int minu = 00, secu = 05;
unsigned long tmp_ant, tmp_atual;
unsigned long lastBTClick = 0;
unsigned long temp_ant_blink;
int lastpos;
int readCLKE;
int numTimes;
int count = 00;
//Inicializa o display
TM1637Display display(CLKD, DIO);
void setup() {
Serial.begin(9600);
pinMode(CLKE,INPUT);
pinMode(DT,INPUT);
pinMode(PIR,INPUT);
pinMode(SW, INPUT_PULLUP);
pinMode(MQ, INPUT);
lastpos = digitalRead(CLKE);
display.setBrightness(0x0f);
tmp_ant = millis();
temp_ant_blink = millis();
}
void loop() {
while(digitalRead(MQ) == LOW){
if (digitalRead(PIR) == LOW){
Serial.print("Não detectou presença");
Serial.print("Modo de contagem");
countdown(minu,secu);
Serial.print("Contagem finalizada");
Serial.print("-------------------");
Serial.print("Entrando em modo blink");
}
else if (digitalRead(PIR) == HIGH){
Serial.println("Detectou presença");
int8_t press = rotary.pushType(2000);
if(press == 2){
minu = 0;
secu = 0;
confige();
Serial.println("Aperte para começar a nova contagem");
}
else{
showvalues(minu,secu);
}
}
}
//TRAVA
//BLINKRESET
//RESET
}
void confige(){
Serial.print("Modo de configuração");
numTimes = 0;
int8_t r, p;
while (numTimes<2){
r = rotary.rotate();
p = rotary.push();
while (( (r == 1) || (r == 2) )){
if ((r == 1 ) && (count < 59)){
count++;
}
if ((r ==2) && (count > 0)){
count--;
}
if (numTimes == 0){
Serial.println(count);
showvalues(count,secu);
}
else{
Serial.println(count);
showvalues(minu,count);
}
r = rotary.rotate();
}
if (p == 1){
numTimes++;
if (numTimes == 1){
minu = count;
Serial.println("Minuto setado");
Serial.println(minu);
showvalues(minu,secu);
blinkset();
count = 0;
}
else if (numTimes == 2){
secu = count;
Serial.println("Segundo setado");
Serial.println(secu);
showvalues(minu,secu);
blinkset();
count = 0;
}
}
}
}
void blinkset(){
//Quando a contagem acabar, essa função será chamada
//Código no site https://www.electricalelibrary.com/2022/06/16/display-de-4-digitos-tm1637-no-arduino/
uint8_t OFF[] = { 0, 0, 0, 0 };
if(millis() - temp_ant_blink >= 1500){
temp_ant_blink = millis();
delay(250);
display.setSegments(OFF);
delay(250);
showvalues(minu,secu);
}
}
void blinkreset(){
minu = 0;
secu = 0;
uint8_t OFF[] = { 0, 0, 0, 0 };
while(true){
delay(250);
display.setSegments(OFF);
delay(250);
showvalues(minu,secu);
}
}
void countdown(int minu,int secu){
while(secu != 00 || minu != 00){
if(millis() - tmp_ant >= 1000){
tmp_ant = millis();
secu -= 1;
if(secu < 0){
secu = 59;
minu -= 1;
}
if(minu<0){
secu = 0;
minu = 0;
}
showvalues(minu, secu);
Serial.print(minu);
Serial.print(" : ");
Serial.println(secu);
}
}
}
void showvalues(int minu, int secu){
display.showNumberDecEx(secu, 0, true, 2, 2);
display.showNumberDecEx(minu, 0b01000000, true, 2, 0);
delay(10);
}