#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
#include <Servo.h>
#include <semphr.h>
// Definições de Pinos
const int ldrPin = A1; // Pino para o sensor LDR
const int sensorPin = A0; // Pino para o sensor de temperatura
const int servoPin = 11; // Pino para o servo motor
Servo myServo; // Cria um objeto servo
SemaphoreHandle_t xSerialSemaphore;
float temp_C ; // Variable for storing the temperature
float temp_f ;
int revised_output;
float ldrVal;
const float GAMMA = 0.7;
const float RL10 = 50;
double Thermistor ( int RawADC )
{
double Temp ;
Temp = log (10240000 / RawADC - 10000);
Temp = 1 / ( 0.001129148 + ( 0.000234125 * Temp ) + ( 0.0000000876741 * Temp * Temp * Temp ) ) ;
Temp = Temp - 273.15 ; // This will Convert Kelvin to Celcius
return Temp ;
}
// Função para ler e converter a temperatura
float readTemperature() {
int sensorValue = analogRead(sensorPin);
revised_output= map (sensorValue, 0, 1023, 1023, 0 ) ;
temp_C = Thermistor( revised_output ) ;
return temp_C;
}
int resistorValue = 10000; // Valor do resistor em série com o LDR (10kΩ, por exemplo)
float readLux() {
ldrVal = analogRead(ldrPin); // Read the analog value of the LDR
float voltage = ldrVal / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return lux;
}
void TaskServoControl(void *pvParameters) {
myServo.attach(servoPin);
while (1) {
float temperature = readTemperature();
if (xSemaphoreTake(xSerialSemaphore, (TickType_t)10) == pdTRUE) {
Serial.print("Temp: "); Serial.println(temperature);
xSemaphoreGive(xSerialSemaphore);
}
myServo.write(temperature < 25.0 ? 0 : 180);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void TaskLdrRead(void *pvParameters) {
pinMode(ldrPin, INPUT);
while (1) {
float ldrValue = readLux();
if (xSemaphoreTake(xSerialSemaphore, (TickType_t)10) == pdTRUE) {
Serial.print("Luz: "); Serial.println(ldrValue);
xSemaphoreGive(xSerialSemaphore);
}
// Cálculo complexo para simular tarefa demorada
for (volatile long i = 0; i < 1000000; i++) { /* Nada aqui */ }
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void setup() {
Serial.begin(115200);
while (!Serial) { ; }
xSerialSemaphore = xSemaphoreCreateMutex();
xTaskCreate(TaskServoControl, "ServoControl", 128, NULL, 1, NULL);
xTaskCreate(TaskLdrRead, "LdrRead", 128, NULL, 1, NULL);
}
void loop() {
// Nada aqui, as tarefas são gerenciadas pelo FreeRTOS
}