Programm funktioniert nicht

Hallo,
ich fange gerade an mit Arduino programmieren.

Leider komme ich bei dem kleinen Programm nicht weiter.

Eine LED soll leicht leuchten wenn Eingang 1 Masse ist.
Die LED soll zusätzlich 3 mal hell leuchten wenn Eingang 2 Masse ist.

Eingang 1 funktioniert.
Eingang 2 nicht. Die LED leuchte leicht weiter.
Irgendwie wird die 2. if Bedingung nicht ausgeführt.

Was ist da falsch ?

int led = 13;
 int x = 0; 
 int s1 = 1; 
 int s2 = 2;
   
   void setup() {
   pinMode(led, OUTPUT);
   pinMode(s1, INPUT);
   pinMode(s2, INPUT);
   }

void loop() 
{
int s1_Zustand = digitalRead(s1);
int s2_Zustand = digitalRead(s2);

if (s1_Zustand == 0)
{
 x=0;
 do
 {
  digitalWrite(led,HIGH);
  delay(1);
  digitalWrite(led,LOW);
  delay(8);
  x++;
 } 
 while (x < 50 );
} 

if (s2_Zustand == 0)
{
 x=0;
 do
 {
  digitalWrite(led,HIGH);
  delay(40);
  digitalWrite(led,LOW);
  delay(80);
  x++;
 } 
 while (x < 4 );
} 
}

LED_Blitzer_02.ino (569 Bytes)

Setze bitte Deinen Sketch in Codetags (</>-Button oben links im Forumseditor). Dann ist er für alle besser lesbar.

Gruß Tommy

Was bitte verstehst du unter "leicht leuchten" ?

Hallo

ich hoffe ich hab dein Problem richtig verstanden, wenn der erste Eingang masse ist gilt die erste If Bedingung

wenn der Zweite Taster zusätzllich auf Masse ist soll das zweite If gelten

die Zweite if Bedingung wird schon funktionieren , aber die erste eben auch noch.

benutze mal für die2 If Bedinung das else mit damit die alte Else auch was zu tun hat :wink:

Hi

Für ganz Faule:
Wenn noch ein PWM-Pin frei ist, kannst Du auch mit analogWrite ein PWM generieren, also Deine LEDs dimmen.
(Netter Nebeneffekt: Du kommst vom delay() weg)

Bei Deinem Programm hast Du glaube einen logischen Fehler drin - Du 'denkst', daß die 2.te Bedingung greift und deshalb der Code dort ausgeführt wird, siehst dabei aber nicht, daß die erste Abfrage ebenfalls greift - Du müsstest die beiden Abfragen gegen einander verriegeln, wie Rentner Das schon sagte.

MfG

Hallo,

ich habe den Code getestet, er funktioniert genau so wie er soll.
Ich habe nur 2 Änderungen vorgenommen. Eingangspin nicht 1 und 2 sondern 2 und 3. 0 und 1 sollten erstemal frei bleiben. Und ich habe Taster die gegen Masse schalten, deswegen pinMode(s , INPUT_PULLUP)
Ein while ohne do würde auch funktionieren. while blockiert jedoch wie delay. Das noch zur Info am Rande.

Also:

Eingang 1 + 2 high = Led aus

Nur Eingang 1 low = Led leuchtet leicht, da gedimmt

Nur Eingang 2 auf Low = Led blitzt 3 x hell

Eingang 1+2 auf low = Led leuchtet leicht und blitzt dann 3x

Nochmal, stellst du nur Fragen oder antwortest du uns auch ?

berny46:
Nur Eingang 1 low ...
Nur Eingang 2 auf Low ...
Eingang 1+2 auf low ...

Das ist nun eine ganz andere Aufgabenstellung!
Oben ging es nur um entweder oder. Jetzt sollen beide Taster gedrückt werden.
Dann musst du a) vom while weg und b) eine Funktion schreiben die auch was anderes macht, nämlich was drittes wenn beide Taster gedrückt sind. Was soll denn passieren wenn beide Taster gedrückt sind?
Zur Zeit werden dabei beide Funktionen nacheinander abgearbeitet. Je nachdem welcher Taster zuerst gedrückt wurde und sie lange genug gedrückt wurden für die "langsamste" Funktion der beiden.
Bitte in aller Ruhe die Aufgabestellung überdenken und komplett formulieren, dann können wir gezielte Lösungen anbieten.

@ HotSytems:

Oh Mann, nicht gleich so mürrisch ...
2x geantwortet : Error und alles war weg
Ich muss erst mal mit dem Forum klarkommen etc. !

Also ich habe die Änderungen lt. Doc_Arduino gemacht.

Und es funktioniert jetzt so wie gewollt!
Bei beiden Eingängen low leuchtet die Led schwach und blitzt dann 3x.

Ohne weiter Änderungen.

Danke für die schnelle Hilfe.

Hallo,

Info, die Reihenfolge der LED Aktionen hängt davon ab, welcher Taster der beiden beim vermeintlichen "zeitgleich" drücken einen Tick eher gedrückt wurde. Teste mal das Taster drücken. :slight_smile: Ich möchte nicht weiter vorgreifen. Erst muss das aha Erlebnis kommen zum besseren Verständnis. Ansonsten wenn es egal ist, okay.

Du magst schon recht haben ... genau genommen.

Aber darauf kommt es nicht an.

Ob zuerst das "Blitzen" kommt oder die "gedimmte" LED ist egal.

Ich benötige das für mein Copter als Frontbeleuchtung.
Im Nahbereich reicht die gedimmte LED aus.
Wenn die Sonne Scheint und ab 50m Entfernung ist das zusätzliche Blitzlicht besser.

Bei einer 5W LED die immer an ist, braucht es eine gute Kühlung.
Deshalb das Blitzen.

Aber jetzt hätte ich noch ein Frage.
Ist es möglich einen digitalen Impuls zu messen der zwischen 1ms und 2ms liegt ?
Ich bräuchte nicht die genauen ms sondern ob 1,5ms oder 2ms.

Ca. 1,5ms entspräche dann bei mir S1 und ca. 2ms S2.

Dann bräuchte ich keinen Schaltbaustein mehr um das Arduino anzusteuern.

berny46:
Oh Mann, nicht gleich so mürrisch ...

Wie soll ich das verstehen ?
Nur weil ich nachfrage ?
Eine Antwort (Post#2) habe ich immer noch nicht erhalten.

Hi

Das liest sich gerade sehr schwer nach 'Eingriff in den Straßenverkehr' - und wird bitter böse geahndet!
Du musst jederzeit damit rechnen, daß sich Dein Arduino aufhängt und dann die 5W-LED die Sonne in den Schatten stellt - für entgegen kommendes Volk eher nicht so toll.

Davon ab - wie willst Du die 50m detektieren?

1,5ms ... 2ms klingt wiederum eher nach Servo (wobei Das bei 1ms anfangen würde)

MfG

postmaster-ino:
Hi

Das liest sich gerade sehr schwer nach 'Eingriff in den Straßenverkehr' - und wird bitter böse geahndet!
Du musst jederzeit damit rechnen, daß sich Dein Arduino aufhängt und dann die 5W-LED die Sonne in den Schatten stellt - für entgegen kommendes Volk eher nicht so toll.

Für mich liest sich das eher nach Drohne oder Helicopter.

HotSystems:
Wie soll ich das verstehen ?
Nur weil ich nachfrage ?
Eine Antwort (Post#2) habe ich immer noch nicht erhalten.

Also leicht leuchten heißt : mit geringer Helligkeit

Da man Leds nicht dimmen kann, wird sie mit PWM angesteuert.
1ms an und 8ms aus.

postmaster-ino:
Hi

Das liest sich gerade sehr schwer nach 'Eingriff in den Straßenverkehr' - und wird bitter böse geahndet!
Du musst jederzeit damit rechnen, daß sich Dein Arduino aufhängt und dann die 5W-LED die Sonne in den Schatten stellt - für entgegen kommendes Volk eher nicht so toll.

Davon ab - wie willst Du die 50m detektieren?

1,5ms ... 2ms klingt wiederum eher nach Servo (wobei Das bei 1ms anfangen würde)

MfG

ich beschreibe das Ganze mal so :

An einem Copter ist zur Lageerkennung vorne eine 5W LED angebracht.

In einem Umkreis von ca. 50m reicht es aus, wenn die Led über PWM getimmt wird
(ca: 1ms ein, 8ms aus).

Bei hellem Sonnenschein oder bei größerer Entfernung soll die LED zusätzlich 3x blitzen.
Die Led kann nicht ständid an sein, da sie sonst gekühlt werden muß zwecks ihrer Hitzeentwicklung.

Das funktioiert mit meinem Programm.
Eingang 2 schaltet auf "gedimmt" ein.
Eingang 3 läßt die LED noch 3x blitzen.

Die Eingänge werden per RC-Anlage geschaltet und ein Servo-Schaltmodul schaltet dann
jeweils Eingang2 oder/und Eingang 3 gegen Masse.

Nun ist die Frage ob/wie man das Servosignal (1ms - 2ms / 50Hz) nicht direkt auswerten kann.
Es würde in meinem Fall reichen, festzustellen ob dieser Impuls größer 1 ms (Led gedimmt)
und größer 1,5 ms (Led blitzt) ist.

Hallo,

für die Pulslängenerkennung, würde es bei dir reichen, falls nicht wieder noch was dazukommt, wenn du dein Programm so umschreibst, dass deine LED Blinkerei den Ablauf nicht blockiert. Das heißt du musst millis() verstehen und anwenden lernen. Sonst wird das nichts. Das bedeutet letztlich deine while muss weg und umgebaut werden. Dafür gibts Bsp. in der IDE und das hier als erste Hilfe.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

Wenn das fertig ist, kannste deine Eingänge abfragen und merkst dir den Zeitpunkt/die Zeitpunkte des Pegelwechsels mit micros(). Aus der Differenz der Zeit haste deine Pegellänge. Bei dem kurzen Programm sollte das ausreichend genau genug sein.

Wenn du das mit Taster testest musste die noch entprellen, sonst kommt Müll raus. Dafür wäre das abgreifen der echten Signal hilfreich.

Kurzum, du hast jetzt viel vor dir um einen sauberen/größeren aber schnellen Sketch zu schreiben.

Also ich habe das mit der PWM versucht auszuwerten.

Impuls 1-2 ms high, 18ms low

Mit millis() und micros() hat das leider bei mir nicht funktioniert.
Der Impuls ist 1000us -2000us lang.
Die Abfragen und Auswertungen dauerten irgendwie zu lange.

So habe ich während des Impulses ein Zähler laufen, der einfach eine Zahl hochzählt.
Es ergeben sich dabei Werte von 200-400 die man dann entsprechend auswerten kann.

Danach wird je nach Zählerstand die LED gedimmt und blitzt auch 3 mal.
Unter 250 ist die LED aus, von 250-350 ist sie gedimmt, und über 350 Blitzt sie zusätzlich 3x.

Ein Problem gibt es aber beim Dimmen.

Da liegt je die Abfrage des Impulses dazwischen. Und die dauert länger als die Ein- Auszeit beim Dimmen,
sodaß man eine kurze Unterbrechung bei Dimmen hat.
Aber die wird man nicht wegbekommen, evtl mit Interruptverarbeitung (da kenne ich micht nicht aus).

Ich weiß leider noch nicht, wie man Codetags einfügt (hatte mit Programmieren lernen zu tun).
Deshalb hier der Sketch nochmal normal:

int led = 13; // LED Ausgang Nr.
int e1=2; // SignalEingang Nr.
int e1_Level; // Eingangszustand
int time1 =0; // Zähler Zeit
int count = 0; // Loop LED

void setup()
{
pinMode(led , OUTPUT); // Ausgang setzen
pinMode(e1 , INPUT_PULLUP); // Eingang setzen

}

void loop()
{

{
time1 = 0;

do // Impulsynchronisierung
{
e1_Level = digitalRead(e1);
}
while (e1_Level == 0); // ppm Pause
do
{
e1_Level = digitalRead(e1);
}
while (e1_Level == 1); // ppm high
do
{
e1_Level = digitalRead(e1);
}
while (e1_Level == 0); // ppm Pause

do // Impulsauswertung
{
e1_Level = digitalRead(e1); // 2. PPM Signal = Längenmessung
time1++; // ca.: -100% = 200 , 0% = 300 , 100% = 400
}
while (e1_Level == 1); // ppm Signal high

if(time1 > 250) // LED Stufe 1 - gedimmt
{
count = 0;
do
{
digitalWrite(led,HIGH); // 30x LED ein 1:5
delay(3);
digitalWrite(led,LOW);
delay(15);
count++;
}
while (count <= 30);

}

if(time1 > 350) // LED Stufe 2 - mit Blitzer
{
count = 0;
do
{
digitalWrite(led,HIGH); // 3x LED ein 3:1
delay(100);
digitalWrite(led,LOW);
delay(33);
count++;
}
while (count < 4);
}

}
}

Die Verwendung von Codetags konntest Du schon mal. Warum jetzt nicht mehr?

Gruß Tommy