El dia que vaig fer un termostat

Fa uns anys se’m va acudir la idea de fer-me el meu propi termostat. Semblava un projecte asequible doncs només s’ha hauria de controlar la temperatura de la calefacció. Sí… La cosa es va complicar.

El termostat que tenia per encendre la caldera era molt bàsic, i vaig pensar que no podria ser gaire difícil millorar aquell tros de plastic enmerdat. Em vaig posar mans a l’obra i vaig començar a investigar com podria fer el projecte.

Just tenia un nou asistent Alexa, cosa que va despertar en mi una obsessió molt boja per tot el que es pugués automatitzar i controlar per beu o internet. Em vaig fer amb tots els gadgets compatibles amb Alexa que vaig trobar: perquè m’enceguéssin els llums, la tv, l’aire acondicionat, el robot aspirador, la rentadora… i esclar, faltava la calefacció.

Les motivacions inicials eren tenir un termostat a l’estil NEST que en aquell moment em feia mandra comprar, i crear alguna cosa funcional amb una Raspberry-pi 3, doncs m’havien regalat una i també tenía per casa una pantalla tàctil compatible molt bàsica..

Algunes preguntes bàsiques:

  • Quin es el SO idoni per al projecte?
  • Com es configura la pantalla?
  • Quin llenguatge utilitzaré per a crear l’aplicació?
  • Quins components electrònics necessito?
  • Com faig que inicï la meva aplicació

Al final vaig trobar les respostes a aquestes preguntes. Vaig basar la solució en desenvolupament Python i components bàsics de compatibles amb Raspberry i el resultat va ser prou bo:

Components Bàsics:

Els components de hardware i sofware els trobareu al projecte de git:

Us adjunto la captura dels components.

Important el model de pantalla en la que en depenen les següents configuracions

3.5 inch 320*480 TFT

Sistema Operatiu

El sistema operatiu triat va ser el Raspbian sense sistema gràfic. Ja li instalaria jo el Xinit mes tard. Alguns passos a tenir en compte:

Fixar IP a WiFi local:

$ sudo nano /etc/dhcpcd.conf

Afegir-hi:

interface wlan0
static ip_address=192.168.1.205 //IP desitjada
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

Instalar XINIT 

Es tracta del sistema de finestres necessari per a poder visualitzar l’aplicació

$ apt-get install xinit

Instalar Python i drivers Raspberry

$ sudo apt-get install git
$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git
$ sudo apt-get install build-essential python-dev
$ cd Adafruit_Python_DHT
$ sudo python3 setup.py install

També instalarem el RPI:

$ sudo apt-get install python-dev python-rpi.gpio
$ Sudo pip3 install RPi.GPIO

Configurar pantalla

Basat en https://circuitdigest.com/microcontroller-projects/interfacing-3.5-inch-touchscreen-tft-lcd-with-raspberry-pi

Connectem la pantalla la Raspberry y configurem el autologin des de raspi-config:

$ sudo raspi-config

Descarreguem el driver

$ sudo rm -rf LCD-show 
$ git clone https://github.com/goodtft/LCD-show.git 
$ chmod -R 755 LCD-show 
$ cd LCD-show/
$ sudo ./LCD35-show

Per revertir el canvi:

$ chmod -R 755 LCD-show 
$ cd LCD-show/ 
$ sudo ./LCD-hdmi

Eliminar el fitxer de conf:

sudo mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf ~startx

S’ha de crar d’alta el següent:

/etc/X11/xorg.conf.d/99-fbturbo.conf
Section "Device"
 Identifier "DeviceHDMI"
 Driver "fbdev"
 Option "fbdev" "/dev/fb0"
 Option "SwapbuffersWait" "True"
EndSection

Section "Device"
  Identifier "DeviceTFT"
  Driver "fbdev"
  Option "fbdev" "/dev/fb1"
EndSection

Section "ServerLayout"
 Identifier "HDMI"
 Screen 0 "ScreenHDMI"
EndSection

Section "ServerLayout"
 Identifier "TFT"
 Screen 0 "ScreenTFT"
EndSection

Section "Screen"
 Identifier "ScreenHDMI"
 Monitor "MonitorHDMI"
 Device "DeviceHDMI"
EndSection

Section "Screen"
 Identifier "ScreenTFT"
 Monitor "MonitorTFT"
 Device "DeviceTFT"
EndSection

Section "Monitor"
 Identifier "MonitorHDMI"
EndSection

Section "Monitor"
 Identifier "MonitorTFT"
EndSection

Evitar que s’activi el mode repòs de la pantalla

Prerionem el comandament:

$ xset q

Es posible que al accedir remotament no trobi la pantalla. Es per això que previament s’ha de definir la variable DISPLAY

export DISPLAY=:0 #o el que corresongui en el vostre cas

Apareixerà quelcom similar a:

keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000000
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    off    02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
    12: Group 2:     off    13: Mouse Keys:  off
  auto repeat delay:  660    repeat rate:  25
  auto repeating keys:  00ffffffdffffbbf
                        fadfffefffedffff
                        9fffffffffffffff
                        fff7ffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  2/1    threshold: dddd 4
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  600    cycle:  600
Colors:
  default colormap:  0x20    BlackPixel:  0x0    WhitePixel:  0xffff
Font Path:
  /usr/share/fonts/X11/misc,/usr/share/fonts/X11/100dpi/:unscaled,/usr/share/fonts/X11/75dpi/:unscaled,/usr/share/fonts/X11/Type1,/usr/share/fonts/X11/100dpi,/usr/share/fonts/X11/75dpi,built-ins
DPMS (Energy Star):
  Standby: 600    Suspend: 600    Off: 600
  DPMS is Enabled
  Monitor is On

Teclegem:

$ xset -dpms
$ xset s noblank
$ xset s off

I ja tindrem la pantalla configurada perquè no es posi en mode repòs.

Permisos d’execució remots

L’aplicació Python s’executarà amb el gestor gràfic startX. Per a poder executar remotament (desde el terminal mitjançant ssh) l’aplicació i per tant inciar startX es necessari modificar el fitxer:

/etc/X11/Xwrapper.config

i afegir la linea:

allowed_users = anybody

En cas contrari aparareixería el missatge:

/usr/lib/xorg/Xorg.wrap: Only console users are allowed to run the X server

Instal·lar llibreries Python necessaries per al projecte

#Instalar TKINTER
$ sudo apt-get install python3-tk

#Instalar PIP3
$ sudo apt-get install python3-pip

#Instalar PIL
$ sudo pip3 install pillow

#Instalar libopenjp2 
$ sudo apt-get install libopenjp2-7
#Instalar libtiff (si no esta ya instalado)
$ sudo apt install libtiff5

#Instalar numpy
$ sudo pip3 install numpy

#Instlar libatlas
$ sudo apt-get install libatlas-base-dev

#Instalar Flask
Virtual env:
$ sudo apt install python3-venv
$ Sudo pip3 install flask

#Instalar matplotlib
$ sudo pip3 install matplotlib

#Instalar requests
$ sudo pip3 install requests

Copiar les fonts del projecte

El projecte inclou fons especials necessaries per a la correcta visualització. Simplment s’han d’instal·lar al repositori de fonts de raspbian. Un cop descarregat el projecte de github on trovareu les fons:

Instalar fontconfig:

$ sudo apt-get install fontconfig

Després podrem veure les fonts instal·lades en un idioma (Ex:Tamil):

$ fc-list :lang=ta

Situarse al diretoru thermostat i teclejar el següent comendament:

Copiar les fonts:

$ sudo cp -r thermoFonts/ /usr/share/fonts

Carregar les fonts sense necessitat de reiniciar:

$ fc-cache -f -v

Preparació pinatge

Basantnos en el pinatge de la raspberry pi 3:

https://pinout.xyz/pinout/pin36_gpio16

Al projecte s’utilitzen el pins

  • 26: Per al sensor de la temperatura
  • 16 i 12: Per al potenciometre electrònic
  • 13: Per al relé que activa la caldera

Disposició del potenciometre electrònic (KY-040)

http://www.ardiotech.com/en/connect-ky-040-rotary-encoder-raspberry-pi/

Disposició del sensor de temperatura

Disposición relé KY-019

Finalment vaig fer el meu propi sketch eletrònic del model final:

Configurar arranc automàtic

Crear un script en /etc/init.d

sudo nano /etc/init.d/thermoPi.sh

Al fitxer rc.local hi afegim l’arranc del mateix:

sudo nano /etc/rc.local 
#/etc/rc.local
/etc/init.d/thermoPi.sh start &

Paral·lelament a l’arranc de l’aplicació termostat hem d’arrancar el gestor de finestres start. Trobareu els scripts d’arranc al propi projecte:

Muntatge i resultat final

Feu un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Desplaça cap amunt