#include <Wire.h>
#include <TM1637Display.h>
#include <I2CKeyPad.h>
#define HOME_SENSOR A2
#define CLK 9
#define DIO 10
#define LED_GREEN 12
#define LED_RED 11
#define DIR_PIN 6
#define STEP_PIN 7
#define ENABLE_PIN 8
TM1637Display tm(CLK, DIO);
I2CKeyPad keyPad(0x20);
enum State {
STANDBY_STATE,
DIGITANDO,
RODANDO,
RETORNANDO,
CORTANDO,
FINALIZADO,
ERRO
};
const char START = 'R';
const char STOP = 'P';
const char DELETE = 'D';
const char STANDBY = 'S';
char mapa[16] = {
'1','2','3',START,
'4','5','6',STOP,
'7','8','9',DELETE,
' ','0',' ',STANDBY
};
String numero = "";
State estadoAtual = STANDBY_STATE;
uint8_t ultimaTecla = I2C_KEYPAD_NOKEY;
long passosAtual = 0;
long passosAlvo = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
digitalWrite(LED_RED, HIGH);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, HIGH);
// sensor HOME
pinMode(HOME_SENSOR, INPUT_PULLUP);
tm.setBrightness(7);
if (!keyPad.begin()) {
Serial.println("Erro no keypad");
while(1);
}
tm.clear();
}
void clearDisplay(){
numero = "";
tm.clear();
}
const uint16_t DELAY_MOTOR = 500;
void runMotor(){
if (passosAtual >= passosAlvo) {
estadoAtual = FINALIZADO;
digitalWrite(ENABLE_PIN, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
Serial.println("PROCESSO FINALIZADO");
return;
}
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(DELAY_MOTOR);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(DELAY_MOTOR);
passosAtual++;
}
void returnMotor(){
if (digitalRead(HOME_SENSOR) == LOW) {
passosAtual = 0;
estadoAtual = STANDBY_STATE;
digitalWrite(ENABLE_PIN, HIGH);
clearDisplay();
Serial.println("HOME ENCONTRADO");
return;
}
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(DELAY_MOTOR);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(DELAY_MOTOR);
passosAtual--;
}
void readKeyPad(uint8_t index){
char tecla = mapa[index];
// =========================
// START
// =========================
if (
tecla == START && numero.length() > 0 &&
numero != "0" &&
estadoAtual != RETORNANDO
) {
passosAtual = 0;
passosAlvo = numero.toInt();
estadoAtual = RODANDO;
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
Serial.println("PROCESSO INICIADO");
}
// =========================
// STOP
// =========================
if (tecla == STOP && estadoAtual == RODANDO) {
estadoAtual = RETORNANDO;
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
Serial.println("RETORNANDO PARA POSICAO INICIAL");
}
// =========================
// DELETE
// =========================
if (tecla == DELETE) {
clearDisplay();
estadoAtual = STANDBY_STATE;
Serial.println("DISPLAY LIMPO");
}
// =========================
// DIGITAÇÃO
// =========================
if ((estadoAtual == STANDBY_STATE || estadoAtual == DIGITANDO)
&& tecla >= '0' && tecla <= '9') {
estadoAtual = DIGITANDO;
if (numero.length() < 4) {
numero += tecla;
}
tm.showNumberDec(numero.toInt(), false);
}
}
void loop() {
uint8_t teclaIndex = keyPad.getKey();
// detecta apenas nova tecla
if (teclaIndex != I2C_KEYPAD_NOKEY &&
teclaIndex != ultimaTecla) {
readKeyPad(teclaIndex);
}
ultimaTecla = teclaIndex;
// =========================
// MOTOR
// =========================
if (estadoAtual == RODANDO) {
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
runMotor();
}
if (estadoAtual == RETORNANDO) {
digitalWrite(ENABLE_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
returnMotor();
}
if(estadoAtual == FINALIZADO){
clearDisplay();
estadoAtual = STANDBY_STATE;
}
}
Sensor Home