#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DADOS 12
OneWire oneWire(DADOS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 16, 2);
volatile int seg = 0;
volatile int min = 0;
volatile int horas = 0;
int rele = 11;
float temperatura;
bool estado_atual_botao = false;
bool botao;
bool timer_enabled = false; // Indica se a contagem do tempo está habilitada
// Lógica da Tensão
const int numReadings = 100;
float totalA0 = 0;
// Lógica da Corrente
float corrente; // A variável que vai armazenar a corrente medida pelo sensor
const float sensibilidade = 0.066;
// Debounce dos Botões
const unsigned long debounceDelay = 50;
unsigned long lastDebounceTime[5] = {0, 0, 0, 0, 0}; // Para botões 2-6
//==============================================================================
void setup() {
lcd.init();
lcd.backlight();
lcd.print("IFSP/CAMPINAS");
lcd.setCursor(6, 1);
lcd.print("TEI");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("FONTE DE TENSAO");
lcd.setCursor(3, 1);
lcd.print("ELETROFORESE");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ");
Tensao();
Corrente();
lcd.setCursor(0, 1);
lcd.print(" ");
MostrarTempo();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(rele, OUTPUT);
Desacionador_V_I();
sensors.begin(); // Inicia a biblioteca do sensor de temperatura
Timer1.initialize(1000000); // Inicia o Timer1 com um período de 1 segundo (em microssegundos)
Timer1.attachInterrupt(Contador); // Configura a função para ser chamada a cada interrupção do Timer1
}
//==============================================================================
void loop() {
MostrarTempo();
Tensao();
Corrente();
Temperatura();
Botoes(); // Chama a função Botoes
}
//==============================================================================
void MostrarTempo() {
lcd.setCursor(0, 1);
lcd.print("Tempo: ");
if (horas < 10) lcd.print("0");
lcd.print(horas);
lcd.print(":");
if (min < 10) lcd.print("0");
lcd.print(min);
lcd.print(":");
if (seg < 10) lcd.print("0");
lcd.print(seg);
if (timer_enabled && horas == 0 && min == 0 && seg == 0) {
Desacionador_V_I();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("FIM DA 'CORRIDA'");
delay(1000);
lcd.clear();
}
}
//==============================================================================
void Contador() {
if (timer_enabled) {
seg--;
if (seg < 0) {
if (min > 0) {
seg = 59;
min--;
} else {
seg = 0; // Garante que seg não fique negativo
if (horas > 0) {
horas--;
min = 59;
seg = 59;
}
}
}
}
}
//==============================================================================
void Acionador_V_I() { // Aciona o relé
digitalWrite(rele, LOW);
}
//==============================================================================
void Desacionador_V_I() { // Desaciona o relé
digitalWrite(rele, HIGH);
}
//==============================================================================
void Tensao() {
float totalA0 = 0;
for (int i = 0; i < numReadings; i++) {
totalA0 += analogRead(A0);
}
float voltage = (totalA0 / numReadings) * (5.0 / 1023.0) * 21.81;
lcd.setCursor(0, 0);
lcd.print(voltage, 1);
lcd.setCursor(4, 0);
lcd.print("V");
}
//==============================================================================
void Corrente() {
corrente = calculaCorrente(filtroDaMedia()); // Calcula a corrente
lcd.setCursor(6, 0);
lcd.print(corrente, 2);
lcd.setCursor(10, 0); // Representação da corrente no display
lcd.print("A");
}
//==============================================================================
float calculaCorrente(int sinalSensor) {
return (float)(sinalSensor - 508) * (5.000) / (1023.000 * sensibilidade);
}
//==============================================================================
int filtroDaMedia() {
long somaDasCorrentes = 0;
for (int i = 0; i < 1000; i++) {
somaDasCorrentes += analogRead(A1);
}
return somaDasCorrentes / 1000;
}
//==============================================================================
void Temperatura() {
sensors.requestTemperatures(); // Envia o comando para leitura da temperatura
float temperatura = sensors.getTempCByIndex(0);
lcd.setCursor(12, 0);
lcd.print(temperatura, 0); // Representação da temperatura no display
lcd.write(0xDF);
lcd.print("C");
if (temperatura >= 35) {
// Abre o relé, pausa o tempo e apita um buzzer (necessário adicionar lógica para isso)
}
}
//==============================================================================
void Botoes() {
unsigned long currentTime = millis();
if (digitalRead(5) == LOW && (currentTime - lastDebounceTime[0]) > debounceDelay) {
botao4();
lastDebounceTime[0] = currentTime;
}
else if (digitalRead(4) == LOW && (currentTime - lastDebounceTime[1]) > debounceDelay) {
botao3();
lastDebounceTime[1] = currentTime;
}
else if (digitalRead(3) == LOW && (currentTime - lastDebounceTime[2]) > debounceDelay) {
botao2();
lastDebounceTime[2] = currentTime;
}
else if (digitalRead(2) == LOW && (currentTime - lastDebounceTime[3]) > debounceDelay) {
botao1();
lastDebounceTime[3] = currentTime;
}
}
//==============================================================================
void botao1() {
if (!timer_enabled) {
timer_enabled = true; // Inicia o temporizador
Acionador_V_I();
} else {
timer_enabled = false; // Pausa o temporizador
Desacionador_V_I();
}
delay(100); // Adicione um pequeno atraso para evitar múltiplos disparos
}
//==============================================================================
void botao2() { // UP - aumenta o tempo
lcd.setCursor(10, 1);
lcd.print(" "); // Apaga a linha
min += 10; // Incrementa os minutos em 10
if (min >= 60) { // Se os minutos ultrapassarem 59
horas += min / 60; // Adiciona as horas equivalentes aos minutos excedentes
min %= 60; // Mantém apenas os minutos restantes após a conversão para horas
}
if (min < 10) {
lcd.print("0"); // Adiciona zero à esquerda para formatar corretamente
}
lcd.print(min); // Exibe os minutos no LCD
delay(100);
}
//==============================================================================
void botao3() { // DOWN - diminui o tempo
lcd.setCursor(10, 1);
lcd.print(" "); // Apaga a linha
min -= 10; // Decrementa os minutos em 10
if (min < 0) { // Se os minutos forem negativos
horas--; // Reduz uma hora
min += 60; // Adiciona 60 minutos para garantir que min seja positivo
}
if (min < 10) {
lcd.print("0"); // Adiciona zero à esquerda para formatar corretamente
}
lcd.print(min); // Exibe os minutos no LCD
delay(100);
}
//==============================================================================
void botao4() {
// Para ou reinicia o temporizador
timer_enabled = false;
Desacionador_V_I();
min = 0; // Reinicia o tempo para o valor inicial
seg = 0;
horas = 0;
delay(100);
}