Bitte um Hilfe beim programmieren.
Habe am Freitag meinen ersten Arduino bekommen
und übe den zu programmieren.
Dieses Tutorial habe ich dazu gefunden und damit
und den Beispielen in der arduinosoft etwas gelernt.
https://www.youtube.com/watch?v=0wAY3DYihyg&list=PLAB63281B90FB376E
Mit while komme ich nicht klar.
Wenn ich den Schalter HIGH mache geht er in die while
Schleife. Mache ich den LOW kommt er da leider nicht
mehr raus.
Was mache ich falsch? Was ist zu tun?
In der angehängten ino mit if funktioniert das Monoflop bedingt.
Habt Ihr einen guten link für mich wo while und andere erklärt werden?
Muss kein youtube sein.
LG
old.
Jetzthabensieihn I. schrieb:> bleibt er leider auch hängen
Wo bleibt er denn hängen? Und woher weißt du das? Spicke deinen Code
doch mit Serial.println() zum debuggen. Ist dein Schalter wirklich ein
Schalter oder ein Taster?
In dieser Schleife kann sich "Schalter" nicht ändern, also kann er die
Schleife auch nicht verlassen. Um sie zu verlassen, muss Du "Schalter"
in der Schleife auf einen Wert ungleich 1 umstellen.
Jetzthabensieihn I. schrieb:> So wie ich das in 003 mache, bleibt er leider auch hängen. :-(
Das blöde an Mikrocontrollern ist, dass sie genau das machen, was man
ihnen sagt.
Wie soll sich die Variable Schalter ändern, wenn das Programm einmal
in den "while (Schalter == 1)"-Block gelangt ist.
Md M. schrieb:> Wo bleibt er denn hängen? Und woher weißt du das?
Die rote LED bleibt dann an unabhängig von der
Schalterstellung.
Siehe Bild vom Aufbau.
Klugscheisser schrieb:> Um sie zu verlassen, muss Du "Schalter"> in der Schleife auf einen Wert ungleich 1 umstellen.
Das verstehe ich leider nicht. Bitte etwas ausführlicher
erklären.
LG
old.
Arduino F. schrieb:> Hier ...
Danke, allerdings verstehe ich das nicht.
Ist ja ein ganz anderer Ansatz.
Woher kennst Du die Begriffe zum Programmieren
und deren Funktion?
Angeblich soll man ja die Begriffe zur Programmierung
auf der arduino.cc Seite finden. ich habe da schon
mehrfach erfolglos gesucht.
Wenn da Jemand einen link kennt, bitte zeigen.
Muss doch irgendwie gehen aus der while Schleife rauszukommen.
Vielleicht ist minibloq für mich besser geeignet.
LG
old.
Jetzthabensieihn I. schrieb:> Muss doch irgendwie gehen aus der while Schleife rauszukommen.
Ja, einfach mal innerhalb der while-Schleife gucken, was der Schalter
macht (i.e. InputPin abfragen) und die Variable Schalter
entsprechend ändern.
Wolfgang schrieb:> (i.e. InputPin abfragen) und die Variable Schalter> entsprechend ändern.
Habe ich das nicht in 003 getan?
Auch digitalRead(Schalter); funktioniert nicht,
siehe Anhang 004.
Vielleicht braucht die while Funktion eine Rechenaufgabe
(die ich nicht bieten kann).
Gibt es noch etwas anderes als if und while was da
infrage kommt?
Gibt es eine Liste mit Begriffen und Erklärungen dazu?
Link?
LG
old.
Jetzthabensieihn I. schrieb:> Gibt es noch etwas anderes als if und while was da> infrage kommt?
Klingt als bräuchtest du erstmal einen kleinen C-Grundlagen bzw.
algemein einen Programmier-Crashkurs. Und wie gesagt, schreib doch
immer, wenn du nicht weißt, was an einer Stelle vor sich geht oder
welcher Wert in einer Variable steht sowas wie
1
Serial.print("Stelle A: ");
2
Serial.println(Schalter,DEC);
hin, dann weißt du, was in der Variable steht und ob du sie verändert
hast oder ob du nur glaubst, dass du sie verändert hast.
Md M. schrieb:> Siehst du die Unterschiede?
Nein?
Ich habe über Google !!! etwas bei arduino gefunden:
https://www.arduino.cc/en/Tutorial/WhileStatementConditional
Ich muss für 1 HIGH und für 0 LOW schreiben.
Das war der Fehler.
Jetzt funzt das. :-) Der Tag ist gerettet.
Über den Pfad finde ich dann auch weitere Erklärungen
auf der arduino.cc Seite.
LG
old.
Jetzthabensieihn I. schrieb:> Ich muss für 1 HIGH und für 0 LOW schreiben.> Das war der Fehler.> Jetzt funzt das. :-) Der Tag ist gerettet.> Über den Pfad finde ich dann auch weitere Erklärungen> auf der arduino.cc Seite.
Immer gut NICHT zu wissen warum etwas funktioniert
Jetzthabensieihn I. schrieb:> Arduino F. schrieb:>> Hier ...>> Danke, allerdings verstehe ich das nicht.> Ist ja ein ganz anderer Ansatz.> Woher kennst Du die Begriffe zum Programmieren> und deren Funktion?
Was du (und auch ich) verwende(st) ist C++.
Dazu gibts reichlich im Internet.
Arduino ist übrigens gerade bei C++11 angekommen.
Angefangen, habe ich übrigens mit Büchern, und so...
---
> anderer Ansatz
Klar.
Dein 3 tausender Delay wird dir noch das Genick brechen.
Jetzthabensieihn I. schrieb:> Wenn da Jemand einen link kennt, bitte zeigen
Zu while: http://en.cppreference.com/w/cpp/language/while
Jetzthabensieihn I. schrieb:> Jetzt funzt das.
Tut es leider nicht.
Hatte statt while, if geschrieben in 005.
Damit geht es bedingt.
Arduino F. schrieb:> Zu while
Absolut unverständlich für mich.
Ich schaue mich mal auf der arduino Seite um.
Wenn ich damit nicht klar komme probiere ich
mal minibloq. Darauf bin ich zufällig bei youtube
gekommen.
LG
old.
Jetzthabensieihn I. schrieb:> Arduino F. schrieb:>> Zu while>> Absolut unverständlich für mich.
Ok, das kann ich nachvollziehen, auf der Seite sieht das auf den ersten
Blick etwas viel aus. Wenn man das mit Mathematik vergleicht, hast du
dich da quasi von der Addition erschrecken lassen.
> Ich schaue mich mal auf der arduino Seite um.
Dann hier https://www.arduino.cc/en/Reference/While
Klugscheisser schrieb:> Um sie zu verlassen, muss Du "Schalter"> in der Schleife auf einen Wert ungleich 1 umstellen.
Ja, ich habe ihn um eins erniedrigt
Schalter --;
und komme raus.
Jetzt habe ich die ino falsch bezeichet, sollte 006 sein,
egal.
Ich hoffe mal da raucht nichts ab, wenn ich im Programm
Schalter ++;
mache.
Arduino F. schrieb:> Dein 3 tausender Delay wird dir noch das Genick brechen.
Knack.
Ich muss mal zusehen, dass er auf die fallende Flanke
in while kommt.
LG
old.
@Moderation: Bitte mal retriggerbares in der Überschrift
vom Startbeitrag setzen.
Jetzthabensieihn I. schrieb:> Knack.> Ich muss mal zusehen, dass er auf die fallende Flanke> in while kommt.
Tipp:
Suche das Arduino Beispiel "BlinkWithoutDelay"
Da findest du die Lösung für dein Delay Problem.
Jetzthabensieihn I. schrieb:> Klugscheisser schrieb:>> Um sie zu verlassen, muss Du "Schalter">> in der Schleife auf einen Wert ungleich 1 umstellen.>> Das verstehe ich leider nicht. Bitte etwas ausführlicher> erklären.
Schalter = digitalRead(InputPin);
while (Schalter == 1)
{
digitalWrite(rot,HIGH);
digitalWrite(gruen,LOW);
delay(3000);
digitalRead(InputPin);
}
OK, Versuch
du gehst in den Supermarkt und willst Kaffe, fragst vor dem Drehkreuz
die Kassiererin in welchem Regal -> diese Info ist dein (Schalter == 1)
Solange du diese Info hast und keine neue Info anforderst schickt dich
diese Schleife
while (Schalter == 1)
immer ums Kaffeeregal rum, wie sollst du da wieder rauskommen wenn du
nicht mal neuere Infos bestellst, also den Schalter in deinem im
Kreislaufen neu befragst!
die weitere Abfrage ob der Schalter immer noch 1 ist muss natürlich in
die Schleife damit du raus kommst.
Joachim B. schrieb:> digitalRead(InputPin);
siehe 003.ino
In der Schleife ist der Schalterzustand parameter.
Deshalb ist das sinnlos den Abzufragen.
Du muss Dich da raus rechnen, siehe Beitrag:
Jetzthabensieihn I. schrieb:> und komme raus
So erkläre ich mir das.
___________________________________________Arduino F. schrieb:> Tipp
Danke, ich befasse mich jetzt erstmal mit den
Bool'schen Operatoren.
LG
old.
eigentlich wollte ich den Spielverderber machen. Aber ich glaube, der TO
braucht braucht so langsam doch einen deutlicheren Hinweis...
Jetzthabensieihn I. schrieb:> In der Schleife ist der Schalterzustand parameter.> Deshalb ist das sinnlos den Abzufragen.
Du sollst den Schalterzustand innerhalb der Schleife nicht abfragen, du
sollst ihn aktualiseren! (Damit die Abfrage der Schleifenbedingungen
mitkriegen kann, wenn sich der Zustand des Schalters wieder ändert)
Mach aus dem
Schalter = digitalRead(InputPin);
Serial.println(Schalter,DEC);
1
while(Schalter==1)
2
{
3
digitalWrite(rot,HIGH);
4
digitalWrite(gruen,LOW);
5
delay(3000);
6
digitalRead(InputPin);//in dieser Schleifer bleibt der Wert von
7
//Schalter konstant. Die Schleife kann nie
8
//verlassen werden
9
}
bitte einfach mal ein
1
Schalter=digitalRead(InputPin);
2
Serial.println(Schalter,DEC);
3
4
while(Schalter==1)
5
{
6
digitalWrite(rot,HIGH);
7
digitalWrite(gruen,LOW);
8
delay(3000);
9
Schalter=digitalRead(InputPin);
10
//in dieser Schleife wird der Zustand des Schalters bei jedem
11
//Schleifenadurchlauf neu abgefragt.
12
//Sobald Schalter auf 0 wechselt, wird die Schleife beendet
13
}
Vergiss bitte nicht auch die Kommentare in deinen Code einzufügen (als
Merkhilfe)
Jetzthabensieihn I. schrieb:> Achim S. schrieb:>> der TO>> ist schon lange aus der while Schleife raus.
Ja, und zwar mit einer völlig unsinnigen Methode:
Jetzthabensieihn I. schrieb:> Ja, ich habe ihn um eins erniedrigt> Schalter --;> und komme raus.
Warum machst du Sache nicht einfach richtig? Wäre das zu einfach?
Achim S. schrieb:> Aber ich glaube, der TO> braucht braucht so langsam doch einen deutlicheren Hinweis...
Hatte er eigentlich schon:
Md M. schrieb:> Schalter = digitalRead(InputPin);> digitalRead(Schalter);>> Siehst du die Unterschiede?Jetzthabensieihn I. schrieb:> Frage:> wie gibt man mit der Tastatur logical or und xor ein?
Wie schon gesagt:
Md M. schrieb:> Klingt als bräuchtest du erstmal einen kleinen C-Grundlagen bzw.> algemein einen Programmier-Crashkurs.http://www2.informatik.uni-halle.de/lehre/c/c_operat.html
Logische und bitweise Operatoren.
Jetzthabensieihn I. schrieb:> Bitte um Hilfe beim programmieren.> Mit while komme ich nicht klar.> Wenn ich den Schalter HIGH mache geht er in die while> Schleife. Mache ich den LOW kommt er da leider nicht> mehr raus.> LG> old.
das wolltest DU, den Schalter befragen bei HIGH rein in die while
Schleife!
den Schalter befragen und bei LOW raus!
Jetzthabensieihn I. schrieb:> Joachim B. schrieb:>> digitalRead(InputPin);>> siehe 003.ino>> In der Schleife ist der Schalterzustand parameter.> Deshalb ist das sinnlos den Abzufragen.> Du muss Dich da raus rechnen, siehe Beitrag:> LG> old.
while (Schalter == HIGH)
{
digitalWrite(Schalter,HIGH);
digitalWrite(rot,HIGH);
digitalWrite(gruen,LOW);
delay(3000);
Schalter --;
}
deswegen ist dieses falsch!
Du befragt den Schalter und gehst bei HIGH rein, soweit OK.
Nun befragst du aber in der WHILE Schleife den Schalter nicht sondern
vergisst was die Frage am Anfang war und das ist nicht gleich deiner
ersten Forderung!
Es ist ein Unterschied ob der Schalter LOW wird oder ob man den
"gemerkten" Schalterzustand vergisst oder sich falsch erinnert.
ja ne is klar
wer Gedankenfehler aufzeigt bekommt ein negativ reingewürgt?
echt jetzt?
Die Forderung war wenn der Schalter wieder LOW wird, das ist aber nicht
der Fall wer den gemerkten Schalterzustand einfach negiert!
Das hat mit Schalterzustand nichts zu tun.
Jetzthabensieihn I. schrieb:> Wenn ich den Schalter HIGH mache geht er in die while> Schleife. Mache ich den LOW kommt er da leider nicht> mehr raus.
so geht das, sagten auch andere:
Achim S. schrieb:> while (Schalter == 1)> {> digitalWrite(rot,HIGH);> digitalWrite(gruen,LOW);> delay(3000);> Schalter = digitalRead(InputPin);> //in dieser Schleife wird der Zustand des Schalters bei jedem> //Schleifenadurchlauf neu abgefragt.> //Sobald Schalter auf 0 wechselt, wird die Schleife beendet> }
das hatte ich auch versucht zu erklären, aber OK
Jetzthabensieihn I. schrieb:> Habe ich das nicht in 003 getan?> Auch digitalRead(Schalter); funktioniert nicht,> siehe Anhang 004.
while (Schalter == 1)
{
digitalRead(Schalter);
digitalWrite(rot,HIGH);
digitalWrite(gruen,LOW);
digitalRead(Schalter);
delay(3000);
digitalRead(Schalter);
}
du verstehst immer noch nicht
vor while:
Schalter = digitalRead(InputPin);
^Merker^.........^Schalter^
while (Schalter == 1)
solange Merker ==1
in der while
digitalRead(Schalter);
schick der Schalter kann sich ändern,
der Merker wird nicht verändert es fehlt:
Schalter = digitalRead(InputPin);
^Merker^.........^Schalter^
und solange der Merker (Schalter) nicht durch den digitalRead(InputPin)
geändert wird:
while (Schalter == 1)
du könntest dir den Merker Schalter auch sparen wenn du gleich in der
while abfragst,
while( digitalRead(InputPin)== 1 )
{ digitalWrite(rot,HIGH);
digitalWrite(gruen,LOW);
delay(50); // und dazu entprellst bis der Schalterzustand stabil
wird
}
// und danach das low wider entprellst
do
{delay(50); // und dazu entprellst bis der Schalterzustand stabil wird
}while( digitalRead(InputPin)==1 );
bevor es in eine neue Runde geht
Jetzthabensieihn I. schrieb:> Das digitalRead über dem while war die Ursache.
nicht nur, auch deine ganzen vorigen Abfragen
es ist halt ein Unterschied ob ich mit dem Finger teste ob die
Herdplatte heiss ist
( Schalter = digitalRead(InputPin); )
^ Finger.......^ Herdplatte = heiss
und solange Finger aua (egal ob die Herdplatte an ist oder nicht)
ich dann heule
und wenn der Finger nicht mehr weh tut weiter mache, (egal ob die
Herdplatte noch an ist).....
oder ob ich bevor ich weiter mache noch mal den Finger auf die
Herdplatte lege
> Jetzt sehe ich aber keinen Unterschied zu if.
das wird der Compiler schon optimierend fast gleichwertig übersetzen
WENN es das gleiche meint.
Jetzthabensieihn I. schrieb:> Diese Lösung muss ich mal nachvollziehen:> Beitrag "Re: Arduino UNO etriggerbares Monoflop if while"
Wenn dir daran etwas unklar ist, dann kann ich dir sicherlich die
passenden Stichworte für Google liefern.
Ha! Genau das Richtige für mich:
www.ov-meschede.de/workshop/Arduino%20Programmierhandbuch.pdf
Jetzthabensieihn I. schrieb:> ich befasse mich jetzt erstmal mit den> Bool'schen Operatoren.
Die UND Verknüpfung mit Variablen steht auch schon.
Macht mir Spaß der Arduino. :-)
LG
old.
Jetzthabensieihn I. schrieb:> www.ov-meschede.de/workshop/Arduino%20Programmierhandbuch.pdf
So wird ein Link draus:
http://www.ov-meschede.de/workshop/Arduino%20Programmierhandbuch.pdf
scheint leicht verdaubare Kost zu sein, dazu in deutscher Sprache, was
dem deutschsprachigem Fremdsprachabstinenzler entgegen kommt (wobei mein
Englisch auch nur für's Nötigste reicht - ohne Google wäre ich echt arm
dran ;))
MfG
Md M. schrieb:> wozu Arduino gemacht istBeitrag "Re: Elektrische Rollosteuerung"
Wenn ich alle logischen Verknüpfungen in Griff habe,
kann ich den Arduino da schon einbauen.
Das Hardwaremonoflop und die Endlagenschalter werden
dann mit dem Programmierfortschritt entfernt.
Da das CD4541 ja vorhanden ist, hat das Softwaremonoflop
hier keine Eile.
LG
old.
Jetzthabensieihn I. schrieb:> Ha! Genau das Richtige für mich:> www.ov-meschede.de/workshop/Arduino%20Programmierhandbuch.pdf
Liegt bei mir seit 2015 auf der Festplatte, mit sowas und einigen
Schulscripten (per Google gefunden) habe ich am ersten Uno Blinkeleds,
Drehpoti, Taster ... bespielt.
Ich hatte zwar ein konkretes Projekt im Auge, weiß aber aus langjähriger
Erfahrung, dass es besser ist, sich erstmal Grundlagen ohne direktes
Gesamtziel zu erarbeiten.
Ich habe auch schon stundenlang eigene Fehler *) gesucht, glaube aber,
dass ich damit schneller am Ziel war als meine Ergüsse in Foren zu
posten.
*) Geschweifte Klammern und Semikolon sind meine Feinde.
> Macht mir Spaß der Arduino. :-)
Das macht er in der Tat, sogar süchtig.
Patrick J. schrieb:> scheint leicht verdaubare Kost zu sein, dazu in deutscher Sprache, was> dem deutschsprachigem Fremdsprachabstinenzler entgegen kommt (wobei mein> Englisch auch nur für's Nötigste reicht - ohne Google wäre ich echt arm> dran ;))
Mein Englisch reicht, mit Servicetechnikern per Telefon zu sprechen -
dennoch bevorzuge ich Deutsche Unterlagen, die Muttersprache geht immer
noch am besten.
Jetzthabensieihn I. schrieb:> Da das CD4541 ja vorhanden ist, hat das Softwaremonoflop> hier keine Eile.
Dafür schäme Dich!
Manfred schrieb:> Jetzthabensieihn I. schrieb:>> Da das CD4541 ja vorhanden ist, hat das Softwaremonoflop>> hier keine Eile.> Dafür schäme Dich!
Warum?
Manfred schrieb:> Ich habe auch schon stundenlang eigene Fehler *) gesucht, glaube aber,> dass ich damit schneller am Ziel war als meine Ergüsse in Foren zu> posten.
Habe ich inzwischen auch gemerkt.
Im Programmierbereich des Forums ist die Hilfsbereitschaft
nicht sonderlich ausgeprägt.
Wenn Du aber eine Frage stellst und nach stundenlanger
Suche die Lösung einstellt, hilfst Du damit anderen
Hilfesuchenden. Eine Gute Tat halt.
LG
old.
Jetzthabensieihn I. schrieb:>>> Da das CD4541 ja vorhanden ist, hat das Softwaremonoflop>>> hier keine Eile.>> Dafür schäme Dich!> Warum?
Das bedeutet doch, dass Du aufgegeben hast. Es ist keine Schande, an
einem Stück Software zu verzweifeln, aber zumindest ich kann mir selbst
gegenüber nur schwer akzeptieren, etas abzubrechen.
>> Ich habe auch schon stundenlang eigene Fehler *) gesucht, glaube aber,>> dass ich damit schneller am Ziel war als meine Ergüsse in Foren zu>> posten.> Habe ich inzwischen auch gemerkt.> Im Programmierbereich des Forums ist die Hilfsbereitschaft> nicht sonderlich ausgeprägt.
Wenn Du selbst einmal versuchst, fremden Programmcode zu verstehen und
zu verändern, wird Dir klar, warum das so ist.
Manfred schrieb:> Das bedeutet doch,
Wenn ich alle logischen Verknüpfungen in Griff habe,
kann ich den Arduino da
Beitrag "Re: Elektrische Rollosteuerung"
schon einbauen.
Das Hardwaremonoflop und die Endlagenschalter werden
dann mit dem Programmierfortschritt entfernt.
Da das CD4541 ja vorhanden ist, hat das Softwaremonoflop
hier keine Eile.
LG
old.
Arduino F. schrieb:> Suche das Arduino Beispiel "BlinkWithoutDelay"
Das ist ein guter Tipp!
Nach einigen Experimenten konnte ich zuerst
die LED über einen Schalter verzögert schalten.
Dann die Verzögerungszeiten für das Ein- und
Ausschalten separat einstllen.
Für meine Anwendung Sonnenschutzrollo
Beitrag "Re: Elektrische Rollosteuerung"
ist dieser Sketch sehr geeignet, weil ich eine
Einschaltverzögerung z.B. eine Minute und eine
Ausschaltverzögerung z.B. 30 Minuten einstellen
kann. Das ist mehr als das eine Hardware-Monoflop kann.
Damit der Sketch für Anfänger wie mich nachvollziehbar
ist, habe ich einige Kommentare dazu geschrieben.
Möge er dem Nächsten viele Stunden Arbeit ersparen.
Zum Ansehen auf die Codeansicht klicken.
https://www.mikrocontroller.net/attachment/highlight/330247
LG
old.
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