Arduino - Display 16x2 - Simple Menu System for Rotary encoder

preview_player
Показать описание
SMS - Simple Menu System for all devices - test 1
For my purposes is only 8-bit Arduino now.
Designed for:
1. Rotary encoder with button
2. minimal 3 micro buttons
Рекомендации по теме
Комментарии
Автор

// Krajina: Slovensko, Country: Slovakia (separate from old Czechoslovakia)
// Projekt: Menu system pre krokovy motor + I2C displej 16x2
// Project: Menu system for stepper motor + I2C display 16x2
// Rotary encoder: Keyes with button

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HCMotor.h"

HCMotor HCMotor;
LiquidCrystal_I2C lcd(0x27, 16, 2);

// premenne = variables
int a, b, c, d, zavity, zaloha;
int in = 0;

// menu system
int poz = 0; // pozicia kurzora na stranke = cursor position on actual page
int poz_max = 1;
int poz_min = 0;

int stranka = 0; // aktualna stranka = actual page
int stranka_max = 1;
int stranka_min = 0;

// EEPROM - pamet = memory
int adresa = 0;
int eeprom = 0;

// pocitadla zavitov + casu = count for turns and time
int pocitadlo;
int percento;
int sekunda;
int minuta;
int csekunda;
int cminuta;

unsigned long pMillis = 0;
unsigned long cMillis = 0;

// rotacny enkoder = rotary encoder
const int pin_clk = 2;
const int pin_dt = 3;
const int pin_sw = 5;

// vystup = output for stepper motor NEMA17
const int dir_pin = 8;
const int step_pin = 9;
boolean set = false;

// motor parameters
const int frekmax = 25;
const float n = 0.2; // nabeh/dobeh 20 % na desatinne cislo = 0.2
const int velkost = 50; // max.velkost pola pre nabeh/dobeh
int nabeh; // pre vypocet zo zavitov
int krok_k; // krok nabehu
int krok_prvy;
int *nahor, *nadol; // pole
int stred;

// stav tlacidiel a premennych = buttons state and variables for buttons
int clk = 0;
int dt = 0;
int sw = 0;

int poc = 0;
int smer = 0;

int tlac = 0;
int tlac_max = 1;

int tl_stop = 0;
int tl_x = 0;
int sm = 1;
int pausa = 0;

setup
void setup() {
a = 0;
b = 0;
c = 0;
d = 0;

zavity = 0; // turns
zaloha = 0; // backup

pocitadlo = 0; // counter
percento = 0; // percent
sekunda = 0; // seconds
minuta = 0; // minutes

// rotacny enkoder - vstupy = inputs for rotary encoder
pinMode(pin_clk, INPUT_PULLUP);
pinMode(pin_dt, INPUT_PULLUP);
pinMode(pin_sw, INPUT_PULLUP);

// nastav vstupy na "0" = set inputs to zero
digitalWrite(pin_clk, LOW);
digitalWrite(pin_dt, LOW);

// LCD - start
lcd.init();
lcd.clear();
lcd.backlight();

// motor - start
HCMotor.Init();
HCMotor.attach(0, STEPPER, step_pin, dir_pin);
}

// turn the stepper motor to desired count
void navi()
{
// pocitadlo zavitov = turns counter
pocitadlo++;
percento =

if(percento == 99 || percento > 100) { percento = 100; }

if(pocitadlo > zavity){ pocitadlo = zavity; }
if(zavity > 9999){ zavity = 0; }

// cas
if(cMillis - pMillis >= 1000)
{
if(pocitadlo < zavity)
{ sekunda++; }
pMillis = cMillis;
}

if(sekunda > 59) { sekunda = 0; minuta++; }

// Zapni motor - smer otacania
HCMotor.Direction(0, FORWARD);
//HCMotor.Direction(0, REVERSE);
HCMotor.Steps(0, CONTINUOUS);

// nabeh
if(pocitadlo > 0 && pocitadlo <= nabeh)
{
HCMotor.DutyCycle(0, nahor[pocitadlo]);
}
else if(pocitadlo > nabeh && pocitadlo <= stred + nabeh)
{
HCMotor.DutyCycle(0, frekmax);
krok_prvy = frekmax;
}
else if( pocitadlo > stred+nabeh && pocitadlo < stred + (2*nabeh))
{
HCMotor.DutyCycle(0,
}
else if(pocitadlo == stred+(2*nabeh))
{
// stop - motor
HCMotor.DutyCycle(0, 0);
}

// zobraz navijanie
lcd.setCursor(0, 1);
lcd.print(pocitadlo);
lcd.print(" ");

lcd.print(percento);
lcd.print("%");
lcd.print(" ");

// cas
lcd.print(minuta);
lcd.print(":");
lcd.print(sekunda);
lcd.print(" ");
/*
// odpocet
if(csekunda-sekunda == 0){
sekunda = 0;
csekunda = 59;
cminuta--;
}
lcd.print(cminuta);
lcd.print(":");
lcd.print(csekunda-sekunda);
*/
delay(500);
}

menu
// stranka0 = page0
void stranka0(){
poz_min = 0;
poz_max = 3;
tlac_max = 1;

lcd.setCursor(0, 0);
lcd.print("Set Mem Run Help");
switch(poz){
case 0: lcd.setCursor(0, 1);
lcd.print("--- ");
if(tlac == 1){ tlac = 0; poz = 0; stranka = 1; }
break;
case 1: lcd.setCursor(0, 1);
lcd.print(" --- ");
if(tlac == 1){ tlac = 0; poz = 0; stranka = 2; }
break;
case 2: lcd.setCursor(0, 1);
lcd.print(" --- ");
if(tlac == 1){ tlac = 0; poz = 0; stranka = 3; }
break;
case 3: lcd.setCursor(0, 1);
lcd.print(" ----");
if(tlac == 1){ tlac = 0; poz = 0; stranka = 4; }
break;
}
}

// page1 and etc
void stranka1(){
poz_min = 0;
poz_max = 9;
tlac_max = 4;

krok_prvy = 400;

// vypocet casu navijania
csekunda =
cminuta =

nabeh = int( zavity*n );
if(nabeh > velkost){ nabeh = 50; }

stred = zavity - (2*nabeh);

// pole = array - not work as I want
if (nahor != 0) {
nahor = (int*) realloc(nahor, velkost * sizeof(int));
} else {
nahor = (int*) malloc(velkost * sizeof(int));
}

// konstanta
krok_k =

nahor[0] = krok_prvy;
for(int i=1; i<nabeh; i++){
nahor[i] = nahor[i-1] - krok_k;
}
if (nadol != 0) {
nadol = (int*) realloc(nadol, velkost * sizeof(int));
} else {
nadol = (int*) malloc(velkost * sizeof(int));
}

nadol[0] = frekmax;
for(int i=0; i<nabeh; i++){
nadol[i] = nadol[i-1] + krok_k;
}

lcd.setCursor(0, 0);
lcd.print("Set tm: ");
lcd.print(cminuta);
lcd.print(":");
lcd.print(csekunda);
lcd.print(" ");

lcd.setCursor(0, 1);
lcd.print("z: ");
/*
if(eeprom == 1){
a = zavity / 1000;
b = (zavity / 100) % 10;
c = (zavity / 10) % 10;
d = zavity % 10;
}
*/
switch(tlac){
case 0: a = poz;
lcd.print("<");
lcd.print(a);
lcd.print(">");
lcd.print(b);
lcd.print(" ");
lcd.print(c);
lcd.print(" ");
lcd.print(d);
lcd.print(" ");
lcd.print("X");
lcd.print(" ");
break;

case 1: b = poz;
lcd.print(" ");
lcd.print(a);
lcd.print("<");
lcd.print(b);
lcd.print(">");
lcd.print(c);
lcd.print(" ");
lcd.print(d);
lcd.print(" ");
lcd.print("X");
lcd.print(" ");
break;

case 2: c = poz;
lcd.print(" ");
lcd.print(a);
lcd.print(" ");
lcd.print(b);
lcd.print("<");
lcd.print(c);
lcd.print(">");
lcd.print(d);
lcd.print(" ");
lcd.print("X");
lcd.print(" ");
break;

case 3: d = poz;
lcd.print(" ");
lcd.print(a);
lcd.print(" ");
lcd.print(b);
lcd.print(" ");
lcd.print(c);
lcd.print("<");
lcd.print(d);
lcd.print("> ");
lcd.print("X");
lcd.print(" ");
break;

case 4: lcd.print(" ");
lcd.print(a);
lcd.print(" ");
lcd.print(b);
lcd.print(" ");
lcd.print(c);
lcd.print(" ");
lcd.print(d);
lcd.print(" <");
lcd.print("X");
lcd.print(">");

if(poz == 1){
tlac = 0;
stranka = 0;
poz = 0;
}
break;
}
zavity = (1000*a) + (100*b) + (10*c) + d;
}

void stranka2(){
poz_min = 0;
poz_max = 2;
tlac_max = 1;

lcd.setCursor(0, 0);
lcd.print("Mem ");
lcd.setCursor(0, 1);
switch(poz){
case 0: lcd.print("Load ");
if(tlac == 1){
tlac = 0;
/*EEPROM.get(adresa, zavity);
lcd.setCursor(0, 1);
lcd.print(" Load...ok X");
delay(1000);
eeprom = 1;
*/
}
break;

case 1: lcd.print("Save ");
if(tlac == 1){
tlac = 0;
/*EEPROM.put(adresa, zavity);
lcd.setCursor(0, 1);
lcd.print(" Save...ok X");
delay(1000);
eeprom = 0;
*/
}
break;

case 2: lcd.print("Exit ");
if(tlac == 1){
lcd.setCursor(0, 1);
lcd.print(" ----");

tlac = 0;
stranka = 0;
poz = 1;
}
break;
}
}

void stranka3(){
poz_min = 0;
poz_max = 2;
tlac_max = 1;

lcd.setCursor(0, 0);
lcd.print("Run tm: ");
lcd.print(cminuta);
lcd.print(":");
lcd.print(csekunda);
lcd.print(" ");
switch(poz){
case 0: lcd.setCursor(0, 1);
lcd.print("Start/Pause ");
if(tlac == 1){
lcd.setCursor(0, 1);
lcd.print(" ");
navi();
}
break;

case 1: lcd.setCursor(0, 1);
lcd.print("Reset ");
if(tlac == 1){
lcd.setCursor(0, 1);
lcd.print("Reseting counts ");
delay(500);

tlac = 0;
sekunda = 0;
pocitadlo = 0;
}
break;

case 2: lcd.setCursor(0, 1);
lcd.print("Exit ");
if(tlac == 1){
lcd.setCursor(0, 1);
lcd.print(" ----");

tlac = 0;
stranka = 0;
poz = 2;
}
break;
}
}

void stranka4(){
poz_min = 0;
poz_max = 1;
tlac_max = 1;

lcd.setCursor(0, 0);
lcd.print("Help ");
lcd.setCursor(0, 1);
switch(poz){
case 0: lcd.print("www.arduino.sk ");
break;

case 1: lcd.print("Exit ");
if(tlac == 1){
lcd.setCursor(0, 1);
lcd.print(" ----");

tlac = 0;
stranka = 0;
poz = 3;
}
break;
}
}

loop
void loop() {
cMillis = millis();

// vstupy = inputs
clk = digitalRead(pin_clk);
dt = digitalRead(pin_dt);
sw = digitalRead(pin_sw);

// zisti smer rotacie = get direction of rotation
if(clk == LOW && dt == HIGH){ smer = 1; }
if(clk == HIGH && dt == LOW){ smer = 2; }

// do prava = if turning right
if((clk == LOW && dt == LOW && smer == 1) ||
(clk == HIGH && dt == HIGH && smer == 2)){
smer = 0;

// pozicia kurzora na stranke
poz++;
delay(5);
if(poz > poz_max) { poz = poz_max; }
}

// do lava = if turning left
if((clk == LOW && dt == LOW && smer == 2) ||
(clk == HIGH && dt == HIGH && smer == 1)){
smer = 0;

// pozicia kurzora na stranke
poz--;
delay(5);
if(poz < poz_min) { poz = poz_min; }
}

// tlacidlo = encoder buttons switch
if(sw == LOW)
{
tlac++;
delay(100);
if(tlac > tlac_max) {tlac = 0;}
}

// page switch
switch(stranka){
case 0: stranka0(); break;
case 1: stranka1(); break;
case 2: stranka2(); break;
case 3: stranka3(); break;
case 4: stranka4(); break;
}
}

mrstanlez
Автор

Hello, could you provide the source code for this? Many thanks!

KLIPPANLAN