#include <Servo.h>
#define PINO_SENSOR A0
#define PINO_SERVO 9
#define LED_BAIXO 2
#define LED_MEDIO 3
#define LED_ALTO 4
Servo servoMotor;
// Faixa dinâmica de temperatura
float tempMin = 9999;
float tempMax = -9999;
void setup() {
Serial.begin(9600);
servoMotor.attach(PINO_SERVO);
pinMode(LED_BAIXO, OUTPUT);
pinMode(LED_MEDIO, OUTPUT);
pinMode(LED_ALTO, OUTPUT);
}
void loop() {
int leitura = analogRead(PINO_SENSOR);
float tensao = leitura * (5.0 / 1023.0);
float temperatura = (tensao - 0.5) * 100.0; // TMP36
// Atualização dinâmica da faixa
if (temperatura < tempMin) tempMin = temperatura;
if (temperatura > tempMax) tempMax = temperatura;
float faixa = tempMax - tempMin;
if (faixa == 0) faixa = 1;
// Mapeamento da temperatura para o ângulo do servo
int angulo = mapFloat(temperatura, tempMin, tempMax, 0, 180);
angulo = constrain(angulo, 0, 180);
servoMotor.write(angulo);
// Indicadores visuais por faixa
digitalWrite(LED_BAIXO, LOW);
digitalWrite(LED_MEDIO, LOW);
digitalWrite(LED_ALTO, LOW);
if (angulo < 60) {
digitalWrite(LED_BAIXO, HIGH);
} else if (angulo < 120) {
digitalWrite(LED_MEDIO, HIGH);
} else {
digitalWrite(LED_ALTO, HIGH);
}
Serial.print("Temperatura simulada: ");
Serial.print(temperatura);
Serial.print(" °C | Ângulo do servo: ");
Serial.println(angulo);
delay(500);
}
// Função auxiliar de mapeamento para float
int mapFloat(float x, float in_min, float in_max, float out_min, float out_max) {
return (int)((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min);
}