www.errorediridondanzaciclicodotcom

  • Home
  • CONTROLLO PER LUCI
  • BACK P.P.

  • Un controllore per luci accese

    Questo progettino è per evitare che qualcuno (nel mio caso, figlie!) dimentichi accesa una luce per tutta la notte.
    Se la luce non dispone di pir o timer (difficile, questo, in ambito domestico) è facile che si possa dimenticare accesa e, se non è a led o parsimoniosa, i consumi aumentano inutilmente. Visto il costo attuale e previsto dell'energia elettrica, un affarino di pochi watt come il Pi Zero può aiutare ad evitare di buttar via i soldi.

    Le foto sotto mostrano l'oggetto già completato:

    Si tratta di un Raspberry Pi Zero W (wireless per permetterne il posizionamento in qualsiasi punto della casa) dotato di una FOTORESISTENZA, un SENSORE PIR ed un ALTOPARLANTE.
    La fotoresistenza serve a rilevare se la stanza è al buio o è rimasta accesa una luce.
    Il sensore Pir serve a rilevare se la luce è accesa perchè c'è qualcuno che la sta usando realmente.
    L'altoparlante serve ad emettere il suono di avvertimento per segnalare la luce accesa.

    La fotoresistenza deve essere collegata ad un condesatore.
    In pratica, attraverso il condensatore, si deve collegare un filo della fotoresistenza al pin su cui leggeremo i valori, l'altro capo andrà al 3.3 volt e il polo negativo del condensatore al pin di terra della GPIO (GND).

    Una spiegazione per l'audio. Il Pi Zero non è dotato di uscita analogica audio, perciò ho dovuto veicolare l'audio attraverso la GPIO. Per fare ciò mi sono informato sul sito Adafruit, nel post relativo all'audio PWM su Pi Zero.
    PWM significa modulazione di larghezza di impulso, cioè si varia la durata di un impulso per simulare un segnale analogico. La GPIO del Pi emette, per un dato segnale audio riprodotto, un segnale PWM su due pin abilitati per questo: il pin 18 (BCM) e pin 13 (in alternativa anche il pin 19).
    Tuttavia questi pin non sono abilitati di default per questa funzionalità ma bisogna settarli con le funzioni alternative (ALT5 e ALT0). Proprio queste funzioni alternative sono quelle che li rendono in grado di emettere una modulazione di larghezza di impulso per i due canali. Lo scopo finale è di scrivere nel codice di boot della pi:

    gpio_alt -p 13 -f 0
    gpio_alt -p 18 -f 5.

    Le due istruzioni sopra, avviate ad ogni boot, rendono le due uscite due canali PWM.
    La procedura non è semplicissima ma con un pò di attenzione è alla portata di tutti (se ci sono riuscito io!).

    Una volta predisposta la parte software non resta che collegare come da tutorial le (la) casse audio alle uscite previste e avviare i test canonici.
    Nello schema sotto (con il solito morsetto per visualizzare, in pratica, come creare il circuito) si vedono i componenti che, come scritto anche dalla grande Lady Ada, non devono essere esattamente uguali come capacità. Io ho usato un condensatore elettrolitico da 1 microfarad ed uno ceramico da 33nF (siglato 33(3) ovvero 33(000) pico farad), una resistenza da 270 ohm ed una da 160 ohm.

    Qui sotto il codice dello script:

    import RPi.GPIO as GPIO
    import time
    import datetime
    import os

    GPIO.setmode(GPIO.BCM)
    pir_pin = 23
    GPIO.setup(pir_pin, GPIO.IN)
    start = datetime.time(23, 30,0)
    end = datetime.time(23, 59, 59)
    start1 = datetime.time(0, 0, 1)
    end1 = datetime.time(5, 0, 0)

    pin= 4
    def RCtime(pin):

    reading = 0
    GPIO.setup(pin, GPIO.OUT)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(0.1)
    GPIO.setup(pin, GPIO.IN)
    while(GPIO.input(pin) == GPIO.LOW):
    reading += 1
    return reading

    counter=0
    cmd = "aplay /home/pi/Documents/lightsON.wav"
    RCtime(pin)
    start_pir = 0
    time.sleep(2)

    while True:

    if GPIO.input(pir_pin):
    counter = 0
    for i in range(1200):
    start_pir += 1
    time.sleep(1)
    start_pir = 0

    x = datetime.datetime.now().time()

    if RCtime(pin) < 10000 and counter < 360 and (start<x<end or start1<x<end1):

    counter += 1

    elif RCtime(pin) < 10000 and counter == 360 and (start<x<end or start1<x<end1) and start_pir==0:
    os.system(cmd)
    time.sleep(10)
    os.system(cmd)
    counter=0

    elif RCtime(pin) > 10000:
    counter=0

    time.sleep(1)

    GPIO.cleanup()
    sys.exit()

    Il funzionamento è questo: lo script legge prima di tutto il pir, se è stato attivato, mette il counter a 0 ed inizia a contare per 1200 secondi (circa, la durata può essere leggermente superiore). Alla fine mette la variabile start_pir a 0.
    La durata di due ore è una richiesta di mia figlia che a volte si alza la notte e tiene la luce accesa volontariamente. Per evitare discussioni ho messo due ore di tempo entro il quale la luce può rimanere accesa anche senza esserci movimento rilevato dal pir (in questo caso riprenderebbe il conteggio).
    Poi lo script prosegue con il settaggio dell'ora attuale, infatti questo marchingegno deve funzionare (per me) solo in un intervallo notturno.
    A questo punto lo script controlla se la fotoresistenza ha un valore inferiore 10000 (equivalente ad una luce accesa), se il counter è inferiore a 360 (circa 6 minuti) e ci troviamo nell'intervallo di tempo in cui eseguire questa funzione. Se tutte e tre le condizioni sono soddisfatte il counter inizia a contare.
    Se invece, il counter è uguale a 360 (il conteggio sopra è arrivato a 6 minuti) e start_pir è 0 (il Pir ha finito di conteggiare, cioè non c'è stato più alcun movimento dall'ultimo rilevamento) parte l'allarme, cioè il file audio. Dopo averlo riprodotto due volte, il counter torna a 0 (se la luce è rimasta accesa ripartirà il conteggio e l'allarme).
    Come ultima condizione c'è la lettura della fotoresistenza superiore a 10000 (buio) in questo caso il counter va a 0 per ritornare pronto in caso di luce accesa.

    Non si tratta certamente di uno strumento essenziale e, considerando l'acquisto del raspi, prima di ammortizzarlo in risparmio di luce ce ne vuole. Tuttavia può essere realmente utile in caso di stanze grandi o luci particolamente energivore, anche in ambito produttivo.
    Il tutto si può completare con un pushover per inviare avvisi in remoto.