// Definir os pinos
const int botaoPin1 = 25; // Pino conectado ao botão de incremento (B1)
const int botaoPin2 = 26; // Pino conectado ao botão de decremento (B2)
const int botaoPin3 = 27; // Pino conectado ao botão de seleção (B3)
const int ledPinR = 19; // Pino conectado ao LED vermelho
const int ledPinG = 18; // Pino conectado ao LED verde
const int ledPinB = 5; // Pino conectado ao LED azul
// Pinos para o controle do motor de passo
const int dirPin = 16; // Pino de direção do motor (DIR)
const int stepPin = 17; // Pino de passo do motor (STEP)
// Definir o número de passos por volta do motor de passo (assumindo 200 passos por volta)
const int passosPorVolta = 200;
// Definir a posição atual do motor (inicialmente na posição 0)
int posicaoAtual = 0;
// Definir a posição desejada
int posicaoDesejada = 0;
// Definir a quantidade de passos para 33% de uma volta (aproximadamente 67 passos)
const int passosPorTercoVolta = (passosPorVolta * 33) / 100;
// Definir a tolerância para a proximidade da posição (em passos)
const int tolerancia = 10; // Exemplo de 10 passos de tolerância
void setup() {
// Inicializa os pinos dos botões como entrada com pull-down
pinMode(botaoPin1, INPUT_PULLDOWN);
pinMode(botaoPin2, INPUT_PULLDOWN);
pinMode(botaoPin3, INPUT_PULLDOWN);
// Inicializa os pinos dos LEDs como saída
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
// Inicializa os pinos do motor de passo
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
// Inicializa a comunicação serial para depuração
Serial.begin(115200);
}
void loop() {
// Lê o estado dos botões
int estadoBotao1 = digitalRead(botaoPin1);
int estadoBotao2 = digitalRead(botaoPin2);
int estadoBotao3 = digitalRead(botaoPin3);
// Depuração: imprime o estado dos botões no monitor serial
Serial.print("Botao 1: ");
Serial.print(estadoBotao1);
Serial.print(" | Botao 2: ");
Serial.print(estadoBotao2);
Serial.print(" | Botao 3: ");
Serial.println(estadoBotao3);
// Incrementar a posição se o botão B1 for pressionado
if (estadoBotao1 == HIGH) {
posicaoDesejada++; // Incrementa a posição desejada
moverMotor(1); // Move o motor para a nova posição
delay(200); // Aguarda um pouco para evitar múltiplos incrementos
}
// Decrementar a posição se o botão B2 for pressionado
if (estadoBotao2 == HIGH) {
posicaoDesejada--; // Decrementa a posição desejada
moverMotor(-1); // Move o motor para a nova posição
delay(200); // Aguarda um pouco para evitar múltiplos decrementos
}
// Selecionar e verificar a posição se o botão B3 for pressionado
if (estadoBotao3 == HIGH) {
verificarPosicao(); // Verifica se a posição desejada foi alcançada
delay(500); // Aguarda para evitar múltiplos acionamentos
}
// Atualiza a cor do LED conforme a proximidade da posição desejada
atualizarLED();
}
// Função para mover o motor para a posição desejada
void moverMotor(int direcao) {
// Define a direção do motor
if (direcao > 0) {
digitalWrite(dirPin, HIGH); // Direção para incrementar
} else {
digitalWrite(dirPin, LOW); // Direção para decrementar
}
// Gira o motor 1 passo por vez até a posição desejada
for (int i = 0; i < abs(direcao); i++) {
digitalWrite(stepPin, HIGH); // Envia um pulso de passo
delayMicroseconds(1000); // Aguarda um pouco antes de enviar o próximo pulso
digitalWrite(stepPin, LOW); // Desliga o pulso
delayMicroseconds(1000); // Aguarda antes de enviar o próximo pulso
}
// Atualiza a posição atual do motor
posicaoAtual = posicaoDesejada;
}
// Função para verificar se a posição foi alcançada
void verificarPosicao() {
if (abs(posicaoAtual - posicaoDesejada) <= tolerancia) {
Serial.println("Posição alcançada com sucesso!");
} else {
Serial.println("Posição não alcançada!");
}
}
// Função para atualizar a cor do LED conforme a proximidade da posição
void atualizarLED() {
if (abs(posicaoAtual - posicaoDesejada) == 0) {
// Se a posição foi alcançada, LED verde
digitalWrite(ledPinR, LOW);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinB, LOW);
} else if (abs(posicaoAtual - posicaoDesejada) <= tolerancia) {
// Se a posição está próxima, LED amarelo
digitalWrite(ledPinR, HIGH);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinB, LOW);
} else {
// Se a posição está longe, LED vermelho
digitalWrite(ledPinR, HIGH);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinB, LOW);
}
}