Consiglio di programmazione

Ciao a tutti,
in questi giorni di festa :slight_smile: :slight_smile: , mi sto divertendo con il nostro amico Arduino uno, in poche parole sto realizzando da molto neofita di questo bel mondo un programma che racchiude 10 pagine di menu per impostazioni varie.
Hardware: Arduino Uno, LCD 2x16 I2C, Tastiera 4x3 con PCF8574, modulo rtc i2c ds1307, ho scelto queste configurazioni in modo tale da lasciare più pin liberi su Arduino.
Tornando al software,
la prima pagina comando un led con due codici uno per accendere e uno per spegnere
la seconda per regolare l’orologio
andrò avanti con le altre pagine per impostare dei tempi di attivazione, numeri di telefono ecc. (dipende cosa mi viene in mente) :grin: :grin:
Consapevole che con Arduino bisogna costruirsi tutto o quasi, la mia domanda è se qualcuno ha voglia di perderci un po di tempo per spiegarmi se esistono delle funzioni più semplici che occupano meno memoria, oppure se sto seguendo la strada giusta.
Attenzione che come premesso sono un neofita con pochi mesi di esperienza in questo mondo, consapevole che molte conoscenze mi mancano… :-[ :-[ :-[ Allego programma
Grazie ancora a Tutti

lcd_tastiera_i2c_rtc_menu.ino (21.3 KB)

Non mi pare male come codice! Da un'occhiata veloce, la prima cosa che noto subito è che hai definito un pin, ovvero quello del LED, con int il che non ha molto senso. Ma è un'errore comune di moltissimi esempi! Per definire un pin che è una costante, non serve una variabile, in più un pin non assumerà mai valori compresi tra 32767 e -32768. Quindi usa define :wink:

Questo :

int Led = 13;

Diventa

#define Led 13

Ciao!

As_Needed:
Non mi pare male come codice! Da un'occhiata veloce, la prima cosa che noto subito è che hai definito un pin, ovvero quello del LED, con int il che non ha molto senso. Ma è un'errore comune di moltissimi esempi! Per definire un pin che è una costante, non serve una variabile, in più un pin non assumerà mai valori compresi tra 32768 e -32768. Quindi usa define :wink:

Questo :

int Led = 13;

Diventa

#define Led 13

Ciao!

Ciao, hai ragione non ci avevo pensato grazie 1000

Io ti consiglio anche di dare un'occhiata ai cicli for ;). Però bravo, quel che hai fatto finora è ben organizzato, decisamente molto meglio della media dei neofiti a cui siamo abituati qui.

PS per @As_Needed: -32768...+32767 :).

Grazie SukkoPera, i cicli for sono il mio cruccio :’( :’( è dove sbatto più la testa e perdo tempo :-* :-*
ho aggiunto alla pagina tre il test di una sonda di temperatura in ONE_WIRE_BUS, ho scelto questa perchè secondo me è la più precisa e facile da gestire ( si ha uno scarto di 0,2°C con temperatura -15°C), ho un piccolo problema che non riesco a visualizzare il simbolo del “°” sul LCD, mi da un carattere strano, questo è quanto ho scritto:

sensors.requestTemperatures();
for (int i = 0; i < numberOfDevices; i++)
{
lcd.setCursor(0, 0);
lcd.print(“Sensore “);
lcd.print(i);
lcd.setCursor(0, 1);
lcd.print(sensors.getTempCByIndex(i));
lcd.print(” °C”);
delay(100);
}

È perché quel simbolo non fa parte dell'ASCII a 7 bit, per cui l'LCD usa un codice diverso. Ora non ricordo quale sia, ma se cerchi sul forum ne abbiamo già parlato in passato.

32767 si :smiley:


Dai un'occhiata QUI dovresti riuscire a risolvere :wink:

As_Needed:
32767 si :smiley:


Dai un'occhiata QUI dovresti riuscire a risolvere :wink:

Ottimo Grazie disponibili come sempre :slight_smile:
risolto con
lcd.print((char)223);
Grazie ancora

Due domande anche se banale ma per capire bene,
1° per azionare un utenza (uscita) per un certo tempo, avendo uno scudo RTC, posso far riscontro al byte secondi e/o minuti, anzichè usare i millis??
2° Arduino rimane attivo all'infinito o ha un tempo di ciclo? avevo letto ma non ricordo dove e bene (poichè studio di notte) :sleeping: :sleeping: , che necessitava resettare i millis, oppure se si utilizza lo scudo RTC con batteria questo non accade (sempre se vero)
Grazie ancora
Ciao Giovanni

  1. A meno che non ti serva una precisione alta (tipo con un DS3231 per fare un cronometro) si può usare benissimo millis() che male non fa!

  2. millis() arriva fino a un valore di 4.294.967.295 (quasi 50 giorni) dopo di che riparte da zero. millis() non può resettarsi, è semplicemente lo scorrere del tempo dall'accensione di Arduino. :wink:
    Poi sei tu (e noi :stuck_out_tongue: ) che con il codice bisogna gestirlo come si deve, utilizzando variabili appropriate e if impostati bene in modo da risolvere in qualche modo questo overflow.
    Consiglio QUESTA utile guida.
    Ciao !

Hahaha fatta la legge fatto l'inganno, appena riesco provo grazie ancora alla prossima titubanza
Ciao Giovanni

Di niente :slight_smile:

ho visto il codice ma non ho letto tutto il post ..io so che un bravo programmatore a casa mia scrive i commenti ad ogni funzione... cosi tra qualche anno sa cosa doveva fare.

Esempio i case dello switch che nemmeno io non so cosa fanno.

io ti consiglio di mettere i commenti che cosi ti ricordi.

buona serata.

SistemaL:
ho visto il codice ma non ho letto tutto il post ..io so che un bravo programmatore a casa mia scrive i commenti ad ogni funzione... cosi tra qualche anno sa cosa doveva fare.

Esempio i case dello switch che nemmeno io non so cosa fanno.

io ti consiglio di mettere i commenti che cosi ti ricordi.

buona serata.

Si hai ragione, infatti sto iniziando a metterli, grazie del consiglio