Gebruikt materiaal
- DIY Hall Switch Hall Sensor Module for Smart Car – Blue
- RPI3
- Verlengde dupont kabeltjes
Foto van de Hall Sensor
Er werd voor een Hall sensor gekozen omdat een reed sensor onderhevig is aan metaalmoeheid.
In mijn eerste testopstelling maakte ik gebruik van een TCR5000 dit is een optische infrarood LED. De idee was om het blinkende embleempje onder de 6 van mijn gasteller uit te lezen maar omwille van het plexiglas en het miniscule embleempje was het niet mogelijk om de weerkaatsing in orde te krijgen.
Foto van een optische TCR5000 infrarood reflector
UPDATE: Met heel veel toeval heb ik alsnog de correcte positie van de TCR5000 op de gasmeter gevonden. Plexiglas is ook niet onderhevig aan de weerkaatsing van het infraroodlicht.
Zowel de TCR5000 als de Hall sensor komen met een digital output en een potentiometer om de gevoeligheid te regelen. De totale kostprijs van dit printje is 1.5 EUR en hiervoor kan je onmogelijk zelf een opstelling in elkaar boxen.
Beide sensors komen ook met een LED lampje welke brandt wanneer de Digital Output High is. Hiermee kan je heel eenvoudig en zonder programmeerwerk de werking van de sensor testen.
RPI Configuratie
Aangezien het de eerste GPIO pinnen zijn die ik zal gebruiken op mijn RPI bordje dien ik nog de WiringPi module te installeren.
git clone git://git.drogon.net/wiringPi cd /wiringPi ./build
Versiecontrole na installatie
gpio -v gpio version: 2.44 Copyright (c) 2012-2017 Gordon Henderson This is free software with ABSOLUTELY NO WARRANTY. For details type: gpio -warranty Raspberry Pi Details: Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Sony * Device tree is enabled. *--> Raspberry Pi 3 Model B Rev 1.2 * This Raspberry Pi supports user-level GPIO access.
Gebruikte GPIO pinnen
GPIO PIN 2 : +5V Hall Sensor
GPIO PIN 12 : DO (Digital out) Hall Sensor (WiringPI NUMMER = 1)
GPIO PIN 14 : GND Hall Sensor
Opvragen van de GPIO pinnen met WiringPI
root@raspberrypi:~ # gpio readall
Het voordeel van het aanspreken van de GPIO pinnen via de WiringPI nummering is dat deze nummers niet onderhevig zijn aan hardware changes. D.w.z. dat bij gebruik van de WiringPI library kan overgeschakeld worden naar andere hardware zonder de noodzaak om code te herschrijven.
Op domoticz.com heb ik een mooi c programma gevonden welke de sensor kan pollen
https://www.domoticz.com/forum/viewtopic.php?f=32&t=3151&start=60#p112272
Dit heb ik als basis gebruikt om het programma gascounter en watercounter te compileren. De enige aanpassing in de C-code is de WiringPi ID waarop de puls binnenkomt.
gcc -o gascounter gascounter.c –lwiringPi // What GPIO input are we using? // This is a wiringPi pin number #define IN_PIN 1 #define INTERRUPT_DEBOUNCE_DELAY 500
IN_PIN GAS = 1
IN_PIN Water = 4
Hierna het programma compileren:
gcc -o gascounter gascounter.c –lwiringPi
Verplaatsen van programma naar default linux locatie
mv gascounter /usr/local/bin
Startwaarde eenmalig instellen
echo 300 > /var/run/shm/gascounter
SHM = Shared memory -> de counter telt in het virtuele geheugen. Pas bij een start / stop schrijft hij de waarde weg naar persistent storage. Dit gebeurt via het service script:
vim /etc/init.d/gascounter SAVEFILE="/root/counters/$NAME"
Meer info:
https://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html
Verdere vars aanpassen en startup script optimalisatie
vim /etc/init.d/gascounter chown root:root /etc/init.d/gascounter chmod 755 /etc/init.d/gascounter
Testen van het c-programma in de voorgrond (zonder service script)
vim /etc/init.d/gascounter root@raspberrypi:~ #/usr/local/bin/gascounter /var/run/shm/gascounter /root/counters/gascounter /root/logs/gasmeter.log Usage: /usr/local/bin/gascounter tempfilename storagefilename logfilename
Activeren van de daemon
systemctl daemon-reload systemctl enable gascounter systemctl start gascounter
Autostart & monitoring via MONIT
vi /etc/monit/monitrc check process GAS_Meter matching "/usr/local/bin/gascounter" start program "/etc/init.d/gascounter start" stop program "/etc/init.d/gascounter stop" monit status monit reload
Kleine optimalisatie: (vastgesteld van warning tijdens starten service -> systemctl status gascounter:
chmod 755 /root/counters/gascounter
Zelfde config aanmaken voor de watercounter
watercounter.c GPIO_PIN = wiringPI number 4 gcc -o watercounter watercounter.c –lwiringPi mv watercounter /usr/local/bin/ cp /etc/init.d/gascounter /etc/init.d/watercounter echo 600 > /var/run/shm/watercounter systemctl daemon-reload systemctl enable watercounter systemctl start watercounter vi /etc/monit/monitrc check process watercounter matching "/usr/local/bin/watercounter" start program "/etc/init.d/watercounter start" stop program "/etc/init.d/watercounter stop" chmod 755 /root/counters/watercounter monit status monit reload
Handig commando om elke second de huidige tellerstand uit te lezen (om te debuggen)
while sleep 1; do cat /var/run/shm/gascounter; echo ""; done