Cronotermostato settimanale
2018/01/07 08:35
Temperatura:
20.761
Umidita`: 43.102
Relay: off
SetPoint: 15 |
---|
Cronotermostato settimanale |
Device lettura temperatura/umidita`, controllo riscaldamento, visualizzazione su display lcd |
Repository: https://github.com/raspibo/cronotermostato |
Descrizione
gpio -v
Raspberry Pi Details: Type: Model A+, Revision: 01, Memory: 256MB, Maker: Sony * Device tree is enabled. *--> Raspberry Pi Model A Plus Rev 1.1 * This Raspberry Pi supports user-level GPIO access.
E` il tipo di Raspberry Pi utilizzato.
lsusb
.. Ralink Technology, Corp. RT5370 Wireless Adapter
E` la chiave wifi TP-LINK_TL-WN727N usata.
Legge temperatura e umidita` dal sensore SHT20
Visualizza su un piccolo display lcd 128x128 pixel (8 righe 16 colonne)
Trasmette i valori via MQTT alla Centralina livello 1
Gestisce un'uscita per comando riscaldamento
La particolarita` di questo progetto, e` che la programmazione delle temperature non ha vincoli e puo` essere anche prevista al minuto (per esempio si puo` scrivere nell'orario: "09:23" (il programma guarda che ore sono e che temperatura era impostata nell'orario inferiore all'attuale).
Tranne la chiave wifi, tutto il resto dei componenti dovrebbe essere indicato nel ..
Circuito elettrico/elettronico
Il sensore SHT20 richiede resistenze di pull-up sul collegamento I2C (SDA, SCL), non ci sono perche` sono gia` presenti nel Raspberry Pi.
Al momento in cui scrivo il circuito e` completo di annotazioni per la fase di test (in corso).
(Terminata questa, la seconda sara` di effettuare rilievi di funzionamento dell'attuale cronotermostato, solo successivamente, terza e ultima fase, andra` a sostituirlo)
Software
Come noterete dal repository dei files, e` scritto in "bash".
- cronotermostato.sh
- Programma principale, e` l'unico da eseguire, gli altri sono di contorno ed utilizzati da questo.
- cronotermostato.conf
- File di configurazione (parametrizzazione) dello script principale, e` possibile:
- Selezionare se inviare dati a Centralina livello 1
- Cambiare tempi
- Cambiare identificatori
- .. e altro (credo sia abbastanza commentato).
- help.sh
- Ho voluto mantenere separato dal programma principale le visualizzazioni di aiuto (perche` le modifico/avo spesso)
- program7d.txt
- File di programma settimanale, contiene le programmazioni giornaliere/orarie del termostato.
- cecho.sh
- mvcursor.sh
- Sono script di controllo della visualizzazione in console, il primo si coccupa della colorazione dei testi (ma non funziona su tutte), il secondo degli spostamenti cursore.
- sht20_rh.sh
- sht20_t.sh
- Umidita` relativa e Temperatura, questi si occupano di leggere il sensore SHT20 (i2c), ho preferito mantenerli indipendenti dal tutto il resto.
Install
Per il Raspberry Pi ho utilizzato la Raspbian Stretch Lite (Minimal image based on Debian Stretch), non sto` a spiegare come si installa, e` gia` spiegato ovunque in rete, credo anche in questo wiki, da qualche parte.
Per installare il programma del cronotermostato in oggetto e` sufficiente scaricarlo (sul proprio Raspberry Pi), oppure clonare il repository git (git clone https://github.com/raspibo/cronotermostato.git), nella directory che preferite.
Nel Raspberry Pi dovremo sistemare alcune cose prima di eseguire il programma:
- Attivare SPI
- Attivare I2C
Potete farlo eseguendo (da utente root, oppure fate precedere il comando da "sudo"):
sudo raspi-config
selezionate l'opzione 5, poi P4, poi P5 (dovrete ricominciare da capo perche` ad ogni selezione sarete rimandati alla prima pagina di scelta).
Se volte farlo a mano, abilitate le righe:
dtparam=i2c_arm=on dtparam=spi=on
nel file "/boot/config.txt".
Nel mio caso (Raspbian Lite) ho dovuto installare qualche pacchetto software accessorio (spero di non averne dimenticati):
- Necessari
apt-get install bc i2c-tools mosquitto-clients wiringpi fbset
- Opzionali
apt-get install git
- Sicuramente non necessari
apt-get install fim fbi tio python3-serial imagemagick tput cadubi screen tmux figlet toilet aria2 fbterm
- Potrebbero servire per visualizzazioni immagini sul display lcd e trasmissioni/letture seriali
- Note
- Ho aggiunto lo user "pi" al gruppo "tty", per scrivere da qualsiasi terminale sulla tty0 (es.: echo "testo" >> /dev/tty0 ).
- fbi, fim, visualizzano immagini tramite framebuffer
- imagemagick, pensavo di usarlo per convertire il testo in immagini ... (poi ho preferito, per ora, non usare immagini)
Configurazione wifi
Modificato "/etc/network/interfaces":
# interfaces(5) file used by ifup(8) and ifdown(8) # Please note that this file is written to be used with dhcpcd # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto lo iface lo inet loopback #allow-hotplug eth0 #iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Trovate due "wlan" perche` per accelerare le sperimentazioni (install e setup) ho usato un Raspberry Pi Versione 3, potete omettere le righe che riguardano la seconda "wlan" (wlan1), o lasciatele, male non fanno.
Aggiunto/modificato "/etc/wpa_supplicant/wpa_supplicant.conf", ricordateVi di mettere la vostra rete e password dove indicato:
country=IT ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="<VOSTRO IDENTIFICATIVO RETE WIFI>" psk="<VOSTRA PASSWORD RETE WIFI>" key_mgmt=WPA-PSK }
Configurazione display
Ho scelto la via piu` breve, usare il file "/etc/rc.local", cui ho aggiunto le seguenti righe, prima dell'ultima "exit 0":
# Carica il display LCD, non so come, ma finisce in "fb1" modprobe fbtft_device custom name=s6d02a1 gpios=reset:25,dc:24,led:23 width=128 height=128 rotate=270 #dmesg | tail -10 # Check messages # Ritardo 3 secondi per il caricamento di "fb device" .. #sleep 3 #con2fbmap 1 1 # Mappa la console 1 sul framebuffer 1 # Disable savescreen /usr/bin/setterm -blank 0 -powerdown 0 -powersave off
Notare la disattivazione dello screen saver e del power off, perche` il display lo tengo sempre acceso (ho fatto testi che si visualizzano a colorazione random).
Configurazione autologin
Ho creato il file "/etc/systemd/system/getty@tty1.service.d/override.conf", con questo contenuto:
[Service] ExecStart= ExecStart=-/sbin/agetty -a pi --noclear %I $TERM Type=idle
Configurazione autostart cronotermostato
Nella directory utente ("pi" ovviamente), ho modificato il file ".profile", aggiungendo le righe seguenti:
# Start cronotermostato CTPRG=cronotermostato CTPATH="/home/pi/projects/cronotermostato" PATH="$PATH:$CTPATH" PID=`ps -e -o pid,cmd | grep "$CTPRG[.]sh" | awk '{ print $1 }'` if [ $PID ] then echo "Non si e\` avviato \"$CTPRG\", oppure era gia\` avviato:" echo "Actual PID is: $PID" else echo "Avvio $CTPRG" cd $CTPATH # La linea seguente e` messa fuori dal IF, perche` finche` faccio prove .. #PATH="$PATH:`pwd`" # oppure potevo metterlo/farlo cosi`: PATH="$PATH:$CTPATH" ./$CTPRG.sh # Non e` installato e da decidere se e come usarlo. #redis-cli -h centred hmset msg:alert:level1:$(date +\%Y\%m\%d\%H\%M\%S) type "alert" desc "Avvio $CTPRG" value "on" um "" date "$(date +\%Y/\%m/\%d\ \%H:\%M:\%S)" cd / fi
[Opzionale] Disattivare lo swapfile
Per far durare di piu` la SD Card.
Raspberry_PI-Raspbian-Personalizzazioni#Swapfile
Promemoria Chiavi/Codici
Chiavi e codici, esempi da ultimo device