Classi e oggetti: suggerimenti?

Buongiorno!

Ho una domanda che non è specifica, ma è piuttosto un dubbio sulla "strategia" da adottare in fase di programmazione. Quindi è del tutto teorica.

Situazione:

  • Arduino UNO (per esempio)
  • scheda relè per comandare carichi come luce, cancello, ecc.
  • sensori in ingresso: temperature, luminosità, ecc.
  • link seriale ad un pc per comunicazioni (sia input che ouput)

Tralasciando la parte hardware, mi chiedevo come organizzare il codice in modo pulito, ordinato e riutilizzabile.

Esempio: voglio che l'oggetto "carico" (che può essere fisicamente una lampadina) sia appunto un oggetto in senso informatico, una classe.

Allora dovrei creare una libreria che contenga la definizione dell'oggetto:

  • pin output
  • pin stato del carico (ritorno dell'informazione tramite altro pin digitale)
  • tipologia: potrebbe essere temporizzato, o tipo pulsante (->passo passo), interruttore (relè monostabile?)
  • ecc.

Meglio ancora, la classe "carico da comandare" potrebbe avere un oggetto "comando" che in qualche modo rappresenta la tipologia appena elencata: se gli dico che è di tipo "0" (=temporizzato) saprò che all'attivazione avrà un delay; se è di tipo "1" (=passo-passo) saprò che avrà un HIGH->delay->LOW, ecc.

Metto 2 righe in croce con sintassi generica, per provare:

Classe CARICO:
   proprietà (int) PIN OUTPUT
   proprietà (int) PIN INPUT
   proprietà (int) STATO (digitalRead su pin input)
   proprietà (COMANDO) comando(int tipo)
   
  Costruttore con definizione dei pin I/O e tipo comando

Classe COMANDO:
   proprietà (int) TIPO
   metodo ACCENDI (con varie routine a seconda del tipo di comando assegnato)
   metodo SPEGNI
   .....

Dovrei quindi avere un oggetto di questo tipo:

Carico luceCucina(2,8,0);

...e quindi:

luceCucina.comando.accendi

oppure portare i metodi accendi/spegni più comodamente all'interno della classe "Carico".

Questo approccio potrebbe essere naturale su un pc programmando ad oggetti, mentre per quanto riguarda un micro non so se sia la strada giusta. Ad un vecchio corso su un S300 ricordo che il docente (smanettone e geniale) avvertiva che su certe "macchine" l'approccio potrebbe non essere premiante.

Rimangono quindi questi dubbi:

  • trattandosi di classi, la memoria dell'arduino ne risente molto?
  • la comunicazione con pc dovrebbe trovare un punto di incontro con questi oggetti: come faccio da pc ad inviare una stringa di comando che poi il mio sketch riconosca e colleghi ad uno degli oggetti? Un'ipotesi, un po' macchinosa per la verità, sarebbe quella di utilizzare degli identificativi unici (ID), indipendenti dai pin. Gli oggetti "carico da comandare" potrebbero costituire un array dove la posizione è proprio l'ID, ma tenere sincronizzati questi valori mi sembra suscettibile di errori

Grazie a chi vorrà suggerire consigli o anche solo....demolire l'approccio!

La programmazione ad oggetti è senza dubbio l'approccio più elegante ed il "dialetto" C che si usa in Arduino lo consente attraverso le "librerie".

E in fondo, se ben progettata, una libreria non consuma molta più memoria SRAM dello "spaghetti code".

Comunque dipende dal tuo grado di conoscenza di Arduino: se è ancora sommario, prima di approcciare con il metodo "elegante", ti consiglio di usare un più basso livello, in modo da confrontarti con le problematiche hardware prima che con quelle software.

cyberhs:
La programmazione ad oggetti è senza dubbio l'approccio più elegante ed il "dialetto" C che si usa in Arduino lo consente attraverso le "librerie".

E in fondo, se ben progettata, una libreria non consuma molta più memoria SRAM dello "spaghetti code".

Comunque dipende dal tuo grado di conoscenza di Arduino: se è ancora sommario, prima di approcciare con il metodo "elegante", ti consiglio di usare un più basso livello, in modo da confrontarti con le problematiche hardware prima che con quelle software.

ok, grazie!

Sulla conoscenza di Arduino ne ho da fare! Mi interessava la criticità di questo approccio.
Ad occhio, assegnare IN/OUT ad un pin o leggere lo stato con un digitalRead mi sembra molto meno dispendioso di un richiamo ad un oggetto (metodo, proprietà, ecc.) che si porta dietro tutta la sua struttura. Dico ad occhio, perchè non avrei la minima idea di come viene gestita una libreria in RAM.

Grazie

andreino:
Ad un vecchio corso su un S300 ricordo che il docente (smanettone e geniale) avvertiva che su certe "macchine" l'approccio potrebbe non essere premiante.

E ha perfettamente ragione, se vuoi ottenere il massimo dell'efficienza e l'ottimizzazione delle risorse il modo giusto di programmare è usare l'ANSI C, il C++, e più in generale la programmazione ad oggetti, è altamente sconsigliata sulle piccole mcu come quelle utilizzate da Arduino.
Arduino è "semplice" da programmare, per contro è poco efficiente, tanto per fare un esempio la Digital Read/Write richiede circa 2 us per essere eseguita mentre l'equivalente in C ANSI, ovvero scrittura diretta del registro, richiede solo due cicli macchina pari a 125 ns @16MHz di clock.

e quindi ne deriva che se hai clock e spazio da buttare, datti alle classi che sono più ordinate. altrimenti vai di C (o ASM :))

lesto:
e quindi ne deriva che se hai clock e spazio da buttare, datti alle classi che sono più ordinate. altrimenti vai di C (o ASM :))

ASM...lo usai mi pare per un PIC 16F e qualcheccosa (876 e 84?) qualche anno fa.... Andare con Arduino mi sembra un paradiso in confronto! :slight_smile: