Hallo zusammen, ich habe mehrere DS18S20 und DS18B20 Sensoren an einen Raspberry Zero angeschlossen (Pin4). Pullup habe ich schon von 4k7 auf 1k8 geändert, bekomme aber weiterhin sporadisch CRC Fehler (wechselnde Sensoren). Die Einleseroutine liest den Sensor mehrmals bei Auftreten eines CRC Fehlers aus. Das Einlesen erfolgt über das 1-wire Dateisystem und funktioniert soweit. Die 10 Sensoren sind an einen Verteiler angeschlossen, Leitungslänge jeweils ca. 1,5-3m. Sollte eigentlich kein Problem darstellen. VCC ist auf dem Raspi noch einmal gegen GND mit 100nF geblockt. Wie kann ich das Auftreten der CRC-Fehler verringern? Habt ihr ähnliche Probleme? Ausleseroutine (read function):
1 | sensor_device = '/sys/bus/w1/devices/' + str(sensor_slave) + '/w1_slave' |
2 | try: |
3 | file = open(sensor_device) |
4 | filecontent = file.read() # Read content from 1-wire slave file |
5 | file.close() # Close 1-wire slave file |
6 | stringvalue = filecontent.split("\n")[1].split(" ")[9] # Extract temperature string |
7 | # print filecontent
|
8 | if filecontent.find("NO") > 0: |
9 | temperature = error_temp |
10 | print "CRC failure" + sensor_slave |
11 | else: |
12 | temperature = float(stringvalue[2:]) / 1000 # Convert temperature value |
Und die Auswerteroutine:
1 | file = open(sensor_slaves) |
2 | |
3 | w1_slaves = file.readlines() # Read 1-wire slaves list |
4 | file.close() # Close 1-wire slaves list |
5 | |
6 | # Print header for results table
|
7 | if verbose_level>0: print('Sensor ID | Temperature') |
8 | if verbose_level>0: print('-----------------------------') |
9 | |
10 | # Repeat following steps with each 1-wire slave
|
11 | for line in w1_slaves: |
12 | w1_slave = line.split("\n")[0] # Extract 1-wire slave |
13 | |
14 | for i in range(20): # try 20 reads on CRC failure |
15 | temperature = read_sensor( w1_slave) # call read function |
16 | |
17 | if (temperature != error_temp): break # success |
18 | temperature=10 |
19 | |
20 | time.sleep(0.3) |
21 | |
22 | |
23 | sensor_count = sensor_count + 1 |
24 | |
25 | if temperature!=error_temp: |
26 | if read_level:sensordata.append((w1_slave, temperature)) # store temperature in database |
27 | |
28 | |
29 | return(sensor_count) |