PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einschaltsignal mit externer Spannungsquelle, Zeitverzögertes Ausschalten



herrrbert
06.12.2013, 07:34
Hallo,

bin Neueinsteiger in Arduino und hätte mal ne Frage, ich möchte eine LED schalten sobald an einem Eingang eine Spannung anliegt. Die LED soll dann 4 Sekunden leuchten und danach abschalten. Die Spannung an dem Eingang ist aber kein Impuls sonder bleibt dauerhaft anstehen, die LED soll aber trotzdem nach 4 Sekunden abschalten. Erst nach abschalten der Spannung an dem Eingang und erneutem Anschalten der Spannung soll die LED wieder 4 Sekunden leuchten. Wie mache ich das am besten?

Danke

Picojetflyer
06.12.2013, 08:46
So in etwa würde ich das erst mal löse (Bascom) Nicht sehr elegant aber funktionell :)
Eleganter würde man das mit einen Timer machen. Dann bleibt das Programm nicht in der Port-Abfrage stehen. Aber das wäre glaube ich erstmal ein Thema für Kanonen und Spatzen



do
If Eingang = 1 then 'Wenn Eingang High wird
Ausgang = 1 'Ausgang einschalten
wait 4 '4 Sekunden warten
Ausgang = 0 'Ausgang ausschalten
endif
schleife: 'schleife falls Eingang noch High ist
If Eingang = 1 then 'Eingang noch High???
goto schleife 'Jup Eingang noch High, Schleife nochmal durchlaufen
endif
loop

herrrbert
06.12.2013, 08:58
Danke,

ich kanns aber leider nicht ganz nachvollziehen. Ich habe zwei Schleifen nacheinander? Woher weiß er welche Schleife er nehmen soll, die fangen doch beide gleich an?

Picojetflyer
06.12.2013, 13:11
Nein die fangen nicht gleich an. Es wird von oben nach unten abgearbeitet, Zeilenweise.
Risc-Controller können keine Befehle parallel abarbeiten. Soweit ich weis können das nur diese Propeller Chips.

PlasmaTubeI²C
06.12.2013, 17:38
Ganz simpel würde ich das auf Anhieb so lösen:



void loop() {
if(digitalRead(input) == HIGH && lastread == false){
digitalWrite(ledpin, HIGH);
delay(4000);
digitalWrite(ledpin, LOW);
lastread = true;
}
else if(digitalRead(input) == LOW && lastread == true){
lastread = false;
}
}


Erklärung:

Bei der ersten if-Bedingung wird abgefragt, ob am Eingangs-Pin eine Spannung anliegt und ob ein Wechsel stattgefunden hat. (von Low auf High)
Trifft das zu, wird der Ausgangs-Pin auf HIGH gesetzt, eine beliebige Zeit gewartet und wieder ausgestellt.
Die Variable "lastread" wird auf "true" gesetzt, was in dem Fall den Sinn hat, das das Programm weiß, dass beim aktuellen Status des Eingangs-Pins die Led schon an war - sprich es muss erst mal
so lange gewartet werden bis das Signal wieder 0 ist.
Trifft das zu (wir sind nun bei der "else if"), wird erst geprüft, ob zuletzt die Led an war, sonst würde die else-if-Bedingung bei nicht anliegendem Signal dauerhaft ausgeführt werden.
War der Ausgangs-Pin vor dem Wechsel High -> Low an, wird die 'lastread' wieder zurückgesetzt und bei erneutem Anlegen eines Spannungspegels fängt das Ganze von vorne an.

Anmerkung: Wie Picojetflyer (https://www.roboternetz.de/community/members/3599-Picojetflyer) schon sagte, ist ein 'delay' nicht wirklich sinnvoll, da es den kompletten Programmfluss anhält, für den Anfang reicht es aber.

herrrbert
07.12.2013, 12:24
Super, danke werde ich gleich mal testen. Noch eine Frage dazu, ich habe am Eingang (INPUT)eine Spannung von 1,8 Volt bei der die Schaltung ausgelöst wird. Muss ich hier noch was extra programmieren da die Eingänge ja auf 5 Volt max ausgelegt sind?

Danke

PlasmaTubeI²C
07.12.2013, 15:16
Soweit ich weiß, lösen die Pins erst ein HIGH-State aus, wenn die Spannung höher als 3V ist, genaue Werte habe ich nicht im Kopf.
Meistens bei etwas mehr als der Hälfte der Maximalspannung des Mikrocontrollers.

Musst wahrscheinlich nen OPV davor setzen, damits mit 1,8V klappt.

herrrbert
10.12.2013, 11:18
Ich glaube ich hatte irgendwo gelesen, dass man das einstellen kann, nach dem prinzip der PWM, am digitalen Eingang kann glaube ich der Wert eingestellt werden, sowie eine Schaltschwelle

- - - Aktualisiert - - -

Könnte man nicht auch für den Eingang einen analogen port verwenden?

Hubert.G
10.12.2013, 13:31
Du kannst einen analogen Port verwenden und je nach dem dort ausgegebenen Wert deine Aktion setzen.

herrrbert
11.12.2013, 08:05
Hallo Hubert, wie müsste denn der Code für den analogen Port als Eingang aussehen. Ab 1,5 Volt Eingangssignal sollte geschaltet werden. Danke

Grüße

Bert

Hubert.G
11.12.2013, 09:32
Mit BASCOM habe ich mich nie so richtig beschäftigt. Hier solltest du die Antwort finden.
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/adc_mit_getadc/

herrrbert
11.12.2013, 09:40
Hallo,

ich bekomms leider nicht hin. Vielleicht könnte mir jemand der sich damit auskennt mal den code posten. Dann hab ich ein Beispiel mit dem ich arbeiten könnte. Noch ne kure Erklärung was meine Steuerung machen soll(ich dachte so etwas einfaches habe ich als Einsteiger ruck zu programmiert :( ). Sobald ich am Eingang eine Spannung ab ca. 1,5 Volt anliegen habe soll eine LED für 4 Sekunden geschaltet werden, egal wie lange die Eingangsspannung anliegt. Erst wenn diese Spannung wieder auf null fällt und wieder eingeschaltet wird soll die LED wieder für 4 Sekunden geschaltet werden. Ich hoffe es ist etwas verständlich. Danke

Hubert.G
11.12.2013, 09:56
Ach komm, so schwer kann das doch nicht sein.
Wie sieht denn dein Code bis jetzt aus? Irgendwas wirst du doch schon hingebracht haben.

herrrbert
11.12.2013, 10:08
Hallo Hubert, leider habe ich noch nicht herausgefunden wie ich einen Eingang programmieren kann, dass er ab 1,5 Volt schaltet. Deshalb komm ich null voran

Hubert.G
11.12.2013, 10:22
Ich habe jetzt gerade gesehen das du mit einem Arduino werkst. Such dir mal das Beispiel "AnalogInput"
Auf dieses Beispiel kannst du aufbauen. Der Rest ist dann aber wohl eher C-Syntax.

herrrbert
11.12.2013, 10:38
int ledPinOut = 13; // Variable Pin 13 zugewiesen
int SpannungInput = A1; // Variable Pin A1 zugewiesen
int SpannungStatus; // Variable für Status des SpannungInputs
void setup(){
pinMode(ledPinOut, OUTPUT); // Pin 13 als Ausgang
}
void loop() {
if(analogRead(SpannungInput) == HIGH && lastread == false){
digitalWrite(ledpinOut, HIGH);
delay(4000);
digitalWrite(ledpinOut, LOW);
lastread = true;
}
else if(analogRead(SpannungInput) == LOW && lastread == true){
lastread = false;
}
}

- - - Aktualisiert - - -

Ich den Code mal auf Basis von "PlasmaTubeI²C" erstellt, komm aber mit dem lastread nicht klar und weiß leider auch nicht wie ich den Eingang Spannungsabhängig definieren kann.

Hubert.G
11.12.2013, 11:01
int sensorPin = A0; // select the input pin for the potentiometer
int ledPin = 13; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
int LedOn = 0;
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
}

void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
if((sensorValue >=680)&&(!(LedOn))) {
LedOn=1;
digitalWrite(ledPin, HIGH);
delay(4000);
digitalWrite(ledPin, LOW);
}
if((sensorValue <=679)&&(LedOn)) {
LedOn = 0;
}
}

Das ist als Arduino Sketch, probier mal.
Muss jetzt aber für drei Stunden weg, Kommentare, wenn benötigt kommen dann.

herrrbert
11.12.2013, 11:20
Danke Hubert, hab den Sketch übertragen. Das merkwürdige ist jetzt, obwohl der Arduino im Moment nur am USB KAbel Angeschlossen ist und auch sonst noch keine LEDs oder sonst was angeschlossen sind, wird pin13 immer mal wieder aktiviert und ausgeschaltet aber total unregelmäßig, wie kann das sein? Statische Aufladung?

Peter(TOO)
11.12.2013, 12:24
Hallo,

Jo, das sind Störsignale.

Jeder Leiter wirkt nun mal als Antenne und liest jede Menge Signale aus der Umgebung auf.

Du kannst mal deinen Finger an den Port Pin halten, dann wird's heftiger.

Wenn du einen Widerstand (10k..100k) vom Pin gegen Masse schaltest, sollten die Störungen aufhören.

MfG Peter(TOO)

Hubert.G
11.12.2013, 12:28
Ja, das ist statische Aufladung, der Eingang ist sehr hochohmig. Lege den Eingang mal direkt auf +5V.
Den Wert 680 musst du noch durch 307 und 679 durch 300 ersetzen. Ich hatte den ursprünglichen Wert mit einer anderen Referenzspannung berechnet.
Es wäre auch noch gut wenn du in Serie zum A0-Eingang einen Widerstand mit etwa 4k7 legen würdest, falls so etwas nicht ohnehin vorgesehen ist.

herrrbert
12.12.2013, 08:25
Hallo Hubert, habe die Werte geändert und auch noch ein Pulldown Widerstand eingebaut, jetzt ist es besser. Was aber nicht funktioniert ist, dass die der Ausgang nach 4 Sekunden abschaltet so lange der Eingang bestromt ist. Der Ausgang soll 4 Sekunden geschaltet werden und dann abgeschaltet egal ob noch Spannung am Eingang anliegt. Erst wenn die Spannung am Eingang aus ist und erneut eingeschaltet wird soll der Ausgang wieder 4 Sekunden geschaltet werden. Was muss ich hier ändern?

- - - Aktualisiert - - -

Hallo Hubert, war mein Fehler. Ich hatte den Pull Down Widerstand nicht richtig angeklemmt und so kam es wohl immer wieder zur statischen Aufladung. Jetzt läuft es, vielen Dank. Puhh, ich tu mich schwer mit dem Einstieg in Arduino vor allem wenn ich bei so einfachen Schaltungen schon nicht weiter komme, wo gibt es denn noch gute Übungen für Anfänger?

Danke

Grüße Bert

Peter(TOO)
12.12.2013, 08:55
Hallo Bert,

Deine Probleme mit den Störungen haben nichts mit dem Arduino zu tun, das sind normale No Gos bei CMOS.
Da wirst du am meisten Informationen bei der Gatter-Logik finden.

MfG Peter(TOO)

Hubert.G
12.12.2013, 09:39
Wie schon geschrieben sind das "Fehler" die dich, bis du etwas Routine hast, immer wieder noch erwischen werden.
Du könntest dein Programm noch etwas erweitern in dem du noch ein Poti an den zweiten Analogeingang anschließt. Mit diesem kannst du dann die Schwelle ab der deine LED leuchten soll, manuell einstellen.
Wäre eine gute Übung, ob du auch verstanden hast wie das Programm läuft.
Im Anhang das Programm nochmal kommentiert.