#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
// Configurações do Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// URL do servidor Django
const char* serverUrl = "https://luanteles.pythonanywhere.com/api/sensor-data/";
// Definições dos pinos
#define SERVO_HORIZONTAL_PIN 25
#define SERVO_VERTICAL_PIN 26
#define LDR_LEFT_PIN 34
#define LDR_RIGHT_PIN 35
#define LED_GREEN 16
#define LED_RED 17
#define LED_BLUE 4
#define BUTTON_SYSTEM_PIN 32
#define BUTTON_NIGHT_MODE_PIN 33
// Objeto para o MPU-6050
Adafruit_MPU6050 mpu;
// Variáveis de estado
bool isNightMode = false;
bool isError = false;
bool systemActive = true;
// Variáveis do PID
float kp = 0.5;
float ki = 0.1;
float kd = 0.05;
float previousError = 0.0;
float integral = 0.0;
// Função para movimentar o servo diretamente para o ângulo desejado
void moveServoDirect(int servoPin, int targetAngle) {
int pulseWidth = map(targetAngle, 0, 180, 600, 2400); // Ajuste calibrado
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(servoPin, LOW);
delay(10);
}
// Função para calcular o nível de iluminância (lux) diretamente do valor analógico
float calculateLux(int analogValue) {
return map(analogValue, 4095, 0, 0, 1000);
}
// Função para calibrar o servo
void calibrateServo(int servoPin) {
Serial.println("Iniciando calibração do servo...");
for (int pulseWidth = 500; pulseWidth <= 2500; pulseWidth += 100) {
Serial.print("Pulso: ");
Serial.println(pulseWidth);
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(servoPin, LOW);
delay(1000); // Aguarde para observar o movimento do servo
}
Serial.println("Calibração concluída. Ajuste os valores no código conforme necessário.");
}
void setup() {
Serial.begin(115200);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_BLUE, LOW);
pinMode(SERVO_HORIZONTAL_PIN, OUTPUT);
pinMode(SERVO_VERTICAL_PIN, OUTPUT);
pinMode(LDR_LEFT_PIN, INPUT);
pinMode(LDR_RIGHT_PIN, INPUT);
pinMode(BUTTON_SYSTEM_PIN, INPUT_PULLUP);
pinMode(BUTTON_NIGHT_MODE_PIN, INPUT_PULLUP);
if (!mpu.begin()) {
Serial.println("Falha ao inicializar o sensor MPU6050!");
digitalWrite(LED_RED, HIGH);
while (1);
}
Serial.println("Sensor MPU6050 inicializado com sucesso.");
WiFi.begin(ssid, password);
Serial.print("Conectando ao Wi-Fi...");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Conectado ao Wi-Fi!");
// Calibração dos servos
calibrateServo(SERVO_HORIZONTAL_PIN);
calibrateServo(SERVO_VERTICAL_PIN);
}
void loop() {
static bool previousSystemButtonState = HIGH;
bool currentSystemButtonState = digitalRead(BUTTON_SYSTEM_PIN);
if (previousSystemButtonState == HIGH && currentSystemButtonState == LOW) {
delay(50);
systemActive = !systemActive;
Serial.print("Sistema ");
Serial.println(systemActive ? "Ativado" : "Desativado");
if (!systemActive) {
moveServoDirect(SERVO_HORIZONTAL_PIN, 90);
moveServoDirect(SERVO_VERTICAL_PIN, 90);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
digitalWrite(LED_RED, LOW);
}
}
previousSystemButtonState = currentSystemButtonState;
if (!systemActive) {
delay(100);
return;
}
static bool previousNightButtonState = HIGH;
bool currentNightButtonState = digitalRead(BUTTON_NIGHT_MODE_PIN);
if (previousNightButtonState == HIGH && currentNightButtonState == LOW) {
delay(50);
isNightMode = !isNightMode;
Serial.print("Modo Noturno ");
Serial.println(isNightMode ? "Ativado" : "Desativado");
if (isNightMode) {
moveServoDirect(SERVO_HORIZONTAL_PIN, 90);
moveServoDirect(SERVO_VERTICAL_PIN, 90);
digitalWrite(LED_BLUE, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, LOW);
} else {
digitalWrite(LED_BLUE, LOW);
digitalWrite(LED_GREEN, HIGH);
}
}
previousNightButtonState = currentNightButtonState;
if (isNightMode) {
delay(100);
return;
}
int ldrLeftValue = analogRead(LDR_LEFT_PIN);
int ldrRightValue = analogRead(LDR_RIGHT_PIN);
float ldrLeftLux = calculateLux(ldrLeftValue);
float ldrRightLux = calculateLux(ldrRightValue);
if (ldrLeftLux >= 900 && ldrRightLux >= 900) {
Serial.println("Erro detectado: Luminosidade extrema nos dois sensores!");
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
isError = true;
delay(2000);
return;
}
if (isError) {
Serial.println("Saindo do estado de erro.");
isError = false;
integral = 0;
previousError = 0;
digitalWrite(LED_RED, LOW);
}
if (ldrLeftLux < 10 && ldrRightLux < 10) {
if (!isNightMode) {
Serial.println("Entrando no modo noturno automático.");
moveServoDirect(SERVO_HORIZONTAL_PIN, 90);
moveServoDirect(SERVO_VERTICAL_PIN, 90);
digitalWrite(LED_BLUE, HIGH);
digitalWrite(LED_GREEN, LOW);
isNightMode = true;
}
return;
}
if (isNightMode) {
Serial.println("Saindo do modo noturno automático.");
digitalWrite(LED_BLUE, LOW);
isNightMode = false;
}
digitalWrite(LED_GREEN, HIGH);
float error = ldrLeftLux - ldrRightLux;
integral += error;
float derivative = error - previousError;
previousError = error;
float pidOutput = (kp * error) + (ki * integral) + (kd * derivative);
int targetAngleHorizontal = constrain(90 + pidOutput, 0, 180);
moveServoDirect(SERVO_HORIZONTAL_PIN, targetAngleHorizontal);
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
int targetAngleVertical = map(a.acceleration.x, -9.8, 9.8, 0, 180);
targetAngleVertical = constrain(targetAngleVertical, 0, 180);
moveServoDirect(SERVO_VERTICAL_PIN, targetAngleVertical);
Serial.print("LDR Esquerdo (Lux): ");
Serial.print(ldrLeftLux);
Serial.print(" | LDR Direito (Lux): ");
Serial.print(ldrRightLux);
Serial.print(" | Ângulo Horizontal: ");
Serial.print(targetAngleHorizontal);
Serial.print(" | Ângulo Vertical: ");
Serial.println(targetAngleVertical);
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
String jsonData = "{";
jsonData += "\"ldr_left\": " + String(ldrLeftLux) + ",";
jsonData += "\"ldr_right\": " + String(ldrRightLux) + ",";
jsonData += "\"angle_horizontal\": " + String(targetAngleHorizontal) + ",";
jsonData += "\"angle_vertical\": " + String(targetAngleVertical);
jsonData += "}";
int httpResponseCode = http.POST(jsonData);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Resposta do servidor: " + response);
} else {
Serial.println("Erro ao enviar dados: " + String(httpResponseCode));
}
http.end();
} else {
Serial.println("Wi-Fi desconectado!");
}
delay(500);
}