#include <AccelStepper.h>
#include <ESP32Servo.h> 

// Definições do motor de passo
const int stepPin = 14;
const int dirPin = 12;
const int stepsPerRevolution = 200; 
const int ledPin = 2;

// Definições do servo motor
Servo servo; // Corrigido para usar Servo ao invés de ESP32Servo
const int servoPin = 18;

// Definições dos botões
const int metalButtonPin = 16;       // Botão que simula o sensor indutivo (metal)
const int objectButtonPin = 4;       // Botão que simula o sensor infravermelho (objeto presente)
const int nivelButtonPin = 0;        // Botão que simula o sensor infravermlho (nível)

// Definição do fim de curso
const int limitSwitchPin = 17;
bool isObjectPresent = false;
bool isMetal = false;

void setup() {
  // Inicialização da comunicação serial
  Serial.begin(115200);

  // Configuração dos pinos dos botões
  pinMode(metalButtonPin, INPUT_PULLUP);
  pinMode(objectButtonPin, INPUT_PULLUP);
  pinMode(nivelButtonPin, INPUT_PULLUP);

  // Configuração do pino do fim de curso
  pinMode(limitSwitchPin, INPUT_PULLUP);

  // Configuração dos pinos do driver do motor de passo
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(ledPin, OUTPUT);

  // Inicialização do servo motor
  servo.attach(servoPin, 500, 2400); // Attach the servo with a range of 500-2400 microseconds
}

void loop() {
  // Leitura dos botões
  isMetal = digitalRead(metalButtonPin) == LOW; // LOW significa que o botão foi pressionado
  isObjectPresent = digitalRead(objectButtonPin) == LOW; // LOW significa que o botão foi pressionado

  Serial.print("Metal: ");
  Serial.println(digitalRead(objectButtonPin));
  delay(10);
}

void teste(){
 // Verificação se ambos botões estão pressionados
  if (isMetal == 1) {
    // Gira o motor de passo 180 graus
    rotateStepper(stepsPerRevolution / 2, true); // Rotaciona no sentido horário

    // Gira o servo motor 180 graus
    servo.write(180);
    delay(1000);  // Aguarda 1 segundo para completar a rotação

    // Aguarda 30 segundos
    delay(30000);

    // Retorna o servo motor para 0 graus
    servo.write(0);
    delay(1000);  // Aguarda 1 segundo para completar a rotação

    // Retorna o motor de passo para a posição inicial
    while (digitalRead(limitSwitchPin) == HIGH) {
      rotateStepper(1, false);  // Rotaciona no sentido anti-horário até encontrar o fim de curso
    }
  }
  
  // Leitura do botão e controle do LED
  int stbutao = digitalRead(objectButtonPin);
  if (stbutao == LOW) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

  delay(100);  
}

void rotateStepper(int steps, bool clockwise) {
  digitalWrite(dirPin, clockwise ? HIGH : LOW);
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);  
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);  
  }
}
$abcdeabcde151015202530fghijfghij
A4988