Temperaturmessung mit DS18S20 und HDSP-2502 Display

  • So, ich habe mir die Tage mal ein Digi-Thermometer gebaut, weil ich wissen wollte wie kalt es draußen wirklich ist.
    Eckdaten des "Systmes":
    - Pollin-Board mit Mega32 @ 8MHz
    - Externe Platine mit HDSP-2502, Taster und 1Wire-Ports über den Erweiterungsport von Pollin angeschlossen (Zum Display s. auch hier: AVAGO HDSP-2502 Tutorial mit Quellcode)
    - 1Wire Thermo-Sensoren Typ DS18S20 Bauform TO92 - Anschlüsse vergossen in Epoxy und Schrumpfschlauch


    Die zwei DS18S20 hatte ich schnell ausgelesen, also musste mehr Funktion her!
    Idee: Insgesamt 40 Temperaturwerte in einem Array speichern, auf die 7 Pixel Höhe vom Display normalisieren, acht User Definable Characters des HDSP damit füllen und ausgeben.


    Der Code braucht noch einiges an Zuwendung, ggfs. stelle ich ihn hier noch rein, denke aber gerade noch über Zusatzfunktionen nach...


    Man kann schön erkennen, wie empfindlich der Sensor wirklich ist (0,1°C) - nach dem Reset wird die erste Temperatur gemessen und dann der gesamte Array damit gefüllt - der schnelle Ausschlag nach oben rührt alleine von der Berührung meiner Finger her...
    Man sieht auch, wie die Skalierung greift, sobald sich die min/max-Werte verändern.


    Hier ein kleines Video dazu:
    CEfNh7sbsdU

  • Wie heute nacht bereits im ICQ besprochen, hab ich mit dem Sensor auch schonmal gespielt. Lässt sich super easy auslesen und ist wie du schon festgestellt hast genau genug und spricht schnell an. Die Idee mit dem Visualisieren über die CustomChars des Display finde ich eine tolle Spielerei!


    PS: Ich wollte mir bei gelegenheit mal kleine, autarke Temp-Fühler auf Basis von nem kleinen AVR, nem RFM12 und nem DS18S20 machen. Bin bisher allerdings an einer vernünftigen Spannungsversorgung gescheitert. Das ganze sollte mit StepUp aus einer AAA-Zelle zu betreiben sein. AVR und RFM brauchen ja nur wenig Strom...

  • Die Dinger sind toll! Ich verwende die für meine Heizungs/Raumtemperatur-steuerung. Sie reagieren sehr schnell auf Temperaturveränderung und sind auch sehr genau. Das einzigste was ich befürchte ist das es die Teile vielleicht in 10 Jahren wenn bei meiner Steuerung einer kaputt wird nicht mehr gibt, PT100 wirds wohl immer geben ....


    Der einzigste große Nachteil ist das mit den Adressen, wenn man mehrere Sensoren an einem Bus hat und man einen austauschen muss, dann muss man den Code umschreiben, das ist nicht so toll!
    Und man muss zuerst einzeln Adressen auslesen und die Sensoren definieren um danach zu wissen welche Temperatur welcher Sensor ist ....


    Die Sensoren kann man auch im Parasitären Modus betreiben, das heißt das man nur 2 Leitungen zum Sensor braucht (Ideal wenn man in einem Haus einen vorhandenen PT100 etc ersetzen will!)


    Diese Teile gibts ganz günstig bei http://www.csd-electronics.de/ (1,9€ Stück), dort gibts auch viele andere *atmega sachen* recht günstig!


    Ich kann die Dinger nur empfehlen sind genial!


    Als Basis für die Ansteuerung hab ich Teile von hier verwendet:
    Driver

  • Das mit der Nummerierung ist in der Tat etwas fehleranfällig, da muss man sich was schlaues ausdenken, z.B. die IDs im EEP abspeichern und beim Wegfallen einer ID dann den neuen Sensor da einfügen. Oder ein kleines Menü wo man sie halt identifizieren kann.

  • Man sendet dem sensor mit der ID XYZ den Command zum messen, dieser startet dann den Messvorgang, welcher max. 750mS dauert, danach sendet man dem gleichen Sensor den Befehl die Daten zurück zu schicken, danach erhält man den Wert als 9-bit Binärzahl welche man dann eben umbasteln muss das man das ganze mit Komma usw. bekommt.


    Ich hab das mit den ID's so gelöst das ich einfach immer nur einen Sensor auf einen Pin hänge, dadurch kann ich den Bus im Ein-Sensor-Betrieb fahren und die Adresse is mir egal ....

  • Ja aber welcher der 8 Sensoren is dann welcher .... es ist nicht definiert welcher Sensor sich wann meldet ......


    wenn z.b 8 Sensoren für 8 verschiedene Räume sind um die Temp zu messen dann muss ich wissen welche ID = welcher Raum .....
    sonst ist der Messwert ja vollkommen sinnlos?? Oder verstehe ich einfach nicht was du meinst? wenn das anders gehen würde, wäre es natürlich voll cool!

  • So ich habs nun mal getestet. Die Reihenfolge der Sensoren ist ganz einfach aufsteigend der numerische Wert der ID. Wenn man nun also eine Zuweisung "Raum - ID" im EEPROM ablegt, kann man bei neuem oder getauschtem Sensor einfach neu Scannen und die neue/getauschte ID einem Raum zuordnen. Man braucht also eine art Setup-Menü.


    Hier mal mein Code womit ich getestet habe:



    Output:
    No devices found or not scanned yet!
    Devices: 3
    ID 1: 280239D0010000AD
    ID 2: 284975D0010000E8
    ID 3: 288B5ED001000091


    Mir ist allerdings noch nicht ganz klar, wie ich gezielt eins der drei Devices anspreche. Vorher 1wireverify mit dessen ID ausführen?

  • Schau mal hier www.ibutton.com/ibuttons/standard.pdf, Seite 51 Abschnitt C3. Dort ist beschrieben, in welcher Reihenfolge sich die Sensoren melden. Ist nicht immer einfach aufsteigend.


    Gezielt auslesen geht entweder so:
    1wreset
    1wwrite &H55 ' match rom command
    1wwrite sensor(1) , 8 ' 8Byte ID von sensor 1
    1wwrite &HBE ' Read Scratchpad command
    Daten(1) = 1wread(9) ' bis zu 9 Byte auslesen


    oder so:
    1wreset
    1wverify sensor(1)
    1wwrite &HBE
    Daten(1) = 1wread(9)

  • Mir geht grad mal das Handling der Adressen in dem Array aus 8 bytes total auf den Zeiger. Im obigen Beispiel leg ich das ja in einem String ab, aber das hilft auch nicht wirklich, weil man zB 1wverify nicht mit dem String aufrufen kann. Jemand 'ne Idee, wie man die Adressen sinnvoll handhaben kann, so dass man zB auch mehrere in einem Array ablegen kann? Mehrdimensionales Array? Kann Bascom das überhaupt?

  • Hallo,
    deinen seltsamen String


    Dim Id(16) As String * 16


    hatte ich ganz übersehen. Ich dachte, den wolltest du nur für die Ausgabe verwenden.
    Außerdem brauchst du den auch gar nicht für das 1wverify, da die ID ja in


    Dim Temp_ID(8) as Byte
    Temp_id(1) = 1wsearchfirst()


    abgelegt ist.
    Mehere IDs kannst du hintereinander in ein Array legen oder dir z.B. im Eeprom abspeichern und bei Bedarf wieder auslesen.
    Mehrdimensionale Array gehen in Bascom so nicht, kannst du aber durch ein eindimensionales abbilden.
    Dein ID(16) mit jeweils 16 Charactern ist übrigens so etwas wie ein 2-dimensionales Array.


    BEye

  • In temp_id() liegt die ID aber nur bevor sie im String abgelegt wird, danach wird sie durch die nächste gefundene überschrieben. Daher ja auch "temp" - in dem Fall für temporär.
    Aber klar, ich kann mehrere IDs in einem Array aus Bytes ablegen... halt die erste ID in 1-8, die zweite in 9-16, ...


    Trotzdem irgendwie ein lästiges Handling irgendwie. Eine einfache Liste der Adressen lässt sich in Bascom nicht wirklich abbilden, zumindest nicht ohne eine eigene Abstraktion.

  • Ich hatte an sowas gedacht:
    Sub 1wire_scan()
    'scans the bus for devices
    'out: count
    ' id()
    1wreset
    Count = 1wirecount()
    Temp_id(1) = 1wsearchfirst()
    Gosub Read_DS1820


    For Device = 2 To Count
    Temp_id(1) = 1wsearchnext()
    Gosub Read_DS1820
    Next Device
    End Sub


    Schon klar, dass du mit temp_id(i) auf den temporären Charakter hinweisen willst. Daher könntest du nach der Zuweisung sofort die Daten auslesen.

  • Dann leg die Adressen doch wie oben schon vorgeschlagen in einem Byte-Array oder im EEPROM hintereinander ab.
    Mit jeder Schleife erhöhst du dann den Pointer ins Array um 8 und kommst so an die Adresse des nächsten Sensors.


    So dramatisch finde ich das jetzt nicht.


    BEye

  • Dann leg die Adressen doch wie oben schon vorgeschlagen in einem Byte-Array oder im EEPROM hintereinander ab.

    Genau das hab ich grad gemacht, allerdings mit Schleife:



    Nu hab ich das Problem, dass vorletzte und letzte ID gleich sind, was ich mir nicht erklären kann. Der Index wird korrekt hochgezählt (habe ich bereits debugged) und vom Ablauf her ist es nix anderes als weiter oben: 1wsearchfirst(), 1wsearchnext(), ...


    Mal was nettes um den Kopf frei zu bekommen: http://firstpersontetris.com/