Zisternen-Überwachung mit kapazitivem Füllstandssensor

Hallo Dino!

Nein, es ist nichts verloren gegangen. ;)

Es liegt ja auch nur daran, dass BASCOM nach dem Semikolon einen numerischen Parameter erwartet.....
diesen aber nicht bekommt!

Wenn du jetzt folgendes schreiben würdest:
Code:
Printbin #1 , Ds18s20(ds_count) ; 9

wäre die Anweisung völlständig und es gibt auch keine Fehlermeldung mehr.

Scheint aber nur beim Array ein Problem zu sein.
Die anderen Anweisungen geben keinen Fehler aus. :hmmmm:


Welche BASCOM-Version hast du denn aktuell zum Kompilieren verwendet?

Grüße,
Cassio
 
Scheint aber nur beim Array ein Problem zu sein.
Die anderen Anweisungen geben keinen Fehler aus. :hmmmm:


Welche BASCOM-Version hast du denn aktuell zum Kompilieren verwendet?
müßte in meinem Screenshot zu sehen sein ... 2.0.7.3
Die 2.0.7.4 Beta hab ich auf dem PC noch nicht am laufen.

Gruß
Dino
 
Hallo Dino!

Ich habe eben noch mal in die BASCOM-Hilfe geschaut.....

Bei PRINTBIN und einem Array musst du hinter dem Semikolon noch die Byteanzahl angeben die gesendet werden sollen.

Hinweis aus der Hilfe:
The number of bytes to send can be specified by an additional numeric parameter. This is convenient when sending the content of an array.

Printbin ar(1) ; 3 ' will send 3 bytes from array ar().

Printbin ar(1) ; 2 ; ar(2) ; 4 ' will send 2 bytes from array ar() starting at index 1, then 4 bytes from array ar() starting at index 4.

When you use Printbin ar(1) , the whole array will be printed.


Gruß,
Cassio
 
Bei PRINTBIN und einem Array musst du hinter dem Semikolon noch die Byteanzahl angeben die gesendet werden sollen.
Ich sende ja durch die Schleife und den daraus erzeugten Index für das Array lediglich ein Byte. Also bei jedem Schleifendurchlauf einen Eintrag des Arrays.

Aber eigentlich egal da ich wegen der besseren Debugmöglichkeit und für eine einfachere Erkennung der Datentelegramme auf HEX-Übertragung umgestellt ;)
 
Sensor ist fertig ...

Hallo,

Das Sensorprogramm ist nach meiner Meinung nun fertig ...
Code:
' ####################################################
' ##### Zisternensensor mit AVR ATtiny2313 ###########
' ####################################################
' (c) 26.06.2012 by Dino
'
' Frequenzmessung und Temperaturmessung fuer
' Zisternenanzeige (Fuellstand und Innentemperatur)
' BASCOM 2.0.7.3
' 69% Flash used
' File: Zisternensensor_Tiny2313_v3.bas
'
'Hardware:  PD5/T1 : Oszillatoreingang
'           PD4    : 1Wire-Sensor DS18S20 (Temperatur)
'           PD0/RxD: Kommandos empfangen 9k6 8n1
'           PD1/TxD: Daten senden 9k6 8n1

' Stecker Pin 1+2 = Sensor, heißes Ende (Osc)
' Stecker Pin 3+G = Sensor, kaltes Ende (GND)

' RJ45 Pin 1  = ws/or ------- TxD
' RJ45 Pin 2  = or    - GND
' RJ45 Pin 3  = ws/gn ------- RxD
' RJ45 Pin 4  = bl    - GND
' RJ45 Pin 5  = ws/bl ---- +UB
' RJ45 Pin 6  = gn    - GND
' RJ45 Pin 7  = ws/bn ---- +UB
' RJ45 Pin 8  = bn    ---- +UB
' RJ45 Schirm = Draht - GND

' Prozessor ATtiny2313
$regfile = "ATtiny2313.DAT"
' Systemtakt von 20MHz (externer Quarz)
$crystal = 20000000

$hwstack = 48
$swstack = 8
$framesize = 28
$noramclear




' ####################################
' ##### DEFINITION DER VARIABLEN #####
' ####################################
'
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte                                      ' Array fuer Scratchpad

' Variablen fuer DS18S20 Temperatur
Dim Ds_count As Byte                                        ' Zaehler fuer Scratchpad bearbeiten                                 '
Dim Deg_lo As Byte                                          ' unteres Temperaturbyte
Dim Deg_hi As Byte                                          ' oberes Temperaturbyte

' Variablen fuer Frequenzmessung
Dim Ticks As Word                                           ' Zaehler fuer Messinterfall in 1ms-Ticks
Dim Cnt_lo As Byte                                          ' Wert des Low-Bytes vom 16Bit-Timer 1
Dim Cnt_hi As Byte                                          ' Wert des High-Bytes vom 16Bit-Timer 1
Dim Cnt_ovf As Word                                         ' Wert vom 16-Bit Ueberlaufzaehler fuer 16Bit-Timer 1
Dim T1ovf As Word                                           ' 16-Bit Ueberlaufzaehler fuer 16Bit-Timer 1

Dim Temp As Byte                                            ' Temporaere Byte-Variable fuer alles moegliche
Dim Tmpchr As Byte                                          ' Temporaere Variable fuer ein Byte



' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' DDR  =>  0-Bit = Eingang / 1-Bit = Ausgang
' PORT =>  0-Bit = PullUp aus / 1-Bit = PullUp an (bei Eingang)


' PD0 -------<---- UART RxD | UART
' PD1 --------->-- UART TxD | TTL-Pegel
' PD2/INT0 --
' PD3/INT1 --
' PD4/T0 ----<->-- 1Wire-Bus (Timer0 = 8Bit)
' PD5/T1 ----<---- Mess-Oszillator (Timer1 = 16Bit)
' PD6/ICP1 --
'
' ===== PortD =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= O=1= I=0=  => 00000010 => DDRD
' ---- ----  T1  1Wir ---- ---- TxD  RxD   => 11111101 => PORTD (init)
'  |    |    |    |    |    |    |    |
'
Ddrd = &B0000_0010
Portd = &B1111_1101


' PB0 --
' PB1 --
' PB2 --
' PB3 --
' PB4 --
' PB5/SDA -------- MOSI |
' PB6 ------------ MISO | ISP-Port
' PB7/SCL -------- SCK  |
'
' ===== PortB =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRB
' ISP  ISP  ISP  ---- ---- ---- ---- ----  => 11111111 => PORTB (init)
'  |    |    |    |    |    |    |    |
'
Ddrb = &B0000_0000
Portb = &B1111_1111


' PA0 -- XTAL1 | Systemquarz
' PA1 -- XTAL2 | 20,000MHz
' PA2 -- RESET
'
' ===== PortA =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRA
' ---- ---- ---- ---- ---- Rst  XTl1 XTl2  => 11111111 => PORTA (init)
'  |    |    |    |    |    |    |    |
'
Ddra = &B0000_0000
Porta = &B1111_1111




' ===== UART (TTL) initialisieren =============================================
Config Com1 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Config Serialin = Buffered , Size = 4                       ' Buffer kostet wertvolles SRAM
Open "com1:" For Binary As #1
' Clear Serialin                                              ' Braucht man ohne Buffer auch nicht


' ===== 1Wire-Bus DS18S20 Temperatursensor ====================================
Config 1wire = Portd.4


' ===== Timer Initialisieren ==================================================
Config Timer0 = Timer , Prescale = 256                      ' Timer0 liefert die Messzeit (1sec)
On Ovf0 Tim0_isr

Config Timer1 = Counter , Edge = Falling , Prescale = 1     ' Timer1 zaehlt die Eingangstakte
On Ovf1 Tim1_isr

Enable Timer0                                               ' Timer starten
Enable Timer1                                               ' Timer starten

Waitms 100                                                  ' kleine Wartezeit

Print #1 , "00000000000000000000000000"                     ' Startmeldung ueber UART senden

Waitms 100                                                  ' nochmal etwas warten

Temp = 0                                                    ' Flag Auf "Messung läuft nicht" setzen
' Temp 0 = Messung läuft nicht
'      1 = Messung läuft
'      2 = Mesungen abgeschaltet

' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do


  ' Damit man mit dem "Wait 1100" nicht unnoetig Zeit verbrennt habe ich das Messende nun ueber ein Flag
  ' anzeigen lassen. Nun kann man waehrend der Messzeit auch noch was anderes machen.
  If Temp = 0 Then                                          ' Test ob die Messung zu Ende ist
    ' Frequenz-Messung ist zu Ende

    Gosub Ds18s20_temp                                      ' 1Wire Temperatur abfragen (vom letzten Messzyklus)
    Gosub Ds18s20_mess                                      ' 1Wire Messung starten - der Chip arbeitet alleine weiter

    ' Uebertragung der Daten ueber UART (1k2 8n1) im Hexformat mit crlf (0D 0A) als Endmarke
    ' gesamt : 13 Byte => 26 Chr in Hex ... + Ende-Zeichen crlf (0d 0a)
    ' Wegen der besseren Debug-Moeglichkeit ueber ein Terminal habe ich mich gegen die Binaeruebertragung
    ' entschieden. Die Gegenstelle liest dann die Daten ueber ...
    ' INPUTHEX [" prompt" ] , var[ , varn ]
    ' ... in numerische Variablen ein. Ueber das CRLF als Zeilenende ist die Trennung der Datentelegramme
    ' gegenueber Binaertelegrammen auch einfacher.

    '    __LSB
    '  //  __MSB       __CntRemain     uuuu = Userdefined Bytes im EEPROM
    ' || //          //  __Cnt/deg     ffff = Reserved Bytes (FF FF)
    ' ||||          || //  __CRC
    ' llmm uuuuffff |||| cc  _________Freq
    ' AA00 4B46FFFF 0C10 87 DBD9E53F
    ' 3200 4B46FFFF 0E10 FA 00045946  <=== Leerzeichen im Texteditor eingefuegt um die
    ' 3200 4B46FFFF 0D10 AF 000459DD       Lesbarkeit der Datentelegramme zu verbessern
    ' Ready
    ' AA00 4B46FFFF 0C10 87 000459DD
    ' 3200 4B46FFFF 0D10 AF 000459DA
    ' 3200 4B46FFFF 0D10 AF 000459D6

    ' === Ohne eingefügte Leerzeichen (so kommt es ueber die Leitung) ===
    ' Ready
    ' AA004B46FFFF0C1087DBD9E537
    ' 34004B46FFFF0F10AD00045B12
    ' 34004B46FFFF0F10AD00045B79
    ' 34004B46FFFF0E106900045B72

    ' Daten des Temperatursensors (Scratchpad des DS18S20) ausgeben (9 Byte => 18Cht r in Hex)
    For Ds_count = 1 To 9
'      Printbin #1 , Ds18s20(ds_count);                      ' Scratchpad auf UART ausgeben
      Print #1 , Hex(ds18s20(ds_count));                    ' Scratchpad auf UART als HEX ausgeben
    Next

    ' 32Bit Frequenzmessung ausgeben (4 Byte => 8Chr in Hex)
    Temp = High(cnt_ovf)
'    Printbin #1 , Temp;                                     ' Frequenzmessung auf UART ausgeben (Bits 31-24)
    Print #1 , Hex(temp);                                   ' Frequenzmessung auf UART als HEX ausgeben (Bits 31-24)
    Temp = Low(cnt_ovf)
'    Printbin #1 , Temp;                                     ' Frequenzmessung auf UART ausgeben (Bits 23-16)
'    Printbin #1 , Cnt_hi ; Cnt_lo                           ' Frequenzmessung auf UART ausgeben (Bits 15-0)
    Print #1 , Hex(temp);                                   ' Frequenzmessung auf UART als HEX ausgeben (Bits 23-16)
    Print #1 , Hex(cnt_hi) ; Hex(cnt_lo)                    ' Frequenzmessung auf UART als HEX ausgeben (Bits 15-0)

    Temp = 1                                                ' Temp als Flag nutzen : Messung noch nicht fertig
    ' ----- Frequenz-Messung starten -----
    Ticks = 0                                               ' Timer0-Ticks initialisieren
    Enable Interrupts                                       ' Interrupts für Frequenzmessung anschalten
    ' Waitms 1100                                             ' Die Frequenzmessung sollte nach 1,1sec beendet sein.
                                                             ' und damit die Interrupts auch wieder abgeschaltet (siehe ISR)


  Elseif Temp = 1 Then                                      ' Die Messung laeuft noch

    Tmpchr = Ischarwaiting(#1)
    If Tmpchr = 1 Then
      Tmpchr = Inkey(#1)
      If Tmpchr = &H65 Then                                 ' Test auf "e"
        ' ===== Messungen ausschalten ===== Character "e" (ende)
        Disable Interrupts
        Temp = 2
        ' Senden "EE EE EE EE EE EE EE EE EE EE ...."
        Print #1 , "EEEEEEEEEEEEEEEEEEEEEEEEEE"             ' 26xE als Mess-Ende
      End If
    End If

  Else                                                      ' Messung ist ausgeschaltet

    Tmpchr = Ischarwaiting(#1)
    If Tmpchr = 1 Then
      Tmpchr = Inkey(#1)
      If Tmpchr = &H61 Then                                 ' Test auf "a"
        ' ===== Messungen einschalten ===== Character "a" (anfang)
        Disable Interrupts
        Temp = 1
        ' Senden "AA AA AA AA AA AA AA AA AA AA ...."
        Print #1 , "AAAAAAAAAAAAAAAAAAAAAAAAAA"             ' 26xA als Mess-Anfang
        Gosub Ds18s20_mess                                  ' 1Wire Messung starten - der Chip arbeitet alleine weiter
        ' ----- Frequenz-Messung starten -----
        Ticks = 0                                           ' Timer0-Ticks initialisieren
        Enable Interrupts                                   ' Interrupts für Frequenzmessung anschalten
        '                                                     ' Die Frequenzmessung sollte nach 1 sec beendet sein.
                                                              ' und damit die Interrupts auch wieder abgeschaltet (siehe ISR)
      End If
    End If

  End If


Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################




' ============================================
' ===== Sub fuer DS18S20 Messung starten =====
' ============================================
Ds18s20_mess:
  ' ===== Befehlsbytes =====
  ' SEARCH ROM [F0h]
  ' READ ROM [33h]
  ' MATCH ROM [55h]
  ' SKIP ROM [CCh]
  ' ALARM SEARCH [ECh]
  ' CONVERT T [44h]
  ' WRITE SCRATCHPAD [4Eh]
  ' READ SCRATCHPAD [BEh]
  ' COPY SCRATCHPAD [48h]
  ' RECALL E2 [B8h]
  ' READ POWER SUPPLY [B4h]
  1wreset                                                   ' 1Wire-Bus zuruecksetzen
  1wwrite &HCC                                              ' Alle 1Wire-Devices ansprechen
  1wwrite &H44                                              ' Temperaturmessung starten
Return




' ================================================
' ===== Sub fuer DS18S20 Temperatur einlesen =====
' ================================================
Ds18s20_temp:
  ' ===== Scratchpad =====
  ' 1. Byte 0 - Temperature LSB
  ' 2. Byte 1 - Temperature MSB
  ' 3. Byte 2 - TH Register or User Byte 1 <-> TH Register or User Byte 1
  ' 4. Byte 3 - TL Register or User Byte 2 <-> TL Register or User Byte 2
  ' 5. Byte 4 - Reserved (FFh)
  ' 6. Byte 5 - Reserved (FFh)
  ' 7. Byte 6 - COUNT REMAIN
  ' 8. Byte 7 - COUNT PER deg
  ' 9. Byte 8 - CRC8
  ' ===== Seriennummer / ROM-Code =====
  ' 8-BIT CRC , 48-BIT SERIAL NUMBER , 8-BIT FAMILY CODE (10h)
  ' ===== Temperaturberechnung =====
  ' After reading the scratchpad, the TEMP_READ value is obtained
  ' by truncating the 0.5°C bit (bit 0) from the temperature data
  ' TEMPERATURE = TEMP_READ - 0,25 + ( COUNT_PER_C - COUNT_REMAIN ) / COUNT_PER_C
  '
  1wreset                                                   ' 1Wire-Bus zuruecksetzen
  1wwrite &HCC                                              ' Alle 1Wire-Devices ansprechen
  1wwrite &HBE                                              ' Scratchpad einlesen

  Ds18s20(1) = 1wread(9)                                    ' diese Version spart etwas Flash (85% zu 87%)
'  For Ds_count = 1 To 9
'    Ds18s20(ds_count) = 1wread()                            ' Scratchpad in Array uebertragen
'  Next

  ' die naechsten 4 Zeilen brauch ich eigentlich nicht wenn ich sowieso immer das ganze Scratchpad sende
  ' dann kann auch der empfangende ATmega die CRC pruefen.
  If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then                 ' Wenn CRC8 korrekt dann Temperaturwerte sichern
    Deg_lo = Ds18s20(1)                                     ' Temperatur LSB
    Deg_hi = Ds18s20(2)                                     ' Temperatur MSB
  End If

Return




' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist das Gate fuer die Frequenzmessung
Tim0_isr:
  Timer0 = 178                                              ' Initialisierung fuer 1ms Takt (Prescaler 256)
  Incr Ticks                                                ' 1ms-Ticks zaehlen
  If Ticks = 1 Then                                         ' beim ersten Tick ...
    Timer1 = 0                                              ' Timer1 fuer Taktzaehlung initialisieren
    T1ovf = 0                                               ' und Timer1-Ueberlaufszaehler auf 0
  End If
  If Ticks = 1001 Then                                      ' 1sec Messzeit ist vorbei -> Werte sichern
    Cnt_lo = Tcnt1l                                         ' Frequenz LSB (Byte 1)   - Timer1 LowByte
    Cnt_hi = Tcnt1h                                         ' Frequenz     (Byte 2)   - Timer1 HighByte
    Cnt_ovf = T1ovf                                         ' Frequenz MSW (Byte 3+4) - Timer1-Ueberlaufszaehler
    Disable Interrupts
    Temp = 0                                                ' Temp als Flag nutzen : Messung ist jetzt fertig
  End If
Return




' ================================================
' ===== ISR fuer Timer1 Overflow =================
' ================================================
' Timer1 ist der Zaehler fuer die Frequenzmessung
Tim1_isr:
  Incr T1ovf                                                ' Ueberlauf vom 16Bit-Timer (Byte3+4) bearbeiten
Return




' ###############################################
' ##### Programm Ende ###########################
' ###############################################
Close #1
End

' - - - - - - - - - - - - - - - - S C H L U S S - - - - - - - - - - - - - - - - - - -

und so sieht die Übertragung aus ...
Code:
00000000000000000000000000 <== Startmeldung
E1004B46FFFF031039DBD9E536
33004B46FFFF07100B00046427
33004B46FFFF07100B00046422
33004B46FFFF07100B0004641D
33004B46FFFF0810130004641A
EEEEEEEEEEEEEEEEEEEEEEEEEE <== Mess-Ende nach Senden eines "e" (Mess-Unterbrechung)
AAAAAAAAAAAAAAAAAAAAAAAAAA <== Mess-Anfang nach Senden eines "a" (Mess-Restart) 
33004B46FFFF08101300046415
33004B46FFFF08101300046415
33004B46FFFF07100B00046415
33004B46FFFF07100B00046414
Es läuft und ich bin zufrieden. Man kann jetzt auch über die Ferne eine kleine Steuerung des Sensors machen.

So sieht im Moment der Schaltplan aus ...
Zisternen-Sensor_v3.png

Als nächstes kommt die Auswerte-Einheit.

Gruß
Dino
 
Hallo,

heute hab ich erstmal den Sensor gebastelt.
3m Lautsprecherkabel. Das muß natürlich am Ende und am Stecker möglichst wasserdicht sein. Also nehme man Schrumpfschlauch und ne Menge Heißkleber. Ich hab mir mit dem Heißkleber und Schrumpschlauch also etwas erzeugt was man von Erdkabel-Muffen kennt. Heißkleber aufs Kabel und Schrumpfschlauch drüber. Dann das Ende umgeklappt und nochmal Heißkleber drüber. Dann nochmal Schrumpfschlauch. Sollte so eigentlich alles wasserdicht und feuchtigkeitsunempfindlich sein.

Dabei habe ich auch mal wieder gemerkt ... Heißkleber heißt Heißkleber weil er heiß ist ... Aua :p Ne schöne Blase am Finger :vollkommenauf:
Man sollte dann natürlich nicht den Fehler machen und es runterwischen. Damit verteilt man die heiße Masse nur noch weiter.
Also Zähne zusammenbeißen :sarcastic: und mit viel pusten möglichst schnell abkühlen. Erst dann entfernen :cool: Ein Indianer kennt keinen Schmerz :hahaha:

Das ganze Konstrukt hat eine Kapazität von etwa 205-210pF

Gruß
Dino
 
Hi Dino,

es ist garnicht so einfach, etwas zuverlässig wasserdicht zu kriegen.
Dabei habe ich auch mal wieder gemerkt ... Heißkleber heißt Heißkleber weil er heiß ist ... Aua :p Ne schöne Blase am Finger :vollkommenauf:
Man sollte dann natürlich nicht den Fehler machen und es runterwischen. Damit verteilt man die heiße Masse nur noch weiter.
Also Zähne zusammenbeißen :sarcastic: und mit viel pusten möglichst schnell abkühlen. Erst dann entfernen :cool: Ein Indianer kennt keinen Schmerz :hahaha:
Das ist mir auch schon passiert, aus Reflex schön verteilt :rolleyes:

Das ganze Konstrukt hat eine Kapazität von etwa 205-210pF
Ähhhm, dein Finger plus Blase oder Sensor plus Gehäuse? ;)

Noch ein schönes Wochenende,
Dirk :ciao:
 
Hallo,

und hier gehts auch langsam weiter :p :rolleyes:

Zur Feier des Tages hatte ich erstmal Grillfest :eek: Es hat nen Mega8 und ein kleines 16x2-LCD erwischt :p :eek:

Der Mega8 ist getauscht und läuft wieder. Dadurch hab ich dann auch das defekte LCD festgestellt. Da tut sich nix mehr. Kein Komntrast und nix auf dem Schirm. Also erstmal Lötsession :mad: Eigentlich wollte ich ja nur mal eben ein wenig testen ... nur mal eben :p

EDIT: Neues LCD drangelötet ... Es lebt wieder :cool:

EDIT2: Die Datagramme werden empfangen und wandern schon mal aufs LCD. Der Anfang ist gemacht ;)

EDIT3: Stop und Restart der Messung/Übertragung läuft jetzt auch über Tastendruck. Das reicht für heute :vollkommenauf: :goodnight: :sleep:

Gruß
Dino
 
Hallo,

und die erste Version mit Temperaturanzeige :cool:
Code:
' #################################################
' ##### Basisroutinen für das Mega8-EvalBoard #####
' #################################################
' (c) 27.06.2010 by Dino
'
'
'

' Prozessor ATmega8    8kB Flash, 512B EEPROM, 1kB SRAM
$regfile = "m8def.dat"
' 16,000MHz Quarztakt
$crystal = 16000000
' Fuses ======
' 0:BODLEVEL 4.0V
' 0:BODEN enabled
' 111111:Ext. Crystal/Resonator High Freq.
' 11:128 Words boot size,F80
$prog &HFF , &H3F , &HDF , &H00                             ' generated. Take care that the chip supports all fuse bytes.

$hwstack = 32
$swstack = 32
$framesize = 32
$noramclear


' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' PD0 --<---- RxD | UART
' PD1 ---->-- TxD | TTL-Pegel
'
' PD2 --<---- INT0
' PD3 --<---- INT1
'             ____________
'            |            |
' PD4 ---->--|D4          |
' PD5 ---->--|D5 LCD 4Bit |
' PD6 ---->--|D6 HD44780  |
' PD7 ---->--|D7 2x16Chr  |
'            |            |
' PB0 ---->--|E / Sys-LED |
' PB1 ---->--|RS          |
'            |____________|
'
' PB2 ---->-- /SS  |
' PB3 ---->-- MOSI | SPI-Bus
' PB4 --<---- MISO |
' PB5 ---->-- SCK  |
'
' PB6 -- XTAL1 | Systemquarz
' PB7 -- XTAL2 | 16,000MHz
'
' ===== PortB =================================================================
' I=7=  I=6=  I=5= I=4= I=3= I=2= O=1= O=0=  => 00101111 => DDRB
' XTAL2 XTAL1 SCK  MISO MOSI /SS   RS   E    => 00010000 => PORTB (init)
'   |     |    |    |    |    |    |    |
'
Ddrb = &B0000_0011
Portb = &B0011_1100

' ===== PortD =================================================================
' O=7= O=6= O=5= O=4= I=3= I=2= O=1= I=0=  => 11110010 => DDRD
' LCD7 LCD6 LCD5 LCD4 INT1 INT0 TxD  RxD   => 00001101 => PORTD (init)
'   |    |    |    |    |    |    |    |
'
Ddrd = &B1111_0010
Portd = &B0000_1101
'
' ===== UART (TTL) initialisieren =============================================
Config Com1 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 32
Open "com1:" For Binary As #1
Clear Serialin

'
' ===== LCD initialisieren ====================================================
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.0 , Rs = Portb.1
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
'
' ===== SPI initialisieren ====================================================
'



' ===== PortC (analog/digital) ================================================
'
' PC0 -- frei
' PC1 -- frei
' PC2 -- frei
' PC3 -- frei
'
' PC4 --<->-- SDA | I2C
' PC5 ---->-- SCL | TWI
'
' PC6 --<---- RESET
'
' ===== PortC =================================================================
' I=7= I=6=  I=5= I=4= I=3= I=2= I=1= I=0=  => 00000000 => DDRC
' ---- Reset SCL  SDA   T3   T2   T1   T0   => 00111111 => PORTC (init)
'   x    x    |    |    |    |    |    |
'
Ddrc = &B0000_0000
Portc = &B0011_1111

' ===== I2C/TWI initialisieren ================================================
'Config Scl = Portc.5
'Config Sda = Portc.4
'I2cinit
'Config Twi = 100000                                         ' Taktfrequenz 100 kBit/s
' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
'Twcr = &B00000100                                           ' nur TWEN setzen
' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0                                                 ' Status und Prescaler Register
' Twbr = 152                                               ' Bit Rate Register, 72 = 100kHz   152 = 50kHz(0 bis 255)
' Config I2cdelay = 40


' ===== Logo anzeigen =========================================================
Locate 1 , 1
Lcd "Zisterne"
Locate 2 , 1
Lcd "Dino2012"
Wait 1
Cls
' =============================================================================

Enable Interrupts

'---------------------------------------------------

    ' Uebertragung der Daten ueber UART (1k2 8n1) im Hexformat mit crlf (0D 0A) als Endmarke
    ' gesamt : 13 Byte => 26 Chr in Hex ... + Ende-Zeichen crlf (0d 0a)
    ' Wegen der besseren Debug-Moeglichkeit ueber ein Terminal habe ich mich gegen die Binaeruebertragung
    ' entschieden. Die Gegenstelle liest dann die Daten ueber ...
    ' INPUTHEX [" prompt" ] , var[ , varn ]
    ' ... in numerische Variablen ein. Ueber das CRLF als Zeilenende ist die Trennung der Datentelegramme
    ' gegenueber Binaertelegrammen auch einfacher.

    '    __LSB
    '  //  __MSB       __CntRemain     uuuu = Userdefined Bytes im EEPROM
    ' || //          //  __Cnt/deg     ffff = Reserved Bytes (FF FF)
    ' ||||          || //  __CRC
    ' llmm uuuuffff |||| cc  _________Freq
    ' AA00 4B46FFFF 0C10 87 DBD9E53F
    ' 3200 4B46FFFF 0E10 FA 00045946  <=== Leerzeichen im Texteditor eingefuegt um die
    ' 3200 4B46FFFF 0D10 AF 000459DD       Lesbarkeit der Datentelegramme zu verbessern
    ' Ready
    ' AA00 4B46FFFF 0C10 87 000459DD
    ' 3200 4B46FFFF 0D10 AF 000459DA
    ' 3200 4B46FFFF 0D10 AF 000459D6
    ' ____-________-____-__ ________
    ' 1234 56789012 3456 78 90123456
    ' 0000 00000111 1111 11 12222222

    ' === Ohne eingefügte Leerzeichen (so kommt es ueber die Leitung) ===
    ' AA004B46FFFF0C1087DBD9E537
    ' 34004B46FFFF0F10AD00045B12
    ' 34004B46FFFF0F10AD00045B79
    ' 34004B46FFFF0E106900045B72

    ' 00000000000000000000000000  Startmeldung ueber UART
    ' AAAAAAAAAAAAAAAAAAAAAAAAAA  26xA als Mess-Anfang (nach Senden von "a")
    ' EEEEEEEEEEEEEEEEEEEEEEEEEE  26xE als Mess-Ende   (nach Senden von "e")















Dim A As Byte
A = 0

' ne Zaehlervariable
Dim Count As Byte                                           ' Zaehlervariable fuer allen Kram

Dim Com1chrwait As Byte , Com1chrin As Byte                 ' UART-Steuerung
Com1chrwait = 0
Com1chrin = 0
Dim Text As String * 30                                     ' Empfangsstring

Dim Transfer As Byte                                        ' Ablaufsteuerung
Transfer = 0                                                ' 0 = kein Datentransfer
                                                            ' 1 = Datentransfer
                                                            ' 2 = Daten fertig fuer Bearbeitung
Dim Tmpstr As String * 8                                    ' Temporaerer String

Dim Freq As Long                                            ' Frequenzmessung

' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte

' Variablen fuer DS18S20 Temperatur
Dim Ds_temp As Integer                                      ' 2 Bytes : -32768 bis +32767
Dim Ds_count As Byte                                        '
Dim Temperatur As Single                                    ' 4 Bytes : 1.5 x 10^-45 bis 3.4 x 10^38
Temperatur = 8                                              ' vorbelegen mit 8°C






Dim Loopcount As Word
Loopcount = 0
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do

Com1chrwait = Ischarwaiting(#1)
If Com1chrwait = 1 Then
  If Transfer = 0 Then                                      ' Transferstart ?
    Text = ""                                               ' Empfangsstring loeschen
    Transfer = 1                                            ' Daten liegen an und werden empfangen
  End If

  Com1chrin = Waitkey(#1)                                   ' Byte lesen

  If Com1chrin = &H0D Then
    'Transfer = 2                                            ' Transfer-Ende (cr empfangen)
    NOP
  Elseif Com1chrin = &H0A Then
    Transfer = 2                                            ' Transfer-Ende (lf empfangen)
  Else
    Text = Text + Chr(com1chrin)                            ' Byte als Character anfuegen
  End If
Else
  Com1chrin = 0
End If


If Transfer = 2 Then

  ' ===== DS18S20 Daten in Array uebernehmen =====
  For Count = 0 To 8
    A = Count * 2
    A = A + 1
    Tmpstr = Mid(text , A , 2)                              ' alle 9 Bytes bearbeiten
    Ds18s20(count + 1) = Hexval(tmpstr)                     ' Scratchpad in Array uebertragen
  Next

  ' ===== DS18S20 Array verarbeiten =====
  If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then                 ' Wenn CRC8 korrekt dann Berechnung starten

    Ds_temp = Makeint(ds18s20(1) , Ds18s20(2))              ' LSB und MSB zu 16Bit-Integer zusammensetzen

    ' ===== Ab hier eine genaue Berechnung =====
'    Shift Ds_temp , Right , 1                               ' durch 2 teilen
'    If Ds_temp.14 = 1 Then Ds_temp.15 = 1                   ' Vorzeichen wieder herstellen (2er Komplement)
'    Ds_count = Ds18s20(8) - Ds18s20(7)                      ' Formelteil ... ( COUNT_PER_C - COUNT_REMAIN )
'    Temperatur = Ds_count / Ds18s20(8)                      ' Formelteil ...  / COUNT_PER_C
'    Temperatur = Temperatur + Ds_temp                       ' Der Rest der Formel
'    Temperatur = Temperatur - .25                           ' Der Rest der Formel

    ' ===== oder eine Berechnung auf 0,5 Grad genau =====
    Temperatur = Ds_temp / 2                                ' Nachkommateil erzeugen

    Locate 1 , 1                                            ' Die CRC8-Checksumme hat nicht gepasst
    Lcd Temperatur ; "deg "
  Else
    Locate 1 , 1                                            ' Die CRC8-Checksumme hat nicht gepasst
    Lcd "CRC-Err "
  End If

  ' ===== Debug-Daten anzeigen =====
  Tmpstr = Mid(text , 1 , 4)                                ' DS18S20 LSB, MSB
  Locate 1 , 9
  Lcd Tmpstr ;
  Tmpstr = Mid(text , 13 , 2)                               ' DS18S20 RemainCnt
  Lcd Tmpstr ;
  Tmpstr = Mid(text , 17 , 2)                               ' DS18S20 CRC
  Lcd Tmpstr

  Tmpstr = Mid(text , 19 , 8)                               ' FreqCnt 4Bytes = 8 Character
  Locate 2 , 9
  Lcd Tmpstr

  Freq = Hexval(tmpstr)
  Locate 2 , 1
  Lcd Freq ; " "
  Transfer = 0                                              ' Bearbeitungsende
End If











' ===== Messung abschalten =====
If Pinc.0 = 0 Then
  Print #1 , "a";
Else
End If

' ===== Messung einschalten =====
If Pinc.1 = 0 Then
  Print #1 , "e";
Else
End If


If Pinc.2 = 0 Then
Else
End If


If Pinc.3 = 0 Then
Else
End If



'If Loopcount = 0 Then
'  Locate 1 , 1
'  Lcd A ; "  "
'  Incr A
''  Print #1 , "test serial port 1"
'End If

Incr Loopcount

Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################



' ################################################
Close #1
End
Die Daten werden mit 1200 Baud , 8 Datenbit, 1 Stopbit vom Tiny2313 zum Mega8 übertragen. In der Gegenrichtung werden Steuerkommandos übertragen.

Und mal ein paar Bilder ...
ZisterneDegrees.jpg ZisterneLCD.jpg

Die Temperatur ist jetzt also schon vorhanden. Die Frequenz wird auch angezeigt. Nun kommt die Umrechnung in eine Höhe. Sch... Mathe :p Die Frequenz eines Parallel-Schwingkreises errechnet sich zu:

f = 1 / ( 2 * PI * SQRT ( L * C ) )

Wobei C die Sensorkapazität des im Wasser hängenden Kabels ist.
Der Zusammenhang von Frequenz zur Kapazität ist also leider nicht linear :(
Dafür ist aber wenigstens der Zusammenhang von Kapazität zur Füllhöhe linear.

Sagen wir mal der Meßwert der Frequenz ist "M".

Wie macht man nun aus der Frequenz die Kapazität (die proportional zur Füllhöhe ist) ?
Also mal vereinfachen ... da T = 1/f ist erstmal alles 1/x machen

t = 2 * PI * SQRT ( L * C ) - - - > M = 1 / M

Nun irgendwie diese vermaledeite Wurzel wegbekommen ... also quadrieren ...

t / ( 2 * PI ) = SQRT ( L * C )

( t / ( 2 * PI ) ) * ( t / ( 2 * PI ) ) = L * C

Da die Spule ja konstant bleibt kann man 2*PI und das L auch kombinieren und durch einen konstanten Faktor ersetzen ... K
Das L noch auf die andere Seite der Formel bringen und dann sieht das so aus ...

- - - > M = M * M
- - - > C = M / K

fertig. ;)

Wenn ich ehrlich bin ... ich hab mir angesehen wie das im Beitrag in der Elektor 4/2009 (S.48, Listing 1) gemacht wurde und hab auf dem Papier mal nachvollzogen was die Rechenschritte aus dem Listing bei der Frequenzformel verursachen. Man ist ja faul :p :rolleyes:

Abgekupfert und angelehnt an : Elektor 4/2009, S.46-52, "Volle Kanne! - Mit Pico- und Femtofarad zum Füllstand" von Wolfgang Rudolph, Rudolf Pretzenbacher und Burkhard Kainka.

EDIT: Also das LCD zeigt jetzt auch die "Kapazität" an. Es ist eigentlich nicht wichtig das der Messwert für die Kapazität stimmt. Es reicht aus das der Wert proportional zur Füllhöhe der Zisterne ist damit man einfach auf Zentimeter, Meter, Kubikmeter, Liter, ... was auch immer, umrechnen kann.

Gruß
Dino
 
Hallo,

ach ja ... dieses Projekt ruht nun auch schon wieder ein gutes Jahr :rolleyes: :eek:

die Kapazität wird ja bereits angezeigt und auch die Temperatur. Nun müßte man noch folgendes umsetzen ...
- Kapazität bei Minimalhöhe ins EEPROM als unteren Kalibrierwert ablegen
- Volumen bei Minimalhöhe ins EEPROM legen
- Kapazität bei Maximalhöhe ins EEPROM als oberen Kalibrierwert ablegen
- Volumen bei Maximalhöhe ins EEPROM legen
- Aus den 4 Werten eine lineare Anzeige für den aktuellen Füllstand erzeugen.
- Füllhöhe für Pumpenstop ins EEEPROM legen
- Pumpenabschaltung wenn Pumpenstop unterschritten wird
Eigentlich alles kein Hexenwerk und nicht weiter kompliziert :p :rolleyes:
Na mal sehen wann es wieder weitergeht ...

Gruß
Dino
 
Mal zwei Bilder vom (noch immer) aktuellen Stand ...

Hallo zusammen,

hier mal zwei Bilder die den aktuellen Stand dokumentieren ...

PC030001.JPG . PC030002.JPG

Der Sensor besteht aus nem normalen Lautsprecherkabel. Das kam mir damals grade so in die Finger. Das Ende ist soweit wie möglich mit Heißkleber und Schrumpfschlauch abgedichtet. Wie langzeitstabil das ist weiß ich allerdings noch nicht. Da aber auch Schrumpfmuffen in der Erde mit Heißkleber versehen ist und ich flexiblen Heißkleber verwendet habe (vorher das Kabel mit Sandpapier aufrauhen!) sollte es ne Zeit lang durchhalten. Ich habe beim Kabel die Adern dafür unten 2-3cm außeinandergezogen und einzeln mit Schrumpfschlauch und Heißkleber abgedichtet (wegen rundem Querschnitt und darum besserer Abdichtung. Danach nochmal alles gemeinsam mit Heißkleber und Schrumpschlauch überzogen. Wichtig ist dabei richtig heißer Heißkleber damit er sich gut auf den Kabelmantel und den Schrumpfschlauch aufschmilzt. Den Schrumpfschlauch dafür innen vom Talkum reinigen.

Der Stecker ist von Reichelt und sollte also auch durchhalten. Bei meinem Bruder ist so eine Verbindung für nen Springbrunnen schon ein paar Jahre problemlos im Außeneinsatz. Muß bei mir aber auch noch an der Einführung vernünftig abgedichtet werden. Ist im Moment für Probebetrieb nur mal eben durchgesteckt.

Soweit erstmal wieder ...

Gruß
Dino
 
Hallo,
bin der neue komme vielleicht öfter ;)
danke Dino, sehr schönes Projekt, wir hatten uns ja schon darüber unterhalten
doch ein paar Fragen hätte ich noch
wie lang ist denn das Lautsprecherkabel und wie groß ist die Kap. (wenn das Kabel nicht im Wasser ist)?

Gruß
Businski
 
Hi,

stimmt. Wenn du es nicht gesagt hättest, hätte ich es nicht gewußt :p
Der Thread ruht doch schon ganz schön lange :rolleyes:
Länge und Kapazität sind aber eher nebensächlich.
Das orientiert sich dann im Endeffekt an der Größe vom Wassergefäß.

Ich sollte mir den Thread evtl mal wieder durchlesen um zu
wissen was ich schon alles an Infos reingeschrieben hab :flute:

Gruß
Dino
 
Hallo,

theoretisch sollte man den Sensor auch als Niederschlagssensor (Erkennung) verwenden können. Also auch für Schnee, Regen, ...

Wenn man eine Platine mit 2 kammartigen Strukturen nimmt die inneinanderliegen, dann sollte man die darauf liegende Feuchtigkeit/Schnee messen können weil sich ja ein leitender Belag über der Kammstruktur befindet. Also eine Kapazitätsänderung.

Es gibt ja alle möglichen Regensensoren wie zB so einen ...
- conrad.de - Kemo-Regensensor, M152-Baustein, 12 VDC
- reichelt.de - Kemo M 152 :: Regensensor 12 V/DC
oder ...
- elv.de - FS20 SR Funk-Regensensor
oder ...
- reichelt.de - HYG REGEN 24V :: Regenmelder 24V AC/DC, 85x85x60mm


Die haben jedoch alle offenliegende Leiterbahnen um den Regen über die Leitfähigkeit zu erkennen. Also können auch direkt galvanische Effekte (weggammelnde Leiterbahnen) auftreten.

Wenn man aber nun eine Isolierschicht (Folie, ...) über den Leiterbahnkamm legt, dann kann man über eine Kapazitätsänderung den Regen ohne direkten Kontakt erkennen. Egal ob nun vergoldet oder mit Graphit überzogen oder was weiß ich ...

Um bei Schnee den Belag wieder runterzubekommen würde ich jetzt ne doppelseitige Platine nehmen. Oberseite mit Leiterbahnkamm und Unterseite mit durchgehender Kupferfläche auf GND. Unten drunter ne Heizfolie. Damit hat man dann die Beeinflussung der Meßfläche über ein/ausschalten der Heizfolie beseitigt. Man hat dann zwar wegen der GND-Fläche ne größere Kapazität des Sensors aber die Meßschaltung sollte empfindlich genug sein. Auf jeden Fall kann man dann den Schnee auch abtauen.

Gruß
Dino
 
So was in der Art?
Kondensator.jpg
Ich hatte damals ca 10pF gemessen, mit Finger direkt darüber ca 20pF...
Aber wie verlässlich das Ergebnis war...

Nachtrag: könnte ich ja mal mit Dirks Zangenmultimeter nachmessen...

Achso, was wäre, wenn man die Platine mit Lötstopplack oder Tenting-Resist über zieht? Hätte beides hier, also wenn Du experimentieren (lassen) willst...
 
Hallo,

also Heizfolie hatte ich folgende gedacht ...
reichelt.de - THF-4760 :: Heizfolie,12V,3W PTC,47x60 mm,einzeln für 3,15
identisch mit ...
pollin.de - Flächen-Heizfolie für 3,65

So was in der Art?
Anhang anzeigen 6147
Ich hatte damals ca 10pF gemessen, mit Finger direkt darüber ca 20pF...
Aber wie verlässlich das Ergebnis war...
Die Heizfolie hat 47mm x 60mm was man auch für den Sensor mindestens an Größe haben sollte. Die Kondensatorfläche wird also schon einige Quadratzentimeter haben. Damit wird der Einfluß von Feuchtigkeit bei der Kapazitätsänderung natürlich auch größer. Müßte man mal ausprobieren. Man kann ja auch parallel zu ner Schaltschwelle auch noch den analogen Meßwert anzeigen lassen. Der Finger hat ja auch nur eine relativ kleine Fläche des Sensors überdeckt. Mit Regen wäre ja die gesamte Sensorfläche betroffen. Ser Meßwert wäre auch bestimmt noch ein wenig abhängig von der Luftfeuchtigkeit.

Gruß
Dino
 
Den Nachtrag da oben hättest Du gelesen? Wenn ich Dir die Platine machen soll, gib bescheid. Allerdings hätte ich in der Größe bereits Probleme mit der Folie (Farbtransferband des Druckers schmiert) - obs nur dafür Sinn macht, Leiterplattenfilme zu bestellen...
Oder Du druckst das mit'm Laser auf Folie, und schickst mir diese.

Interesse?
 
Hi,

obs nur dafür Sinn macht, Leiterplattenfilme zu bestellen...
Oder Du druckst das mit'm Laser auf Folie, und schickst mir diese.
erstmal kein Interesse. Bevor ich auch noch mit nem Regensensor
anfange muß ich erstmal den Rest fertig bekommen :rolleyes:

Nachtrag: könnte ich ja mal mit Dirks Zangenmultimeter nachmessen...
Das Problem bei den Messungen sind sich verändernde Umstände bei der Messung.
Wenn man die Finger mal an einer anderen Stelle hat oder die Kabel anders liegen dann ist schon wieder nen ganz anderer Wert auf der Anzeige. Stabile Ergebnisse erhält man erst wenn das Teil eingebaut und sich selbst überlassen ist ;)

Lötstoplack könnte man auch draufpacken. Plastikspray würde auch gehen. Muß nur langzeitstabil sein und darf keine Feuchtigkeit durchlassen. Also muß man auch bei der Kunststoffsorte aufpassen.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)