#include <Arduino.h>
#include <TM1637Display.h>
// Initialize the TM1637 display
#define CLK_PIN 13
#define DIO_PIN 12
TM1637Display display(CLK_PIN, DIO_PIN);
// Definição de pinos
const int ledPin = 4;
const int buzzerPin = 7;
const int buttonPin = 2;
// Const do sensor
const float BETA = 3950.;
// Variáveis para controle do estado
int ledState = LOW;
int counterValue = 0;
int buttonState = HIGH;
int lastButtonState = HIGH;
// unsigned long previousMillisLED = 0;
unsigned long previousMillisCounter = 0;
unsigned long previousMillisSensor = 0;
unsigned long previousMillisBuzzer = 0;
unsigned long previousMillisButton = 0;
// const long intervalLED = 200; // Intervalo do LED: 1 segundo
const long intervalCounter = 1000; // Intervalo do contador: 0.5 segundo
const long intervalSensor = 2000; // Intervalo da leitura do sensor: 2 segundos
const long intervalBuzzer = 3000;
const long intervalButton = 10;
void setup() {
display.setBrightness(7);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonInterrupt, FALLING);
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop() {
// Tarefa 1: Contador Crescente/Decrescente usando LCD ou display de 7 segmentos
counterTask();
// // Tarefa 2: Leitura de dados de sensor (simulado com potenciômetro)
sensorTask();
// Tarefa 3: Leitura de botão (botão)
buttonTask();
// Tarefa 4: Aviso sonoro (buzzer)
buzzerTask();
}
void ledTask() {
// unsigned long currentMillis = millis();
// // Serial.println(currentMillis);
// if (currentMillis - previousMillisLED >= intervalLED) {
// previousMillisLED = currentMillis;
// if (ledState == LOW) {
// ledState = HIGH;
// } else {
// ledState = LOW;
// }
// digitalWrite(ledPin, ledState);
// }
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
void counterTask() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillisCounter >= intervalCounter) {
previousMillisCounter = currentMillis;
updateCounter();
display.showNumberDec(counterValue);
}
}
void updateCounter() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
counterValue++;
} else {
counterValue--;
}
}
void sensorTask() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillisSensor >= intervalSensor) {
// Salva o último tempo que a leitura do sensor foi realizada
previousMillisSensor = currentMillis;
// Simulação de leitura de sensor (usando um valor aleatório)
int analogValue = analogRead(A0);
// int celsius = map(analogValue,953,115,-24,80);
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
Serial.println("Valor do Sensor: " + String(celsius));
}
}
void buttonTask() {
unsigned long currentMillis = millis();
// Serial.println(currentMillis);
if (currentMillis - previousMillisButton >= intervalButton) {
previousMillisButton = currentMillis;
// Leitura do estado do botão
buttonState = digitalRead(buttonPin);
// Verifica se houve uma mudança no estado do botão
if (buttonState != lastButtonState) {
// Se o botão foi pressionado, imprime no monitor serial
if (buttonState == LOW) {
Serial.println("Botão Pressionado!");
}
}
// Salva o último estado do botão
lastButtonState = buttonState;
}
}
void buzzerTask() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillisBuzzer >= intervalBuzzer) {
previousMillisBuzzer = currentMillis;
// Activate the buzzer
tone(buzzerPin, 261);
} else {
// Deactivate the buzzer
noTone(buzzerPin);
}
}
// Função de interrupção para o botão
void buttonInterrupt() {
// Adicione aqui as ações a serem realizadas quando o botão é pressionado
counterValue = 0;
ledTask();
}