[gl-como] Arduino: colorare la temperatura e interrupt

Valerio Talora valerio.talora@gmx.com
Dom 27 Ago 2017 15:50:09 CEST


Per quanto concerne la colorazione è necessario inventarsi una funzione
che, preso come argomento un parametro (diciamo t, la temperatura),
restituisca una tripla (RGB nel nostro caso). Matematicamente avremo una
funzione vettoriale di una variabile del tipo F = (R(t), G(t), B(t)).

Adesso un esempio pratico: se lo spazio di colori è a 16 bit allora R,
G, B possono variare tra 0 e 15 ognuno; per semplicità assumiamo che il
parametro t sia normalizzato in modo da variare anch'esso tra 0 e 15.
Una possibile mappa di colori potrebbe essere la seguente: (t, t, t).
Con questa mappa 'a scala di grigi' il colore varia da nero (0, 0, 0),
quando la temperatura è minima, a bianco (15, 15, 15) quando la
temperatura è massima, passando per le diverse gradazioni di grigio a
temperature intermedie. Assumendo che tutti i colori possibili siano
racchiusi in un cubo in cui l'asse del Rosso coincide con l'asse x,
l'asse del Verde con quello delle y e l'asse del Blu con l'asse z,
allora la mappa (t, t, t) rappresenta un insieme di punti su una retta
che taglia il cubo in diagonale dallo spigolo (0, 0, 0) allo spigolo
(15, 15, 15).
Se si utilizza una mappa di questo tipo (15-t, t, 0), allora i colori
varieranno tra Verde (0, 15, 0) a temperatura minima e Rosso (15, 0, 0)
a temperatura massima, passando per le diverse gradazioni Rosso-Verde
(in questo caso si sta tagliando la faccia del cubo che giace sul piano
xy in diagonale).
Ovviamente il percorso all'interno del 'cubo di colori' non deve per
forza giacere su una retta: si potrebbero individuare una successione di
N colori a proprio piacimento (per esempio 16 colori differenti) e
memorizzarli in un array Nx3

 ((R0, G0, B0),
  (R1, G1, B1),
        .
        .
        .
  (R15, G15, B15))

alla temperatura t corrisponderà la tripla (Rt, Gt, Bt).

Se ho capito bene la seconda domanda e se stai/puoi programmare in C,
situazioni di questo tipo si possono gestire con una opportuna
combinazione delle funzioni sigaction(), kill() ed opzionalmente fork(),
per esempio:

il programma parte e crea un child con la funzione fork(); il programma
padre esegue le operazioni senza curarsi dell'input asincrono; il
programma figlio rimane in attesa dell'input (ad esempio attraverso
read(), non so...) e, quando lo riceve invia un segnale con kill() al
processo padre. Al ricevimento del segnale il processo padre, grazie ai
parametri forniti a sigaction(), blocca l'esecuzione delle istruzioni in
corso e passa ad eseguire l'opportuna funzione handler. Terminata
l'esecuzione dell'handler il processo padre riprende a fare ciò che
stava facendo prima (sempre che nell'handler non si decida di fare
diversamente).

Potendo sfruttare il multithreading si potrebbero creare due thread
anziché due processi; in questo caso bisogna stare attenti ad eventuali
race conditions, poiché alcuni segmenti di memoria dei threads sono
condivisi.

P.S.: Interessanti quei giocattolini... Si interfacciano solo ad Arduino
o si possono gestire anche da PC? (Premessa: non ho mai utilizzato Arduino).


On 08/07/17 14:15, Jio wrote:
> Con la calura pomeridiana che mi costringe a non uscire, ho iniziato un
> paio di progettini con questi cosucci:
> https://www.amazon.it/dp/B015MGHH6Q/ref=pe_3310731_189395851_TE_dp_1
> 
> Il primo è un termometro interno esterno basato su questi sensori:
> http://www.gearbest.com/development-boards/pp_70501.html
> e questo display
> http://www.gearbest.com/lcd-led-display-module/pp_219113.html
> L'idea è di mostrare temperatura interna, temperatura esterna,
> differenza e sotto un grafico dell'andamento nelle ultime 24 ore
> (rilevazione ogni 15 minuti)
> Tutto bene, solo vorrei colorare il grafico, ma non trovo online un
> riferimento a come colorare il grafico tipo lo schema colore di questo sito:
> https://meteo.search.ch/temp
> Secondo voi che formula posso applicare?
> Lo spazio colore del TFT è 16bit (RRRRRGGGGGGBBBBB) se può essere utile.
> 
> Secondo problema un po' più interessante: striscia LED RGB basata su
> WS2812 con la'ggiunta di un pulsantino capacitivo con cui vorrei
> cambiare la programmazione delle sequenze.
> Le sequenze sono abbastanza lunghe e complesse. Pensavo di attaccare un
> interrupt al pulsante per cambiare le sequenze. C'è modo di interrompere
> l'esecuzione di una funzione senza fare polling su una variabile nei
> tempi morti (sostituire un delay(1000) con un ciclo che controlla quanti
> millisecondi son passati e una variabile di stato e nel caso esce dalla
> funzione)?
> 
> Spero di essermi spiegato
> 
> 
> 


-- 

Valerio Talora

-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        signature.asc
Tipo:        application/pgp-signature
Dimensione:  819 bytes
Descrizione: OpenPGP digital signature
URL:         <http://lists.linux.it/pipermail/gl-como/attachments/20170827/8d6af326/attachment.sig>


Maggiori informazioni sulla lista gl-como