#include <OneButton.h>
#include <AccelStepper.h>
#include <RotaryEncoder.h>
#include "menus.h"
// ENCODER
int minPos= -200;
int maxPos= 200;
RotaryEncoder encoder(27,14, RotaryEncoder::LatchMode::TWO03);//variables(PIN DT, PIN CLK,RotaryEncoder::LatchMode::TWO03)
// MOTOR
AccelStepper stepper = AccelStepper(1, 13, 12); //variables(tipo de controlador A4988, pin de step, pin de dir)
int aceleracion=600;
int minSpeed=10;
int maxSpeed=800;
int speed=800;
// BOTONES
OneButton butPos1(15, true);
OneButton butPos2(2, true);
OneButton butPos3(4, true);
OneButton butPos4(5, true);
OneButton butPos5(18, true);
OneButton butPos6(19, true);
OneButton butPos7(3, true);
OneButton butPos8(1, true);
OneButton butIni(25, true);
OneButton butFin(23, true);
OneButton butFuntion(33, true);
OneButton butUp(34, true);
OneButton butDown(39, true);
OneButton butMenu(35, true);
OneButton butEnter(36, true);
// VARIABLES GLOBALES
int currentPos=0;
int recPos[8]={20,65,45,25,14,200,78,0};
int lock=0;
int menuPosition=0;
int menuNumber=0;
int menuSize=9;
/*----------------------------------------
------------------SETUP-------------------
----------------------------------------*/
void setup() {
Serial.begin(115200);
// ASIGNACION DE FUNCIONES A LOS BOTONES
butPos1.attachClick(loadPosition1);
butPos2.attachClick(loadPosition2);
butPos3.attachClick(loadPosition3);
butPos4.attachClick(loadPosition4);
butPos5.attachClick(loadPosition5);
butPos6.attachClick(loadPosition6);
butPos7.attachClick(loadPosition7);
butPos8.attachClick(loadPosition8);
butIni.attachClick(posInicialCall);
butFin.attachClick(posFinalCall);
butUp.attachClick(up);
butDown.attachClick(down);
butMenu.attachClick(menu);
butEnter.attachClick(enter);
butPos1.attachLongPressStart(savePosition1);
butPos2.attachLongPressStart(savePosition2);
butPos3.attachLongPressStart(savePosition3);
butPos4.attachLongPressStart(savePosition4);
butPos5.attachLongPressStart(savePosition5);
butPos6.attachLongPressStart(savePosition6);
butPos7.attachLongPressStart(savePosition7);
butPos8.attachLongPressStart(savePosition8);
butIni.attachLongPressStart(posInicialRec);
butFin.attachLongPressStart(posFinalRec);
butFuntion.attachLongPressStart(lockState);
// MOTOR VARIABLES SET
stepper.setMaxSpeed(maxSpeed);
stepper.setAcceleration(aceleracion);
iniciarDisplay();
}
/*----------------------------------------
------------------LOOP--------------------
----------------------------------------*/
void loop() {
if(lock==0){
useEncoder();
buttonTicks();
moveStepeer(currentPos);
delay(10);
}
butFuntion.tick();
menuses(menuPosition);
}
/*----------------------------------------
----------------FUNCIONES-----------------
----------------------------------------*/
//FUNCION PARA LEER ENCODER ENTRE UN VALOR MAXIMO Y MINIMO
void useEncoder(){
encoder.tick();
int encoderPos=encoder.getPosition();
if(encoderPos<minPos){
cambiarPosicion(minPos);
}else if(encoderPos>maxPos){
cambiarPosicion(maxPos);
}else{
currentPos=encoderPos;
}
}
// FUNCION PARA MONITORIAR PRESION DE BOTONES Y DISPARAR FUNCIONES (EXEPTO EL BOTON FUNCION PORQUE ES EL QUE BLOQUEA)
void buttonTicks(){
butPos1.tick();
butPos2.tick();
butPos3.tick();
butPos4.tick();
butPos5.tick();
butPos6.tick();
butPos7.tick();
butPos8.tick();
butIni.tick();
butFin.tick();
butUp.tick();
butDown.tick();
butMenu.tick();
butEnter.tick();
}
// FUNCION PARA MOVER EL MOTOR A UNA POSICION ABTOSULA NUMERADA EN STEPS SEGUN LA VELOCIDAD
void moveStepeer(int stepNumber){
speed = map(analogRead(32), 0, 4095, minSpeed, maxSpeed);
stepper.setSpeed(speed);
stepper.moveTo(stepNumber);
stepper.runSpeedToPosition();
}
//FUNCION PARA GRABAR POSICION ACTUAL EN LA VARIABLE CURRENTPOS Y ACTUALIZAR EL VALOR DEL ENCODER
void cambiarPosicion(int posicion){
currentPos=posicion;
encoder.setPosition(posicion);
}
//FUNCION PARA CAMBIAR A MODO BLOCKEO
void lockState(){
if(lock==0){
lock=1;
}else{
lock=0;
}
}
// FUNCION PARA LLAMAR POS INICIAL
void posInicialCall(){
cambiarPosicion(minPos);
}
// FUNCION PARA LLAMAR POS FINAL
void posFinalCall(){
cambiarPosicion(maxPos);
}
// FUNCION PARA GRABAR POS INICIAL
void posInicialRec(){
minPos=currentPos;
}
// FUNCION PARA GRABAR POS FINAL
void posFinalRec(){
maxPos=currentPos;
}
//SAVE POSITION FUNTIONS
void savePosition1(){
recPos[0]=currentPos;
}
void savePosition2(){
recPos[1]=currentPos;
}
void savePosition3(){
recPos[2]=currentPos;
}
void savePosition4(){
recPos[3]=currentPos;
}
void savePosition5(){
recPos[4]=currentPos;
}
void savePosition6(){
recPos[5]=currentPos;
}
void savePosition7(){
recPos[6]=currentPos;
}
void savePosition8(){
recPos[7]=currentPos;
}
//LOAD POSITION FUNTIONS
void loadPosition1(){
cambiarPosicion(recPos[0]);
}
void loadPosition2(){
cambiarPosicion(recPos[1]);
}
void loadPosition3(){
cambiarPosicion(recPos[2]);
}
void loadPosition4(){
cambiarPosicion(recPos[3]);
}
void loadPosition5(){
cambiarPosicion(recPos[4]);
}
void loadPosition6(){
cambiarPosicion(recPos[5]);
}
void loadPosition7(){
cambiarPosicion(recPos[6]);
}
void loadPosition8(){
cambiarPosicion(recPos[7]);
}
/*----------------------------------------
----------------FUNCIONES-----------------
----------------------------------------*/
// UP BUTTON
void up(){
if(menuNumber<2){
if(menuPosition>0){
menuPosition--;
}else{
menuPosition=menuSize-1;
}
}else{}
}
void down(){
if(menuNumber<2){
if(menuPosition<menuSize-1){
menuPosition++;
}else{
menuPosition=0;
}
}else{
}
}
void menu(){
switch (menuNumber){
case 1:
menuNumber=0;
break;
case 2:
menuNumber=1;
break;
default:
menuNumber=1;
break;
}
Serial.print("menu: ");
Serial.println(menuNumber);
}
void enter(){
switch (menuNumber){
case 1:
menuNumber=2;
break;
case 2:
menuNumber=1;
break;
default:
menuNumber=0;
break;
}
}