Problem gefunden, Lötstelle war nicht die Beste
Danke für die Hilfe
Problem gefunden, Lötstelle war nicht die Beste
Danke für die Hilfe
Bist du dir sicher, dass das Display auch richtig angeschlossen ist und SDA/SCL nicht vertauscht sind?
Ziemlich sicher, es hat ja erst funktioniert und dann auf einmal nicht mehr
Am Anfang hatte ich die SDA/SCL vertauscht und dann noch dem falschen I2C zugeordnet, aber das hab ich mit Try and error herausbekommen.
Found DS devices: []
I2C Addresses :
I2C Configuration: I2C(1, freq=200000, scl=15, sda=14)
Kein Display gefunden. Mache ohne Display weiter.
Traceback (most recent call last):
File "<stdin>", line 36, in <module>
File "ds18x20.py", line 20, in convert_temp
File "onewire.py", line 23, in reset
OneWireError:
naja, da hab ich wohl ein größeres Problem
display weg, one wire weg
Hab jetzt auch andere Pins ausprobiert für den DS18B20, für das Display und für GND. Ich tippe auf die Spannung
Verzeiht.
Ich werde wohl einen ausführlichen Bericht schreiben und einen neuen Thread wagen
Hallo liebe freunde der Sonne
Ich hab zwar nur nen Temperatursensor an meinem Pico hängen, aber ich hoffe das der thread trotzdem passt. Nach längerem bsteln und probieren zeigte sich das gleiche Problem wie mit dem Zero, das kurze Kabel klappt, das lange nicht. Nun kam gestern ein neues Problem hinzu, ohne das ich was am Code geändert hatte. Erst der Code, dann die Fehlermeldung.
# Display Image & text on I2C driven ssd1306 OLED display
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import machine
import utime
import onewire, ds18x20, time
ds_pin = machine.Pin(16)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
print('Found DS devices: ', roms)
WIDTH = 128 # oled display width
HEIGHT = 64 # oled display height
i2c = I2C(1, scl=Pin(15), sda=Pin(14), freq=200000) # Init I2C using pins GP8 & GP9 (default I2C0 pins)
print("I2C Address : "+hex(i2c.scan()[0]).upper()) # Display device address
print("I2C Configuration: "+str(i2c)) # Display I2C config
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display
while True:
ds_sensor.convert_temp()
time.sleep_ms(750)
for rom in roms:
print(rom)
print(ds_sensor.read_temp(rom))
# Clear the oled display in case it has junk on it.
oled.fill(0)
oled.text("Kesseltemperatur: ",1,4)
oled.text(str(round(ds_sensor.read_temp(rom),2)),30,30)
oled.text("*C",75,30)
utime.sleep(2)
oled.show()
Display More
Found DS devices: []
Traceback (most recent call last):
File "<stdin>", line 20, in <module>
IndexError: list index out of range
Hat erst funktioniert, jetzt will es nicht mehr
Jemand eine Idee??
VG, bruzilla
Derzeit sind noch paar vom Zero WH vorhsanden, der 4er ist schon wieder alle.
die technischen details sind spitze bei dem Artikel:
Display-Größe | 60 Zoll |
---|
Batterien | 3 9 V Batterien erforderlich. |
---|
Gewicht Lithium-Akku | 3 Kilogramm |
---|
ein 3er B für 40,94€, also der gleiche Preis wie der 1B
Na, die Variante sieht ja mal gut aus, aber morgen wird erstmal mit dem kurzen Kabel und nur 3,3V Bier gebraut, wahrscheinlich wird Montag mal die andere Variante ausprobiert. Ich halte euch auf dem laufenden!
Display MoreWenn Du über ein Steckbrett Deinen Versuchsaufbau mit dem Zero realisiert hast, ist vermutlich das Steckbrett Verursacher eines Kontaktfehlers.
Ein Einzelsensor mit 1m Kabellänge sollte aber jedenfalls funktionieren.
Bei Aktivierung des dt-overlays wird aber auch der interne Pullup aktiviert. Den solltest Du "mitberechnen"
Neben dt-overlay im config.txt sollte kein weiterer Modulladeversuch mit modprobe unternommen werden. Der rote Hinweis in der Anleitung von #6 ist nicht (mehr) aktuell.
Servus !
Auf dem Steckbrett hat nur die kurze Variante funktioniert, deswegen hatte ich jetzt alles fein schick als Stecker zusamengefriemelt und es will trotzdem nicht. Also, nur langes kabel nicht, kurzes (ca. 40cm) läuft ohne Probleme.
Bernd666 : Das ist natürlich klar, irgendwie bin ich in meinem Kopf davon ausgegangen, das die Spannung über den Fühler und dann erst zum GPIO, aber der Wiederstand ganz unten macht da natürlich einen Strich durch die Rechnung. Mit dem Levelshifter hab ich mcih noch nciht beschäftigt, sieht aber an sich nach ner guten Variante aus, danke für den Tipp! Hast du damit schon Erfahrung??
Cat kabel ist vielleicht ne Idee zum Verlängern. Ich hab das Produkt weiter vorn schonmal verlinkt, ist ein Wasserdichter Sensor, schon mit Kabel, knap 1m, 24awg, also 0,25mm², aber wie es scheint kein Kupfer, wahrschienlich Alu?
Welche Leitung nimmst Du?
Lutz
sollte mit oben beantwortet sein, falls nicht, gibts mehr infos (würde dann einfach den Kommpletten Text auf dem Kabel präsentieren )
Display MoreMoin bruzilla,
wie lang ist das Kabel eigentlich und wie dick sind die einzelnen Adern?
Du hast nicht einen Arduino, der mit 5V an den Pins arbeitet, rumliegen? Oder einen Levelshifter.
Meine Überlegung ist, das an den Kabeln soviel Spannung abfällt, das am Sensor nur eine Spannung kleiner 3V anliegt.
Mit einem Levelshifter kann man den Sensor mit 5V betreiben und die Datenleitung wird über den Levelshifter an den GPIO-Pin geführt.
73 de Bernd
5V hab ich mir auch schon überlegt, aber hab nur nen Raspi, also eigentlich mehrere Hab in einem anderen Forum schon die Idee gefunden, bei längren Kabeln einfach von den 3,3V auf den 5V zu gehen, aber ich hab Angst, den Pi zu grillen. Wobei ich noch nen 1B habe, da wäre es schade, aber verkraftbar, da er eh nur herumliegt. Frage ist ja auch, ob der Pico das verträgt und man es da versucht, der soll ja eigentlich irgendwann die Aufgabe übernehmen.
So, alle Klarheiten beseitigt
LG, bruzilla
So, nach vielen Versuchen hab ich den Fühler mit dem noch langen Kabel immer nicht zum laufen gebracht. Mit unterschiedlichen Widerständen von 1K bis 5K und auch ohne bekomme ich den nicht dazu, mit dem Pi zu kommunizieren. Hab aber hier im Forum schon gelesen, dass das zum Teil an sehr langen Kabeln laufen soll. Irgendetwas mach ich falsch
else: update_display(display, "Lesefehler")
Hallo Dennis
Danke für die Mühen, ich hab leider jetzt erst Zeit gehabt, den Code zu Testen, schwangere Freundin und so
Nicht erschrecken, aus irgendwelchen Gründen hat mein Zero erst den Lesefehler ausgespuckt, jetzt kommt die richtige T. Hab jetzt bei dem Code von Hyle noch an der Formatierung gefeilt, die Zeit udn die T kommen jetzt auf zwei Zeilen, Ziel ist es ja, unter Umständen ncoh einen zweiten Fühlen anzubauen. Das werde ich die Woche mal in Angriff nehmen und dann den Erfolg hier zeigen. UN din zwei Wochen erfolgt das Debut, da wird das erste mal mit dem Temperatursensor und dem Display gebraut. Ich werde berichten
an alle die hier geholfen haben!!!
Woohoo!!! Ich feier dich gerade!!! Hatte es mit dem sleep() an verschiedenen stellen probiert, aber das while true nach oben, das hätte ich wahrscheinlich erst in 5 Jahren gemacht
Vielen lieben Dank!!!
Btw. Per VNC sollte man Text eigentlich auch kopieren können.
Ja, beim Code klappt es auch, keien Ahnung was der Zero da gerade hat.
Dein modifizierter Code von Dennis bringt eine schöne Ausgabe und auch die richtige Temperatur, aber er nimmt nur die Anfangs-T und holt sie sich nicht jedesmal neu. Ich muss erstmal an die frische Luft
Änder bei dem Code in Zeile 5 mal das [tpos+2] in [tpos+5] und berichte dann nochmal.
Ausgabe auf dem Display 6°C .
#!/usr/bin/env python3
from datetime import datetime
from time import sleep
from luma.core.interface.serial import spi
from luma.core.render import canvas
from luma.oled.device import sh1106
from pathlib import Path
SENSOR_FILE = Path("/sys/bus/w1/devices/28-06201cd6f0f2/w1_slave")
def read_temperature_file():
content_temperature_file = SENSOR_FILE.read_text(encoding="utf-8")
if "YES" in content_temperature_file:
index = content_temperature_file.rfind("=")
print(f"{(int(content_temperature_file[index+1:]) / 1000)}°C")
else:
print('Fehlerhafte Datei')
def update_display(display, temperature):
with canvas(display) as draw:
draw.rectangle(display.bounding_box, outline="white", fill="black")
draw.text((10, 20),f'{datetime.now().strftime("%H:%M:%S")} - {int(temperature)/1000}°C',fill="white",)
def main():
serial = spi(device=0, port=0)
display = sh1106(serial, rotate=2)
with canvas(display) as draw:
draw.rectangle(display.bounding_box, outline="white", fill="black")
draw.text((8, 25), "Hello Fellowbrewers", fill="white")
sleep(2)
temperature = read_temperature_file()
while True:
update_display(display, temperature)
sleep(5)
if __name__ == "__main__":
main()
Display More
das hab ich aus dem zweiten Vorschlag von ramageralf gemacht. Fehlercode:
Traceback (most recent calls):
File "/home/pi/Desktop/ramoled.py", line 45 in <module>
main()
File "/home/pi/Desktop/ramoled.py", line 45 in in main
update_display(display, temperature)
File "/home/pi/Desktop/ramoled.py", line 45 in update_display
draw.text((10, 20),f'{datetime.now().strftime("%H:%M:%S")} - {int(temperature)/1000}°C' ,fill="white",)
TypeError: int() argument must be a string, a bytes-like object or a number, not NoneType'
ayay, musste gerade alles von hand abtipen, weil ich den Fehlercode nicht über VNC kopieren konnte
ramageralf : Bei dir kommt wieder das Problem mit dem String, "deine" Temperatur wird als INT ausgegeben.
QuoteDisplay Moredef read_sensor():
with open(SENSOR_FILE, "r", encoding="UTF-8") as temperature_file:
lines = temperature_file.readlines()
tpos = lines[1].find("t=") # Position von "t=" ermitteln
temp = lines[1][tpos+2] # Alles hinter dem '=' nehmen
return temp.strip() # und ohne den Zeilenvorschub '\n' zurückliefern
Es erfolgt eine Ausgabe auf dem OLED, die Zeit wird aktualisiert und es wird eine Temperatur angezeigt ...aber als 0,002°C. Wenn ich das /1000 rausnehme kommt +2. Wenn ich das [tpos+2] auf [tpos+3] änder, bekomme ich 3°C. Durch Handwärme erfolgt keine Änderung der t.
ramageralf : dein Code gibt mir wunderschön einmal die T aus, als ordentlichen Wert. Ich versuch das mal in den Code zur Ausgabe auf dem OLED zu integrieren, im ersten Anlauf hab ich Mist gebaut.
wenn ich den Code nehem, der nur die T ausgibt kommt das hier im terminal:
09:42:45 - ['43 01 4b 46 7f ff 0c 10 79 : crc=79 YES\n', '43 01 4b 46 7f ff 0c 10 79 t=20187\n']
mit der Ergänzung kommt das gleiche Problem
So, jetzt bin ich 'erst' dazu gekommen
Traceback (most recent call last):
File "/home/pi/Desktop/TtoOled.py", line 37, in <module>
main()
File "/home/pi/Desktop/TtoOled.py", line 32, in main
update_display(display, temperature)
File "/home/pi/Desktop/TtoOled.py", line 20, in update_display
draw.text((10, 20),f'{datetime.now().strftime("%H:%M:%S")} - {int(temperature) / 1000}°C',fill="white",)
ValueError: invalid literal for int() with base 10: '41 01 4b 46 7f ff 0c 10 ff : crc=ff YES\n'
Der Sensor ist ein 1-Wire Sensor und gibt digital einen Wert aus. Jeder Sensor hat eine eigene ID, dadruch können an einem PIN mehrere Sensoren hängen und ausgelesen werden.
Bei meinem Code nur zum Sensor ist auch readlines () drin, da kommt kein Fehler.