Hallo Besucher, der Thread wurde 15k mal aufgerufen und enthält 137 Antworten

letzter Beitrag von 1570 am

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

  • Simples Projekt:

    Nach Einschalten des Arduino soll nach einer Pause von 10 Minuten ein Ton (Doppelton) ausgegeben werden und eine LED soll blinken,

    bis man einen Taster betätigt.

    Der Ton soll dann ausgeschaltet werden und die LED nicht mehr blinken.

    Nach 10 Minuten starten Ton & Blinken erneut, bis der Taster gedrückt wird.

    Also zwei simple For-Next-Schleifen im C64-Basic, mit einem Input (oder GET?).

    Aber auf dem Arduino bekomme ich es nicht hin, Internet war auch keine Hilfe. :(

    Mein Code:



    void setup()
    {
    #define tasterPin 11;
    pinMode(11, INPUT); //Taster-Eingang Pin 11
    }
    void loop () // Hauptschleife
    {
    delay(60000); // Timer starten (10 Minuten)
    void loop () // Schleife für Ton- und LED-Signal
    {
    tasterstatus = digitalRead(tasterPin);
    if (tasterstatus == LOW) // Wenn der Taster nicht gedrückt ist...
    {
    digitalWrite(9, HIGH); // Schalte die LED ein
    tone(8, 100); //An Pin 8 Ton 100 ausgeben
    delay(500); //halbe Sekunde warten (Ton bleibt an)
    digitalWrite(9, LOW); // Schalte die LED aus
    noTone(8); //Ton an Pin 8 ausschalten
    tone(8, 200); //Ton 200 an Pin 8 einschalten
    delay(500); //halbe Sekunde warten
    noTone(8); //Ton ausschalten
    }
    }
    }


    Fehlermeldung:

    Code
    1. sketch.ino: In function 'void loop()':
    2. sketch.ino:10:1: error: a function-definition is not allowed here before '{' token { ^


    Wo ist der (oder "die") Fehler?

    Für mich sieht das völlig logisch aus und das erste "void loop" steht genauso vor der geschweiften Klammer wie das zweite, welches angemeckert wird.

    Vermutlich hat der (die) C++-Erfinder das alles absichtlich erheblich komplizierter konstruiert, sonst könnt´s ja jeder verstehen. ;)

    Vielen Dank für eure Hilfe!

  • Bitte schau Dir "Blink without Delay" an.

    Mit delay() ist das nix.

    In meinem Fall wäre das zwar nicht soooo schlimm, dann müsste man den Taster halt eine Sekunde lang drücken,

    aber Dein Hinweis ist berechtigt. Danke für den Tipp, das schaue ich mir mal in Ruhe an.

    Aber das erklärt trotzdem nicht die Fehlermeldung. ;)

  • loop() ist mitnichten ein Schleifen-Befehl, sondern eine Funktion. Arduino funktioniert so, dass einmalig die Funktion setup() ausgeführt wird und dann in einer Endlosschleife immer wieder die loop() Funktion. Mit dem zweiten void loop() versuchst du eine weitere Funktion mit dem Namen loop innerhalb der eigentlich loop-Funktion anzulegen. Das ist in C++ nicht zulässig und wohl auch nicht das was du willst. Die Schlüsselwörter für Schleifen sind for, while und do.


  • Teste das mal....

    Die Zeit kannst Du dann später "hochsetzen" auf 10 Minuten.


    Wenn Du Blink without delay verstanden hast, packe es in

    "IN DIESE SCHLEIFE KOMMEN DIE AKTIONEN REIN; DIE DU MÖCHTEST"



    Das Ausschalten dann in

    "IN DIESE SCHLEIFE MÜSSEN DIE AKTIONEN AUSGESCHALTET WERDEN"



    Grüße


    Stefan

  • Ich kann immer wieder nur von diesem Arduino Buch erzählen. Ansonsten fängt man von 0 an…

    https://www.amazon.de/gp/product/3966450380

    Das Buch ist gut, geht auch günstiger und "flacher".

    Aber...hm... also... ohne das böse zu meinen...

    Retro-Rentner fängt bei 0 an, möchte aber Level 8 lösen.

    Retro-Rentner, auch in den Arduino Foren wird man Dir ans Herz legen, erst die Beispiele der Reihe nach durchzuarbeiten.


    Ich weiß, dass sich deine Aufgabenstellung simpel anhört. Sie ist auch nicht schwierig, wenn man sich in das Thema eingearbeitet hat. Aber versuche bitte zuerst das Schema eines Arduinoprogramms zu verstehen.

    Es unterscheidet sich extrem vom Basic Programm.


    Stefan

  • Ich habe mich C64 projektbedingt seit einer kurzen Weile auch mit dem Arduino beschäftigt, und kann Stefan Both nur zustimmen. Es hilft wirklich das von vorne bis hinten durchzukauen. Wenn man einiges schon kennt, kann man das bekannte ja überspringen. Ich habe z.B. gerade festgestellt, das der Arduino 3,3V bzw. 5 V mag.

    9 Volt über Batterieblock bringt aufgrund der geringen Stromstärke nicht viel. Da ist die Batterie schnell leer, wenn die überschüssige Spannung zumal noch transformiert werden will.

    Auch steht in dem Buch, wie man sich selber eine Minimalstversion vom Arduino basteln kann, also ohne viele Komponenten und Platzverschwendung, und vieles mehr.

  • Also man kann natürlich einfach losprogrammieren und meinen, jedes System hat sich so zu verhalten, wie ein C64.

    Oder man schaut sich erst mal ein paar Programme an. Nicht umsonst bringt die Arduino-Programmierumgebung jede Menge Beispielprogramme mit.


    Ich habe mich C64 projektbedingt seit einer kurzen Weile auch mit dem Arduino beschäftigt, und kann Stefan Both nur zustimmen. Es hilft wirklich das von vorne bis hinten durchzukauen.

    Muss man nicht. Wer hat schon Lust sich tagelang trockene Literatur reinzuziehen. Erst mal die Beispiele anschauen und versuchen zu verstehen.

    Wenn man mit denen überhaupt nicht klar kommt, kann man sich immer noch mit der Theorie beschäftigen.


    Aber zugegeben. C64 Basic-Programmierer haben es hier natürlich wieder besonders schwer, weil sie zum ersten mal mit einer strukturierten Programmiersprache konfrontiert werden.

  • Ist das Hauptproblem nicht das Semikolon am Ende des #defines?

    Nö.

    Das Hauptproblem liegt zwischen


    void {


    und

    }

    }

    }


    Ernsthaft. 2 "delay() - Schleifen" ineinander

    mit einer Abfrage dazwischen geht so nicht.


    Man könnte die Schalterabfrage noch in die "else" Funktion stecken verschieben. Dann ist ein Reset der Zeit erst NACH deren Ablauf möglich.


    Stefan

  • Ist wohl eine Frage der Definition von "Hauptproblem" ^^. Endurion 's ist zumindest schwerer zu entdecken, mir wars noch gar nicht aufgefallen.

  • Aber versuche bitte zuerst das Schema eines Arduinoprogramms zu verstehen.

    Es unterscheidet sich extrem vom Basic Programm.

    Das scheint mir auch so.

    Das empfohlene Buch habe ich, dazu noch zwei weitere. Sind seeeehr viele Seiten, daher habe ich bisher noch nicht

    in die Bücher geschaut und dachte ganz naiv, dass ich sowas einfaches mit etwas Beispielcode aus dem Internet hinbekomme.

    War mal wieder nichts. ;)

    Eine Funktion ist für mich z.B. x=y+2*x, sowas hatte ich mal vor vielen Jahren in der Schule, ist aber sicherlich nicht das Gleiche. ;)

  • Teste das mal....

    Vielen Dank für Deine Mühe.

    Sieht sehr kompliziert aus und ich würde Dein Programm so interpretieren, dass ich auch vor Ablauf des Timers

    durch Tastendruck den Timer resetten kann, wodurch die LED nie blinken würde. Das soll aber nicht so sein.

    Evtl. kapier´ ich aber auch das Programm nicht und merke schon, dass ich wohl doch Wochen damit verbringen muss,

    meine Arduino-Bücher durchzuarbeiten. Aber was an C++ nun besser sein soll als an C64-BASIC leuchtet mir nicht ein.


    Vielen Dank an alle für die prompten Hilfe-Versuche!

    Auch wenn mir noch immer nicht klar ist, warum ich nicht zwei Schleifen ineinander schachteln kann. ;)