Bir Pi üzerinde yirmi DS18B20 sensörü: sekiz sensörden sonra kopmalar ve anahtarları nasıl adlandırmalı
Yapay zekâ tarafından English dilinden çevrildi ·
Tamam, aslında bu iki soru bir arada, kusura bakmayın.Peynir ve biraz ev yapımı bira sakladığım küçük bir mahzeni izliyorum. Raspberry Pi 4, Raspberry Pi OS Bookworm, GPIO4 üzerinde dtoverlay=w1-gpio ile 1-wire. Raf üstü/ortası/altı vb. için 20 DS18B20 sensörü istiyorum. 8’e kadar sorun yok. Bunun ötesinde bazı sensörler /sys/bus/w1/devices listesinden kayboluyor, sonra geri geliyor ve arada bir birkaçı tam 85.0 değeri okuyor.İkinci konu: Verileri paho-mqtt ile Hermetry’ye gönderiyorum, sensör başına bir publish, anahtar olarak 28-0316a2794bff gibi ROM kimliği. Bu kötü bir fikir mi? Panelim telefon rehberi gibi görünüyor.Kablolama: Pi tarafında 4.7k pull-up, raflara giden cat5 hat, ardından her sensöre kısa bacaklar; toplamda yaklaşık 15 m.
ok so this is probably two questions in one, sorry.
I’m monitoring a small cellar where I keep cheese and some homebrew. Raspberry Pi 4, Raspberry Pi OS Bookworm, 1-wire on GPIO4 with dtoverlay=w1-gpio. I want 20 DS18B20 probes (rack top/middle/bottom etc). With up to 8 it is fine. Past that some sensors vanish from /sys/bus/w1/devices and come back, and a few read exactly 85.0 now and then.
Second thing: I send them to Hermetry with paho-mqtt, one publish per sensor, key = the ROM id like 28-0316a2794bff. Is that a bad idea? My dashboard looks like a phone book.
Wiring: 4.7k pull-up at the Pi, cat5 run out to the racks, then short legs to each probe, about 15 m total.
Yapay zekâ tarafından English dilinden çevrildi ·
Problar 3 telli mi yoksa parazit beslemeli mi? Ve kısa bacaklardan bahsettiğinizde, ne kadar kısa?
Are the probes on 3 wires or parasite power? And when you say short legs, how short?
Yapay zekâ tarafından English dilinden çevrildi ·
3 kablo, Pi’den 3.3V. Kablolar 30 cm ile 1 m arasında, bence çizgiden çok yıldız topolojisine benziyor.
3 wires, 3.3V from the Pi. Legs are 30 cm to 1 m, it’s more of a star than a line I guess.
Yapay zekâ tarafından English dilinden çevrildi ·
Yıldız topoloji kopma sorununun kaynağı. 1-wire kısa dallanmalardan (stub) hoşlanmaz; her uç yansıma yapar. Ya her sensörün yanından tek bir hat geçirip çok kısa dallanmalar kullan, ya da hattı böl: overlay’i iki farklı pinde iki kez yükleyerek iki daha kısa bus elde edebilirsin. Bu kadar uzun kabloyla 4.7k yerine 2.2k denemenizi de öneririm.
The star is your dropout problem. 1-wire hates stubs, every leg reflects. Either run one line past every probe with tiny stubs, or split it: you can load the overlay twice on two pins and have two shorter buses. I’d also try 2.2k instead of 4.7k with that much cable.
Yapay zekâ tarafından English dilinden çevrildi ·
Her rafa ucuz bir ESP32 koymak daha kolay olmaz mı? Ben de öyle yapardım ama donanım konusunda uzman değilim.
Would it be easier to just put a cheap ESP32 on each rack? That’s what I’d do but I’m not a hardware guy.
Yapay zekâ tarafından English dilinden çevrildi ·
James kablolamayı doğru yapmış. İki bus, her biri 2.2k, bu şekilde sorun olmaz. Biz bir pompa evinde bu yöntemle bus başına 14 probe çalıştırıyoruz.85.0, DS18B20’nin açılış değeridir; okumanın dönüşüm bitmeden yapıldığı anlamına gelir, genellikle bus üzerindeki bir brown-out. Kodda eleyin, asla göndermeyin.Anahtarlara gelince, geçmiş birikmeden şimdi değiştirin. Anahtarlar tüm organizasyon genelinde ayrı isimler olarak sayılır (Starter 250 ile sınırlar), bu yüzden sensör başına ROM id’leri ikinci bir bodrum kurmaya başladığınızda bu kotayı hızla tüketir. Onlara konumlarına göre isim verin, ROM id’den konuma giden bir eşlemeyi Pi üzerindeki bir dosyada tutun ve 20 değerin hepsini tek mesajla gönderin. 20 noktalı tek bir mesaj, tek noktalı bir mesajla aynı kotayı harcar.
import glob, json, paho.mqtt.client as mqtt
MAP = {"28-0316a2794bff": "rack1.top", "28-0316a27a11ff": "rack1.mid"} # etc
vals = {}
for p in glob.glob("/sys/bus/w1/devices/28-*/temperature"):
rom = p.split("/")[-2]
t = int(open(p).read()) / 1000
if rom in MAP and t != 85.0:
vals["cellar." + MAP[rom]] = round(t, 2)
c.publish("v1/telemetry", json.dumps(vals), qos=1)
Anahtar kuralları Telemetry keys sayfasında.
James has the wiring right. Two buses, 2.2k each, and you’ll be fine. We run 14 probes per bus in a pump house that way.
85.0 is the power-on value of the DS18B20, it means the read happened before a conversion finished, usually a brown-out on the bus. Drop it in code, never send it.
On the keys, change it now before you have history. Keys count as distinct names across the whole organisation (Starter caps you at 250), so ROM ids per sensor will eat that fast once you build a second cellar. Name them by position, keep a map from ROM id to position in a file on the Pi, and send all 20 in one message. One message with 20 points costs the same quota as one with one.
import glob, json, paho.mqtt.client as mqtt
MAP = {"28-0316a2794bff": "rack1.top", "28-0316a27a11ff": "rack1.mid"} # etc
vals = {}
for p in glob.glob("/sys/bus/w1/devices/28-*/temperature"):
rom = p.split("/")[-2]
t = int(open(p).read()) / 1000
if rom in MAP and t != 85.0:
vals["cellar." + MAP[rom]] = round(t, 2)
c.publish("v1/telemetry", json.dumps(vals), qos=1)
Key rules are on Telemetry keys.
Yapay zekâ tarafından English dilinden çevrildi ·
GPIO4 ve GPIO17 üzerinde iki veri yolu, her biri 2.2k, ve kabloyu raflar boyunca tek bir hat olarak yeniden döşedim. İki gündür 20’de 20, tek bir 85 bile yok. Anahtarları da yeniden adlandırdım, cihazı silip baştan başlattım çünkü yalnızca bir haftalık veri vardı. Pano artık seri numarası listesi gibi değil, bir mahzen gibi okunuyor. Herkese teşekkürler, belki bir sonraki build’de Kevin 😉
Two buses on GPIO4 and GPIO17, 2.2k each, and I re-did the run as a line along the racks. 20 of 20 for two days now, not a single 85. Renamed the keys too, deleted the device and started fresh since there was only a week of data. Dashboard reads like a cellar now instead of a serial number list. Thanks all, Kevin maybe next build 😉
Yapay zekâ tarafından English dilinden çevrildi ·
Orada çalışırken küçük bir şey: cihaz belirtecini betiğin içine değil, yalnızca servis kullanıcınızın okuyabildiği bir dosyaya koyun. Git depolarında bunun çok fazla örneğini gördüm.
One small thing while you’re in there: put the device token in a file only your service user can read, not in the script. Saw too many of those in git repos.
- Bu konuyu yanıtlamak için giriş yapmış olmalısınız.
Sohbete katılın
Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

