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
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.
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
inti=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:
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
Ein1Ein2Led1Led2
2
00AusAus
3
01TBDTBD
4
10FehlerindeinemCode!!!(*)
5
11FadeFade
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%
// "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%
---------------------
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
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
voiddisableLED(intled)
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:
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!
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...
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;
}
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...
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang