Remote control (9 / 17 steg)
Steg 9: Den "Kod" :)) kod
Koden är ganska stort och det blir ganska svårt att förklara och inga bilder hjälper också: P
De första försöken fick jag 99% microcontroller minne, blixten och RAM, så jag lärde mig att använda "programem" att skriva en int i EPROM, även LCD-chaufför eller bibliotek... och mycket mer.
OK låt oss börja med Lcd.
Första gången du inte inkludera biblioteket #include. I biblioteket gjorde jag en klass så "statisk PCF8814 lcd," kan vara till hjälp så att du kan använda det som "lcd.print ("bil remote")". Jag lade lcd upp sidan ner i fallet så i installationsprogrammet är något som denna "lcd.begin(); LCD.rotate(1);". Funktionen börjar börjar lcd och definiera stiften att arduino användning till konen med lcd, så om du behöver ansluta på andra stift, vända PCF8814.h vara säker ordningen av stiften men jag tycker är så här, från standard lcd.begin(13,11,12,10); rotate() med 1 slå img på lcd upp sidan ner och med 0 är normalt.
Du kan skriva ut med lcd.print() sträng; Ställ markören med lcd.setCursor(y,x), y är raden (1 rad = 8 pixlar) på denna lcd du har 8 rader, första raden är 0 och sista 7, och y är antalet pixel från letf till höger; och du kan göra mer men du kommer att se det senare.
Nu hur man läser analoga knapparna.
int analogValue = analogRead(analogKeyPin); / / / returnerar ett värde beroende på vad knappen du trycker (titta bara på scheman och försök att tänka där curent flow, du kommer att ha diferit rezistance på varje knapp). seriella monitor kan du läsa dem eller lcd.print(analogValue) att skriva ut dem på lcd, då vissa om-s eller switch/fall och du är klar t.ex.
om (analogValue > 25 & & analogValue < 40) {nyckel = "meniu";}
annars om (analogValue > 40 & & analogValue < 70) {nyckel = "tillbaka";}
Jag använde sträng att förvara nyckeln eftersom är lättare att programmet men en int kan du spara mer RAM-minne.
Det bigest problemet jag hade var strängar för menius så jag använde är att blockera strängarna i flash-minnet. Så gjorde jag en rad som denna:
prog_char meniu_0 [PROGMEM] = "Obtions";
prog_char meniu_1 [PROGMEM] = "Autoset";
prog_char meniu_2 [PROGMEM] = "Stearing uppsättning";
PROGMEM const char * meniu [] = {meniu_0, meniu_1, meniu_2};
Detta sätt kan du easyely generera menius
för (uint8_t x = 0, x < 7, x ++) {/ / 7 är antalet alternativ i
menyn, så sluta den för på 6 poz
lcd.setCursor (6 x);
läsa från progrmem strcpy_P (buffert, (char *) pgm_read_word (& (meniu [pozMeniu + x])));
LCD.Print(buffer);
}
7 är antalet alternativ i menyn, så gör det "för" 7 gånger, sedan Ställ markören för att skriva ut från första row(0) med x som detta kommer att gå på nästa rad när prog gör andra gången den, jag börja skriva ut alternativ från den 6: e pixeln eftersom jag kommer att dra markören från 0 till 6. Nu strcpy_P funktionen Kopiera strängen från programen i en buffert som jag förklarar det med 50 tecken är lite för mycket men du måste vara säker att det nog, efter att bara skriva ut bufferten.
pgm_read_word (& (meniu [pozMeniu + x]))
Detta läser värdet på menyn är array [0], om pozMeniu och x är "0". Jag använder pozMeniu eftersom när jag kommer att sätta markören och jag vill gå upp och ner och låt oss säga jag har 10 obtions en bara 7 rader, när jag går med markören på det 7: e alternativet och jag vill gå downer jag bara kommer att göra pozMeniu = 1 så här jag kommer att skriva ut från och med det andra alternativet och på den 7: e raden har jag alternativet 8. För att jag gjorde en liten funktion som behöver en parameter, antalet obtions. Så för sista exempel är "upDown_navigate(6);" (också börja räkna med "0"). Om du data överför koden har jag funktionen förklarat där.
UpDown_navigate(); Returnerar också en "pozCursor" som det kommer att ändras när du går upp och ner så kan du skriva ut en markör som denna:
lcd.setCursor (0, pozCursor);
LCD.Print("\2");
Den "/ 2" är andra char att jag definiera det. är markören som en sa. Ja, du kan lägga till anpassade tecken, du ser i länken med hela koden.
Om du vill göra en undermeny kan du göra så här (är bara en idé, jag gjorde det så här):
"level" - här jag använda det i void loop() för att gå till en specifik skärm (jag har funktion för varje meny)
"countUpDown" - detta genereras av upDown_navigate(), sparar ståndpunkten på array (du vet vilken obtion du väljer)
< p > om (nyckel == "ok") {
växel (countUpDown) {
fall 0:
Level = 2;
countUpDown = 0;
pozCursor = 0;
pozMeniu = 0;
LCD.Clear();
bryta;
fall 1:
Level = 3.
countUpDown = 0;
pozCursor = 0;
pozMeniu = 0;
LCD.Clear();
bryta;
fall 2:
Level = 4.
countUpDown = 0;
pozCursor = 0;
pozMeniu = 0;
LCD.Clear();
bryta;