#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Definições dos pinos
#define STEP_PIN 19
#define DIR_PIN 18
#define PEDAL_PIN 2
#define LED_VERDE 4
#define LED_VERMELHO 5
#define MODO_PIN 17 // chave seletora: 0 = manual, 1 = automático
// LCD 16x2 via I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Configuração do 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] = {13, 12, 14, 27}; // Linha
byte colPins[COLS] = {26, 25, 33, 32}; // Colunas
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Variáveis de controle
bool buttonPressed = false;
int doses = 0;
void setup() {
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(PEDAL_PIN, INPUT_PULLUP);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
pinMode(MODO_PIN, INPUT_PULLUP);
digitalWrite(DIR_PIN, HIGH);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dosadora pronta");
}
void dosar() {
digitalWrite(LED_VERDE, HIGH);
for (int i = 0; i < 66.6; i++) { // 90° aproximado
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(2000);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(2000);
}
digitalWrite(LED_VERDE, LOW);
}
void loop() {
int modo = digitalRead(MODO_PIN); // 0 = manual, 1 = automático
if (modo == LOW) { // -------- MODO MANUAL --------
lcd.setCursor(0, 0);
lcd.print("Modo: Manual ");
lcd.setCursor(0, 1);
lcd.print("Pressione pedal ");
if (digitalRead(PEDAL_PIN) == LOW && !buttonPressed) {
buttonPressed = true;
dosar();
delay(300);
}
if (digitalRead(PEDAL_PIN) == HIGH) {
buttonPressed = false;
}
} else { // -------- MODO AUTOMÁTICO --------
lcd.setCursor(0, 0);
lcd.print("Modo: Automatico");
lcd.setCursor(0, 1);
lcd.print("Qtd: ");
lcd.print(doses);
lcd.print(" ");
char key = keypad.getKey();
if (key) {
if (key >= '0' && key <= '9') {
doses = doses * 10 + (key - '0'); // acumula dígitos
} else if (key == '#') { // Confirma
if (doses > 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dosando...");
for (int i = 0; i < doses; i++) {
dosar();
delay(500);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Concluido!");
delay(1000);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Qtd invalida!");
delay(1000);
}
doses = 0; // reseta quantidade
} else if (key == '*') { // Cancela
doses = 0;
}
}
}
}