Knapper og Display kan være et MENU-system

Formålet med dette eksperiment er, at vise hvordan ARDUINO kan have et MENU-system, baseret på kun brug af en enkelt port.

Samme opsætning som vist herunder, blot med kun 5 knapper, men kunne sagten have været ført videre med alle 8 knapper.

Det du skal vide er allerede forklaret på forrige eksempel, så jeg går hermed videre til programmet.

DEMO af programmet ses her:  https://www.youtube.com/watch?v=maPy11RSemI

Under routinen CheckKnap() i programmet herunder, er forklaret sammenhængen mellem modstands-dekaden og de tal der testes for, og det vil jeg ikke uddybe nærmere her.

Hvis der noget du er i tvivl om, så spørg!

//
//**********************************************************************
//** HALLO WORLD med LCD-display.                                     **
//** Hvordan styrer man display på linje, og cursor-possition ?       **
//** de OZ6YM, Palle, april 2015                                      **
//**                                                                  **
//** I dette program ser vi på, hvordan man tilslutter et             **
//** LCD-display, hvordan man styrer, linjer og kolonner, samt        **
//** udskriver tekst på displayet.                                    **
//** Desuden styrer vi 5 knapper og danner en MENU med blot           **
//** en enkelt ANALOG port, samt måler spændingen på de 5             **
//** knapper, og udskriver på displayet                               **
//**********************************************************************
// include the library code:                                          **
//**********************************************************************
#include <LiquidCrystal.h>
// initialize biblioteket til LCD-DISPLAYET
//**********************************************************************
//** Vælg de pinde på LCD der skal bruges                             **
//**********************************************************************
// LiquidCrystal lcd(RS, E, D4, D5, D6, D7)                           **
//**********************************************************************
LiquidCrystal lcd(3,4,6,7,8,9);             // standard for OZ6YM, Palle
const int colums = 20;               // 16 eller 20 karakterer pr. linje
const int rows = 4;                                  // 2 eller 4 linjer
//**********************************************************************
//************  tællere der benyttes i programmet  *********************
//**********************************************************************
int analogPin = A3;                          // port der læser knapperne
int KNAP;                       // Variabel til læsning af knap-nummeret
float voltage = 0; 
float val = 0;
float REF;

//**********************************************************************
void setup()
{
//**********************************************************************
Serial.begin(9600);           // aktiveres hvis man skal DEBUGGE program
//**********************************************************************
//*****      Initialicer LCD med antal collonner og linjer        ******
//**********************************************************************
//** setup() benyttes i begyndelse af et program til at initialicere
//** variable, der kun skal køres een gang i programmet
lcd.begin(colums, rows);
lcd.setCursor(0,0); lcd.print("Hello World de OZ6YM");          // Print
lcd.setCursor(1,1); lcd.print("MENU-system ");
lcd.setCursor(0,2); lcd.print("Vaelg 1 af 5 knapper ");
lcd.setCursor(7,3); lcd.print("VER.1.0 ");
delay(2000);                              // vis meddelelse i 2 sekunder
lcd.clear();                                         //--> CLEAR diaplay
REF = 4.98;                   // MIN SPÆNDING ER IKKE HELT STABIL 5 Volt
}
//**********************************************************************
//** END af SETUP **
//**********************************************************************


//**********************************************************************
//** HOVED LOOP, HER HVOR ALTING STYRES FRA **
//** LOOP-routinen skal være så kort som muligt, for at holde et **
//** godt overblik over, hvad der sker i programmet **
//**********************************************************************
void loop()
{
 checkKnap();  
                           // Er der trykket på en KNAP ?

 switch (KNAP) {
// Linien herunder udføres som DEFAULT, når der ikke skal ske noget   **
//**********************************************************************
 
case 102: lcd.setCursor(3,0); lcd.print("MENU oversigt:"); break;
//**********************************************************************

 
//** Udfør MENUPUNKTER **
//**********************************************************************
  case 0: lcd.setCursor(2,1); lcd.print("MenuPunkt 1"); 
// Her kan indsættes en Procedure til servicering af Menupunkt 1 

 
break;

  case 51: lcd.setCursor(2,1); lcd.print("MenuPunkt 2");
// Her kan indsættes en Procedure til servicering af Menupunkt 2 

  break;

  case 68: lcd.setCursor(2,1); lcd.print("MenuPunkt 3"); 
// Her kan indsættes en Procedure til servicering af Menupunkt 3 

  break;

  case 76: lcd.setCursor(2,1); lcd.print("MenuPunkt 4"); 
// Her kan indsættes en Procedure til servicering af Menupunkt 4

  break;

  case 81: lcd.setCursor(2,1); lcd.print("MenuPunkt 5");
// Her kan indsættes en Procedure til servicering af Menupunkt 5 

  break;
}

}

//**********************************************************************
//**                     END af HOVED LOOP                            **
//**********************************************************************

//**********************************************************************
//**   Check om der er trykket på en KNAP, og læs analogporten ind    **
//**********************************************************************
void checkKnap()
{
//**********************************************************************
// Den analoge port kan antage værdier mellem 0 og 1023.              **
// Tag det læste tal, divider med 10, og smid decimaldelen væk(int)   **
// hvis der ikke er trykket på en knap, vil dette tal altid være 102  **
// +- støj-ændring, som kan gå under 1020.                            **
// Med 5 knapper vil tallene der returneres være: 0, 51. 68, 76, 81   **
// selvfølgelig afhængiet af, hvilke modstandsværdier der er brugt    **
// Modstands-decaden består af 5 modstande på hver 1 K Ohm.           **
// derfor vil Menupunkt 1 altid blive aflæst som værende 0,           **
// da den er direkte målepunkt.                                       **
// Menupunkt 2 vil være 50 % af spændingen,                           **
// Menupunkt 3 vil være 66 % af spændingen,                           **
// Menupunkt 4 vil være 75 % af spændingen,                           **
// Menupunkt 5 vil være 80 % af spændingen 5 volt, som er Refferance  **
//**********************************************************************
KNAP = int(analogRead(analogPin)/10);                 // Læs analog-port

// På grund af støj/spændingsændring af forsyningen, testes på om     **
// tallet er under 100, istedet for 102 **
// *********************************************************************
if ( KNAP <= 100 )                            // test om KNAP er trykket
{                                           // der er trykket på en knap
                                       // Her indlæses spændingen i VOLT
float voltage = analogRead(analogPin) * (REF / 1024.0);
// Hvis din REFspænding ikke er præcis 5 volt, finindstil den - til 1024 

                 // Hvis knappen stadig er trykket, da TEST porten igen, 
                                           // indtil HAN slipper KNAPpen
Test: if ( int(analogRead(analogPin)/10) <= 100 ) { goto Test;} 

                                   // Check om spændingen har ændret sig
if ( voltage != val) { float val = voltage; }
                        // Udskriv på ny, hvis spændingen har ændret sig
lcd.setCursor(1,3); lcd.print("KNAP-VOLT: = "); lcd.print(voltage);


//
Serial.print("Volt: ");Serial.println(voltage);
//
Serial.println(KNAP);
}
}

//**********************************************************************
//** END af checkKnap() **
//**********************************************************************

//**********************************************************************
//** END of PROGRAM **
//**********************************************************************