#include <Servo.h>
const int LED_VERMELHO = 12;
const int LED_VERDE = 13;
// --- MOTOR DE PASSO (A4988) ---
const int BOTAO_LIGA = 2;
const int BOTAO_DESLIGA = 3;
const int DIR_PIN = 4;
const int STEP_PIN = 5;
const int ENABLE_PIN = 6;
bool motorLigado = false;
// --- SERVOS E SENSORES ---
const int PIR1 = 9; // Sensor de movimento 1
const int PIR2 = 10; // Sensor de movimento 2
const int SERVO1_PIN = 7;
const int SERVO2_PIN = 8;
Servo servo1;
Servo servo2;
// --- CONTROLE DE MOVIMENTO DOS SERVOS ---
bool servo1Ativo = false;
bool servo2Ativo = false;
unsigned long tempoServo1 = 0;
unsigned long tempoServo2 = 0;
const unsigned long tempoMovimento = 2000; // tempo que o servo fica a 90° (2s)
void setup() {
// --- MOTOR DE PASSO ---
pinMode(BOTAO_LIGA, INPUT_PULLUP);
pinMode(BOTAO_DESLIGA, INPUT_PULLUP);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, HIGH); // começa desligado
digitalWrite(DIR_PIN, HIGH); // sentido horário
// --- SERVOS ---
servo1.attach(SERVO1_PIN);
servo2.attach(SERVO2_PIN);
servo1.write(0);
servo2.write(0);
// --- SENSORES PIR ---
pinMode(PIR1, INPUT);
pinMode(PIR2, INPUT);
pinMode(LED_VERMELHO, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
digitalWrite(LED_VERMELHO, LOW);
digitalWrite(LED_VERDE, HIGH);
Serial.begin(9600);
}
void loop() {
// --- BOTÕES DO MOTOR ---
bool ligaPressionado = (digitalRead(BOTAO_LIGA) == LOW);
bool desligaPressionado = (digitalRead(BOTAO_DESLIGA) == LOW);
if (ligaPressionado) {
digitalWrite(LED_VERMELHO, HIGH);
digitalWrite(LED_VERDE, LOW);
motorLigado = true;
delay(500);
}
if (desligaPressionado) {
digitalWrite(LED_VERMELHO, LOW);
digitalWrite(LED_VERDE, HIGH);
motorLigado = false;
delay(500);
}
// --- MOTOR DE PASSO ---
if (motorLigado) {
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(800);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(800);
} else {
digitalWrite(ENABLE_PIN, HIGH);
}
// --- SENSORES PIR ---
if (digitalRead(PIR1) == HIGH && !servo1Ativo) {
servo1.write(90);
servo1Ativo = true;
tempoServo1 = millis();
}
if (digitalRead(PIR2) == HIGH && !servo2Ativo) {
servo2.write(90);
servo2Ativo = true;
tempoServo2 = millis();
}
// --- RETORNO DOS SERVOS APÓS O TEMPO ---
if (servo1Ativo && millis() - tempoServo1 >= tempoMovimento) {
servo1.write(0);
servo1Ativo = false;
}
if (servo2Ativo && millis() - tempoServo2 >= tempoMovimento) {
servo2.write(0);
servo2Ativo = false;
}
}