/*Nome: Luiz Felipe Miranda
Projeto: Automação de Temperatura (OTIMIZADO)*/
//Temp acima de 40° é 350, esse é meu limite para ativar o alerta.
//Inicialmente é feita a exibição da temperatura em graus celius
//para gruas farenheit deve-se clicar no botão 1x
//para graus kelvin deve-se clicar 2x
//na terceira vez o ciclo reinicia e será mostrado em celsius.
//caso a temperatura passe de 40°C, 106°F ou 314°K o led vermelho irá acender
//e simultaneamente o som de alerta começará a tocar.
//caso contrario, o led verde permanecerá aceso.
//Recomendo abaixar o vollume para o teste, a frequência utilizada foi de 1kHz
#include <LiquidCrystal.h>
#define TRUE 1
#define FALSE 0
void configura(); //apenas pra facilitar a leitura, titulo da função configura.
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
int pino_NTC = (1 << A0);
int analogvalue = 0;
int Buzzer = 3; //(1 << PB3);
volatile int cont = 0;
volatile int Flag = 1; //flag inicia em 1 para que o código seja executado de primeira
volatile int tempoInicial = 0; //tempo inicial começa em 0 né
const float beta = 3950; //sla de que cu isso saiu
void setup() {
configura();
//não sei qual vou usar ent só deixei pronto aqui
EICRA = (EICRA | (1 << ISC01)) & ~(1 << ISC00);
EIMSK = EIMSK | (1 << INT0); //interrupção por flanco de descida
//ignoraaaaaaaaaaaa
/*EICRA |= (1 << ISC01) | (1 << ISC00);
EIMSK |= (1 << INT0); //configura interrupção por change
/*TCCR2A = _BV(WGM21) | _BV(COM2A0); // Modo CTC, Toggle OC2A (pino do Buzzer) on Compare Match
TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20); // Prescaler de 1024
OCR2A = 156; // Valor para gerar frequência de aproximadamente 1 kHz */
}
void loop() {
while(TRUE){
//Serial.print("TRUE"); //testei se a condição estava de pé... sim, está
analogvalue = analogRead(pino_NTC); // analogvalue recebe a leitura do pino NTC A0
if(analogvalue >= 350){ //condição pra alerta de temperatura elevada
PORTB = (PORTB & ~(1 << PB0)) | (1 << PB1); //acende led verde
} else{
PORTB = (PORTB & ~(1 << PB1)) | (1 << PB0); //acende led vermelho
tone(Buzzer,1000);
}
float kelvin = 1 / (log(1 / (1023.0 / analogvalue - 1.0)) / beta + 1.0 / 298.15);
float celsius = kelvin - 273.15;
float fahrenheit = celsius * 9 / 5 + 32; //apenas calculo das temperaturas, tudo certinho graças a Deus
while(Flag == 0 && (millis() - tempoInicial) <= 3000UL);//espera interrupção por contagem ou tempo = 3 segundos, NÃO TÁ FUNCIONANDOOOOO, depois dee 30segundos a condição nunca é verdadeira e então fica executando sem parar
Flag = 0; //Zera flag.
tempoInicial = millis(); //atualiza o valor pro próximo loop
//Serial.println(millis()); //teste por causa do erro após 30segundos
lcd.clear();
if(cont % 3 == 0){
Serial.print("A tempertatura em celsius é de: ");
Serial.println(celsius);
lcd.print("Temp (C): ");
lcd.print(celsius, 2);
}else{
if(cont % 3 == 1){
Serial.print("A temperatura em Fahrenheit é de: ");
Serial.println(fahrenheit);
lcd.print("Temp (F): ");
lcd.print(fahrenheit);
}else{
Serial.print("A temperatura em Kelvin é de: ");
Serial.println(kelvin);
lcd.print("Temp (K): ");
lcd.print(kelvin);
}
}
}
/* TESTE
Serial.print("A temperatura é: ");
Serial.println(analogvalue);
Serial.print("Em Celsius é de: ");
Serial.println(celsius);
Serial.print("Em Fahrenheit é de: ");
Serial.println(fahrenheit);
lcd.clear();
lcd.print("Temp (C): ");
lcd.print(celsius, 2);
//lcd.setCursor(0, 1);
lcd.print("Temp (F): ");
lcd.print(fahrenheit, 2);
*/
delay(3000);
}
void configura(){
Serial.begin(9600);
lcd.begin(16, 2);
DDRB |= (1 << DDB1) | (1 << DDB0);
DDRD &= ~(1 << DDD2);
PORTD |= (1 << PD2);
///////////////////////////////////////
/*
Acho que o wokwi não está completo para utilizar registradores do Timer1 ou Timer2
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10);
OCR1A = 15624; //(16e6) / (1024 * (15624 + 1)); // ~= 1 Hz
TIMSK1 |= (1 << OCIE1A); */
}
ISR(INT0_vect) {
cont++;
Flag = 1;
}
/*ISR(TIMER2_COMPA_vect) {
if(analogvalue > 350){
TCCR2A |= _BV(COM2A0);
}else{
TCCR2A &= ~_BV(COM2A0);
}
}*/
/*void setup(){
DDRB |= (1 << DDB1) | (1 << DDB0);
}
void loop() {
// Teste pra corrigir erro com led
PORTB = (PORTB & ~(1 << PB0)) | (1 << PB1);
delay(3000);
}*/