Hallo, habe eine Schaltung mit einem ATtiny45 aufgebaut. Habe auch schon
mehrere sachen mit ihm gemacht, aber gerade weiß ich nicht weiter.
Es geht darum, das 3 Leitungen in ein Wasser ragen. Stellt man sich die
3 Leitungen nebeneinander vor, ist die Linke leitung oben an einer
stelle abisoliert, und der recht unten etwas abisoliert. Der mittlere
ist oben und unten abisoliert. Also die Leitungen laufen parallel. Nun
gibt es 3 Schaltzustände. Entweder das Wasser überbrückt keine Leitung,
nur den unteren oder beide.
Wenn nun das Wasser beide überbrückt, soll sich eine Pumpe einschalten.
Solange bis beide Kontakte wieder unterbrochen sind.
Habe nun in BASCOM folgenden Code:
1
$regfile = "attiny45.dat"
2
$crystal = 1000000
3
$hwstack = 40
4
$swstack = 16
5
$framesize = 32
6
7
'$sim 'Für simulation
8
9
Config Portb.4 = Output 'Relais
10
11
Config Pinb.0 = Input 'Pin 0 Eingang
12
Config Pinb.2 = Input 'Pin 2 Eingang
13
14
Einschalten:
15
Wait 1 '1 Sekunde warten
16
17
Config Portb.1 = Output 'Pin 1 Ausgang
18
Portb.1 = 0 'Ausgangspin auf Masse
19
20
If Pinb.0 = 0 And Pinb.2 = 0 Then
21
Portb.4 = 1 'Relais AN
22
Config Pinb.1 = Input 'Ausgangspin STANDBY
23
Goto Ausschalten
24
End If
25
26
Config Pinb.1 = Input 'Ausgangspin STANDBY
27
Goto Einschalten
28
29
30
31
Ausschalten:
32
Wait 1
33
34
Config Portb.1 = Output 'Pin 1 Ausgang
35
Portb.1 = 0 'Ausgangspin auf Masse
36
37
If Pinb.0 = 1 And Pinb.2 = 1 Then
38
Portb.4 = 0
39
Config Pinb.1 = Input 'Ausgangspin STANDBY
40
Goto Einschalten
41
End If
42
43
Config Pinb.1 = Input 'Ausgangspin STANDBY
44
Goto Ausschalten
VCC und GND sind mit einem 100nf Kondensator verbunden, Reset mit einem
Widerstand an VCC.
PINB.0 und PINB.2 haben einen Pullupwidersand von 470kOhm. (Habe zuerst
mit 20kOhm getestet, selber Fehler)
PINB.0 und PINB.2 sind die jeweiligen eingänge. PORTB.1 wird auf Masse
gelegt (siehe code).
PORTB.4 ist der Ausgang. Da ist jetzt eine LED mit Vorwiderstand
angeschlossen.
Das Problem ist, dass die LED schon leuchtet wenn die unteren Kontakte
überbrückt werden. Ausserdem hängt sich dann das Programm auf. Also die
LED leuchtet auch noch wenn ich die Kontakte aus dem Wasser nehme.
Woran liegt das?
Swisser schrieb:> Wenn du den eingangspin auf die masse gezogen hast, wie soll den dieser> High werden?
PINB.0 und PINB.2 haben einen Pullupwidersand von 470kOhm. Sobald die
Kontakte nicht mehr mit Wasser in berührung kommen, haben diese ja
unendlich Ohm. Somit ziehen die Pullupwiderstände den Eingang wieder auf
High.
grundschüler schrieb:> as ist im Prinzip das, was du bauen willst. Der durch das Wasser> gehende Strom wird mit zwei Transistoren verstärkt. Ohne Verstärkung> wird das wahrscheinlich nicht funktionieren.
Stimmt, sieht in der tat eigentlich nicht schlecht aus. Nun bin ich aber
schon so in dem Projekt das ich das erstmal selbst erstellen will.
Vorallem ist das ja auch ein gutes Lernprojekt.
Habe vorher getestet ob der Tiny das Wasser erkennt, also eine simple
Input abfrage. Wasser hat er also ohne Probleme erkannt.
Gleichstrom und Wasser ist keine besonders gute Konstellation. Dann wird
es zusätzlich noch Außenbaschaltung brauchen, Darlingtonstufe oder
Trigger und ehrlich, der Programmierstil ist grausam.
Goto .... Brrrrr
Frager schrieb:> Habe vorher getestet ob der Tiny das Wasser erkennt, also eine simple> Input abfrage. Wasser hat er also ohne Probleme erkannt.
Dann probiere mal das:
1
$regfile="attiny45.dat"
2
$crystal=1000000
3
$hwstack=40
4
$swstack=16
5
$framesize=32
6
7
ConfigPortb.4=Output'Relais
8
9
ConfigPinb.0=Input'Pin0Eingang
10
ConfigPortb.1=Output'Pin1Ausgang
11
ConfigPinb.2=Input'Pin2Eingang
12
13
Portb.1=0'AusgangspinaufMasse
14
Do
15
Waitms250
16
IfPinb.0=0AndPinb.2=0Then
17
Portb.4=1'RelaisAN
18
Else
19
Portb.4=0
20
EndIf
21
Loop
Wenn es funktioniert kannst du weitersehen (Bei der unteren Elektrode
gelbe LED einschalten, oder ähnlich).
Das Problem bei deinem Code ist nun, wenn beide Kontakte überbrückt
sind, schaltet die Pumpe ein. Aber sobald das Wasser Zwischen den beiden
Kontakten ist, geht sie wieder aus. Sie soll aber solange an bleiben,
bis beide Kontakte "offen" sind.
Zudem soll zwischen den Messungen kein Strom fließen um Elektrolyse
entgegenzuwirken.
Mein Code scheint ja auch zu funktionieren, zumindest im Simulator. Ich
scheine aber Hardwaremäßig irgendetwas zu übersehen. Aber was?
Frager schrieb:> Aber was?
Das der TO keinen Schaltplan vorgelegt hat? Die Hardware muss eben
auch funktionstüchtig sein und danach siehts im Moment nicht aus.
Deshalb immer einen Schaltplan auf den Tisch, selbst wenn es nur
eine Skizze ist. Das der µC abstürzt wundert mich nicht, insbesondere
wenn dabei durch galvanische Effekte die Signalspannung größer werden
kann, als die Betriebsspannung.
Inkognito schrieb:> Frager schrieb:>> Aber was?>> Das der TO keinen Schaltplan vorgelegt hat?
Ups, hab überlesen, dass du selbst der TO bist. Ich denke, ein
umschreiben des Satzes kann ich mir wohl schenken?
Ja seh ich ein ;). Hier ein Schaltplan.
Den Widerstand von Reset nach VCC hab ich verbaut aber hier jetzt nicht
eingezeichnet.
Die Taster sind nur symbolisch.
Achja, und mir is klar das von Portb.1 noch ein Widerstand hin gehören
sollte, falls sich die Kontakte im Wasser z.B. berühren sollten. Aber
das habe ich bei den Tests nicht gemacht, und sollte keine auswirkungen
haben. Alles noch in Testphase :D.
nerv schrieb:> Villeicht machst du mal einen eigenen thread zu deinen Versuchen auf?
Er schreibt sein Code ja an mich. Ich soll das mit seinem Code testen.
Allerdings funktioniert ja mein Code.
Frager schrieb:> keine ne idee?
Das Problem wird wohl mit dem Sensor (den drei Drähten) zusammenhängen.
Wenn es abisolierte Drähte sind, könnte einer an dem abgeschnittenen
Ende nicht dicht sein und mit dem Wasser Kontakt bekommen. Vielleicht
mal ein paar Fotos aus vielen Blickwinkeln vom Sensor einstellen? Auch
vom Gesamtaufbau?
Ich vermute, daß bei Trockenübungen, also Verbinden der entsprechenden
Stellen am Sensor mit Draht, was sonst das Wasser macht, das Programm
sich verhält wie es soll.
was du vielleicht mal ausprobieren könntest: belasse den mittleren Draht
(Portb.1) mal dauerhaft als Ausgang, den du auf low treibst.
Momentan schaltest du ihn immer nur kurz (~µs) vor der Abfrage der
beiden anderen Pins auf low. Vielleicht gibt es mit den hochohmigen
Pullups und den Koppelkapazitäten irgendwelche Verzögerungen die dafür
sorgen, dass die Eingänge bei der Abfrage (µs nach den Setzen des
Ausgangs) noch nicht ihren erwarteten Pegel angenommen haben.
Ansonsten: schreib ne Routine, die ständig die Eingänge abfrägt und
deren Pegel per LED anzeigt, und schau so nach, ob die Pegel sich
"falsch" verhalten.
Achim S. schrieb:> Momentan schaltest du ihn immer nur kurz (~µs) vor der Abfrage der> beiden anderen Pins auf low. Vielleicht gibt es mit den hochohmigen> Pullups und den Koppelkapazitäten irgendwelche Verzögerungen die dafür> sorgen, dass die Eingänge bei der Abfrage (µs nach den Setzen des> Ausgangs) noch nicht ihren erwarteten Pegel angenommen haben.
Nein.
Das, was ich gepostet habe, schaltet auf Low, wartet 50ms und erst
dann werden die Pins abgefragt.
Marc V. schrieb:> Nein.> Das, was ich gepostet habe, schaltet auf Low, wartet 50ms und erst> dann werden die Pins abgefragt.
Er meinte aber mich, nicht dein Code.
Die Vermutung mit den "Sensoren" habe ich auch schon gehabt. Werde nun
Testweise mal Streifenrasterplatine dazu verwenden.
Halte die 470k Pullups für viel zu hoch. Gehe mal runter auf 4,7k oder
sogar 1k. Die noch feuchten Elektroden haben noch lange einen relativ
niederen Widerstand, bis sie abgetrocknet sind.
Das Wasser hat einen Widerstand von ca 300kOhm. Somit wären 4,7k viel zu
wenig.
Gerade getestet mit einer Streifenrasterplatine. Damit funktonierte es
perfekt.
Achim S. schrieb:> Momentan schaltest du ihn immer nur kurz (~µs) vor der Abfrage der> beiden anderen Pins auf low. Vielleicht gibt es mit den hochohmigen> Pullups und den Koppelkapazitäten irgendwelche Verzögerungen die dafür> sorgen, dass die Eingänge bei der Abfrage (µs nach den Setzen des> Ausgangs) noch nicht ihren erwarteten Pegel angenommen haben.
Da hast du recht, da sollte ich noch ein kurzen Wait-Befehl einfügen.
Danke
Ich = Frager (TE)
Sollte ich noch Kondensatoren an den Eingängen hängen? Die Zuleitung
wird später eventuell etwas Länger (2-3 Meter). Soll ich von den beiden
Eingängen jeweils ein Kondensator nach Masse legen? Somit können
entstehende Störsignale nach Masse abfließen. Wie groß?
Sonst noch Entstörvorschläge?
Kondensatoren nützen nur bei Störungen die ein Zeitintervall
beinhalten. Ansonsten verzögerst du nur deine Signalflanken.
Bau mal lieber geeignete Sensoren ein, statt nur Drahtenden ins
Wasser zu halten.
Ich hab die hier jetzt nicht auf Eignung geprüft, aber vom
Prinzip her müssten die gehen:
https://www.it-wns.de/themes/kategorie/detail.php?artikelid=1132&source=2
Frager schrieb:> Zudem soll zwischen den Messungen kein Strom fließen um Elektrolyse> entgegenzuwirken.
Ist es bei dir möglich den Füllstand von Außen kapazitive zu messen?
Hier wurden auf der Außenseite nur ein paar Alu-Folienstreifen
aufgeklebt:
https://www.youtube.com/watch?v=BEwNEg1KWpg
Theoretisch könnte auch ein einzelner Alustreifen (ein Pin + GND-Fläche
am Boden) ausreichen um den Füllstand messen zu können.