Painel de controlo completo: o potenciómetro define a velocidade (0–255), dois botões alternam a direção (FWD/BWD) e param de emergência. O LCD exibe velocidade, direção, duty cycle PWM, tempo de funcionamento e uma seta personalizada de direção com chars custom.
| Componente | Pino Arduino | Nota |
|---|---|---|
| LCD 20×4 (I2C) | A4 (SDA) / A5 (SCL) | Endereço 0x27 |
| Motor DC (M1) | Terminais M1+/M1− | Canal 1 da placa |
| Potenciómetro | A0 | Controlo de velocidade 0–255 |
| Botão DIR (inverter) | D5 (INPUT_PULLUP) | Alterna FWD/BWD |
| Botão STOP | D6 (INPUT_PULLUP) | Toggle parado/a correr |
Inicializa LCD, lê A0, exibe o valor e o mapeamento 0–255. Confirma sem flickering. Regista os chars ↑↓ (slots 0 e 1).
Adiciona AF_DCMotor motor(1). Usa setSpeed(map(A0,0,1023,0,255)). Confirma resposta ao potenciómetro.
Adiciona lógica de botões com debounce por millis(). Exibe seta de direção com char custom.
Integra uptime, PWM%, estado e seta animada nas 4 linhas. Testa todos os cenários.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AFMotor.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
AF_DCMotor motor(1);
#define POT A0
#define BTN_DIR 5
#define BTN_STOP 6
byte icF[8]={0b00100,0b00110,0b11111,0b11111,0b00110,0b00100,0b00000,0b00000}; // → FWD
byte icB[8]={0b00000,0b00100,0b01100,0b11111,0b11111,0b01100,0b00100,0b00000}; // ← BWD
bool forward = true, parado = false;
unsigned long tDir=0, tStop=0, tInicio=0;
void atualizarLCD(int vel) {
unsigned long seg=(millis()-tInicio)/1000;
lcd.setCursor(0,0); lcd.print("Painel Motor ");
lcd.setCursor(0,1); lcd.write(forward?0:1); lcd.print(" Dir:"); lcd.print(forward?"FWD ":"BWD ");
lcd.setCursor(0,2); lcd.print("Vel:");lcd.print(vel);lcd.print(" PWM:");lcd.print(vel*100/255);lcd.print("% ");
lcd.setCursor(0,3); lcd.print(parado?"PARADO t:":"A CORRER t:"); lcd.print(seg); lcd.print("s ");
}
void setup() {
lcd.init(); lcd.backlight();
lcd.createChar(0,icF); lcd.createChar(1,icB);
pinMode(BTN_DIR,INPUT_PULLUP); pinMode(BTN_STOP,INPUT_PULLUP);
motor.run(FORWARD);
tInicio = millis();
}
void loop() {
// Botão DIR — toggle com debounce
if(digitalRead(BTN_DIR)==LOW && millis()-tDir>250) {
forward=!forward; tDir=millis();
motor.run(forward?FORWARD:BACKWARD);
}
// Botão STOP — toggle
if(digitalRead(BTN_STOP)==LOW && millis()-tStop>250) {
parado=!parado; tStop=millis();
motor.run(parado?RELEASE:(forward?FORWARD:BACKWARD));
}
int vel = map(analogRead(POT), 0, 1023, 0, 255);
if(!parado) motor.setSpeed(vel);
atualizarLCD(vel);
delay(100);
}