#include <LiquidCrystal.h>
#include <AccelStepper.h>
int dire = 1; // Sentido del Motor
char cable[4] = "A30";
char bobina[3] = "S";
char* tcable[6] = {"A30", "B50", "C60", "RP37", "RP47", "CUS"};
int ptcable = 0;
char* tbobina[5] = {"S", "M", "L", "XL", "C"};
int ptbobina = 0;
float velocidad=5;
//int velocidad_dec=0;
int vel_hom=1000;
int anchobob=100; // Ancho de la Bobina (mm)
int vueltas =0 ; //Nº de vueltas
bool aState= HIGH;
bool aLastState = HIGH;
bool swState = HIGH;
bool swLast = HIGH;
bool menu = HIGH;
int lastClk = LOW;
byte sentido=0;
bool modorun =LOW;
float RotaryTime1; //Rotary encoder timing
float RotaryTime2=0; //Rotary button timing
float time_vuelta=0;
int posm=0; // Posicion del Menu
//LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
LiquidCrystal lcd(16, 17, 23, 25, 27, 29);
// Botones
//#define outputA 37
//#define outputB 35 //dp
unsigned long startMillis0 = 0;
////
#define ENCODER_CLK 37
#define ENCODER_DT 35
#define X_MIN 3
//#define DOWN_BUTTON 3
#define SELECT_BUTTON 31
#define buzzer 33
boolean press_u;
boolean press_d;
boolean press_s;
// Motor con Half Step 1/2 400 pasos/vuelta
// Husillo T8 de paso 8mm -> 500 pasos -> 100mm
// Motor con Half Step 1/8 1600 pasos/vuelta
// Rueda de 20 dientes -> 40 pasos -> 1 mm -> Factor 40
#define DIR A1// 28//A1 /EJE X
#define STEP A0// 26//A0
#define ENABLE 38// 24//38
//#define DIR 28//A1 //EXTRUSOR
//#define STEP 26//A0
//#define ENABLE 24//38
#define motorInterfaceType 1
AccelStepper miMotor = AccelStepper(motorInterfaceType, STEP, DIR);
void setup() {
startMillis0 = millis();
Serial.begin(9600);
pinMode(ENCODER_CLK, INPUT_PULLUP);
pinMode(ENCODER_DT, INPUT_PULLUP);
pinMode(SELECT_BUTTON, INPUT_PULLUP);
pinMode(buzzer, OUTPUT); // Set buzzer
pinMode(X_MIN, INPUT_PULLUP); // SWICTH MINIMO HOME
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
pinMode(ENABLE, OUTPUT);
//miMotor.setAcceleration(100);
miMotor.setMaxSpeed(3000);
miMotor.setSpeed(velocidad*40);
digitalWrite(ENABLE, HIGH);
lcd.begin(20, 4);
// you can now interact with the LCD, e.g.:
//lcd.print("Bobinador");
lcd.setCursor(0, 0); lcd.print((char) 126); lcd.print("Vel= mm/s");
lcd.setCursor(11-(String(velocidad).length()), 0);lcd.print(velocidad);
lcd.setCursor(1, 1); lcd.print("Ancho Bob= mm");
lcd.setCursor(15- (String(anchobob).length()), 1);lcd.print(anchobob);
lcd.setCursor(1, 2); lcd.print("CONFIG HOME RUN");
lcd.setCursor(0, 3); lcd.print("T= s V= P= mm");
}
void loop() {
//delay(200);
// miMotor.setCurrentPosition(0);
//digitalWrite(ENABLE, LOW);
//miMotor.run();
//a = miMotor.getSpeed();
//miMotor.setSpeed(velocidad * dire);
// miMotor.runSpeed();
if (modorun == false) {
byte boton=0; /// NAVEGANDO POR MENU
boton = encoder();
//Serial.println(boton);
if (menu == true) {
switch (boton) {
case 1:
if (posm <4){posm++;}
else {posm=0;}
mnp_cursor (posm);
break;
case 2:
if (posm >0){posm--;}
else {posm=4;}
mnp_cursor (posm);
break;
}
}
else { //dentro de una opcion
switch (boton) {
case 0:
if (posm == 0) {
// lcd.setCursor(7, 0); lcd.print((char) 126);
//lcd.setCursor(7, 0); lcd.print(" ");
//lcd.setCursor(11-(String(velocidad).length()), 0);lcd.print(velocidad);
}
if (posm == 1) {
//lcd.setCursor(12, 1); lcd.print(" ");
//lcd.setCursor(15- (String(anchobob).length()), 1);lcd.print(anchobob);
}
break;
case 1:
if (posm == 0) { // Estamo en velocidad
velocidad=velocidad+0.1;
lcd.setCursor(6, 0); lcd.print(" ");
lcd.setCursor(11-(String(velocidad).length()), 0);lcd.print(velocidad);
//lcd.setCursor(7, 0);lcd.print(velocidad);
Serial.print("Vel:");
Serial.println(velocidad);
}
if (posm == 1) { // Estamos en bobina
anchobob=anchobob+1;
lcd.setCursor(12, 1); lcd.print(" ");
lcd.setCursor(15- (String(anchobob).length()), 1);lcd.print(anchobob);
//lcd.setCursor(12, 1);lcd.print(anchobob);
}
break;
case 2:
if (posm == 0) { // Estamo en velocidad
velocidad=velocidad-0.1;
lcd.setCursor(6, 0); lcd.print(" ");
lcd.setCursor(11-(String(velocidad).length()), 0);lcd.print(velocidad);
// lcd.setCursor(7, 0);lcd.print(velocidad);
Serial.print("Vel:");
Serial.println(velocidad);
}
if (posm == 1) { // Estamos en bobina
anchobob=anchobob-1;
lcd.setCursor(12, 1); lcd.print(" ");
lcd.setCursor(15- (String(anchobob).length()), 1);lcd.print(anchobob);
//lcd.setCursor(12, 1);lcd.print(anchobob);
}
break;
}
}
}
else { //MODO RUN
digitalWrite(ENABLE, LOW); // Habilito el Motor
miMotor.setCurrentPosition(0);
miMotor.setSpeed(velocidad*40);
time_vuelta= millis();
while(miMotor.currentPosition() != anchobob*40) { // Empieza el recorrrido a Derechas
miMotor.runSpeed();
// float posicion =miMotor.currentPosition();
//Serial.println(posicion/40);
//Serial.println("***");
// Serial.println((float (miMotor.currentPosition())/40));
if ((float (miMotor.currentPosition())/40)== int(miMotor.currentPosition()/40)) {
lcd.setCursor(18-(String(miMotor.currentPosition()/40).length()), 3); lcd.print(miMotor.currentPosition()/40);
//Serial.println("------------------");
}
}
vueltas=vueltas+1;
lcd.setCursor(12-(String(vueltas).length()), 3); lcd.print(vueltas);
lcd.setCursor(2, 3); lcd.print(int((millis()-time_vuelta)));
//miMotor.setCurrentPosition(0);
miMotor.setSpeed(velocidad*(-40));
time_vuelta= millis();
while(miMotor.currentPosition() != 0) { // Empieza el recorrrido a Izquierda
miMotor.runSpeed();
}
vueltas=vueltas+1;
lcd.setCursor(12-(String(vueltas).length()), 3); lcd.print(vueltas);
lcd.setCursor(2, 3); lcd.print(int((millis()-time_vuelta)));
lcd.setCursor(15, 3); lcd.print(" ");
digitalWrite(ENABLE, HIGH); //Libero al Motor
}
swState = digitalRead(SELECT_BUTTON); /// Click Encoder
RotaryTime1 = millis();
if ((swState == LOW) && (swLast == HIGH)) {
if (RotaryTime1 - RotaryTime2 > 1000) {
// Serial.println("Rotary pressed");
tone(buzzer, 300); // Send 0.3KHz sound signal...
delay(5); // ...for 1 sec
noTone(buzzer);
// miMotor.setSpeed(velocidad * dire);
//dire = dire * (-1);
// delay(100);//debounce
menu = !menu; // Nos adentramos dentro de opcion menu
byte lcd_carac_i = (menu==0)*62+(menu==1)*32; // Caracter "<" o " "
byte lcd_carac_f = (menu==0)*60+(menu==1)*32; // Caracter ">" o " "
if (posm == 0) {
lcd.setCursor(5, 0); lcd.print((char) (lcd_carac_i ));
lcd.setCursor(11, 0); lcd.print((char) (lcd_carac_f ));
Serial.println("Estas en Velocidad");
}
if (posm == 1) {
Serial.println("Estas en longitud bobina");
lcd.setCursor(11, 1); lcd.print((char) (lcd_carac_i));
lcd.setCursor(15, 1); lcd.print((char) (lcd_carac_f));
}
if (posm == 3) { // Estamos en HOMING
Serial.println("Estas en Homming");
lcd.setCursor(8, 2); lcd.print((char) (lcd_carac_i));
lcd.setCursor(13, 2); lcd.print((char) (lcd_carac_f));
homming();
menu = !menu; ; // quito el modo menu
}
if (posm == 4) {
Serial.println("Estas en run");
lcd.setCursor(15, 2); lcd.print((char) (lcd_carac_i));
lcd.setCursor(19, 2); lcd.print((char) (lcd_carac_f));
modorun=!modorun;
vueltas=0; // Pongo el contador a cero
}
mnp_cursor((menu==1)*(posm-99)+99);
//Serial.println(((menu==1)*(posm-99)));
}
RotaryTime2 = millis();
} ///retardo
swLast = swState;
}
/// Indicacion cursor en Menu Principal (posicion "posm")
void mnp_cursor (int posicion) {
lcd.setCursor(0, 0); lcd.print((char) 32);
lcd.setCursor(0, 1); lcd.print((char) 32);
lcd.setCursor(0, 2); lcd.print((char) 32);
lcd.setCursor(8, 2); lcd.print((char) 32);
lcd.setCursor(15, 2); lcd.print((char) 32);
//lcd.setCursor(15, 3); lcd.print((char) 32);
switch (posicion) {
case 0:
lcd.setCursor(0, 0); lcd.print((char) 126);
break;
case 1:
lcd.setCursor(0, 1); lcd.print((char) 126);
break;
case 2:
lcd.setCursor(0, 2); lcd.print((char) 126);
break;
case 3:
lcd.setCursor(8, 2); lcd.print((char) 126);
break;
case 4:
lcd.setCursor(15, 2); lcd.print((char) 126);
break;
}
}
/// Lectura del Encoder /////////
byte encoder(){
//**
//RotaryTime1 = millis();
//if (RotaryTime1 - RotaryTime2 > 100) {
// Serial.println("Ya puede leer");
byte sentido=0;
//**
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk) {
// There was a change on the CLK pin
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH) { // DERECHA
sentido=1;
// Serial.println("Rotated clockwise ⏩");
}
if (newClk == LOW && dtValue == LOW) { // IZQUIERDA
sentido=2;
// Serial.println("Rotated counterclockwise ⏪");
}
}
// RotaryTime2 = millis();
//}
return sentido;
}
void homming(){ // vamos a realizar el homming
digitalWrite(ENABLE, LOW); //Habilito al Motor
miMotor.setSpeed(-vel_hom);
//Serial.println("Estamos en Homming");
//Serial.println(digitalRead(X_MIN));
while(digitalRead(X_MIN) == LOW) {
//lcd.setCursor(0, 0); lcd.print(digitalRead(X_MIN));
//Serial.println(digitalRead(X_MIN));
//lcd.setCursor(17- (String(miMotor.currentPosition()).length()), 3);lcd.print(miMotor.currentPosition());
// miMotor.setSpeed(velocidad*(-1));
miMotor.runSpeed();
}
digitalWrite(ENABLE, HIGH); //Deshabilito al Motor
}