#include <AccelStepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definições dos pinos
#define DIR_PIN 2 // Pino de direção do motor de passo
#define STEP_PIN 4 // Pino de passo do motor de passo
#define EN_PIN 5 // Pino ENABLE do motor de passo
#define RED_PIN 14 // Pino do LED vermelho
#define GREEN_PIN 12 // Pino do LED verde
#define BLUE_PIN 13 // Pino do LED azul
#define POT_PIN 34 // Pino do potenciômetro (opcional para controle de velocidade)
// Inicializando o motor de passo
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// Inicializando o display LCD (endereço 0x27, 20 colunas, 4 linhas)
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(115200); // Inicia a comunicação serial
// Verificar se o monitor serial está funcionando
Serial.println("Iniciando o setup...");
// Definir pinos como saída
pinMode(EN_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
// Inicializar o LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Ativar o driver de motor de passo
digitalWrite(EN_PIN, LOW); // Habilitar o driver (LOW = habilitado)
// Configurar o motor de passo
stepper.setMaxSpeed(1000); // Velocidade máxima (passos por segundo)
stepper.setAcceleration(500); // Aceleração (passos por segundo ao quadrado)
// Verificar se o setup foi concluído
Serial.println("Setup completo!");
}
void loop() {
// Leitura do valor do potenciômetro (opcional, para controle de velocidade)
int potValue = analogRead(POT_PIN);
long speed = map(potValue, 0, 4095, 0, 1000); // Mapeia a leitura do potenciômetro para velocidade
// Debug: Mostrar o valor do potenciômetro e a velocidade no Serial Monitor
Serial.print("Potenciômetro: ");
Serial.print(potValue);
Serial.print(" Velocidade mapeada: ");
Serial.println(speed);
// Controlar a velocidade do motor com base no potenciômetro
stepper.setSpeed(speed);
stepper.runSpeed(); // Executar o movimento
// Atualizar o LCD com a posição do motor
lcd.setCursor(0, 0);
lcd.print("Posicao: ");
lcd.print(stepper.currentPosition());
// Verificar o status do motor e mudar a cor do LED RGB
if (stepper.distanceToGo() == 0) {
// Se o motor atingiu a posição desejada (ou se não houver movimento programado)
setLEDColor(0, 255, 0); // Verde (normal)
lcd.setCursor(0, 1);
lcd.print("Status: Posiçao atingida");
} else {
// Se o motor ainda está em movimento
setLEDColor(0, 0, 255); // Azul (em movimento)
lcd.setCursor(0, 1);
lcd.print("Status: Em movimento");
}
delay(100); // Delay para estabilidade
}
// Função para controlar a cor do LED RGB
void setLEDColor(int red, int green, int blue) {
analogWrite(RED_PIN, red); // Controla a intensidade do LED vermelho
analogWrite(GREEN_PIN, green); // Controla a intensidade do LED verde
analogWrite(BLUE_PIN, blue); // Controla a intensidade do LED azul
}