Paso 12: El código - ese botón 4
La palanca de mando del acelerador tienen un 70% del movimiento hacia adelante y el resto, 30% utiliza para romper y necesitaba algo para atrás así que estaba pensando a un conmutador adelante / atrás. Y si pongo un botón, le dije vamos a poner más opciones:
1 piloto automático - Esto evitará que el acelerador hasta llegar a la rotura, así por ejemplo, poner el acelerador hasta el 40% y lo dejas a 0%, el piloto automático Mantenga el acelerador hasta el 40% y si vas otra vez al 70%, el piloto automático establece el acelerador hasta el 70%. Al golpear rotura piloto automático está desactivado y acelerador va a 0%.
2 faros - encendido / apagado: P
3 divisor - para esta opción tengo 4 Estados y cada estado dividirá el acelerador así que si quieres ir más despacio y con un manejo de alta tasa o puede fijar el acelerador al 25% (tendrá aceleración en 25% cuando la palanca de mando está al 100%). Opciones del divisor es como este, divisor del 100% de 75%, 50% y 25%.
4 reversa
Para cada opción tengo 2 cosas en EPROM, primer uno tengo el número del botón y el estado. Ahorro el nr de botón, hacen fácil cambiarlo, así que si quieres puede poner la opción inversa en el primer botón y luego cambiar al botón 3.
Aquí es cómo cambiar la opción de botón
int EpromPozBut = 58; lcd.clear(); for (int x = 0; x < 4; ){ readkey(); lcd.setCursor(0, 1); lcd.print("press the key then ok"); lcd.setCursor(0, 3); strcpy_P(buffer, (char*)pgm_read_word(&(but_set[x]))); //but_set[] stores the options name (autopilot, revrse..) lcd.print(buffer); lcd.setCursor(0, 4); lcd.print("you press key"); lcd.print(but); if (key == "ok"){ ///if you hit ok EpromPozBut += 2; //increase with 2 (EEPROMWriteInt() saves int so needs 2 bytes to store) EEPROMWriteInt(EpromPozBut, but); // save the but nr in eprom x++; //increase the x (for "for" :p) lcd.clear(); } if (x == 4 || key == "back"){ ///exit if you finis with the 4th option or hit back level = 1; lcd.clear(); } }
Para activar una opción que tienes que comprobar en eprom para ver donde has almacenado el nr de botón.
Ejemplo:
en eprom almaceno así: 60 es el nr de botón de piloto automático y 70 es el estado
62 es el nr de botón de la linterna y 72 es el estado
64 es el nr de botón divisor y 74 es el estado
66 es el nr de botón de reverso y 76 es el estado
So...if pulsar el botón 3, tienes que ver donde en 60, 62,64,66 es almacenada "3", cuando se encuentra el estado y modificarlo
void buttonPress(){ if (but != 0){ int addrNrBut = 58; int addrStateBut = 68; for(int x = 0; x < 4; x++){ // go on all 4 eprom position addrNrBut += 2; addrStateBut += 2;//////if you find the button nr on eprom 64 (throttle divider) you need to handle this in a diferent way///////because you have 4 states if (but == EEPROMReadInt(addrNrBut) && addrNrBut == 64){ //throttle divider if (EEPROMReadInt(addrStateBut) < 3){ EEPROMWriteInt(addrStateBut, (EEPROMReadInt(addrStateBut) + 1) ); x = 4; but = 0; } else if (EEPROMReadInt(addrStateBut) == 3){ EEPROMWriteInt(addrStateBut, 0); x = 4; but = 0; } }/////the rest of buttons are just on / off (1/0) if (but == EEPROMReadInt(addrNrBut) && addrNrBut != 64){ if (EEPROMReadInt(addrStateBut) == 0){ EEPROMWriteInt(addrStateBut, 1); x = 4; but = 0; } else if (EEPROMReadInt(addrStateBut) == 1){ EEPROMWriteInt(addrStateBut, 0); x = 4; but = 0; } } } delay(160); } }
Y una cosa mas en esos 4 botones, los indicadores led. Porque puedo cambiar la opción de un botón, es un poco complicado:
void ledUpdate(){ int state = 68; int adr = 58; for(int x = 0; x < 4; x++){ state += 2; adr += 2; if(EEPROMReadInt(state) == 0){digitalWrite(led[EEPROMReadInt(adr)], LOW); } else if(EEPROMReadInt(state) != 0){digitalWrite(led[EEPROMReadInt(adr)], HIGH); } } }