Kapazitiver Regensensor mit ATtiny84

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

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Auf wunsch, hier der Schaltplan und das letzte Programm

      BASCOM-Quellcode

      1. ' Insanity
      2. ' Atmel Typ
      3. ' ATiny84
      4. ' Regensensor
      5. $regfile = "attiny84.dat"
      6. $hwstack = 64
      7. $swstack = 64
      8. $framesize = 64
      9. ' Quarz
      10. $crystal = 8000000
      11. Const Ein = 1
      12. Const Aus = 0
      13. ' Timer Für PWM - Heizung
      14. Config Timer0 = Pwm , Compare_b_pwm = Clear_up , Prescale = 64
      15. ' Timer für Kapazitätmessung
      16. Config Timer1 = Timer , Prescale = 8
      17. ' Analog
      18. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      19. Start Adc
      20. Declare Function Kapazitaet(byval Messungen As Word)as Word
      21. Declare Function Analog(byval Kanal As Byte , Byval Anzahl As Word ) As Word
      22. Open "comb.0:9600,8,N,1" For Output As #1
      23. ' Ausgang für PWM / Heizung
      24. Config Porta.7 = Output
      25. ' Analogcomparator
      26. Config Porta.1 = Input
      27. Config Porta.2 = Input
      28. ' Ausgang bei Regen
      29. Config Portb.2 = Output
      30. Regen Alias Portb.2
      31. '
      32. ' Analogkomparator
      33. ' definieren
      34. Config Aci = On
      35. Adcsrb.6 = 0
      36. Acsr.0 = 0
      37. Acsr.1 = 0
      38. Acsr.2 = 0
      39. Acsr.3 = 0
      40. Acsr.4 = 0
      41. Acsr.6 = 0
      42. Acsr.7 = 0
      43. Dim Wert As Word
      44. Dim Zeit_ein As Byte
      45. Dim Zeit_aus As Byte
      46. Dim Senden As Byte
      47. Dim Analog_grenze As Word
      48. 'Dim Temp As Single
      49. Dim Schwelle_ein As Word
      50. Dim Schwelle_aus As Word
      51. Dim Verzoegerung_aus As Word
      52. Dim Heizung_ein_flag As Byte
      53. Dim Heizung As Byte
      54. Heizung = 50
      55. Const Schaltungs_offset = 13
      56. Const Wartezeit_ein = 10
      57. Const Wartezeit_aus = 50
      58. Const Hysterese = 10
      59. Const Heizung_max = 150
      60. Const Heizung_grund = 30
      61. Const Heizung_aus_verzoegerung = 50
      62. ' Heizung leicht mitlaufen lassen
      63. Heizung = Heizung_grund
      64. Pwm0b = Heizung
      65. Config Watchdog = 2048
      66. Start Watchdog
      67. Print #1 , "Regensensor by Insanity"
      68. Print #1 , "August 2019"
      69. Print #1 , "Offset : ";
      70. Print #1 , Schaltungs_offset
      71. Print #1 , "Hysterese : ";
      72. Print #1 , Hysterese
      73. Print #1 , "Wartezeit Ein : ";
      74. Print #1 , Wartezeit_ein
      75. Print #1 , "Wartezeit Aus : ";
      76. Print #1 , Wartezeit_aus
      77. Do
      78. Wert = Kapazitaet(200)
      79. Analog_grenze = Analog(5 , 100)
      80. Schwelle_ein = Analog_grenze + Hysterese
      81. Schwelle_aus = Analog_grenze - Hysterese
      82. Incr Senden
      83. If Senden => 0 Then
      84. Print #1 , "Kapa: ";
      85. Print #1 , Wert;
      86. Print #1 , " Gr: ";
      87. Print #1 , Analog_grenze;
      88. Print #1 , " Pwm: ";
      89. Print #1 , Heizung ;
      90. Print #1 , " V_Aus: ";
      91. Print #1 , Verzoegerung_aus ;
      92. Print #1 , " Zeit Ein: ";
      93. Print #1 , Zeit_ein ;
      94. Print #1 , " Zeit Aus: ";
      95. Print #1 , Zeit_aus ;
      96. If Pwm0b < Heizung_max Then
      97. Print #1 , " He.Aus";
      98. Else
      99. Print #1 , " He.Ein";
      100. End If
      101. If Regen = Ein Then
      102. Print #1 , " A.Ein"
      103. Else
      104. Print #1 , " A.Aus"
      105. End If
      106. Senden = 0
      107. End If
      108. ' Auswertung
      109. If Wert > Schwelle_ein Then
      110. ' Heizung auf
      111. Heizung = Heizung_max
      112. Pwm0b = Heizung
      113. Verzoegerung_aus = 0
      114. Heizung_ein_flag = 1
      115. If Zeit_ein < Wartezeit_ein Then
      116. Incr Zeit_ein
      117. End If
      118. If Zeit_ein => Wartezeit_ein Then
      119. ' Ausgang schalten
      120. Regen = Ein
      121. End If
      122. Elseif Wert < Schwelle_aus And Zeit_ein > 0 Then
      123. Decr Zeit_ein
      124. Elseif Wert < Schwelle_aus Then
      125. Zeit_ein = 0
      126. If Zeit_aus < Wartezeit_aus And Regen = Ein Then
      127. Incr Zeit_aus
      128. Else
      129. Regen = Aus
      130. Zeit_aus = 0
      131. End If
      132. If Heizung_ein_flag = 1 Then
      133. Incr Verzoegerung_aus
      134. If Verzoegerung_aus > Heizung_aus_verzoegerung Then
      135. Heizung = Heizung_grund
      136. Pwm0b = Heizung
      137. Heizung_ein_flag = 0
      138. Verzoegerung_aus = 0
      139. End If
      140. End If
      141. End If
      142. Reset Watchdog
      143. Loop
      144. End
      145. Function Kapazitaet(messungen)
      146. Local Zykus As Word
      147. Local Schleife As Word
      148. Local Ticks As Word
      149. Local G_ticks As Dword
      150. Local Zw As Single
      151. G_ticks = 0
      152. If Messungen = 0 Then Messungen = 1
      153. For Zykus = 1 To Messungen
      154. ' Kapazität löschen
      155. Config Porta.1 = Output
      156. Porta.1 = 0
      157. Waitms 5
      158. ' Kapazität freigeben
      159. Config Porta.1 = Input
      160. Timer1 = 0
      161. ' internen Komparator abfragen
      162. Schleife = 0
      163. Do
      164. ' If Acsr.5 = 1 Then Exit Do
      165. Incr Schleife
      166. If Schleife > 200 Then
      167. Exit Do
      168. End If
      169. Loop Until Acsr.5 = 1
      170. ' Timer auslesen
      171. Ticks = Timer1
      172. ' Offset des Schaltungsaufbaus
      173. If Ticks > 0 And Ticks < Schaltungs_offset Then
      174. Ticks = 0
      175. Else
      176. Ticks = Ticks - Schaltungs_offset
      177. End If
      178. ' Addieren
      179. G_ticks = G_ticks + Ticks
      180. Next
      181. ' Kapazität löschen
      182. Config Porta.1 = Output
      183. Porta.1 = 0
      184. ' Mittelwert berechnen
      185. Zw = G_ticks / Messungen
      186. ' Kapazität berechnen - ca.
      187. ' 1*tau = 63% / Zeitkonstante
      188. Zw = Zw * 0.63
      189. Ticks = Zw
      190. ' Mittelwert zurückgeben / in pF (ca.)
      191. Kapazitaet = Ticks
      192. End Function
      193. ' Analog messen
      194. Function Analog(kanal , Anzahl)
      195. Local Xschleife As Word
      196. Local Xanalogmesswert As Word
      197. Local Xanalogmesswert_summe As Long
      198. Local Xanalog_mittel As Long
      199. If Anzahl = 0 Then Anzahl = 1
      200. Xanalogmesswert_summe = 0
      201. For Xschleife = 1 To Anzahl
      202. Xanalogmesswert = Getadc(kanal)
      203. Xanalogmesswert_summe = Xanalogmesswert_summe + Xanalogmesswert
      204. Next
      205. Xanalog_mittel = Xanalogmesswert_summe / Anzahl
      206. Xanalogmesswert = Xanalog_mittel
      207. Analog = Xanalogmesswert
      208. End Function
      Alles anzeigen
      Dateien
    • Hallo Insanity,
      ohne deine Arbeit zu kennen habe ich auch einen kapazitiven Regensensor für meinen Mäh-Roboter gebaut.
      Ich benutze dafür einen ATtiny13-20. Das Prinzip ist hier auf elektronik-labor.de/AVR/Touch.html sehr gut erklärt.
      Der Sensorfläche besteht aus einer kammartigen Struktur, etwa 10 x 3 cm. Die Elektronik ist auf der Unterseite der Platine, ebenso die Heizung.
      Sie wird durch zwei Ketten von SMD- Widerständen realisiert, die etwa 2,3 Watt verheizen.
      Die Oberfläche habe ich ebenso wie du mit Plastik 70 versiegelt.
      Hast du schon Erfahrungen, wie lange der Schutz halten wird? Ich kann ja erst ab Frühjahr Erfahrungen sammeln.
      Eventuell muss man etwas anderes nehmen, z.B. Urethan 71.

      Gruß
      EL84
    • Meine Erfahrung der Langzeitwirkungen von Feuchtigkeit, Sonne und Wind bei Feuchtesensoren ist, dass einfache Beschichtungen/Lacke auf Dauer nicht standhalten. Am längsten halten bisher die Sensoren mit Urethan 71 Beschichtung, 3-4 Schichten übereinander.

      NACHTRAG: Seit 2 Jahren draußen.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.