Hallo, ich bin aktuell dabei mich ein wenig mit dem Arduino UNO anzufreunden und ein kleines Programm zu schreiben. Die LED1&2 soll je nach Zustand von 2 Eingängen unterschiedlich hell leuchten. jedoch funzt das nicht so ganz wie es soll.. der Fall 1 "scheint" zu funktionieren Fall 2 tritt auch ein(nur nicht ganz korrekt jedoch komme ich nicht zu Fall 3 hier mein Code und evtl kann ja wer helfen <<---code--->> int LED1 = 10; int LED2 = 11; int E1 = 2; //Eingang1 mit 5V+ int E2 = 3; //Eingang2 mit 5V+ void setup(){ //setzt Arduino pin 10,11,9,3 to frequency 122.5 //code typically inserted in setup() TCCR1B = (TCCR1B & 0b11111000) | 0x04; TCCR2B = (TCCR2B & 0b11111000) | 0x06; //Pindefinitionen pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(E1, digitalRead); pinMode(E2, digitalRead); } void loop(){ //Fallauswahl zur TFL Steuerung //----------------------------------Fall 1----------------- //alles aus if (digitalRead(E1)== 0 && digitalRead(E2)== 0 { // LED1 analogWrite(LED1, 0); //for (int fadeValue = 0 ; fadeValue <= 0; fadeValue += 5) { // analogWrite(LED1, fadeValue);} // LED2 analogWrite(LED2, 0); //for (int fadeValue1 = 0 ; fadeValue1 <= 0; fadeValue1 += 5) { // analogWrite(LED2, fadeValue1);} } //Ergebnis LEDs sind aus-->korrekt //----------------------------------Fall 2----------------- //Eingang1 an else if (digitalRead(E1)== HIGH) { // LED1 for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) { analogWrite(LED1, fadeValue);} // LED2 for (int fadeValue1 = 0 ; fadeValue1 <= 255; fadeValue1 += 1) { analogWrite(LED2, fadeValue1);} } //Ergebnis LEDs sind an, jedoch kein Fading von 0 auf 255 //----------------------------------Fall 3----------------- //Eingang1&2 an if (digitalRead(E1)== HIGH && digitalRead(E2)== HIGH) { // LED1 for (int fadeValue = 0 ; fadeValue <= 150; fadeValue += 5) { analogWrite(LED1, fadeValue);} //LED2 for (int fadeValue1 = 0 ; fadeValue1 <= 150; fadeValue1 += 5) { analogWrite(LED2, fadeValue1);} } //Ergebnis LEDs sind an, jedoch kein Fading von (letzten Zustand auf 155 ) <<---code--->> nehme ich E1 und nur E2 ist aktiv bleiben die LEDs an, obwohl dieser Zustand nicht existiert. Ich will eigentlich noch mehr Zustände und Eingänge einbinden, aber es sollte erst mal so Funktionieren. Und schön wäre es wenn zu jedem Zustandswechsel ein Fading erfolgt sofern sich der fadevalue ändert. Ist mein Ansatz mit mehreren IF dafür korrekt? Danke schon mal
:
Bearbeitet durch Admin
Hab den Code mal lesbar gemacht:
1 | void loop() |
2 | {
|
3 | if (digitalRead(E1) == 0 && digitalRead(E2) == 0) |
4 | {
|
5 | analogWrite(LED1, 0); |
6 | analogWrite(LED2, 0); |
7 | }
|
8 | else if (digitalRead(E1) == HIGH) |
9 | {
|
10 | for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) |
11 | analogWrite(LED1, fadeValue); |
12 | |
13 | for (int fadeValue1 = 0 ; fadeValue1 <= 255; fadeValue1 += 1) |
14 | analogWrite(LED2, fadeValue1); |
15 | }
|
16 | |
17 | if (digitalRead(E1) == HIGH && digitalRead(E2) == HIGH) |
18 | {
|
19 | for (int fadeValue = 0 ; fadeValue <= 150; fadeValue += 5) |
20 | analogWrite(LED1, fadeValue); |
21 | |
22 | for (int fadeValue1 = 0 ; fadeValue1 <= 150; fadeValue1 += 5) |
23 | analogWrite(LED2, fadeValue1); |
24 | }
|
25 | }
|
Das Problem is, dass du den Fade mit maximal-Geschwindigkeit des Prozessors machst. Zwischen den analogWrite() is keinerlei Pause. PS: Viele Kommentare machen Code nicht unbedingt lesbarer. Vorallem nicht wenn die Einrückung das ganze zusätzlich noch unübersichtlicher gestaltet.
:
Bearbeitet durch User
ok..hätte gedacht mehr Kommentare sind besser.. naja man lernt nie aus.. thx fade mit max Geschwindigkeit.. wie kann ich es ändern? mit delay(xy);?? und wie erreiche ich das wenn eine if Bedingung erfüllt ist das er in dem status bleibt? wenn der Staus nicht mehr erfüllt ist trifft ja mindestens der status alles aus zu... bspw. fall-1 tritt ein=alles aus danach tritt Fall-1 ein.. er geht zu Led wert 255 danach tritt fall-2ein... er geht zu led wert 150 -->jedoch immer wieder erst schrie 0 dann 1 dann 2 und von vorn. ich will aber erreichen das er direkt da hin springt.. wenn ich mal fertig bin soll er bspw. direkt von Fall-1 zu Fall xy springen, ohne die anderen zu durchlaufen...
Jens S. schrieb: > ok..hätte gedacht mehr Kommentare sind besser.. naja man lernt nie aus.. > thx Kommentare sollte man setzen wenn der Code nicht offensichtlich ist. Dass es bei
1 | analogWrite(LED1, 0); |
um LED1 geht ist ja klar. Sogar dass sie ausgemacht werden muss. Das muss man dann nicht extra kommentieren. Manche Lehrer bestehen natürlich drauf, dass man jeden schei* kommentiert. Dass soll aber eher die Gewohnheit erzeugen, dass man den Code den man da vor sich hat versteht und prinzipiell weiss, dass man kommentieren kann und soll. Aber oft wird dabei das Ziel aus den Augen verloren, und dann findet man Kommentare wie:
1 | int i = 10; // Integer i den Wert 10 zuweisen. |
Bei denen der Informationsgehalt exakt 0 ist. > > fade mit max Geschwindigkeit.. wie kann ich es ändern? mit delay(xy);?? Ja, delay() sollte helfen. > und wie erreiche ich das wenn eine if Bedingung erfüllt ist das er in > dem status bleibt? wenn der Staus nicht mehr erfüllt ist trifft ja > mindestens der status alles aus zu... Dafür brauchst du deine "state machine". Im Grunde setzt du eine globale Variable beim erreichen einer Bedingung, die dann bei der nächsten Hauptschleifeniteration abgefragt wird. Also in etwa so, in halbvollständigem PseudoCode:
1 | #define GRUNDSTELLUNG 0
|
2 | #define LED1_FADE 1
|
3 | #define LED2_FADE 2
|
4 | int status = 0; |
5 | |
6 | int fadeValueLED1 = 0; |
7 | |
8 | void loop() |
9 | {
|
10 | if (status == GRUNDSTELLUNG) |
11 | {
|
12 | if (digitalRead(E1) == HIGH) |
13 | {
|
14 | status = LED1_FADE; |
15 | fadeValueLED1 = 0; |
16 | return; |
17 | }
|
18 | }
|
19 | else if (status == LED1_FADE) |
20 | {
|
21 | analogWrite(LED1, fadeValueLED1); |
22 | delay(...); |
23 | |
24 | if (fadeValueLED1 == 255) |
25 | {
|
26 | status = GRUNDSTELLUNG; |
27 | return; |
28 | }
|
29 | }
|
30 | }
|
puh das muss ich erst mal verstehen :D danke schon mal dafür... so jetzt jibs erst mal ne Gans :D
:
Bearbeitet durch User
Hier nochmal eine etwas klarere Version meines Beispiels,+ inkl. Kommentaren und weniger Bugs (ist aber nicht getestet):
1 | #define GRUNDSTELLUNG 0
|
2 | #define LED1UND2_FADE 1
|
3 | int status = 0; |
4 | |
5 | int fadeValueLED1 = 0; |
6 | int fadeValueLED2 = 0; |
7 | |
8 | void loop() |
9 | {
|
10 | // "status" hält den aktuellen Zustand des Systems fest.
|
11 | // Bei jedem loop() aufruf weiss damit der Prozessor,
|
12 | // womit er weiter machen soll.
|
13 | |
14 | if (status == GRUNDSTELLUNG) |
15 | {
|
16 | if (digitalRead(E1) == HIGH) |
17 | {
|
18 | // Beim detektieren einer Bedingung,
|
19 | // sagen wir dem System, es soll beim nächsten
|
20 | // mal etwas anderes tun.
|
21 | status = LED1UND2_FADE; |
22 | // Dafür müssen wir ggf. auch noch andere
|
23 | // Dinge initialisieren:
|
24 | fadeValueLED1 = 0; |
25 | fadeValueLED2 = 0; |
26 | return; |
27 | }
|
28 | }
|
29 | else if (status == LED1UND2_FADE) |
30 | {
|
31 | // In diesem Zustand kümmert sich das
|
32 | // System um einen weiteren Schritt im Faden der beiden LEDs:
|
33 | analogWrite(LED1, fadeValueLED1); |
34 | analogWrite(LED1, fadeValueLED2); |
35 | // Ein delay, damit das menschliche Auge mit kommt, bzw. die LED
|
36 | // physikalisch Zeit hat die Helligkeit zu ändern:
|
37 | delay(...); |
38 | |
39 | // Für die nächste Iteration die Helligkeit anpassen:
|
40 | fadeValueLED1++; |
41 | fadeValueLED2++; |
42 | |
43 | // Die Ende-Bedingung des Fades abfragen:
|
44 | if (fadeValueLED1 > 255) |
45 | {
|
46 | status = GRUNDSTELLUNG; |
47 | return; |
48 | }
|
49 | }
|
50 | }
|
:
Bearbeitet durch User
Jens S. schrieb: > wenn ich mal fertig bin soll er bspw. direkt von Fall-1 zu Fall xy > springen, ohne die anderen zu durchlaufen... Wenn du das geschafft hast, lass es mich wissen oder poste deinen Code so schnell wie möglich. > puh das muss ich erst mal verstehen :D Normalerweise zeichnet man zuerst eine Logiktabelle:
1 | Ein1 Ein2 Led1 Led2 |
2 | 0 0 Aus Aus |
3 | 0 1 TBD TBD |
4 | 1 0 Fehler in deinem Code !!! (*) |
5 | 1 1 Fade Fade |
Du hast das natürlich nicht gemacht, sondern munter drauflos geschrieben. (*) Es wird nur Eingang1 geprüft, in der nächsten Abfrage wieder, dismal mit Eingang2 - so etwas soll man nicht machen - immer beide Eingänge prüfen.
also das wird was schwierig für mich um das auf mich umzumünzen... aber ich schau weiter... hier mal die logigtabelle Ein1 Ein2 Led1 Led2 0 0 Aus Aus 0 1 fadeTo50% fadeTo50% 1 0 fadeTo100% fadeTo100% 1 1 fadeTo50% fadeTo50%
so habe das mal angepasst...
1 | const int LED1 = 9; // LED links an Pin 11 |
2 | const int LED2 = 11; // LED rechts an Pin 12 |
3 | const int E1 = 2; //Eingang an Pin 2 |
4 | const int E2 = 3; //Eingang an Pin3 |
5 | |
6 | #define GRUNDSTELLUNG 0 |
7 | #define LED1UND2_FADE 1 |
8 | int status = 0; |
9 | |
10 | int fadeValueLED1 = 0; |
11 | int fadeValueLED2 = 0; |
12 | |
13 | void setup(){ |
14 | //setzt Arduino pin 10,11,9,3 to frequency 122.5 |
15 | //code typically inserted in setup() |
16 | TCCR1B = (TCCR1B & 0b11111000) | 0x04; |
17 | TCCR2B = (TCCR2B & 0b11111000) | 0x06; |
18 | |
19 | //Pindefinitionen |
20 | pinMode(LED1, OUTPUT); |
21 | pinMode(LED2, OUTPUT); |
22 | pinMode(E1, digitalRead); |
23 | pinMode(E2, digitalRead); |
24 | } |
25 | void loop() |
26 | { |
27 | // "status" hält den aktuellen Zustand des Systems fest. |
28 | // Bei jedem loop() aufruf weiss damit der Prozessor, |
29 | // womit er weiter machen soll. |
30 | |
31 | if (status == GRUNDSTELLUNG) |
32 | { |
33 | if (digitalRead(E1) == HIGH) |
34 | { |
35 | // Beim detektieren einer Bedingung, |
36 | // sagen wir dem System, es soll beim nächsten |
37 | // mal etwas anderes tun. |
38 | status = LED1UND2_FADE; |
39 | // Dafür müssen wir ggf. auch noch andere |
40 | // Dinge initialisieren: |
41 | fadeValueLED1 = 0; |
42 | fadeValueLED2 = 0; |
43 | return; |
44 | } |
45 | } |
46 | else if (status == LED1UND2_FADE) |
47 | { |
48 | // In diesem Zustand kümmert sich das |
49 | // System um einen weiteren Schritt im Faden der beiden LEDs: |
50 | analogWrite(LED1, fadeValueLED1); |
51 | analogWrite(LED2, fadeValueLED2); |
52 | // Ein delay, damit das menschliche Auge mit kommt, bzw. die LED |
53 | // physikalisch Zeit hat die Helligkeit zu ändern: |
54 | delay(30); |
55 | |
56 | // Für die nächste Iteration die Helligkeit anpassen: |
57 | fadeValueLED1++; |
58 | fadeValueLED2++; |
59 | |
60 | // Die Ende-Bedingung des Fades abfragen: |
61 | if (fadeValueLED1 > 255) |
62 | { |
63 | status = GRUNDSTELLUNG; |
64 | return; |
65 | } |
66 | } |
67 | } |
so das Ergebnis daraus... gebe ich E1 dauerhaft +5V, dann faden beide LED währenddessen ein und beginnen je nach delay von vorn. nehme ich dann E1 weg, bleiben die LEDs bei 100% stehen.(jetzt sollten diese zu 0 Faden Es sollte ja so sein. Wenn E1 permanent aktiv =Led faden zu 100% Wenn E1 "irgendwann"aus led Faden zu 0 Wenn E1 permanent aktiv =Led faden zu 100% Wenn E1&E2 permanent aktiv Led Faden zu 50% Wenn E1 permanent aktiv =Led faden wieder zu 100% ---------------------
:
Bearbeitet durch User
Robin R. schrieb: > Hab den Code mal lesbar gemacht: ??? warum dieses? Robin R. schrieb: > if (digitalRead(E1) == 0 > else if (digitalRead(E1) == HIGH) doch entweder 0 und 1 oder LOW und HIGH, der Mix wird ja nicht lesbarer. Jens S. schrieb: > ok..hätte gedacht mehr Kommentare sind besser.. Jens S. schrieb: > // LED1 > analogWrite(LED1, 0); ja dann aber nicht so sondern: analogWrite(LED1, 0); // LED1 off dann bleibt das bei wenig Zeilen aber trotzem mit Kommentar! Robin R. schrieb: > Dass es beianalogWrite(LED1, 0); um LED1 geht ist ja aber on oder off? hänt ja von der Verschaltung ab, also 0 besagt erst mal NICHTS möchte man LED Fading angepasst machen empfehle ich den Artikel LED Fading https://www.mikrocontroller.net/articles/LED-Fading klappt auch mit Arduino
:
Bearbeitet durch User
Manchmal kann auch ein Stück Käse helfen. Z.B. Taster an B2 und B3: switch (PortB & 0x0C) { // 00001100 case 0: ... // 00000000 break; case 4: ... // 00000100 break; case 8: ... // 00001000 break; case 12: ... // 00001100 oder default break; }
Joachim B. schrieb: > möchte man LED Fading angepasst machen empfehle ich den Artikel LED > Fading > https://www.mikrocontroller.net/articles/LED-Fading Das mit dem Anpassen ist nicht mein Problem, danke dafür was ich gerne möchte ist verschiede Eingangszustände -->verschiede Ausgangszustände zuweisen und dann zwischen denen wechseln
Joachim B. schrieb: > Robin R. schrieb: >> Hab den Code mal lesbar gemacht: > > ??? > warum dieses? > Robin R. schrieb: >> if (digitalRead(E1) == 0 >> else if (digitalRead(E1) == HIGH) > > doch entweder 0 und 1 oder LOW und HIGH, der Mix wird ja nicht lesbarer. Ja da hast du recht, das ist etwas chaotisch. Ist wohl eine Macke in meinem Denken, dass HIGH==1==true==Positiver TTL-Pegel, das ist ja alles nicht zwangsweise so. Ich gestehe, dass ich nicht so häufig Ausflüge in die hardwarenahe Softwareentwicklung unternehme und mich auf Arbeit eher mit Warenwirtschaftssystemen auseinander setze, da braucht man sowas üblicherweise nicht so genau nehmen. > Robin R. schrieb: >> Dass es beianalogWrite(LED1, 0); um LED1 geht ist ja > > aber on oder off? hänt ja von der Verschaltung ab, also 0 besagt erst > mal NICHTS Stimmt, so ein uC-Programm läuft ja immer in einer Hardware-Umgebung, die auch entsprechend verschaltet ist. Da hast du recht, dass man das (erhoffte) Verhalten der Hardware durchaus kommentieren sollte. 0/LOW kann ja in der tat etwas einschalten. Ich hätte das analogWrite(LED1, 0); evtl. auch weite gekapselt:
1 | void disableLED(int led) |
2 | {
|
3 | analogWrite(led, 0); |
4 | }
|
5 | |
6 | // ...
|
7 | |
8 | disableLED(LED1); |
Je nach Compiler-Optimierung kann das aber wirklich unnötig Taktzyklen kosten. Gut, da gibts ja noch
1 | #define
|
:
1 | #define DISABLE_LED(led) analogWrite(led, 0);
|
2 | // ...
|
3 | |
4 | DISABLE_LED(led); |
Und ob das dann wirklich soviel besser ist als ein kleiner Kommentar, darüber lässt sich gut streiten. Ist evtl. auch Geschmacksfrage? Oder in C++, wenn man Klassen um der Klassen-Willen nutzen will:
1 | class LEDService |
2 | {
|
3 | public:
|
4 | static void disable(int led) { analogWrite(led, 0); } |
5 | };
|
6 | |
7 | // ...
|
8 | |
9 | LEDService::disable(LED1); |
Boar krass....das ist für mich echt zu hoch... ich fang doch grad mal an... Das man bestimmten Code sicherlich optimieren oder anders aufbauen kann ist mir klar.. Aber ich will ja erst einmal dazu kommen das das funzt was ich will ;)
Server001 schrieb: > Aber ich will ja erst einmal dazu kommen das das funzt was ich will ;) aber so verworren lernt man das nicht oder bekommt Zufallsergebnisse die du irgendwann später noch weniger verstehst!
:
Bearbeitet durch User
Joachim B. schrieb: > Server001 schrieb: >> Aber ich will ja erst einmal dazu kommen das das funzt was ich will ;) > > aber so verworren lernt man das nicht oder bekommt Zufallsergebnisse die > du irgendwann später noch weniger verstehst! Also meine ersten C-Programme die ich so mit 15 geschrieben habe waren ein schlimmeres Chaos. Da arbeitet man auch gerne mal nach dem "ich fummel solange daran rum, bis es ca. tut was es soll"-Prinzip. Aber sowas ist auf nem uC wesentlich schwieriger, weil man die Debugging-Möglichkeiten nicht so hat. Ich fing damals auch auf einem richtigen PC an, da ging dann printf()-Debugging auch zuverlässig und konnte sich den code dump im gdb ansehen.
Sebastian S. schrieb: > Manchmal kann auch ein Stück Käse helfen. also mit der Case version komm ich zu keinem Ergebnis... :( Jens S. schrieb: > so habe das mal angepasst... evtl. kann sich dazu ja nochmal jemand äußern... das das so kompliziert wird hat ich ja nicht gedacht...
Du kannst auch auf die State-Maschine verzichten und die LED-Fades in eine Schleife verschieben und in deine if-Kaskade einbauen:
1 | for (int fadeValue = 0 ; fadeValue <= 150; fadeValue += 5) |
2 | {
|
3 | analogWrite(LED1, fadeValue); |
4 | analogWrite(LED2, fadeValue); |
5 | delay(...); |
6 | }
|
Zwei Schalter = vier Möglichkeiten - alle berücksichtigt. Es besteht aber auch die Möglichkeit, das Deine Schalter umgekehrt arbeiten. Dann muss das Beispiel anders herum abgelegt werden! switch (PortB & 0x0C) { // ????00?? case 0: ... // 00000000 Vorher keiner gedrückt hier beide break; case 4: ... // 00000100 Vorher B2 gedrückt hier B3 break; case 8: ... // 00001000 Vorher B3 gedrückt hier B2 break; case 12: ... // 00001100 oder default Jetzt beide losgelassen break; }
:
Bearbeitet durch User
Ihr werdet nachts erst munter was;) Muss ich morgen schauen... Meine Schalter sind im eigentlichem Sinne keine Schalter...es sind schlichte Eingänge. Entweder liegen 5v+ an oder nicht...
ich jab jetzt für mich eine funktionierende Lösung gefunden. Funktioniert soweit genau so wie ich es wollte und damit kann ich weiterarbeiten.
1 | const int LED1 = 5; // LED links an Pin 11 |
2 | const int LED2 = 6; // LED rechts an Pin 12 |
3 | const int E1 = 0; //Eingang an Pin 0 |
4 | const int E2 = 1; //Eingang an Pin1 |
5 | |
6 | |
7 | int TFLstatus = 0 ; |
8 | |
9 | void setup(){ |
10 | //setzt Arduino pin 10,11,9,3 to frequency 122.5 |
11 | //code typically inserted in setup() |
12 | TCCR1B = (TCCR1B & 0b11111000) | 0x04; |
13 | TCCR2B = (TCCR2B & 0b11111000) | 0x06; |
14 | |
15 | //Pindefinitionen |
16 | pinMode(LED1, OUTPUT); |
17 | pinMode(LED2, OUTPUT); |
18 | pinMode(E1, digitalRead); |
19 | pinMode(E2, digitalRead); |
20 | } |
21 | void LED100on() { |
22 | if (TFLstatus==0&&digitalRead(E1)==HIGH) { |
23 | for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) { |
24 | analogWrite(LED1, fadeValue);delay(10); |
25 | analogWrite(LED2, fadeValue);delay(10); |
26 | TFLstatus = 100; } |
27 | }} |
28 | void LED100off() { |
29 | if (TFLstatus==100&&digitalRead(E1)==LOW) { |
30 | for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) { |
31 | analogWrite(LED1, fadeValue);delay(10); |
32 | analogWrite(LED2, fadeValue);delay(10); |
33 | TFLstatus = 0; } |
34 | }} |
35 | void LED50on() { |
36 | if (TFLstatus==100&&digitalRead(E2)==HIGH) { |
37 | for (int fadeValue = 255 ; fadeValue >= 50; fadeValue -= 5) { |
38 | analogWrite(LED1, fadeValue);delay(10); |
39 | analogWrite(LED2, fadeValue);delay(10); |
40 | TFLstatus = 50; } |
41 | }} |
42 | void LED50off() { |
43 | if (TFLstatus==50&&digitalRead(E2)==LOW) { |
44 | for (int fadeValue = 50 ; fadeValue <= 255; fadeValue += 5) { |
45 | analogWrite(LED1, fadeValue);delay(10); |
46 | analogWrite(LED2, fadeValue);delay(10); |
47 | }TFLstatus = 100; |
48 | }} |
49 | void loop() { |
50 | LED100on(); |
51 | LED100off(); |
52 | LED50on(); |
53 | LED50off(); |
54 | } |
was sagt ihr?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.