Arduino-Programmierung: Bin ich oder der Erfinder der Programmiersprache zu blöd?

Es gibt 137 Antworten in diesem Thema, welches 17.662 mal aufgerufen wurde. Der letzte Beitrag (16. Juni 2022 um 13:57) ist von 1570.

  • Als normales C-Programm würde ich das durchgehen lassen.

    Sollte auf dem Arduino so eigentlich auch laufen, habe es nur wie gesagt nicht getestet.

    Was man noch machen sollte/kann ist den pinMode auf PIN 9 auf OUTPUT zu setzen, aber ansonsten sollte das Script der Anforderung aus Post Bitte melde dich an, um diesen Link zu sehen. genügen.

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

  • So, ich habe es mal zum Laufen gebracht:

    Bitte melde dich an, um diesen Link zu sehen.

    Man musste noch den Taster auch als Input deklarieren, sonst ging das nicht.

    Habe den delay mal auf 5s gesetzt, sonst ist das Testen im Simulator arg langweilig.

    EDIT: Noch einen Fehler behoben, da ich INPUT_PULLUP gemacht habe, muss die Abfrage in der while-Schleife natürlich true sein (Schalter aus == Logisch hoch)

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

    2 Mal editiert, zuletzt von root42 (14. Juni 2022 um 15:12)

  • Mach noch ein const in die ersten beiden Zeilen vor das int, wenn schon kein Bitte melde dich an, um diesen Link zu sehen. verwendet werden soll. :wink:

    Und damit es einheitlich wird, würde ich den Tonausgang auch noch als Konstante am Anfang definieren.

    Dann fehlt nur noch das Rauswerfen des delays.

    P.S.: Warum eigentlich "== true" in Zeile 24? Das Ergebnis von digitalRead ist doch strenggenommen HIGH oder LOW, das würde ich noch ändern.

  • Also das Beispiel in Deinem Link funktioniert bei mir nicht, root42

    Nach 5s blink es zwar, aber ich kann den Taster drücken so viel ich will, es blinkt fröhlich weiter.

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

  • P.S.: Warum eigentlich "== true" in Zeile 24? Das Ergebnis von digitalRead ist doch strenggenommen HIGH oder LOW, das würde ich noch ändern.

    Geändert.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Also das Beispiel in Deinem Link funktioniert bei mir nicht, root42

    Nach 5s blink es zwar, aber ich kann den Taster drücken so viel ich will, es blinkt fröhlich weiter.

    Doch, man muss den Button nur recht lange drücken, weil das delay(500) natürlich das Auslesen blockiert. Sekunde! Ich fixe das mal...

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Ok, hier eine Version mit Interrupts (nur GPIO 2 und 3 sind Interruptfähig auf dem Uno scheint es):

    Bitte melde dich an, um diesen Link zu sehen.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Ok, attachInterrupt() habe ich bisher nicht gekannt, das macht Sinn.

    Aber warum setzt Du einen INPUT_PULLUP auf auf den pinTaster?

    Wenn ich die Zeile entferne und attachInterrupt mir RISING definiere, funktioniert es genau so.

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

  • Mag jetzt für ein LED-Blink etwas bertrieben sein... aber

    (nur GPIO 2 und 3 sind Interruptfähig auf dem Uno scheint es)

    Zumindestens bei den ATTiny's sind alle IO interruptfähig, ich kann mir kaum vorstellen das

    der '328 das nicht unterstützt.

    Stichwort "PinChangeInterupt", allerdings muss man dazu auf Registerebene runter.

    Mfg Jood

    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.,
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.,
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.

  • Ok, attachInterrupt() habe ich bisher nicht gekannt, das macht Sinn.

    Aber warum setzt Du einen INPUT_PULLUP auf auf den pinTaster?

    Wenn ich die Zeile entferne und attachInterrupt mir RISING definiere, funktioniert es genau so.

    Keine Ahnung, ich kann doch auch kein Arduino. :biggrin: Ist halt die Frage was Default ist? Kann man ja alles nach belieben konfigurieren...

    (nur GPIO 2 und 3 sind Interruptfähig auf dem Uno scheint es)

    Zumindestens bei den ATTiny's sind alle IO interruptfähig, ich kann mir kaum vorstellen das

    der '328 das nicht unterstützt.

    Stichwort "PinChangeInterupt", allerdings muss man dazu auf Registerebene runter.

    Auch hier kenne ich mich zu wenig aus. Es ging mit dem Pin 11 oder was das war nicht, und die Dokumentation sagte Pin 2 und 3 sollten gehen. Und Tatsache, nach einer Änderung ging es dann.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Ungetestet, aber sollte das nicht ganz simpel so funktionieren

    Das war super! :) Ich habe es noch etwas gekürzt:

    void setup()
    {pinMode(8, OUTPUT);}
    void loop()
    {
    delay(60000);
    do
    {
    digitalWrite(8,HIGH);
    tone(6,500);
    delay(300);
    digitalWrite(8,LOW);
    tone(6,800);
    delay(300);
    }
    while(digitalRead(4) == false);
    noTone (6);
    }


    Klappt einwandfrei. Klar muss man den Taster etwas länger gedrückt halten, aber es klappt immerhin! :)

    Nun bin ich erstmal beruhigt. ;)

    Aber ich werde mir trotzdem mal das "Blinken ohne Delay" ansehen und schauen, ob ich das nicht integrieren kann um

    die Tasterabfrage bedienerfreundlicher zu machen.

    Vielen Dank für Deine Hilfe!

  • ich kann mir kaum vorstellen das

    der '328 das nicht unterstützt.

    Lt. Doku könne die 328er basierten das nur auf PIN 2 und 3

    Klar muss man den Taster etwas länger gedrückt halten, aber es klappt immerhin!

    Schau Dir die Interrupt-Methode von root42 an, die ist in dem Fall besser geeignet.

    Bitte melde dich an, um diesen Link zu sehen. Bitte melde dich an, um diesen Link zu sehen.

  • Ich habe das Projekt nochmal aktualisiert und einen Buzzer hinzugefügt, für das volle Erlebnis. :) Und ich habe das do-while in ein while geändert, so dass GANZ schnelle finger eine chance haben den Alarm VOR dem ersten piepsen zu beenden. :biggrin:

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Aber warum setzt Du einen INPUT_PULLUP auf auf den pinTaster?

    Das aktiviert den internen Pullup-Widerstand, sodass man den Taster nur noch gegen GND vebinden muss. Bei nicht gedrückt hat der Eingang dann HIGH, bei gedrückt hat er LOW.

    Zumindestens bei den ATTiny's sind alle IO interruptfähig, ich kann mir kaum vorstellen das

    der '328 das nicht unterstützt.

    Das geht beim 328 nicht. Trotzdem könnte man alle Pins als Tastereingang benutzen, wenn man in einem Interrupt den Taster ständig abfragt. Den Interrupt könnte man z.B. 100 mal in der Sekunde aufrufen.

    Aber ich werde mir trotzdem mal das "Blinken ohne Delay" ansehen und schauen, ob ich das nicht integrieren kann um


    die Tasterabfrage bedienerfreundlicher zu machen.

    Das Prinzip ist: Man merkt sich die aktuelle Zeit und addiert die Wartezeit dazu. Dann wartet man in einer Schleife, bis diese Zeit überschritten wird. Das macht man dann wieder in einer While- oder Do-While-Schleife. Darin kann man dann munter prüfen, ob der Taster gedrückt wurde. Dann braucht man auch den Interrupt-Handler nicht.

    Du wirst feststellen: so schwer ist das alles nicht, und weder Du noch der Erfinder der Sprache ist zu blöd.:)

    P.S.:
    Und noch etwas: achte bei Deinem Code auf die Einrückungen, sonst sieht man die Struktur nicht. Um Code gut lesbar einzufügen, kannst oben im Edit-Fenster die Schaltfläche </> benutzen.

  • Schau Dir die Interrupt-Methode von root42 an, die ist in dem Fall besser geeignet.

    Sind beide nicht perfekt:

    Mein Code klappt nur bis zum ersten Tastendruck, dann ertönt alle 10 Minuten ein Doppelton.

    Vermutlich muss Pin4 irgendwie "resettet" werden. :(

    Beim Code von root24 erklingt der Ton auch nach Drücken des Tasters einen Moment weiter, das müsste man auch noch irgendwie ändern.

    Aber was ich aus diesem Thread mitnehme: Es ist tatsächlich nicht so einfach, auf dem Arduino ein simples Programm zu erstellen. ;)

  • Und wie Stefan schon geschrieben, verwendet man intwischen eigentlich "const" statt "DEFINE".

    Oder noch moderner: constexpr

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Nichts ist simpel. ;) Und das mit dem weitertönen bei meinem Programm ist genau das Problem, dass wir ja zweimal tone() aufrufen. Das wird noch zu Ende ausgeführt, bevor die Schleife sich ausklinkt.

    Wenn dir das alles nicht gefällt musst du den Rat von Kosmas befolgen und das ganze ohne delay() und tone() programmieren. Denn die beiden Funktionen blockieren ja die Ausführung (unterbrochen vom Timer), und können nicht so ohne weiteres abgebrochen werden.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.

  • Aber was ich aus diesem Thread mitnehme: Es ist tatsächlich nicht so einfach, auf dem Arduino ein simples Programm zu erstellen. ;)

    Doch, eigentlich schon. Dieses Programm hier ist aber schon nicht ganz so simpel wie z.B. eine Ampelsteuerung, in die man gar nicht eingreifen will.

  • Ich kapier´ aktuell (unter anderm *gggg*) nicht, warum bei dem Programm

    Bitte melde dich an, um diesen Link zu sehen.

    die Tonfolge beim ersten Start so lange ertönt, bis man den Taster drückt,

    aber dann immer nur eine Doppeltonfolge ertönt, obwohl der Taster nicht mehr gedrückt ist.

    Dann sollte Pin 4 doch LOW sein und das Programm sollte doch die Schleife mit den beiden Tönen endlos durchlaufen? :(

  • Ich kapier´ aktuell (unter anderm *gggg*) nicht, warum bei dem Programm

    Bitte melde dich an, um diesen Link zu sehen.

    die Tonfolge beim ersten Start so lange ertönt, bis man den Taster drückt,

    aber dann immer nur eine Doppeltonfolge ertönt, obwohl der Taster nicht mehr gedrückt ist.

    Dann sollte Pin 4 doch LOW sein und das Programm sollte doch die Schleife mit den beiden Tönen endlos durchlaufen? :(

    Naja, der eingang ist ja nicht auf PULLDOWN programmierbar, von daher würde ich sagen floated der fröhlich herum. Bei INPUT_PULLUP ist der ja automatisch HIGH, floated nicht, und wird aktiv LOW gezogen durch drücken. Du müsstest bei der Verdrahtung also vielleicht noch hochohmig nach GND eine Strippe ziehen, damit der Taster richtig funzt? Die Simulation ist da vermutlich nicht perfekt.

    EDIT: habe das mal hier gemacht: Bitte melde dich an, um diesen Link zu sehen.

    C64C mit 8580, C64 mit 6581 und C64G mit ARMSID,

    C16, VC20, PET3016+32K, 3x1541, 2x1541-II, Pi1541, Philips CM8833-II, 1084S

    Bitte melde dich an, um diesen Link zu sehen.