Remote control (12 / 17 steg)
Steg 12: Koden - 4 knappen
Spjäll joysticken har ca 70% av rörelse framåt och resten, 30% jag använt det för paus och jag behövde något för omvänd så jag tänkte att en växla bakåt / framåt. Och om jag sätter en knapp, sagt låt oss sätta fler alternativ:
1. autopilot - detta kommer att hålla full gas tills du träffar rast, så till exempel, du sätter gasen till 40% och du låter det tillbaka till 0%, autopiloten hålla gaspedalen till 40% och om du gå igen till 70%, autopiloten sätter gasen till 70%. När du träffar paus autopilot är inaktiverat och gas går till 0%.
2. strålkastare - på / av: P
3. divider - för det här alternativet jag har 4 stater, och varje stat kommer att dela upp gasen så om du vill gå långsammare och med en hög o hantering kan du ange spjäll på 25% (du har gasspjället på 25% när joysticken är 100%). Divider alternativ är som här, 100% divider off, 75%, 50% och 25%.
4. vända
För varje alternativ har jag 2 grejer sparas i EPROM, första en jag har knappen talet och staten. Spara knappen nr, gör det enkelt att ändra den, så om du vill kan du sätta alternativet Omvänd på första knappen och sedan ändra den till 3: e-knappen.
Här är hur jag ändra alternativet knapp
int EpromPozBut = 58.
LCD.Clear();
för (int x = 0; x < 4;) {
readkey();
lcd.setCursor (0, 1);
LCD.Print ("tryck sedan ok");
lcd.setCursor (0, 3);
strcpy_P (buffert, (char *) pgm_read_word (&(but_set[x]))); but_set [] lagrar namnet på alternativ (autopilot, revrse..)
LCD.Print(buffer);
lcd.setCursor (0, 4);
LCD.Print ("du trycker");
LCD.Print(but);
om (nyckel == "ok") {///if du trycker ok
EpromPozBut += 2. öka med 2 (EEPROMWriteInt() sparar int så behöver 2 byte att lagra)
EEPROMWriteInt(EpromPozBut, but); Spara men nr i eprom
x ++; öka x (för "för": p)
LCD.Clear();
}
om (x == 4 || nyckel == "tillbaka") {///exit om du finis med 4 alternativ eller slå tillbaka
Level = 1;
LCD.Clear();
}
}
För att aktivera ett alternativ måste du checka in eprom se där du har sparat knapp nr.
Exempel:
i eprom jag förvara det såhär: 60 är autopilot knapp nr och 70 är staten
62 är strålkastare knapp nr och 72 är staten
64 är divider knapp nr och 74 är staten
66 är omvänd knapp nr och 76 är staten
So...if du trycka på knappen 3 kommer ni att se var i 60, 62,64,66 är lagrad "3", när du hittar det kontrollera staten och ändra den
void buttonPress() {
om (men! = 0) {
int addrNrBut = 58.
int addrStateBut = 68.
för (int x = 0; x < 4; x ++) {/ / gå på alla 4 eprom position
addrNrBut += 2.
addrStateBut += 2.
Om du hittar knappen nr på eprom 64 (spjäll avdelare) måste du hantera detta på ett annorlunda sätt
eftersom du har 4 stater
om (men == EEPROMReadInt(addrNrBut) & & addrNrBut == 64) {//throttle divider
om (EEPROMReadInt(addrStateBut) < 3) {
EEPROMWriteInt (addrStateBut, (EEPROMReadInt(addrStateBut) + 1));
x = 4.
men = 0;
}
annat if (EEPROMReadInt(addrStateBut) == 3) {
EEPROMWriteInt (addrStateBut, 0);
x = 4.
men = 0;
}
}
resten av knapparna är bara på / av (1/0)
om (men == EEPROMReadInt(addrNrBut) & & addrNrBut! = 64) {
om (EEPROMReadInt(addrStateBut) == 0) {
EEPROMWriteInt (addrStateBut, 1);
x = 4.
men = 0;
}
annat if (EEPROMReadInt(addrStateBut) == 1) {
EEPROMWriteInt (addrStateBut, 0);
x = 4.
men = 0;
}
}
}
Delay(160);
}
}
Och en sak på de 4 knapparna, de led indikatorerna. Eftersom jag kan ändra alternativet på en knapp, är lite knepigt:
void ledUpdate() {
int state = 68.
int adr = 58.
för (int x = 0; x < 4; x ++) {
statliga += 2.
ADR += 2.
IF(EEPROMReadInt(State) == 0){digitalWrite(led[EEPROMReadInt(adr)], låg);}
annat if(EEPROMReadInt(state)! = 0){digitalWrite(led[EEPROMReadInt(adr)], hög);}
}
}