#include <LiquidCrystal.h>
#include <Keypad.h>
// ==== LCD ====
LiquidCrystal lcd(0, 1, 3, 4, 5, 6); // RS=GP0, E=GP1, D4=GP3, D5=GP4, D6=GP5, D7=GP6
// ==== Teclado 4x4 ====
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {28, 27, 26, 22}; // GP28, GP27, GP26, GP22
byte colPins[COLS] = {21, 20, 19, 18}; // GP21, GP20, GP19, GP18
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// ==== Display 7 segmentos (cátodo común) ====
int segA = 2, segB = 7, segC = 12, segD = 9, segE = 11, segF = 8, segG = 10;
// Números del 0 al 9
byte numeros[10][7] = {
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,1,0,1,1} //9
};
void mostrarNumero(int num) {
digitalWrite(segA, numeros[num][0]);
digitalWrite(segB, numeros[num][1]);
digitalWrite(segC, numeros[num][2]);
digitalWrite(segD, numeros[num][3]);
digitalWrite(segE, numeros[num][4]);
digitalWrite(segF, numeros[num][5]);
digitalWrite(segG, numeros[num][6]);
}
// ==== Motor paso a paso con A4988 ====
#define EN 13
#define STEP 15
#define DIR 14
// ==== Switch tapa ====
#define SWITCH_PIN 17
void setup() {
lcd.begin(16, 2);
lcd.print("Lavadora Pico");
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(EN, OUTPUT);
pinMode(STEP, OUTPUT);
pinMode(DIR, OUTPUT);
digitalWrite(EN, LOW); // Habilitar A4988
pinMode(SWITCH_PIN, INPUT_PULLUP); // Switch tapa
}
void loop() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Seleccione ciclo:");
char key = keypad.waitForKey();
if (key >= '1' && key <= '4') {
lcd.clear();
lcd.print("Ciclo ");
lcd.print(key);
delay(1000);
if (digitalRead(SWITCH_PIN) == HIGH) {
lcd.clear();
lcd.print("Cerrar tapa!");
delay(2000);
return;
}
// Etapas del ciclo
llenarAgua();
lavar();
enjuagar();
centrifugar();
lcd.clear();
lcd.print("Ciclo terminado");
delay(3000);
}
}
void llenarAgua() {
lcd.clear();
lcd.print("Llenando agua...");
cuentaRegresiva(5);
}
void lavar() {
lcd.clear();
lcd.print("Lavando...");
girarMotor(200, 500); // pasos, microsegundos
cuentaRegresiva(5);
}
void enjuagar() {
lcd.clear();
lcd.print("Enjuagando...");
cuentaRegresiva(5);
}
void centrifugar() {
lcd.clear();
lcd.print("Centrifugando...");
girarMotor(800, 300);
cuentaRegresiva(5);
}
void cuentaRegresiva(int segundos) {
for (int i = segundos; i >= 0; i--) {
mostrarNumero(i);
delay(1000);
}
}
void girarMotor(int pasos, int velocidad) {
digitalWrite(DIR, HIGH);
for (int i = 0; i < pasos; i++) {
digitalWrite(STEP, HIGH);
delayMicroseconds(velocidad);
digitalWrite(STEP, LOW);
delayMicroseconds(velocidad);
}
}