www.errorediridondanzaciclicodotcom

  • Home
  • LoggerLux
  • BACK P.P.

  • Logger per registrare i lux ambiente

    Ho sviluppato questo progetto per creare un sistema attraverso il quale registrare l'andamento dell'illuminazione in un dato ambiente.
    I materiale utilizzato è il seguente:

    - il solito raspberry pi
    - una scheda RandA
    - un sensore di luce TSL2561



    La scheda RandA ha bisogno della sua immagine con precaricati i driver necessari. La prima volta ho provato ad aggiornare la mia Debian Wheezy ma, dopo il secondo riavvio, si è bloccata in fase di boot. A quel punto ho trovato molto più pratico e meno stressante scaricare un'immagine nuova e ricaricare i file necessari.
    Infatti, in forma di bozza, era già funzionante il sistema con un raspberry ed un Arduino Uno.
    Mi interessava sopratutto il discorso (non poi così immediato) del clock con la batteria e il fatto di rimanere una insieme più compatto.



    La scheda RandA ha poi la possibilità di collegare a due pin un interruttore che manda il segnale di spegnimento al raspberry (lo vedete nelle foto di colore rosso con la ghiera cromata) Questo è particolarmente utile per evitare spegnimenti con distacco dell'alimentazione, visto che l'aggeggio deve funzionare senza monitor nè tastiera.

    Il sensore di lux viene letto attraverso la seriale di Arduino. Dalla mia esperienza e dopo diversi tentativi ho dovuto accettare l'unico metodo per ottenere dati validi e aggiornati. Infatti senza lanciare, insieme allo script in python con la serial.read, il monitor della seriale su Arduino, si ottengono valori non aggiornati e spesso errati.
    Ho provato il serial.open e serial.close (che ho poi lasciato), diversi valori di timeout, sleep di diversi valori, ma senza aprire la serial monitor i dati erano sbagliati.
    Se il mio scopo fosse stato di avviare il logger lux da schermo e tastiera, non sarebbe stato poi un grosso problema. Invece a me serviva un giocattolino da attaccare all'alimentazione e avviare il tutto senza vedere niente.
    Ecco allora che ho innanzitutto reso eseguibile al boot lo script di python, poi lanciato dopo un pò di secondi l'idle di Arduino ed infine avviato automaticamente la serial.monitor. Qui di seguito l'istruzione crontab che fa partire launcher.sh, uno script bash con il semplice comando "sudo python loggerlux.py" (il mio script):
    @reboot sleep 90 && sh /home/pi/sesnsorapi/launcher.sh
    


    Quello che segue è invece la parte di autostart (LXDE-pi) che fa prendere l'ora dall'RTC (ne parlo dopo), fa partire l'IDE di Arduino e lo script bash per fare partire la serial monitor:
    @/home/pi/bootime.sh
    @/usr/bin/arduino
    @/home/pi/StartSerialM.sh
    


    Di seguito il bash StartSerial.sh:
    #!/bin/sh
    #StartSerialM.sh
    
    sleep60
    cd /
    xdotool mousemove 880 290 click 1 && xdotool key ctrl+shift+m
    /
    

    Attendo 60 secondi per essere sicuro che l'IDE sia avviato bene, poi lancio da terminale xdotool.
    Questo programma è molto utile per far fare a linux comandi in GUI. Non è stato facile trovare la combinazione giusta ma dopo un pò di googling (anzi, binging visto che google senza login ti spara sempre un bel paginone bianco accecante che ha proprio rotto!), sono riuscito a trovare quanto sopra che funziona benissimo.
    Dico al tool di mettere il mouse praticamente sulla barra di Arduino nel punto dove c'è la serial monitor e, una volta aperto il sotto-menu, lancio la combinazione controlshift + M. Appare così la finestra che legge la seriale di arduino e vedo così i valori di lux che sta leggendo. Se provate ad oscurare con la mano il sensore vedreste il valore letto cambiare immediatamente.
    Senza aprire la seriale, stampando a video i valori letti dallo script in python, questi non si aggiornavano, nonostante diversi tentativi nel mio script. Per questo motivo ritengo che senza la serial monitor in azione non si riesce ad avere risultati validi.
    Ho provato anche senza il monitor della seriale facendo una lettura ogni secondo ma senza apporre nessuna modifica il programma si "saturava" dopo un paio d'ore. Quindi alla fine ho trovato sufficiente una lettura al minuto per ottenere un grafico valido ma gestibile.
    Ho creato un dbase per registrare tutte le letture con i campi della data, ora e lux letti.
    Per operare poi su un grafico ed utilizzare quindi i valori, ho messo i record del dbase in un semplice file di testo così da rendere più semplice l'importazione.

    Qui di seguito il breve codice:
    #!/usr/bin/env python
    import sqlite3
    import os
    import time
    import serial
    
    db = '/var/www/luxm.db'
    def lux_store(lux):
            conn=sqlite3.connect(db)
            curs=conn.cursor()
            curs.execute("INSERT INTO luxread VALUES(datetime('now','localtime'), (?))",
    (lux,))
            conn.commit()
            conn.close()
    
    def data():
    	conn=sqlite3.connect(db)
    	curs=conn.cursor()
    	for row in curs.execute("SELECT*FROM luxread"):
    		print(str(row[0])+"  "+str(row[1]))
    	f = open('/home/pi/logger.txt', 'a')
    	f.write(str(row[0])+"  "+str(row[1])+'\n')
    
    	f.close()
    	conn.close()
    
    def main():
      while(1):
    	try:
    		ser = serial.Serial(
        		port='/dev/ttyS0',\
        		baudrate=9600,\
        		parity=serial.PARITY_NONE,\
        		stopbits=serial.STOPBITS_ONE,\
        		bytesize=serial.EIGHTBITS,\
            	timeout=3)
    		ser.open()
    	except:
    		print("error")
    		pass
    	luxx=ser.readline()
    	lux_store(luxx)
    	
    	data()
    	ser.close()
    	time.sleep(60)
    if __name__=="__main__":
    	main()
    
    
    Quanto sopra viene avviato in automatico dopo il boot.

    Discorso RTC.


    La RandA possiede una batteria tampone per l'RTC (real time clock). Ha diverse funzioni, tra cui quella semplice di dotare il raspi di un clock anche se sconnesso dalla rete. In particolare a me serve per far partire il sistema dopo averlo posizionato in un locale di cui voglio registrare i lux, anche senza rete.
    Perchè funzioni bisogna settare l'ora giusta o direttamente sull'RTC (sul web si trovano le istruzioni) oppure si setta l'ora del raspi normale (o si prende dalla rete) e poi si fa sul terminale "SetRTC -s". L'ora dell'RTC sarà così allineata a quella generale, precedentemente aggiustata.
    Nel mio caso però non dura tanto tempo, a me serve per preparare il logger da posizionare poi in posti dove non c'è rete ne monitor. Se passa più di un certo tempo anche l'RTC torna a 00:00 del 1.1.2001.
    Ora che l'RTC ha l'ora giusta, al successivo riavvio, con il seguente bash, diciamo al raspberry di andare a prendere l'ora dall'RTC:
    
    #!/bin/sh
    #bootime.sh
    
    cd /
    cd /home/pi/bin
    SetSysClock
    cd /
    


    I Risultati.


    Lo scopo di questo strumento è quello di leggere l'andamento dei lux nell'arco di un lasso di tempo in un preciso luogo. Ciò può essere utile per valutare la sostituzione di lampade tradizionali con quelle a led o, meglio, per valutare l'introduzione di un sistema di regolazione automatica della luce artificiale in funzione di quella esterna solare.
    Quello sotto è il grafico che ho ottenuto da una valutazione eseguita:



    La linea rossa rappresenta il livello di lux che si vorrebbe avere costantemente nell'arco della giornata. Qui è pari a circa 300 lux ma il valore assoluto non è importante. Infatti il sensore utilizzato è buono per attività semplici ma non è paragonabile ad uno professionale, in particolare perchè dovrebbe essere anch'esso tarato prima dell'utilizzo. Tuttavia risulta comunque utile allo scopo perchè, letto il valore che oggettivamente corrisponde ad un'illuminazione ottimale, sarà possibile vedere poi come varierà in più e in meno nel corso della giornata. Il grafico blu mostra quindi come varia l'illuminamento totale (artficiale + naturale).
    All'inizio (appena sotto i lux desiderati) cresce lentamente per il sorgere del sole. Poi si vede un'impennata che è dovuta al fatto che il sole colpisce direttamente (anche se attraverso una tenda) il sensore. I picchi in discesa sono passaggi nuvolosi. Poi inizia a decrescere con un punto in cui il sole non colpisce più direttamente il sensore.
    Si vede quindi che in un largo periodo di tempo la luce naturale compenserebbe largamente la luce artificiale che nel mio esempio è rimasta inutilmente accesa. Mettendo un dimmer collegato a led adeguati si potrebbe regolare la luce totale in funzione di quella esterna. Dal grafico si potrebbe poi avere conferma della bontà dell'operazione.
    In un altro caso, che mi è realmente servito, il logger è stato utile per vedere, dopo avere installato un sensore di presenza, quanto tempo le luci di quel locale rimanevano spente automaticamente.

    In realtà il discorso della dimmerabilità della luce è un pò più complesso perchè in ambienti larghi come uffici la misurazione della luce in un punto non può essere significativa se poi si mette un solo sensore di regolazione dell'illuminamento. Ma questo è un problema tipico dei sistemi di regolazione automatica applicati ad ambienti vasti e con luce naturale solo da un'area precisa (finestre solo su una parete). Quando i dimmer costeranno poco e saranno applicabili a più punti luce il problema sarà risolto.