Jotain tähän suuntaan sitten. Käänsin, mutta en ole ajanut kertaakaan läpi, kun ei ole mitään millä testata. Jos sinulla onkin digitaaliset napit, niin pitäisi korvata analogRead useammalla digitalRead-kutsulla ja toimia sen mukaan mikä nappi oli pohjassa. Funktiota get_key ei silloin välttämättä tarvita ainakaan tuossa muodossa. Tämäkin koodi lukee napin tilan kahteen kertaan ja ilmeisesti tarkoitus on välttää reagoimasta kohinaan tms (debounce).
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int NUM_KEYS = 5;
int adc_key_val[NUM_KEYS] ={30, 150, 360, 535, 760 };
int adc_key_in;
int key=-1;
int oldKey=-1;
enum tila_t { INFO, NOUSU, GEAR } tila;
const double MIN_NOUSU = 10;
const double MAX_NOUSU = 32;
const double MIN_GEAR = 1.32;
const double MAX_GEAR = 2.60;
double nousu;
double gear;
double maxnopeus;
void setup()
{
pinMode(13, OUTPUT);
lcd.begin(16,2);
lcd.print("Initializing...");
nousu = 17.00;
gear = 2.60;
maxnopeus = 0.00;
tila = INFO;
}
void loop()
{
adc_key_in = analogRead(0); // read the value from the sensor
digitalWrite(13, HIGH);
key = get_key(adc_key_in);
if (key != oldKey)
{
delay(50); // wait for debounce time
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in);
if (key != oldKey)
{
oldKey = key;
if (key >= 0)
paivitaTila(key);
}
}
switch(tila)
{
case INFO:
menuInfo();
break;
case NOUSU:
menuNousu();
break;
case GEAR:
menuGear();
break;
}
digitalWrite(13, LOW);
}
// näytä infotila
// lue nopeus, jos nopeus suurempi kuin max, päivitä.
// lue kierrosluku, laske, päivitä näyttö uusilla arvoilla.
void menuInfo()
{
lcd.print("info");
}
// näytä potkurin asetustila
// lue nousu
void menuNousu()
{
lcd.print("nousu");
}
// näytä vaihteiston asetustila
// lue gear
void menuGear()
{
lcd.print("gear");
}
//tilakone
// muokkaa muuttujien arvoja
void paivitaTila(int input)
{
switch(input)
{
case 0: // oikea
case 3: // vasen
if (tila == NOUSU)
tila = GEAR;
else if (tila == GEAR)
tila = NOUSU;
break;
case 1: // ylos
if (tila == NOUSU && nousu < MAX_NOUSU)
nousu++;
else if (tila == GEAR && gear < MAX_GEAR)
gear += 0.01;
break;
case 2: // alas
if (tila == NOUSU && nousu > MIN_NOUSU)
nousu--;
else if (tila == GEAR && gear > MAX_GEAR)
gear -= 0.01;
break;
case 4: // select
if (tila == INFO)
tila = NOUSU;
else
tila = INFO;
break;
}
}
// Convert ADC value to key number
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
return k;
}
if (k >= NUM_KEYS)
k = -1; // No valid key pressed
return k;
}