1-Wire-Slave-Baukasten V.2

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Hi cineks,
      there is another error:
      Not connect direct to UART, but to GPIO4.
      Take look at: 1-Wire-Slave-Baukasten V.2

      1-Wire-Data -> GPIO4 of RPi (with resistor 4,7 to 3,3V RPi)
      1-Wire-GND -> GND RPi
      1-Wire-VCC -> 3,3V RPi

      Then you must load the drivers:

      modprobe w1-gpio
      pullup=1modprobe w1-therm

      If you use UART you need an adapter, for example DS2480 or DS2480B an other drivers.

      Thank you for the files.

      RoBue
    • ehh,
      not work,
      after changes lockbits the led blinks faster :)
      Nothing changed the purchase of a new attiny.
      Maybe this is a new/old/another version of bme280 and is not properly detected.
      My module looks different from yours (see attach).

      RoBue schrieb:

      If you use UART you need an adapter, for example DS2480 or DS2480B an other drivers.

      yes, I use UART with adapter DS2480 and work properly.
      To the adapter I have connected counter ds2423 (emulation on attiny 25), ds18b20.
      work.

      best regards
      Dateien
    • Hi cinecs,
      sorry I had not enough time to answer.

      That's bad.
      Ok.
      I still want to solve this problem!!!

      Please test the following hex-code with an ATtiny85 without the converter and BME.
      It is a simple counter (not a DS2423 or compatible with it).
      Does the DS2480 and the RPi detect this as a DS18B20?
      (Temperature: 0°)

      1-Wire-Slave-0x28_ATtiny85_Counter_Timer1.zip

      If not - I have no idea, how I can help you from the distance.

      Please send your module to me.
      The address is in this forum.
      Then I can test it with my hardware and can say more.
      Poland is not America or Asia ;)

      Greetings,
      RoBue

      PS: What are the connections "CSB" and "SD0" (I hope I read right this)?
      Are these something like "chip select"?
      Must you connect these for eample to GND or VCC?

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von RoBue ()

    • 13. 1-Wire-Slave mit HC-SR04 und LM35 (Distanzmessung, Füllstandsanzeige)

      Hi, nachdem ich meine ersten Versuche mit dem Ultraschallsensor HC-SR04 gemacht habe,

      -> 1-Wire-Slave-Baukasten V.2

      stelle ich hier meine verbesserte Version ein.

      Der Grund für die Änderung ist der,
      dass die Temperatur die Schallgeschwindigkeit beeinflusst.
      Diese wurde bisher nicht berücksichtigt.
      In der neuen Version wurde zusätzlich ein LM35-Temperatursensor eingebunden (hatte ich gerade rumliegen).

      Prinzip:
      Die Echo-Leitung wird in Zeitintervallen abgefragt,
      die jeweils für 5cm Weg nötig sind,
      d.h. man bekommt die Entfernung in 5cm-Schritten.

      Die Zeitintervalle werden - im Gegensatz zur vorigen Version - an die jeweilige Schallgeschwindigkeit bei der gemessenen Temperatur angepasst.
      Die Formeln dafür sind im Code erklärt (Leistungskurs Physik trägt späte Früchte!)

      Der Init-Teil:

      BASCOM-Quellcode

      1. '***************************************
      2. ' Variable und Init-Routinen
      3. Dim Ausgabewert As Single
      4. Dim Ausgabeinteger As Integer
      5. Dim Ausgabe As String * 8
      6. ' PORTB.3 -> Trigger
      7. Config Portb.3 = Output
      8. Portb.3 = 0
      9. ' PORTB.4 -> Echo
      10. Config Portb.4 = Input
      11. ' PORTB.7 -> ADC-Eingang fuer LM35
      12. Config Adc = Single, Prescaler = Auto
      13. Dim Temperatur As Integer
      14. Dim Intervall As Word
      Alles anzeigen

      Der Berechnungsteil (Calculatedata) mit Formeln:

      BASCOM-Quellcode

      1. Calculatedata:
      2. If Match_slave = 1 Then
      3. ' Zaehler fuer Abfrage zuruecksetzen -> Fehlererkennung
      4. Daten_array(8) = 0
      5. ' Problem:
      6. ' Die Schallgeschwindigkeit ist von der Temperatur abhaengig
      7. ' Formel_1: V(Luft) = (331.5 + 0.6 * Temp) | Einheit: Meter/Sekunde
      8. ' Der Weg s, der in einer bestimmten Zeit t zurueckgelegt wird,
      9. ' errechnet sich aus:
      10. ' Formel_2: s = V * t => s = V(Luft) / t | t = Messzeit / 2
      11. ' (Die Messzeit gilt fuer den Weg hin und zurueck => Division durch 2)
      12. ' Die Zeit t, fuer das Zurucklegen einer bestimmten Strecke s benoetigt wird,
      13. ' errechnet sich aus:
      14. ' Formel_3: t = (s / V) * 2
      15. ' Daraus ergibt sich als Zeitintervall fuer eine Messung in 5cm-Schritten:
      16. ' Intervall = (0.05 / 331.5 + 0.6 * Temp)) * 2
      17. ' Die Werte liegen im us-Bereich.
      18. ' Damit man leichter rechnen kann (Integer- oder Word-Werte),
      19. ' sollte man das Ganze noch mit 1.000.000 multiplizieren
      20. ' Problemloesungen:
      21. ' - Variante 1 ohne interne Temperaturkompensation:
      22. ' Man fragt das Echo immer in 100 us oder 200 us - Schritten ab
      23. ' und kompensiert mit der Temperatur gegebenenfalls auf dem 1-Wire Server
      24. ' durch einen weiteren 1-Wire-Slave, z.B. DS18B20
      25. ' Intervall = 100
      26. ' While Pinb.4 = 1
      27. ' Waitus Intervall
      28. ' Incr Ausgabeinteger
      29. ' ' Mehr als 3m -> kein Echo
      30. ' If Ausgabeinteger > 100 Then Exit While
      31. ' Wend
      32. ' ...
      33. ' Daten_array(5) = Low(ausgabeinteger)
      34. ' Daten_array(6) = High(ausgabeinteger)
      35. ' - Variante 2 mit interner Temperaturkompesation
      36. ' Temperatur messen (LM35 an PORTB.7)
      37. ' 0V -> 0°C ; 1.5V -> 150°C
      38. Start Adc
      39. Temperatur = Getadc(1)
      40. Waitms 10
      41. Temperatur = Getadc(1)
      42. Waitms 10
      43. ' Dieser Wert wird genommen
      44. Temperatur = Getadc(1)
      45. Stop ADC
      46. ' Umrechnung: (5V / 1024) * Adcwert * 1000 -> °C * 10
      47. ' Ungefaer:
      48. Temperatur = Temperatur * 5
      49. ' Abfrageintervall fuer 5 cm in Abhaengigkeit der Temperatur berechnen
      50. ' Formel (s.o.): (0.05 / (331,5 + (0.6 * Temperatur))) * 2 * 1.000.000
      51. Ausgabewert = Temperatur / 10
      52. Ausgabewert = Ausgabewert * 0.6
      53. Ausgabewert = Ausgabewert + 331.5
      54. Ausgabewert = 100000 / Ausgabewert
      55. Intervall = Ausgabewert
      56. ' Sende Ultraschallsignal
      57. Portb.3 = 1
      58. Waitus 10
      59. Portb.3 = 0
      60. ' Warte auf Empfang
      61. Ausgabeinteger = 0
      62. Do
      63. Loop Until Pinb.4 = 1
      64. ' Dauer messen
      65. While Pinb.4 = 1
      66. Waitus Intervall
      67. Incr Ausgabeinteger
      68. ' Mehr als 3m -> kein Echo
      69. If Ausgabeinteger > 100 Then Exit While
      70. Wend
      71. ' Ausgabe in cm
      72. Ausgabeinteger = Ausgabeinteger * 5
      73. ' Datenarray beschreiben
      74. Daten_array(1) = Low(temperatur)
      75. Daten_array(2) = High(temperatur)
      76. Daten_array(5) = Low(ausgabeinteger)
      77. Daten_array(6) = High(ausgabeinteger)
      78. ' CRC bestimmen
      79. Daten_array(9) = Crc8(daten_array(1) , 8)
      80. End If
      81. 'Goto Readb
      82. Goto Waitreset
      Alles anzeigen

      Anschlussbelegung des ATtiny45/85 (ATtiny25 ist zu klein):
      Pin 1 und 8: VCC ---------- VCC HC-SR04 + LM35
      Pin 2: -------------------- Trig HC-SR04
      Pin 3: -------------------- Echo HC-SR04
      Pin 4: GND ---------------- GND HC-SR04 + LM35
      Pin 5: Kontroll-LED (gegen GND)
      Pin 6: 1-Wire-Port
      Pin 7: -------------------- Ausgang LM35

      Das Scatchpad:
      Byte 1,2 -> Temperatur in C x 10
      Byte 2,3 -> unbenutzt
      Byte 5,6 -> Distanz in cm (5 ... 305; 505: kein Echo erhalten!)
      Byte 7 -> leer (evtl. Versorgungsspannung)
      Byte 8 -> Fehlerausgabe
      'Byte 9 -> CRC

      Der Code:
      1-Wire-Slave_HC-SR04_LM35_2017-23-09.zip

      LG RoBue

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von RoBue ()

    • 14. Neuer 1-Wire-32-Bit-Counter

      Der erste Counter
      -> 1-Wire-Slave-Baukasten V.2
      hat das Problem, dass er nur max. 511 Ereignisse zwischen zwei 1-Wire-Auslesevorgängen sauber erfassen kann. Das reicht zwar in vielen Fällen aus (z.B. bei meinem Regenzähler), aber irgendwie packte mich doch der Ehrgeiz, auch deutlich mehr Impulse verarbeiten zu können.

      So habe ich mich mit dem Attiny44 beschäftigt. Er hat im Gegensatz zum ATtiny25-45-85 einen16-Bit-Timer/Counter, nämlich Timer1. Das bedeutet, dass mit demCounter- und dem Überlaufregister über 130.000 Impulse selbstständig vom ATtiny44 gezählt werden können, ohne dass er über den 1-Wire-Bus abgefragt und der 32-Bit-Counter aktualisiert werden muss. Damit hat man eine viel größere Zählreserve als beim ATtiny25-45-85.

      Ich habe das Ding bei mir im Testlauf und es scheint zu funktionieren. Aber ich wäre froh, wenn die Profis hier nochmal drüberschauen könnten. Der Umgang mit Timern und Countern ist mir noch nicht so geläufig.

      Schaltplan (in analoger Form):

      1-Wire-Slave_ATtiny44_Counter.jpg

      Code: 1WS_0xFD_32Bit-Counter_ATtiny44.bas

      Liebe Grüße,
      RoBue
    • Moin, Moin,

      teste ich am Wochenende. Aktuell verwende ich eine modifizierte FIRMATA für bestimmte Elemente zur Ankopplung an FHEM. Schicker wäre natürlich ein Unterbau mit Bascom, inklusive 1-Wire Slaves nach eigenem Gusto....
      Hab auch schon neue Tinys für Hardware basierte I2C Slaves beschafft.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Hallo monkye,
      schön, dass sich jemand mal rückmeldet.
      Habe ca. 3000 Hits und ein paar likes, aber ansonsten keinerlei Info,
      ob und wie die 1-Wire-Slaves angekommen sind bzw. angenommen werden.

      Eigentlich sollte das AVR-PC-Control als eine Art Server auch zur Anbindung von 1-Wire an den PC dienen.
      Bei Interesse gerne mehr.
      Eine Version für i2c-Slaves ist im Forum schon eingestellt.

      Mit FHEM habe ich zwiespältige Erfahrungen gemacht.
      Das Programm selbst ist eine tolle Sache.
      Das Forum hat mich aber eher enttäuscht.
      Habe ein wenig mitgearbeitet und sogar ein Modul für RasPi und meine Slaves geschrieben,
      aber selbst keinerlei Hilfe bei Anfragen bekommen.
      War mir dann schließlich zu einseitig.

      Inzwischen binde ich mein AVR-PC-Control über serielle Schnittstelle an den PC (Linux) an
      und werte die Daten dann mit Bash, Perl und vor allem gnuplot aus.
      Auch das kann ich bei Interesse mal posten.

      LG RoBue
    • RoBue schrieb:

      Habe ca. 3000 Hits und ein paar likes, aber ansonsten keinerlei Info,
      ob und wie die 1-Wire-Slaves angekommen sind bzw. angenommen werden.
      Ich finde es gut, dass sich jemand mit so was ernsthaft beschäftigt, dafür hast du auch meinen vollsten Respekt.
      Dein Thema ist so speziell, dass sich eben nur sehr wenige damit beschäftigen. Dann aber richtig.

      Aber bedenke bitte, hier ist kein Facebook etc., wo die Leute gerne in Klicks gemessen werden wollen und dadurch ihre Bestätigung im Leben finden. Es wäre doch schade, wenn wir hier nur posten, um Likes zu bekommen, oder?
    • Hallo Michael,
      ich gebe zu, dass ich mich über die hits und likes durchaus freue.
      Ist zumindest eine Form der Rückmeldung und ok.

      Freuen würde ich mich aber auch, wenn ich etwas darüber erfahren könnte,
      ob und wie die Sensoren eingesetzt werden.
      Interessant wäre da der Dialog mit anderen Anwendern, um z.B. Fehler zu finden, den Code zu optimieren, neue Sensortypen zu entwickeln, Platinen herzustellen ...
      Die Entwicklung des Baukastens hat mir Spaß gemacht
      und ich setze einige der Sensoren bei mir daheim in meiner Haussteuerung ein,
      aber ich stoße dabei wirklich an die Grenzen meines Wissens
      und könnte Tipps und Hilfen gebrauchen.

      Ein größeres Ziel könnte z.B. auch die Entwicklung einer 1-Wire-Wetterstation sein.
      Das kann ich jedoch - soweit ich das sehe - nicht allein stemmen.
      Ich kann z.B. keine Platinen entwickeln.

      Isch a bissele ego, das gebe ich zu, aber das wäre trotzdem super.

      Unabhängig davon werde ich meine "Errungenschaften" hier einstellen,
      schon allein deswegen, weil ich ja auch immer wieder von den Kenntnissen anderer profitiere.

      LG Roland
    • 15. Ergänzung zum BME280

      Hi 1-Wire-Interessierte,

      nach längerer Pause konnte ich mich mal wieder um meine 1-Wire-Slaves kümmern.

      Als ich ein weiteres BME280-Board kaufte,
      merkte ich, dass es nicht erkannt wurde,
      und wurde fatal an das Phänomen von cineks erinnert (s.o.).

      Also Tante Google gefragt und siehe da:

      Es gibt tatsächlich 2 mögliche I2C-Adressen: EC und EE

      Dazu fand ich eine hardwareseitige Lösung, um die Adresse zu ändern:

      bascomforum.de/index.php?attac…451516ebddea10c313ba5927f

      Aber das ist nicht das Wahre, also habe ich meine Routinen so angepasst, dass sie nun erkennen, welche Variante vorliegt.

      Vermutlich ist cineks dann auch geholfen.

      bascomforum.de/index.php?attac…451516ebddea10c313ba5927f


      LG RoBue
    • 16. 1-Wire-Slave mit Distanzsensor vom TYP DYP-ME007Y

      Zu einer Hausüberwachung gehört auch das Messen von Zisternen oder Öltanks.
      Da die Öffnungen, in die man Sesoren einführen kann, dafür oft sehr klein sind,
      ist der HC-SR04 (s.o.) nicht immer so geschickt.
      Ich habe z.B. den HC-SR04 auf die Abluftöffnung gesetzt. Das hat gerade so gepasst.
      Da stieß ich auf Ultraschallsensoren, die man auch in den Stoßstangen von Autos findet.
      Sie scheinen ähnlich abgefragt zu werden wie der HC-SR04, aber sind viel kleiner.
      Super! Also flugs bestellt.

      DYP-ME007Y.jpg

      Aber dann nach dem Anschließen die Ernüchterung:
      Eine grüne LED blinkte auf dem Board wie wild,
      aber es wurden keine sinnvolle Werte ausgelesen.
      Na toll!

      Auch hier war die Tante mein Freund:
      Es gibt tatsächlich 2 Varianten,
      die auf dem absolut tupfengleichen Board mit der genau gleichen Bezeichnung ausgeliefert werden:
      Die eine arbeitet wie ein HC-SR04, die andere schickt die Daten seriell.
      Und ich hab natürlich die serielle erwischt, was an der hektische LED im Betrieb erkennbar ist.
      Aber auch dafür fanden sich Lösungen im Internet, die ich dann auf BASCOM übertragen konnte.

      Das Prinzip ist recht einfach:
      Es gibt immer 4 Bytes, die gesendet werden:
      1. Startbyte, &HFF
      2. High-Byte Wert
      3. Low-Byte Wert
      4. Prüfsumme: Byte1+Byte2+Byte3 (nur die unteren/niederwertigen 8Bit)

      Deswegen gibt es nun einen 1-Wire-Slave dafür.

      In den Init-Teil muss nun rein:

      BASCOM-Quellcode

      1. ' Soft-UART
      2. ' PORTB.2 als serieller Eingang
      3. Open "ComB.2:9600,8,n,1" For Input As #1
      4. ' Es werden immer 4 Bytes gesendet:
      5. ' 1 -> &HFF (Startbyte)
      6. ' 2 -> Distanz in mm MSB
      7. ' 3 -> Distanz in mm LSB
      8. ' 4 -> Pruefsumme
      9. Dim uart_array(7) As Byte
      10. Dim uart_wert As Byte
      11. Dim uart_index As Byte
      12. Dim uart_pruef As Byte
      Alles anzeigen


      Calculatedata sieht so aus:

      BASCOM-Quellcode

      1. Calculatedata:
      2. If Match_slave = 1 Then
      3. ' Scatchpad loeschen, Status-Byte 8 auf 0
      4. For I = 1 to 8
      5. Daten_array(i) = 0
      6. Next I
      7. ' Serielle Werte einlesen
      8. ' - Warten auf Startbyte (&HFF)
      9. Do
      10. Inputbin #1, Uart_wert
      11. Loop Until Uart_wert = &HFF
      12. Uart_array(1) = Uart_wert
      13. ' - Weitere 6 Werte einlesen
      14. ' (Es werden immer 7 Bytes eingelesen,
      15. ' damit auf jeden Fall die richtige Bytefolge im Array steht.)
      16. For Uart_index = 2 To 7
      17. Inputbin #1, Uart_wert
      18. Uart_array(Uart_index) = Uart_wert
      19. Next Uart_index
      20. ' - Richtige Werte ueber Pruefsumme aus Array herausfiltern
      21. ' (Falls &HFF nicht das Startbyte war,
      22. ' sondern ein anderer Wert)
      23. Uart_index = 1
      24. Do
      25. If Uart_array(Uart_index) = &HFF Then
      26. I = Uart_index
      27. Uart_pruef = Uart_array(I)
      28. Incr I
      29. Uart_pruef = Uart_pruef + Uart_array(I)
      30. Incr I
      31. Uart_pruef = Uart_pruef + Uart_array(I)
      32. Incr I
      33. If Uart_pruef = Uart_array(I) Then
      34. ' Es wurden die richtigen 4 Bytes gefunden
      35. ' Ende der Suche
      36. Exit Do
      37. End If
      38. End If
      39. ' Weitere Suchrunde
      40. Incr Uart_index
      41. Loop Until Uart_index = 5
      42. ' - Auswertung
      43. If Uart_index = 5 Then
      44. ' Nichts gefunden -> Wert 11111 ausgeben
      45. Ausgabeinteger = 11111
      46. Else
      47. ' Umrechnung
      48. Incr Uart_index
      49. Ausgabeinteger = Uart_array(Uart_index) * 256
      50. Incr Uart_index
      51. Ausgabeinteger = Ausgabeinteger + Uart_array(Uart_index)
      52. Ausgabeinteger = Ausgabeinteger / 10
      53. End If
      54. ' Werte ins Scratchpad schreiben
      55. Daten_array(5) = Low(Ausgabeinteger)
      56. Daten_array(6) = High(Ausgabeinteger)
      57. ' Pruefsumme bilden
      58. Daten_array(9) = Crc8(daten_array(1) , 8)
      59. End If
      60. 'Goto Readb
      61. Goto Waitreset
      Alles anzeigen
      Die Ausgabe gibt die Distanz in cm an.
      Die Werte (LSB,MSB) stehen im Scatchpad an 5. und 6. Stelle.
      "11111" ist ein Hinweis, dass beim Empfang der Daten Probleme gab.
      Die Stellen 1 - 4 sind 0.


      Hier der vollständige Code:
      Distanzsensor_DYP-ME007Y_seriell.zip

      Nachtrag:
      Leider ist doch nicht alles so, wie ich mir das vorgestellt habe:
      Die Sensoren liefern unter 30 cm chaotische Werte,
      d.h. sie sollten mindestens 30 cm über dem höchsten Wasser- bzw. Ölstand angebracht werden,
      was aber in der Regel kaum möglich ist.
      Wenn man sie oberhalb der Öffnung anbringt, wird der Schall möglicherweise nicht von der Flüssigkeit, sondern vom Tankdach zurückgeworfen.

      LG RoBue

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von RoBue ()