// 5 button LCD and Stepper
// https://wokwi.com/projects/399421219902241793
//
// modified from https://wokwi.com/projects/396715020656032769
#include <LiquidCrystal.h>
#include <AccelStepper.h>
#include <TimerOne.h>
// Defina os pinos para o LCD e Laser Sensor (Wilson)
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7, backlightPin = 10, botaolaserPin = 2, LedLaser = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Defina o pino para a entrada analógica
const int buttonPin = A0;
// Defina os pinos para o driver do motor de passo
const int stepPin = 11;
const int dirPin = 12;
// Crie uma nova instância da classe AccelStepper
AccelStepper stepper(1, stepPin, dirPin);
long currentValue = 0; // Armazena o valor atual inserido pelo usuário
int currentDirection = 1; // Armazena a direção atual do motor de passo (1: forward, -1: backward)
int defaultSpeed = 1000; // Velocidade padrão do motor de passo
unsigned long lastActivityTime = 0; // Armazena o tempo da última atividade no menu secreto
const unsigned long timeoutDuration = 10000; // Duração do tempo limite (em milissegundos) para o menu secreto
//Variavel do sensor laser (Wilson)
int laserPinBotaoState = 0; //inicializa Pulldown
void setup() {
// Set up the LCD
lcd.begin(16, 2);
//Configurar o pino do sensor laser para Pullup
// --------------------------------------------------------------------
pinMode( botaolaserPin, INPUT); //inicializa com pullup
pinMode( LedLaser, OUTPUT); //inicializa com puldown
pinMode(3, OUTPUT); // Configura o pino 3 como saída para o LED 7
Timer1.initialize(1000); // Configura o temporizador para 1 segundo (1000 milissegundos)
Timer1.attachInterrupt(callback); // Associa a função "callback" ao temporizador
//------------------------------------------------------------------
// Configurar o pino de luz de fundo para PWM
pinMode(backlightPin, OUTPUT);
analogWrite(backlightPin, 128); // Defina a intensidade da luz de fundo para 50%
// Set up the stepper motor
stepper.setMaxSpeed(defaultSpeed); // Defina a velocidade máxima do motor de passo
stepper.setAcceleration(200);
// Imprima o valor inicial, a direção e a velocidade padrão no LCD
printValueAndDirection();
// Inicializar comunicação serial
Serial.begin(115200);
}
void callback() {
static unsigned long previousMillis3 = 0;
unsigned long currentMillis = millis();
// Pisca o LED 3 a cada 1 segundo
if (currentMillis - previousMillis3 >= 2000) {
digitalWrite(3, !digitalRead(3)); // Inverte o estado do LED 3 (liga/desliga)
previousMillis3 = currentMillis; // Atualizar o tempo anterior --> LED 9
}
}
void loop() {
// ---------------------------------------------
laserPinBotaoState = digitalRead(botaolaserPin); //Lê o estado da entrada D2 e salva na variavel (regra)
if(laserPinBotaoState == 1){
stepper.moveTo(300);
digitalWrite(LedLaser, LOW);
delay(10);
}
else{
digitalWrite(LedLaser, HIGH);
stepper.setCurrentPosition(0);
}
// --------------------------
// Leia a entrada analógica para determinar o estado do botão
static int last = -1;
int buttonState = analogRead(buttonPin);
if (buttonState != last) {
last = buttonState;
// Imprima a leitura bruta do ADC no console serial
Serial.println(buttonState);
switch (buttonState) {
case 0 ... 49: // Right button
handleRightButton();
break;
case 300 ... 400: // Up button
handleUpButton();
break;
case 100 ... 150: // Down button
handleDownButton();
break;
case 500 ... 620: // Left button
handleLeftButton();
break;
case 720 ... 830: // Select button
handleSelectButton();
break;
default: // No button press
break;
}
}
// Execute o motor de passo
stepper.run();
}
// Função para manipular o pressionamento do botão direito
void handleRightButton() {
// Manuseie o botão direito pressionado
currentDirection = 1;
printValueAndDirection();
}
// Função para manipular o pressionamento do botão para cima
void handleUpButton() {
// Manuseie o botão para cima
incrementCurrentValue();
}
// Função para manipular o pressionamento do botão para baixo
void handleDownButton() {
// Handle the down button press
decrementCurrentValue();
}
// Função para manipular o pressionamento do botão esquerdo
void handleLeftButton() {
// Manuseie o botão esquerdo pressionado
currentDirection = -1;
printValueAndDirection();
}
// Função para manipular o pressionamento do botão de seleção
void handleSelectButton() {
lcd.setCursor(13, 0);
lcd.print("RUN");
moveStepper(currentValue * currentDirection); // Mova o motor de passo Wilson
lcd.setCursor(13, 0);
lcd.print(" ");
}
// Função para incrementar o valor
void incrementCurrentValue() {
currentValue++;
if (currentValue > 9999) {
currentValue = 0; // Substitua se o valor exceder 9999
}
printValueAndDirection();
}
// Função para decrementar o valor
void decrementCurrentValue() {
currentValue--;
if (currentValue < 0) {
currentValue = 9999; // Substitua se o valor exceder 9999
}
printValueAndDirection();
}
// Função para imprimir o valor e a direção no LCD
void printValueAndDirection() {
lcd.clear();
// lcd.setCursor(0, 0);
lcd.print("Contagem Passos/steps");
lcd.setCursor(0, 1);
if (currentDirection == 1) {
lcd.print(" ");
lcd.print(currentValue);
lcd.print(" >>");
} else {
lcd.print("<< ");
lcd.print(currentValue);
lcd.print(" ");
}
}
// Função para movimentar o motor de passo
void moveStepper(long steps) {
// Defina a direção com base no sinal dos passos
if (steps >= 0) {
stepper.setSpeed(defaultSpeed); // Defina a velocidade do motor de passo
stepper.move(steps); // Mova o motor para frente em passos de 'passos'
} else {
stepper.setSpeed(-defaultSpeed); // Defina a velocidade do motor de passo (negativo para direção reversa)
stepper.move(steps); // Mova o motor para trás em passos de 'passos'
}
}
+
-
CW>>>
<<<CCW
Enter