Forum: Mikrocontroller und Digitale Elektronik Attiny45: Pumpensteuerung frage


von Frager (Gast)


Lesenswert?

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?

von Frager (Gast)


Lesenswert?

Achja, Code funktioniert in der Simulation.

von Swisser (Gast)


Lesenswert?

Wenn du den eingangspin auf die masse gezogen hast, wie soll den dieser 
High werden?

von grundschüler (Gast)


Lesenswert?

Schau dir das mal an:
http://www.ebay.de/itm/172124361910?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
und
http://www.ebay.de/itm/232011003107?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Das 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.

von Frager (Gast)


Lesenswert?

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.

von Weinbauer (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
Config Portb.4 = Output                                     'Relais
8
9
Config Pinb.0 = Input                                       'Pin 0 Eingang
10
Config Portb.1 = Output                                     'Pin 1 Ausgang
11
Config Pinb.2 = Input                                       'Pin 2 Eingang
12
13
Portb.1 = 0                                                 'Ausgangspin auf Masse
14
Do
15
  Waitms 250
16
  If Pinb.0 = 0 And Pinb.2 = 0 Then
17
    Portb.4 = 1                                             'Relais AN
18
  Else
19
    Portb.4 = 0
20
  End If
21
Loop
 Wenn es funktioniert kannst du weitersehen (Bei der unteren Elektrode
 gelbe LED einschalten, oder ähnlich).

von Frager (Gast)


Lesenswert?

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?

von Inkognito (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Frager schrieb:
> Zudem soll zwischen den Messungen kein Strom fließen um Elektrolyse
> entgegenzuwirken.

 Dann probiere das:
1
$regfile = "attiny45.dat"
2
$crystal = 1000000
3
$hwstack = 40
4
$swstack = 16
5
$framesize = 32
6
7
Config Portb.4 = Output                                     'Relais
8
9
Config Pinb.0 = Input                                       'Pin 0 Eingang
10
Config Pinb.2 = Input                                       'Pin 2 Eingang
11
12
Portb.1 = 0                                                 'Ausgangspin auf Masse
13
14
Do
15
  Ddrb.1 = 1                                                'Pin 1 Ausgang
16
  Waitms 50
17
18
  If Pinb.0 = 0 Then
19
      Portb.4 = 1                                           'Relais AN
20
  Elseif Pinb.2 = 0 Then
21
      Portb.4 = 1                                           'Relais AN
22
  Else
23
    Portb.4 = 0
24
  End If
25
  Ddrb.0 = 0                                                'Pin 1 Eingang
26
  Waitms 450
27
Loop

von Inkognito (Gast)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Marc V. schrieb:
> If Pinb.0 = 0 Then
>       Portb.4 = 1                                           'Relais AN
>   Elseif Pinb.2 = 0 Then
>       Portb.4 = 1                                           'Relais AN
>   Else
>     Portb.4 = 0
>   End If
>  Ddrb.0 = 0                                  '*Fehler* Pin 1 ist Eingang

Sollte sein:
1
  If Pinb.0 = 0 Then
2
      Portb.4 = 1                                           'Relais AN
3
  Elseif Pinb.2 = 0 Then
4
      Portb.4 = 1                                           'Relais AN
5
  Else
6
    Portb.4 = 0
7
  End If
8
  Ddrb.1 = 0                                  '*Richtig* Pin 1 Eingang

: Bearbeitet durch User
von Frager (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Frager (Gast)


Lesenswert?

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.

von nerv (Gast)


Lesenswert?

Marc V. schrieb:
> Sollte sein:

Villeicht machst du mal einen eigenen thread zu deinen Versuchen auf?

von Frager (Gast)


Lesenswert?

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.

von Frager (Gast)


Lesenswert?

keine ne idee?

von nerv (Gast)


Lesenswert?

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.

von Achim S. (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Frager (Gast)


Lesenswert?

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.

von Frieder (Gast)


Lesenswert?

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.

von Frager (Gast)


Lesenswert?

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

von Daniel J. (theend)


Lesenswert?

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?

von Inkognito (Gast)


Lesenswert?

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

von Mike J. (linuxmint_user)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.