Configuration de relevés de température
Sur la carte SVXLink Card est installé un capteur de température DS18B20 fonctionnant en bus 1-wire et raccordé au GPIO 04 de la carte Raspberry Pi.
Dans le fichier /boot/config.txt
avec la commande
sudo nano /boot/config.txt
et ajouter en fin de fichier ces lignes
#gpio 1-wire dtoverlay=w1-gpio,gpiopin=4
<note tip>Dans le cas ou vous auriez installé un capteur DS18B20-PAR ou DS18S20-PAR, veuillez notez que le fichier /boot/config.txt doit être complété comme suit.
En effet ce composant a un fonctionnement “parasite”. Il ne tire pas son alimentation nécessaire à son fonctionnement sur la patte habituelle VDD (patte 3) mais directement de la patte DATA (patte 2).
dtoverlay=w1-gpio-pullup,gpiopin=4,pullup=1
</note>
Redémarrer votre Raspberry Pi, puis reconnectez-vous.
sudo reboot
Lecture de la température
A présent, la sonde installée sur la carte va pouvoir être lue. Le répertoire /sys/bus/w1/devices/
doit contenir un sous-répertoire composés de chiffres et lettres. Le nom de ce répertoire est le numéro de série (numéro unique au monde !) de votre sonde de température.
ls /sys/bus/w1/devices/
va renvoyer par exemple :
10-00080109d8c4 w1_bus_master1
Pour lire la valeur de la température, nous allons consulter le contenu d'un fichier se trouvant dans ce répertoire 10-00080109d8c4
avec la commande suivante
cat /sys/bus/w1/devices/10-00080109d8c4/w1_slave
Cela affiche deux lignes.
2e 00 4b 46 ff ff 10 10 a1 : crc=a1 YES 2e 00 4b 46 ff ff 10 10 a1 t=22750
La seconde ligne contient la température mesuré par le composant 1-wire. Dans notre cas t=22750. Il faut comprendre que la température mesurée est 22,75°C. En effet il faut divisé la valeur entière par 1000 pour déterminer la température.
Programme de lecture cyclique
Pour pourvoir constater la réactivité de ce capteur de température, nous vous proposons ce programme de test en python. Pour le faire fonctionner créer le fichier et copier-coller le code après avoir lancer votre éditeur.
sudo nano test-temperature.py
Dans le code recopié, pensez à remplacer le numéro de capteur (ici 10-00080109d8c4) par le vôtre. Vous trouvez ce numéro en lancant la commande ls /sys/bus/w1/devices/
#!/usr/bin/env python # -*- coding: utf-8 -*- sensorids = ["10-00080109d8c4"] #Indiquer ici le numéro de série de votre 18b20 : ls /sys/bus/w1/devices/ for sensor in range(len(sensorids)): temperatures = [] while True: text = ''; while text.split("\n")[0].find("YES") == -1: tfile = open("/sys/bus/w1/devices/"+ sensorids[sensor] +"/w1_slave" ) text = tfile.read() tfile.close() secondline = text.split("\n")[1] temperaturedata = secondline.split(" ")[9] temperature = float(temperaturedata[2:])/1000 print("temperature = %.3f °C" % temperature)
Lancer le programme avec la commande
python test-temperature.py
Vous verrez ce résultat
Température lu par le relais via code DTMF
A intégrer à /usr/share/svxlink/events.d/local/Logic.tcl
#SEND DTMF CODE 26# if {$cmd == "26"} { puts "Reading temperature..." foreach file [glob -nocomplain -directory /sys/bus/w1/devices/ */w1_slave] { set r [exec cat $file | grep t= | cut -f2 -d= ] set r [format {%0.1f} [expr {$r / 1000.0}]] lappend temps $r; } set temp1 [lindex $temps 0]; set temp2 [lindex $temps 1]; set temp3 [lindex $temps 2]; puts "$temp1"; playMsg "svxcard/temperature" "temp1"; playNumber $temp1; playMsg "WeatherStation" "degree"; puts "$temp2"; playMsg "svxcard/temperature" "temp2"; playNumber $temp2; playMsg "WeatherStation" "degree"; puts "$temp3"; playMsg "svxcard/temperature" "temp3"; playNumber $temp3; playMsg "WeatherStation" "degree"; return 1 }