Brauche Hilfe!! Schalter wird zu lange ausgelesen.

Hallo,

ich möchte einen Schalterstatus über einen Digitaleingang auslesen lassen.
Wenn ich den Schalter drücke soll er aber nur wenige millisekunden lang ausgelesen werden,
und nicht die ganze Zeit, vom drücken bis loslassen. Es soll nur ein ganz kurzer Impuls
erkannt werden, sonst wäre die Zeit zu lange.

Kann man dem Arduino über einen Befehl sagen, das der schalter nur z.b. ca 1-2 millisekunden lang
ausgelesen wird?

Hallo,

beschreib doch mal, was Du machen möchtest

Grüße,
Jürgen

Würde mir bei jedem Durchgang merken wie die aktuelle Schalterstellung ist.
Vorher würde ich die aktuelle mit der gemerkten vom letzten Durchgang vergleichen: Wenn sie sich unterscheiden wurde der Knopf grade eben gedrückt/losgelassen. Entsprechend kannst Du reagieren. :wink:

Ich möchte das der Schalter nur ca 1-5 millisekunden ausgelesen wird, weil sonst die Schaltzeit zu lange dauert.

Der Schalter würde sonst vom drücken bis zum wieder loslassen ausgelesen, was zu lage wäre (ca. 200 millisekunden).

ich dr
arf aber nur ca. maximal 5 millisekunden schaltzeit haben.

Die Schaltzeit ist egal. Eine Schaltung muß “Idiotensicher” gebaut und programmiert werden; Du kannst nicht darauf vertrauen, daß einer kurz drückt.

Mach das was Joghurt sagt. Triggere auf die Flanke.

Grüße Uwe

Hallo uwefed,
auf die flanke zu triggern reicht nicht, weil der Schalter bei jedem mal schalten sofort über das arduino einen Photomos ansteuern soll, der soll eine definierte Zeit geschaltet werden und eine Verbindung trennen.

ich brauche nur einen Impuls, von ca max.5millisekunden, auch wenn der Schalter für 200ms gedrücht werden würde.

ich möchte die einsprtzung am Motorrad für ca 55ms abschalten.

Ich muss also die Schaltzeit des Schalters auf ein Minimum verkürzen, aber wie?

Triggere den Taster auf die Flanke und mach den Rest softwaremäßig.
Bei Schalterbetätigung schaltest Du den Photomos ein und nach x Zeit wieder aus. Da ist es egal wielange der Schalter zu ist.
Grüße Uwe

Eingang: Schalter
Augsang: Photomos (was auch immer das ist, aber du willst den Ausgang einen 55ms Impuls geben ja?)

außerhalb von setup und loop:

boolean last_schalter_stellung = false;
boolean schalter_stellung = false;

in loop:

last_schalter_stellung = schalter_stellung;
schalter_stellung = digitalRead(SCHALTER_PIN);

if(last_schalter_stellung = false && schalter_stellung = true) //aufsteigende flanke
{
// impuls geben
 digitalWrite(PHOTOMOS_PIN, HIGH);
 delay(55);
 digitalWrite(PHOTOMOS_PIN, LOW); 

}

debouncing müsstest du eventuell noch integrieren, aber dafür gibts genug tutorials :wink:

hab das jetzt so: aber fehlermeldung

const int switchPin = 2; // Pinbelegung Schalter
const int outputPin = 13; // Pinbelegung Ausgang

boolean last_schalter_stellung = false;
boolean schalter_stellung = false;

// Variable die ausgelesen wird

int switchState = 0;

// Hauptprogramm
void setup() {

// Definition der Pin´s Eingang ; Ausgang
pinMode(switchPin, INPUT);
// Schalter ist definiert als Eingang
pinMode(outputPin, OUTPUT);
// Output ist definiert als Ausgang
}

void loop() {

last_schalter_stellung = schalter_stellung;
schalter_stellung = digitalRead(switchPin);

if(last_schalter_stellung = false && schalter_stellung = true) //aufsteigende flanke

// impuls geben
digitalWrite(outputPin, HIGH);
delay(55);
digitalWrite(outputPIN, LOW);
}

Besser nicht die fehlermeldung posten, könnte ja helfen

sorry her der errorcode

Schaltassistent1_0.cpp: In function 'void loop()':
Schaltassistent1_0:32: error: lvalue required as left operand of assignment
Schaltassistent1_0:37: error: 'outputPIN' was not declared in this scope

MueThoS:
Besser nicht die fehlermeldung posten, könnte ja helfen

Nee, das ist Training für unsere Glaskugeln;-)

die Fehler liegen hier:

outputPin ist verschieden von digitalWrite(outputPIN,LOW);

Die Variablennamen sind case sensitiv (Ein Groß- und ein Kleinbuchstaben sind verschieden Zeichen.)

"=" ist etwas anderes als "=="

dashier:

if(last_schalter_stellung = false && schalter_stellung = true) //aufsteigende flanke

ist immer wahr da eine Zuweisung "=" immer wahr ist und eine Vergleich "==" mit 2 istgleich geschrieben wird.

ps hab meine Glaskugel nichtmal aupacken müssen. :wink: :wink:

Grüße Uwe

jetzt wird der Schalter garnicht mehr erkannt.

habe keinen fehlercode mehr.

wieso erkennt der den schalter nicht mehr?

:fearful:

const int switchPin = 2; // Pinbelegung Schalter
const int outputPin = 13; // Pinbelegung Ausgang

boolean last_schalter_stellung = false;
boolean schalter_stellung = false;

// Variable die ausgelesen wird

int switchState = 0;

// Hauptprogramm
void setup() {

// Definition der Pin´s Eingang ; Ausgang
pinMode(switchPin, INPUT);
// Schalter ist definiert als Eingang
pinMode(outputPin, OUTPUT);
// Output ist definiert als Ausgang
}

Schalter wird nicht mehr ausgelesen!!!
warum? es kommt kein fehlercode.

void loop() {

last_schalter_stellung = schalter_stellung;
schalter_stellung = digitalRead(switchPin);

if(last_schalter_stellung = false && schalter_stellung == true) //aufsteigende flanke

// impuls geben
digitalWrite(outputPin, HIGH);
delay(55);
digitalWrite(outputPin, LOW);
}

Weil in if(last_schalter_stellung = false && schalter_stellung == true) //aufsteigende flanke
immer noch ein Fehler steckt.

if(last_schalter_stellung == false && schalter_stellung == true) //aufsteigende flanke

Der Vergleich mit dem "==" gilt für beide Teile Deiner if-Bedingung. Außerdem wäre es gut, wenn Du den "#"-Button im Forum zum posten von Code verwenden würdest, das macht uns das Lesen leichter.
Mario.

if(last_schalter_stellung = false && schalter_stellung == true)

:slight_smile: Ich danke euch Jungs ihr habt mich gerade gerettet!!! :smiley: :smiley:

Es Funtzt alles problemlos.

eine letzte Frage noch:

wenn ich jetzt die Schaltzeit ändern möchte, muss ich ja nur die delay zeit verändern_ richtig?

MFG.

wenn ich jetzt die Schaltzeit ändern möchte, muss ich ja nur die delay zeit verändern_ richtig?

ja

Wenn Du lange Zeiten willst ist es besser das mit millis() realisieren da delay() den Kode blockiert.

Grüße Uwe

Okay, aber ich denke das ich niemals über 100ms hinaus komme.

ne zehntel Sekunde Schaltzeit ist bei einer Einspritzdauer im Leerlauf von 2.6ms schon extrem lang.

ich denke so um die 50-60 ms werden optimal sein. - muss das ganze aber noch in der Realität testen.

Danke euch nochmals für eure Hilfe.

MFG.
Daniel