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

Jio jiojio74@gmail.com
Lun 28 Ago 2017 12:47:14 CEST


2017-08-27 15:50 GMT+02:00 Valerio Talora <valerio.talora@gmx.com>:

> 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
>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/gl-como
>
> Grazie per le risposte. Nel mentre ho risolto.
Per la parte colore: funzione che controlla t e per -10<t<0 parte con
(0,0,FF) a -10 e linearmente arriva a (FF,FF,FF), per 0<t<20 parte da
(FF,FF,FF) e linearmente arriva a (00,FF,00) e per 20<t<40 da (00,FF,00) a
(FF,00,00) un po' spartano ma efficace.
Per l'interrupt, purtroppo niente C, mi sono arrangiato con delle macro
della libreria FastLED ( https://github.com/FastLED/FastLED ) non ho
sottomano l'esempio da cui son partito, se serve ad altri lo recupero, ma
sostanzialmente fa polling sul bottone.
I giocattolini sono degli equivalenti dell'arduino nano ed hanno più o meno
le stesse funzioni. Non so cosa intendi per collegarsi al PC, ma ti posso
dire che hanno una bella porta micro usb con cui li programmi e ci puoi
parlare in seriale vedi qui: https://www.arduino.cc/en/Reference/Serial
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.linux.it/pipermail/gl-como/attachments/20170828/8f8e7457/attachment.html>


Maggiori informazioni sulla lista gl-como