Claudio_FF:
Ad esempio questa è la parte relativa alla regolazione ora/minuti
Maurotec:
Io in questi casi (o meglio sempre) tra {} ci faccio il passaggio dallo stato corrente a quello futuro
Ho sempre seguito con molto interesse i vostri thread sulla programmazione a stati e le sue varie implementazioni. Qualche mese fa ce ne fu uno su un impianto di irrigazione, che ancor oggi ogni tanto vado a rileggere (alcuni post in particolare).
Mi piace la piega che ha preso questo thread, e vi ringrazio, perchè leggendovi, mi sono accorto che nei miei progetti (più o meno complessi), solitamente implemento questi principi in modo naturale (loop mai fermo, stato/fase, uso del tempo, etc.); vuol dire che i vostri insegnamenti sono stati utili 
Per esempio, questi sono gli stati, di un orologio con timer (oled+4 pulsanti)
enum STATE {
VIEW_NONE = 0,
VIEW_CLOCK = 1,
VIEW_TIMER = 2,
VIEW_ALARM = 3,
SET_CLK_DAY = 11,
SET_CLK_MONTH = 12,
SET_CLK_YEAR = 13,
SET_CLK_HOUR = 14,
SET_CLK_MINUTE = 15,
SET_CLK_SECOND = 16,
SET_TMR_HOUR = 21,
SET_TMR_MINUTE = 22,
SET_TMR_SECOND = 23
};
e questa è una parte del loop per la gestione degli stessi
void loop() {
//Prelevo data, ora e millis una sola volta
currentMillis = millis();
time_t nowTime = now();
//Verifico lo stato dei pulsanti e definisco lo stato corrente
checkButtonsState();
//..omissis..
if (
buttons[IDX_BTNS(BTN_MODE)][2]
|| (curState < SET_CLK_DAY && (currentMillis - lastRefreshTime) >= CLK_TIME)
|| ((curState >= SET_CLK_DAY || curState == VIEW_ALARM) && (currentMillis - lastRefreshTime) >= BLINK_TIME)
) {
if (curState == VIEW_NONE) {
digitalWrite(LED_RED, blinkState);
blinkState = !blinkState;
} else if (curState == VIEW_CLOCK) {
displayClock(nowTime);
} else if (curState == VIEW_TIMER) {
displayTimer(nowTime, curAlarm);
} else if (curState == VIEW_ALARM) {
displayAlarm();
} else if (curState >= SET_CLK_DAY && curState <= SET_CLK_SECOND) {
displayClock(setupTime);
} else if (curState >= SET_TMR_HOUR && curState <= SET_TMR_SECOND) {
displayTimer(nowTime, setupAlarm);
}
lastRefreshTime = currentMillis;
}
//..omissis..
} //loop
Ok, quella prima if è alquanto complessa, forse la si potrebbe semplificare, ma al momento il progetto è fermo perchè voglio aggiungere un chip per il debouncing hardware dei quattro pulsanti, in ogni caso funziona come voglio.
Stesso discorso per la macchinina
enum MODE {
MOD_NONE = 48,
MOD_AUTO = 49,
MOD_BT = 50,
MOD_IR = 51,
MOD_CONFIG = 52
};
enum COMMAND {
CMD_NONE = 48,
CMD_STOP = 49,
CMD_FORWARD = 50,
CMD_FORWARD_RIGHT = 51,
//..omissis..
};
//Nel loop
switch (readedMod) {
case MOD_NONE: { //..omissis.. }
case MOD_AUTO: { //..omissis.. }
case MOD_BT: {
switch (readedCmd) {
case CMD_FORWARD_LEFT: { //..omissis.. }
case CMD_ACCELERATE: { //..omissis.. }
case CMD_DECELERATE: { //..omissis.. }
//..omissis..
}
Chiaramente non mi sto auto-celebrando :), voglio solo ringraziarvi dimostrandovi che il tempo che impiegate (volontariamente) nella divulgazione, non è tempo perso, almeno io (ma sono convinto tanti altri) ne faccio buon uso.
GRAZIE
Federico