Início›Projetos›Painel de Controlo
⬤ Projeto Integrado · LCD + Motor DC

🎮 Painel de Controlo de Motor

⏱️ 45–55 min🧩 LCD 20×4 · Motor DC · Potenciómetro · 2× Botão · Chars custom

Nesta página

🎯 Objetivo

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.

Painel Motor PR.FT9→ Dir: FWD Vel: 200/255 PWM:78Estado: OK t:142s

🔌 Ligações

ComponentePino ArduinoNota
LCD 20×4 (I2C)A4 (SDA) / A5 (SCL)Endereço 0x27
Motor DC (M1)Terminais M1+/M1−Canal 1 da placa
PotenciómetroA0Controlo de velocidade 0–255
Botão DIR (inverter)D5 (INPUT_PULLUP)Alterna FWD/BWD
Botão STOPD6 (INPUT_PULLUP)Toggle parado/a correr

🔨 Fases de Montagem

Fase 1 — LCD + potenciómetro

Inicializa LCD, lê A0, exibe o valor e o mapeamento 0–255. Confirma sem flickering. Regista os chars ↑↓ (slots 0 e 1).

Fase 2 — Motor com velocidade

Adiciona AF_DCMotor motor(1). Usa setSpeed(map(A0,0,1023,0,255)). Confirma resposta ao potenciómetro.

Fase 3 — Botões de direção e stop

Adiciona lógica de botões com debounce por millis(). Exibe seta de direção com char custom.

Fase 4 — Dashboard completo

Integra uptime, PWM%, estado e seta animada nas 4 linhas. Testa todos os cenários.

💻 Código Completo

proj_painel_controlo.ino
#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);
}

🏆 Para ir mais longe

PR.FT9_5 · LCD 20×4 · L293D Motor Driver · Arduino UNO Rev3 · Início · led.dge.medu.pt