Heyho,
Ich verwenden nun seit einiger Zeit wasserdichte DS18B20 zur Messung der Wassertemperatur in der Thames in London. Das funktionierte auch einwandfrei zusammen mit einem Raspberry 2B+ über Monate. Vor ein paar Tagen allerdings ergaben sich falsche und fehlende Messwerte. Das textfile mit den ausgegebenen Daten und Zeitstempeln sieht z.B. so aus:
06-01-2017,10:59:01,5.687
06-01-2017,11:00:02,-1.000
06-01-2017,11:10:02,5.687
06-01-2017,11:11:01,5.687
06-01-2017,11:12:02,5.687
06-01-2017,11:13:01,5.687
06-01-2017,11:14:02,5.687
06-01-2017,11:15:01,5.687
06-01-2017,11:16:02,5.687
06-01-2017,11:17:02,5.687
06-01-2017,11:18:02,-1.000
06-01-2017,11:19:02,-1.000
06-01-2017,11:29:02,5.687
06-01-2017,11:30:02,5.687
06-01-2017,11:31:02,5.687
06-01-2017,11:32:02,5.687
06-01-2017,11:33:02,5.687
06-01-2017,11:34:02,5.687
06-01-2017,11:35:01,5.687
06-01-2017,11:36:02,5.687
06-01-2017,11:37:01,5.687
06-01-2017,11:38:02,5.687
06-01-2017,11:39:01,5.687
06-01-2017,11:40:02,5.687
06-01-2017,11:41:01,-1.000
06-01-2017,11:42:01,-1.000
Alles anzeigen
Die 5.678 Grad Celsius sind in etwa korrekt. Was natürlich nicht stimmt sind die -1 Grad Celsius und die komplett fehlenden Bereiche.
Der Sensor ist an ein Verlängerungskabel gelötet (absolut Wasserdicht und die Stelle ist ohnehin nicht unter Wasser). das Verlängerungskabel ist etwa 10m lang, shielded und hat 3 Adern. Mit Strom wird der Sensor über 3v3 (pin1) versorgt. Daten sind mit GPIO4 (pin7) und ground ist mit pin9 verbunden. Zwischen power und data hängt noch der 4k7 Widerstand.
Wenn gar keine Daten in die Datei geschrieben werden, wird der gesamte Sensor in /sys/bus/w1/devices nicht angezeigt. Ein sehr ähnliches Problem gab es vor einigen Monaten schon einmal mit dem ersten Sensor. Auch fehlenden Bereiche und falsche Temperaturen. Damals allerdings hauptsächlich der Default-Wert von 85 Grad Celsius. Ich tauschte damals einfach den Sensor durch einen neuen und alles leif wieder wie gehabt.
Die Frage ist nun, kann es sein das über die Zeit das verhältnismäßig lange Kabel und der 4k7 Ohm Widerstand einen zu hohen Widerstand entwickeln und dementsprechend der Sensor gar nicht mehr erkannt wird, bzw die Daten fehlerhaft/unvollständig ankommen?
Oder hat der Sensor einfach eine zu geringe Lebensdauer (übrigens der hier [Anzeige]) und ich muss damit leben ihn alle paar Monate zu erneuern?
Der Vollständigkeit halber hier noch die Skripte zum auslesen und schreiben der Temperatur:
#!/bin/bash
sudo modprobe w1-gpio
sudo modprobe w1-therm
base_dir="/sys/bus/w1/devices/28-*/"
temp_dev="w1_slave"
dev=$base_dir$temp_dev
gcc -O3 -fPIC -g -Wall -Werror /home/pi/Watertemp/temp.c -o temp
now=$(date +"%d-%m-%Y")
sudo ./temp
echo `./temp $dev` >> /home/pi/RAW/WaterTemp_$now.txt;
Alles anzeigen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <inttypes.h>
#include <errno.h>
#include <math.h>
#include <time.h>
double readTemp(const char*);
int main(int argc, char *argv[])
{
time_t t;
char str[80];
struct tm *ts;
t = time(NULL);
ts = localtime(&t);
const char *devicepath;
double temp;
if(argc==1)
{
//printf("You cannot directly run this. Please run temp_log.sh or temp.sh\n");
exit(0);
}
else
{
devicepath = argv[1]; //Get device file path from argument passed by bash script
}
temp = readTemp(devicepath);
strftime(str, 100, "%d-%m-%Y,%H:%M:%S", ts);
printf("%s,%.3lf \n", str, temp);
return 0;
}
double readTemp(const char *path)
{
FILE *device = fopen(path, "r");
double temperature = -1;
char crcVar[5];
if (device == NULL)
{
printf("Check connections %s\n", path);
perror("\n");
}
if (device != NULL)
{
if (!ferror(device))
{
fscanf(device, "%*x %*x %*x %*x %*x %*x %*x %*x %*x : crc=%*x %s", crcVar);
if (strncmp(crcVar, "YES", 3) == 0)
{
fscanf(device, "%*x %*x %*x %*x %*x %*x %*x %*x %*x t=%lf", &temperature);
//printf("%.3lf\n",temperature);
temperature /= 1000.0;
}
}
}
fclose(device);
return temperature;
}
Alles anzeigen