Forum: PC-Programmierung DS18B20 - Daten im RAM sammeln und übertragen?


von Arne (specht83)


Lesenswert?

Guten Morgen,

ich wollte diverse DS18B20 bei uns im Haus installieren und jetzt stellt 
sich mir unter anderem die Frage, wie ich die Daten sinnvoll mit einem 
Mikrocontroller sammeln kann?
Die Messwerte sollen zunächst im RAM des Mikrocontrollers gesammelt 
werden und zur Speicherung regelmäßig an einen Einplatinencomputer 
übertragen werden.
Ich habe mit einem einfachen Entwurf einer Datenstruktur angefangen, die 
zum Testen erstmal nur 2 Sensoren abbildet und pro Sensor nur 5 
Messwerte speichern kann. Das Ganze soll später hinsichtlich Sensoren 
und Messwerte sinnvoll skalierbar sein:
1
struct temperatur_messung {
2
    uint32_t zeitpunkt;
3
  float temperatur;
4
};
5
6
struct temperatur_sensor {
7
    char *sensor_name;
8
    unsigned char rom_code[8];
9
  struct temperatur_messung temperatur_messungen[5];
10
};
11
12
struct temperatur_sensor temperatur_sensoren[] =
13
    {
14
        {
15
            "Wohnzimmer",
16
            { 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xAF },
17
            {
18
                { 0, 0 },
19
                { 0, 0 }
20
            }
21
        },
22
        {
23
            "Heizungsvorlauf",
24
            { 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xBF },
25
            {
26
                { 0, 0 },
27
                { 0, 0 }
28
            }
29
        },
30
    };
31
32
int main()
33
{
34
    temperatur_sensoren[0].temperatur_messungen[0].zeitpunkt = 1000;
35
    temperatur_sensoren[0].temperatur_messungen[0].temperatur = 23.4;
36
    temperatur_sensoren[0].temperatur_messungen[1].zeitpunkt = 1000;
37
    temperatur_sensoren[0].temperatur_messungen[1].temperatur = 22.7;
38
39
    temperatur_sensoren[1].temperatur_messungen[0].zeitpunkt = 1000;
40
    temperatur_sensoren[1].temperatur_messungen[0].temperatur = 21.8;
41
    temperatur_sensoren[1].temperatur_messungen[1].zeitpunkt = 1000;
42
    temperatur_sensoren[1].temperatur_messungen[1].temperatur = 19.4;
43
44
    return 0;
45
}

Ich habe bereits sämtliche ROM-Codes ausgelesen und deren feste 
Speicherung im Programm wäre für mich erstmal völlig OK, mir geht es 
mehr um die Datenstruktur und in welchen Intervallen man die Sensoren am 
besten ausliest. Da später noch eine eigene Regelung geplant ist, würde 
ich gerne ausreichend oft messen, aber wegen des begrenzten RAM keine 
überflüssigen Daten aufzeichnen. Ich könnte mir vorstellen, dass man den 
Vorlauf eines Heizkreises häufiger messen muss als z.B. die 
Raumtemperatur. Oder man speichert nur ab einer gewissen Änderung, wobei 
da natürlich irgendwie sichergestellt werden müsste, dass das Ausbleiben 
von Veränderungen seine Richtigkeit hat. Im Beispiel werden die 
Messwerte zunächst mit 0 initialisiert, da dieser Wert im Haus 
normalerweise niemals auftreten sollte. Zur Laufzeit würden dann echte 
Zeitstempel und Temperaturen ergänzt werden.

Vielen Dank und herzliche Grüße
Arne

von Alt G. (altgr)


Angehängte Dateien:

Lesenswert?

Ich verwende bytes anstatt float. Reduziert speicher um faktor 4.
Damit speichre ich 720 werte im ram des esp8266, 6 sensoren.
Zeit kann man auch in ein byte reinpressen.
1
#define num_datasets 720
2
#define num_sensors_max 6
3
4
struct wp
5
{
6
  uint8_t temp[num_sensors_max];
7
  int8_t hour;
8
};
9
10
wp wp_arr[num_datasets];

Sieht dann aus wie bild. Heizung abgas, kessel vorlauf etc.

BTW Die idee mit fest codierten sensoradressen ist müll.

: Bearbeitet durch User
von Arne (specht83)


Lesenswert?

Alt G. schrieb:
> Sieht dasnn aus wie bild. Heizung abgas, kessel vorlauf etc.

Vielen Dank, die Darstellung sieht gut aus. Machst Du alle 5 Sekunden 
eine Messung?

von Alt G. (altgr)


Lesenswert?

Arne schrieb:
> Machst Du alle 5 Sekunden
> eine Messung?

Nee. Alle 30 sek. Einstellbar. Die striche unten sind stunden.
Die messung zur brennersteuerung sind alle 10 sek.

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

ein beliebtes Thema zur Zeit.
Wieviele DS bekommt man denn so an einen Portpin? Ich komme auf ein 
Dutzend Temperaturen die ich messen möchte, 4 Heizkreise mit 
Vor/Rücklauf, den Puffer für Vor/Rücklauf, Warmwasserausgang und 
Zirkulationsleitung.
Auf dem Schreibtisch mit einem Sensor mit 5 m Leitung läuft es, bei 12 
Sensoren wird es sicher spannend, ich habe keine Erfahrungen mit den DS. 
Spannungsversorgung soll aus dem Controller kommen, die 3. Leitung gönne 
ich mir. Ist eine Busverkabelung ok oder ist ein Stern zuverlässiger? 
Sind Entstörmassnahmen wie Schutzdioden nötig?

Mit der Speicherung mache ich es mir einfach und nehme einen fetten F769 
der auch noch zusätzliches RAM sowie einen SD Slot auf dem Board hat. 
Obwohl, einfach ist das mit dem Discoboard auch nicht...

von Rüdiger B. (rbruns)


Lesenswert?

J. S. schrieb:
> Busverkabelung ok

JA!

15 an einem Portpin eher grenzwertig, lieber einen 1wire Controller z.B. 
an i2c oder spi.

von J. S. (jojos)


Lesenswert?

Rüdiger B. schrieb:
> lieber einen 1wire Controller z.B.
> an i2c oder spi.

ach ja, wurde auch in einem anderen Thread hier schon genannt, hatte ich 
schon wieder vergessen.

von Manfred (Gast)


Lesenswert?

Arne schrieb:
> Oder man speichert nur ab einer gewissen Änderung,
Verknüpfung: Bei Änderung, aber mindestens alle xx-Minuten?

> wobei
> da natürlich irgendwie sichergestellt werden müsste, dass das Ausbleiben
> von Veränderungen seine Richtigkeit hat.

Das Problem hast Du sowieso, auch bei fester Abfragefolge könnte ein 
Ausfall passieren.

Rüdiger B. schrieb:
>> Busverkabelung ok
> JA!
> 15 an einem Portpin eher grenzwertig,

Hängt das nicht von der Speisung ab? Dreiadrig die 5 Volt mitgeliefert, 
sollte doch keine Grenze pro Pin existieren. Telefonkabel, zwei Adern 
plus Schirm für die Masse?

J. S. schrieb:
> Mit der Speicherung mache ich es mir einfach und nehme einen fetten F769
> der auch noch zusätzliches RAM sowie einen SD Slot auf dem Board hat.

Kannst Du mit dem STM32 SD-Karten korrekt und zeittolerant bedienen? Ich 
habe am Arduino mit dessen SD-Lib mit einigen Karten Ärger, dass diese 
undefiniert aussteigen.

von J. S. (jojos)


Lesenswert?

Manfred schrieb:
> Das Problem hast Du sowieso, auch bei fester Abfragefolge könnte ein
> Ausfall passieren.

das kann man sicher gut überwachen indem man CRC Fehler oder Aussetzer 
mitzählt.

Manfred schrieb:
>> 15 an einem Portpin eher grenzwertig,
>
> Hängt das nicht von der Speisung ab?

es sind ja auch alle Datenleitungen parallel, da wird es sicher ein 
Limit geben.
Ich hatte auch nach Bridges gesehen und jetzt ein paar DS2482-100 bei 
Aliexpress bestellt. Für die -800 werden Mondpreise verlangt (300€ für 
10 Stk), bei bekannten Distris bekommt man die erst in einem Jahr.
Da teste ich erstmal wie die Fehlerrate an dem F7 ist wenn der auch noch 
andere Sachen macht, MQTT und evtl Webserver möchte ich da auch 
einbauen. Wenn es zuviele Aussetzer gibt dann eben einen kleinen µC als 
Sklaven dran der nur den 1-Wire bedient.

Manfred schrieb:
> Kannst Du mit dem STM32 SD-Karten korrekt und zeittolerant bedienen? Ich
> habe am Arduino mit dessen SD-Lib mit einigen Karten Ärger, dass diese
> undefiniert aussteigen.

Was meinst du mit zeittolerant? Die Schreibfrequenz sollte nicht zu hoch 
sein, ich dachte an einmal täglich. Das wäre auch nur ein Backup oder 
für lokale Anzeige, eine Infrastruktur mit MQTT/ioBroker/InfluxDB habe 
ich, damit ist eine bequemere Analyse möglich.
Ich mache das nicht mit Arduino, für den F4 habe ich SD Code mit SDIO 
Interface und der hat einige Tests bestanden und einen Webserver hatte 
ich auch damit mehrere Monate laufen, da allerdings read only.
Für den F7/H7 kämpfe ich noch, da ist das Verpacken in eine allgemeine 
Komponente schwierig wg. DMA und Cache. Bin aber zuversichtlich das es 
auch zuverlässig laufen wird.

von Arne (specht83)


Lesenswert?

Rüdiger B. schrieb:
> 15 an einem Portpin eher grenzwertig, lieber einen 1wire Controller z.B.
> an i2c oder spi.

Sind derartige Treiber momentan eigentlich bei Händlern für Verbraucher 
wie z.B. Reichelt verfügbar? Der DS 2480 B sollte dort eigentlich ab 
heute wieder verfügbar sein, aber das war wohl nichts...

Und ermöglicht ein 1-Wire Treiber einen so viel stabileren Betrieb als 
z.B. die von MAXIM beschriebenen Methode mit UART und PullUp zwischen TX 
und RX? Wenn man mit einem offiziellen Treiber-IC auch erst diverse 
Widerstände und Leitungsterminierungen ausprobieren muss bis es läuft, 
würde ich mir die Suche danach vermutlich sparen.

von Manfred (Gast)


Lesenswert?

J. S. schrieb:
>> Kannst Du mit dem STM32 SD-Karten korrekt und zeittolerant bedienen? Ich
>> habe am Arduino mit dessen SD-Lib mit einigen Karten Ärger, dass diese
>> undefiniert aussteigen.
> Was meinst du mit zeittolerant?

Ich meine damit, dass manche SD-Karten einfach mal für einige hundert 
Millisekunden nicht antworten. Hängt auch vielleicht davon ab, wie man 
die anspricht, dafür fehlt mir das Detailwissen.

> Ich mache das nicht mit Arduino, für den F4 habe ich SD Code mit SDIO
> Interface und der hat einige Tests bestanden.

Ich habe gelesen, dass Du STM32 und kein Arduino benutzt. Wenn Du eine 
zuverlässig erprobte Schreibroutine hast, vergiss meine Bedenken.

von J. S. (jojos)


Lesenswert?

Manfred schrieb:
> Ich meine damit, dass manche SD-Karten einfach mal für einige hundert
> Millisekunden nicht antworten

Das wäre schlecht für Videoaufnahmen... Ich habe SDHC Karten und gerade 
die H7 können die sehr schnell lesen/schreiben. Für diese Anwendung beim 
Schreiben einmal am Tag macht das aber nichts aus.

Arne schrieb:
> Sind derartige Treiber momentan eigentlich bei Händlern für Verbraucher
> wie z.B. Reichelt verfügbar?

Sind offensichtlich auch sehr knapp. Habe wie geschrieben einige DS2482 
bei Ali bestellt, in der Hoffnung das es keine Fakes sind. Als Plan B 
wenn es zuviele Fehler bei direktem Lesen gibt, wobei man ja auch mehre 
1-Wire Busse instanziieren kann.

von Εrnst B. (ernst)


Lesenswert?

Arne schrieb:
> Und ermöglicht ein 1-Wire Treiber einen so viel stabileren Betrieb

Hatte beides im Einsatz, DS2482 per I²C an einem OpenWRT-Router, und 
Bit-Banging an einem AVR. Keine Phantom-Speisung, also drei Adern.
Klappt beides, auch mit langen Leitungen (~20 Meter Telefonkabel, 
ungeschirmt)

Kaputtgegangen sind schlussendlich die DS18B20-Fakes. Da hatte ich 
welche erwischt, die ihr Scratch-Pad als EEPROM ausgeführt hatten.

https://github.com/cpetrich/counterfeit_DS18B20

Nach so einem Jahr waren die Schreibzyklen aufgebraucht, und es wurde 
immer häufiger Müll gemessen, bis schließlich alle Messwerte unbrauchbar 
waren.

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

gute Info, aber Übel das es soviele Fakes gibt. Werde meine Sensoren 
dann heute Abend mal mit den Testprogrammen überprüfen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.