#include <Servo.h>
#include <Arduino_FreeRTOS.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(6);
DallasTemperature sensor(&oneWire); // Informa as referencias da biblioteca dallas temperature para biblioteca onewire
Servo servo1; //criando objeto da classe Servo
float celsius = 0; //variavel apra receber temperatura em graus celsius
//variaveis de tempos para o millis
unsigned long previousTime1 = 0;
unsigned long previousTime2 = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
sensor.begin(); // inicia ao sensor de temperatura
pinMode(A0, INPUT);
pinMode(2, INPUT); //pinando botão
pinMode(7, OUTPUT); //pino Buzzer
pinMode(8, OUTPUT); //pino LED VERDE
pinMode(9, OUTPUT); // PINO LED AMARELO
pinMode(10, OUTPUT);// PINO LED RED
pinMode(11, OUTPUT); //PINO LED BRANCO
pinMode(12, OUTPUT);
servo1.attach(3); //pino 3 ligado ao servo
servo1.write(0); //definido angulo 0
//inicia enviando comandos
sensor.requestTemperatures();
// iniciando a temperatura em um valor diferente de zero para não exibir a mensagem "aquecedor ligado"
celsius = sensor.getTempCByIndex(0) + 1;
xTaskCreate(GetTemperatura, "getTemperatura", 128, NULL, 5, NULL);
xTaskCreate(MainTask, "mainTask", 128, NULL, 10, NULL);
}
void GetTemperatura(void *pvParameters) { // task para obter e atribuir a temperatura do sensor
while (1) {
sensor.requestTemperatures(); // Envia comandos para realizar uma conversao de temperatura
celsius = sensor.getTempCByIndex(0); //pegando a temperatura do sensor e atribuindo
tarefaLedAmarelo();
}
}
void MainTask(void *pvParameters) { //task principal
while (1) {
int i = 0;
if (celsius >= 18 && celsius <= 28) { //acender led verde
acendeLedVerde();
apagaLedVermelho(); //apaga os leds amarelos e vermelhos
apagaLedBranco();
abrirPorta();
} else if (celsius > 28) { //acender led branco
acendeLedBranco();
acendeLedVermelho();
apagaLedVerde(); //apaga os leds verde e amarelo
Serial.println("Ventilador ligado.");
} else if (celsius < 18) { //ligar o aquecedor
acendeLedVermelho();
apagaLedVerde();
apagaLedBranco();
digitalWrite(12, HIGH);
Serial.println("Aquecedor ligado.");
}
}
}
void loop() {
// put your main code here, to run repeatedly:
}
//********************FUNÇÔES*************************
void tarefaLedAmarelo() { //função para piscar o led amarelo a cada 1 segundo
unsigned long current = millis() - previousTime1;
if ((millis() - previousTime1) < 1000) {
acendeLedAmarelo(); // acende o led amarelo a cada leitura
} else {
apagaLedAmarelo(); //apaga o led amarelo após 1s
}
if ((millis() - previousTime1) > 2000) {
previousTime1 = millis();
}
}
void abrirPorta() { //função para abrir a porta e permanecer aberta por 5 segundos
unsigned long current2 = millis();
if (digitalRead(2) == HIGH) {
servo1.write(90); // Gira o servo para 90 graus
tone(7, 200); // Ativa um tom no pino 7 (se necessário)
Serial.println("Porta aberta.");
// Define o tempo para retornar à posição inicial
previousTime2 = current2 + 5000; // Adiciona 5 segundos ao tempo atual
}
// Verifica se passaram os 5 segundos e retorna o servo para 0 graus
if (current2 >= previousTime2) {
servo1.write(0); // Retorna o servo para 0 graus
noTone(7); // Desativa o tom no pino 7 (se necessário)
}
}
//acender leds
void acendeLedVerde() {
digitalWrite(8, HIGH);
}
void acendeLedAmarelo() {
digitalWrite(9, HIGH);
}
void acendeLedVermelho() {
digitalWrite(10, HIGH);
}
void acendeLedBranco() {
digitalWrite(11, HIGH);
}
//apagar leds
void apagaLedVerde() {
digitalWrite(8, LOW);
}
void apagaLedAmarelo() {
digitalWrite(9, LOW);
}
void apagaLedVermelho() {
digitalWrite(10, LOW);
}
void apagaLedBranco() {
digitalWrite(11, LOW);
}