#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//-----------------------------------------
#define clk 6
#define dt 5
#define btnsw 9
//-----------------------------------------
#define Ledred 13
#define btnnext 10
//Variables para los diferentes estados Menus/Submenus----------------
int MainMenuEn = 0;
int LedRojoEn = 0;
int MotorXEn = 0;
//Variables StepperX-----------------------
int NmotorX = 0;
//Estados de encoder-----------------------
int clkOld = 0;
int estadoclk = digitalRead(clk);
int estadodt = digitalRead(dt);
int delayEn = 5;
//Variable que declara los diferentes estados------------------------
enum MenuState {MAIN_MENU , LED_ROJO , MOTOR_X , MOTOR_XR , INICIAR};
//Indica que estado se muestra primero
MenuState currentState = MAIN_MENU;
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
//lcd.clear();
pinMode(clk, INPUT);
clkOld = digitalRead(clk);
pinMode(dt, INPUT);
pinMode(btnsw, INPUT_PULLUP);
pinMode(btnnext, INPUT_PULLUP);
pinMode(Ledred, OUTPUT);
}
void loop()
{
//Muestra el estado actual (currentState)
//----------------------------------------------------
switch (currentState)
{
case MAIN_MENU:
mainMenu();
break;
case LED_ROJO:
ledrojo();
break;
case MOTOR_X:
motorX();
break;
case MOTOR_XR:
motorXR();
break;
case INICIAR:
iniciar();
break;
default: break;
}
}
// FUNCIONES-que forman el los diferentes estados--------
//-------------------------------------------------------
void mainMenu()
{
//Encoder control
//-------------------------------------------------------
int estadoclk = digitalRead(clk);
int estadodt = digitalRead(dt);
if (clkOld == 1 && estadoclk == 0) {
if (estadodt == 0) {
MainMenuEn--;
} else {
MainMenuEn++;
}
lcd.clear();
}
delay(delayEn);
clkOld = estadoclk;
//-------------------------------------------------------
// Limite de casos del switch
//-------------------------------------------------------
int casos = 3;
if (MainMenuEn < 0) MainMenuEn = casos - 1;
if (MainMenuEn > casos - 1) MainMenuEn = 0;
//-------------------------------------------------------
switch (MainMenuEn)
{
case 0:
lcd.setCursor(0, 0);
lcd.print("Led rojo 1");
//lcd.setCursor(15, 1);
//lcd.print("1");
if (digitalRead(btnsw) == 0){
ledlcdclear();
currentState = LED_ROJO;
}
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("MotorX 2");
//lcd.setCursor(15, 1);
//lcd.print("2");
if (digitalRead(btnsw) == 0){
ledlcdclear();
currentState = MOTOR_X;
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Iniciar!! 3");
//lcd.setCursor(15, 1);
//lcd.print("3");
if (digitalRead(btnsw) == 0){
ledlcdclear();
currentState = INICIAR;
}
break;
default: break;
}
}
void ledrojo()
{
//Encoder control
//-------------------------------------------------------
int estadoclk = digitalRead(clk);
int estadodt = digitalRead(dt);
if (clkOld == 1 && estadoclk == 0) {
if (estadodt == 0) {
LedRojoEn--;
} else {
LedRojoEn++;
}
lcd.clear();
}
delay(delayEn);
clkOld = estadoclk;
//-------------------------------------------------------
// Limite de casos del switch
//-------------------------------------------------------
int casos = 3;
if (LedRojoEn < 0) LedRojoEn = casos - 1;
if (LedRojoEn > casos - 1) LedRojoEn = 0;
//-------------------------------------------------------
switch (LedRojoEn)
{
case 0:
lcd.setCursor(0, 0);
lcd.print("ON");
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("OFF");
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Back");
if (digitalRead(btnsw) == 0) {
ledlcdclear();
currentState = MAIN_MENU;
}
break;
default: break;
}
}
void motorX()
{
//Encoder control
//-------------------------------------------------------
int estadoclk = digitalRead(clk);
int estadodt = digitalRead(dt);
if (clkOld == 1 && estadoclk == 0) {
if (estadodt == 0) {
MotorXEn--;
} else {
MotorXEn++;
}
lcd.clear();
}
delay(delayEn);
clkOld = estadoclk;
//-------------------------------------------------------
// Limite de casos del switch
//-------------------------------------------------------
int casos = 3;
if (MotorXEn < 0) MotorXEn = casos - 1;
if (MotorXEn > casos - 1) MotorXEn = 0;
//-------------------------------------------------------
switch (MotorXEn)
{
case 0:
lcd.setCursor(0, 0);
lcd.print("Pasos:");
lcd.setCursor(10, 0);
lcd.print(NmotorX);
if (digitalRead(btnsw) == 0){
ledlcdclear();
currentState = MOTOR_XR;
}
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("OFF");
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Back");
if (digitalRead(btnsw) == 0) {
ledlcdclear();
currentState = MAIN_MENU;
}
break;
default: break;
}
}
void motorXR()
{
//Encoder control
//-----------------------------------------------
int estadoclk = digitalRead(clk);
int estadodt = digitalRead(dt);
if (clkOld == 1 && estadoclk == 0) {
if (estadodt == 0) {
NmotorX--;
} else {
NmotorX++;
}
delay(delayEn);
}
clkOld = estadoclk;
//Muestra los signos + y - delante del los valores '000'-----
//int displayValue = NmotorX;
int displayValue = NmotorX;
if (NmotorX < 0) {
lcd.setCursor(0, 1);
lcd.print("-");
displayValue = abs(NmotorX);
} else {
lcd.setCursor(0, 1);
lcd.print("+");
}
if (displayValue < 10) {
lcd.print("00");
} else if (displayValue < 100) {
lcd.print("0");
}
lcd.print(displayValue);
if (digitalRead(btnsw) == 0) {
lcd.clear();
ledlcdclear();
currentState = MOTOR_X;
}
}
void iniciar()
{
lcd.setCursor(0,0);
lcd.print("Pulsa boton!!");
if (digitalRead(btnsw) == 0){
ledlcdclear();
if ( NmotorX >= 0) {
for (int i = 0; i < NmotorX; i++)
{
digitalWrite(Ledred, 1);
delay(200);
lcd.setCursor(0,0);
lcd.print(" ");
digitalWrite(Ledred, 0);
delay(100);
lcd.setCursor(0,0);
lcd.print("||positivo||");
}
delay(100);
lcd.clear();
MainMenuEn = 0;
currentState = MAIN_MENU;
}
else if ( NmotorX <= 0) {
for (int i = 0; i > NmotorX; i--)
{
digitalWrite(Ledred, 1);
delay(200);
lcd.setCursor(0,0);
lcd.print(" ");
digitalWrite(Ledred, 0);
delay(100);
lcd.setCursor(0,0);
lcd.print("||Negativo||");
}
delay(100);
lcd.clear();
MainMenuEn = 0;
currentState = MAIN_MENU;
}
}
}
void ledlcdclear(){
if (digitalRead(btnsw) == 0)
{
//lcd.clear();
digitalWrite(Ledred, 1);
delay(500);
digitalWrite(Ledred, 0);
}
}