#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
// Motor Paso a Paso
const int Dir = 12;
const int Step = 11;
const int stepsPerRevolution = 50;
unsigned long segundos = 1000;
// Motor DC
const int In3 = 4;
const int In4 = 6;
const int En = 5;
// Variables de Entrada
int horValue;
int verValue;
int pushValue;
int barpos = 3;
int cm = 0;
unsigned long tiempo;
bool BotonPresionado = false;
bool menuMotor = true;
bool menuCordon = false;
bool antesPresionado = true;
bool x = true;
bool tr = true;
// Configuración del LCD y el Motor Paso a Paso
LiquidCrystal_I2C lcd(0x27, 20, 4);
Stepper myStepper(stepsPerRevolution, Dir, Step);
// Definición de Caracteres Personalizados
byte A[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000};
byte B[8] = {B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000};
byte C[8] = {B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000};
byte D[8] = {B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100};
byte E[8] = {B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110};
byte F[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};
enum estado {
menuPrincipal,
accionCordon,
accionPulsera,
accionMotor,
};
estado funciones;
void principal() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("MAQUINA TRENZADORA");
lcd.setCursor(0, 1);
lcd.print("--------------------");
lcd.setCursor(1, 2);
lcd.print("Pulseras");
lcd.setCursor(1, 3);
lcd.print("Cordones");
lcd.setCursor(0, 2);
lcd.print(">");
}
void pulsera() {
if (tr) {
tr = false;
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("PULSERA");
lcd.setCursor(3, 2);
lcd.print("[");
lcd.setCursor(16, 2);
lcd.print("]");
}
if (horValue < 400) {
cm++;
barpos = map(cm, 0, 100, 4, 15);
}
if (barpos > 15) {
barpos = 15;
}
if (cm > 100) {
cm = 100;
}
if (horValue > 600) {
cm--;
barpos = map(cm, 0, 100, 4, 15);
}
if (barpos < 3) {
barpos = 3;
}
if (cm < 0) {
cm = 0;
}
if (cm < 10) {
lcd.setCursor(11, 3);
lcd.print(" ");
}
if (cm < 100) {
lcd.setCursor(12, 3);
lcd.print(" ");
}
lcd.setCursor(7, 3);
lcd.print("CM:");
lcd.print(cm);
for (int i = 4; i <= 15; i++) {
lcd.setCursor(i, 2);
if (i <= barpos) {
lcd.write(byte(5));
} else {
lcd.write(byte(0));
}
}
}
void cordon() {
if (tr) {
tr = false;
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("CORDONES");
lcd.setCursor(3, 2);
lcd.print("[");
lcd.setCursor(16, 2);
lcd.print("]");
}
if (horValue < 400) {
cm++;
barpos = map(cm, 0, 100, 4, 15);
}
if (barpos > 15) {
barpos = 15;
}
if (cm > 100) {
cm = 100;
}
if (horValue > 600) {
cm--;
barpos = map(cm, 0, 100, 4, 15);
}
if (barpos < 3) {
barpos = 3;
}
if (cm < 0) {
cm = 0;
}
if (cm < 10) {
lcd.setCursor(11, 3);
lcd.print(" ");
}
if (cm < 100) {
lcd.setCursor(12, 3);
lcd.print(" ");
}
lcd.setCursor(7, 3);
lcd.print("CM:");
lcd.print(cm);
for (int i = 4; i <= 15; i++) {
lcd.setCursor(i, 2);
if (i <= barpos) {
lcd.write(byte(5));
} else {
lcd.write(byte(0));
}
}
}
void arriba() {
if (verValue > 600) {
x = true;
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(">");
}
}
void abajo() {
if (verValue < 400) {
x = false;
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(">");
}
}
void seleccionador() {
if (x) {
funciones = accionPulsera;
} else {
funciones = accionCordon;
}
}
void calculoSeg() {
segundos = (unsigned long)cm * 1000;
Serial.print(" CM: ");
Serial.println(cm);
Serial.print(" segundos: ");
Serial.println(segundos);
delay(500);
}
void activarMotor() {
unsigned long tiempoInicio = millis();
while (millis() - tiempoInicio < segundos) {
myStepper.step(1);
AdelanteDC();
}
DetenerDC();
}
void DetenerDC() {
digitalWrite(In3, LOW);
digitalWrite(In4, LOW);
}
void AdelanteDC(){
digitalWrite(In3, HIGH);
digitalWrite(In4, LOW);
}
void setup() {
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A1, INPUT_PULLUP);
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.createChar(0, A);
lcd.createChar(1, B);
lcd.createChar(2, C);
lcd.createChar(3, D);
lcd.createChar(4, E);
lcd.createChar(5, F);
principal();
funciones = menuPrincipal;
//Velocidad de Motor paso a paso
myStepper.setSpeed(500);
//Velocidad de motor dc
analogWrite(En, 128);
}
void loop() {
horValue = analogRead(A2);
verValue = analogRead(A3);
pushValue = digitalRead(A1);
delay(100);
switch (funciones) {
case menuPrincipal:
abajo();
arriba();
if (!pushValue) {
seleccionador();
delay(200);
}
break;
case accionPulsera:
pulsera();
if (!pushValue) {
funciones = accionMotor;
delay(200);
}
break;
case accionCordon:
cordon();
if (!pushValue) {
funciones = accionMotor;
delay(200);
}
break;
case accionMotor:
if (menuMotor) {
lcd.clear();
menuMotor = false;
lcd.setCursor(1, 0);
lcd.print("MOTORES");
lcd.setCursor(0, 1);
lcd.print("--------------------");
}
calculoSeg();
activarMotor();
principal();
funciones = menuPrincipal;
tr = true;
x = true;
BotonPresionado = false;
menuMotor = true;
menuCordon = false;
antesPresionado = true;
barpos = 3;
cm = 0;
break;
}
}