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

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

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
  }