Arduino Blinkprogramm

OP #4744829
Lesenswert?

Hi,
momentan haben wir in der Schule das Thema Arduino.
Ich habe wohl ein Verständnis Problem und komme weder im Internet noch 
in Büchern weiter.
Die Aufgabe war mit einem Arduino Uno eine LED 5 mal im Abstand von 2 
Herz Blinken zu lassen, wenn ein Taster betätigt wird. Wird der Taster 
nicht gedrückt, soll nichts passieren.

So wie ich alles verstanden habe, habe ich versucht ein Programm zu 
schreiben, aber Blinken tut nichts wenn ich auf den Taster drücke.

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(4, OUTPUT);

}

void loop()
{
  digitalWrite(4, HIGH);

  if(4 == HIGH)
  {
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(8, LOW);
    delay(500);
   }

  else
 {
   digitalWrite(8, LOW);

 }
}

Ich weiß nicht was ich falsch mache..
Danke schon mal im voraus für jede Hilfe.
#4744847
Lesenswert?

Deine Pin Definition ist falsch wenn du einen Taster abfragen möchtest 
musst du auch den Pin als INPUT definieren. Desweiteren musst du zum 
Auslesen des Pins auch digitalRead(PIN) nutzen. Ich empfehle erstmal ein 
grundlegendes Einlesen auf Arduino.cc dort findest du auch mehrere 
Beispiel.

Hier mal der Link zu den Reference, wo du alle Befehle findest.
https://www.arduino.cc/en/Reference/HomePage
Gast #4744860
Lesenswert?

Ich würde mal vermuten das Pin 4 der INPUT ist und auch als INPUT 
konfiguriert werden sollte. pinMode(4, INPUT) ?

if(4 == HIGH)   das wird wohl niemals TRUE sein wenn HIGH als 1 
definiert ist, vermutlich gibt es da so was wie digitalRead(4) welches 
HIGH oder LOW zurücklifert?
OP #4744903
Lesenswert?

Ich habe den Text jetzt etwas umgeschrieben, sodass ich den digitalRead 
mit benutzte.
Funktionieren tut es trotzdem nicht...


int taster = 4;
int led = 8;
int i = 0;


void setup()
{
   pinMode(8, OUTPUT);
   pinMode(4, INPUT);
}

void loop()
{
   digitalRead(4);

    if(12 == HIGH)
    {
       for (int i = 0; i < 5; i++);

       digitalWrite(8, HIGH);
       delay(500);
       digitalWrite(8, LOW);
       delay(500);
      }
}
(Firma: privat) #4744904
Lesenswert?

Wie immer und schon tausend mal beschrieben ist Delay böse da es den AVR
anhält. Mag bei einer LED nicht interessieren und wird aber in den 
Büchern immer wieder beschrieben und die Leute verwenden es.

Wenn Du schon dely benutzt ist das zweite überflüssig da Du nach LOW 
nochmal 500 mS bis zum nächsten LOW wartest.
OP #4744929
Lesenswert?

Sepp Huber schrieb:
> wie wäre es mit
> if (digitalRead(4) == HIGH)
> ?

Klingt besser als meins aber es klappt trotzdem nicht...

Arduinoquäler schrieb:
> Bianca R. schrieb:
>> Wenn ich das richtig verstanden habe
>
> Ich wiederhole nochmal:
>
> Arduinoquäler schrieb:
>> ... ersatzweise könntest du auch schreiben
>> if (1 == 10)
>
> Nix kapiert?

Warum genau (1 == 10)?
Also was bedeutet das genau in diesem Fall?
#4744932
Lesenswert?

Bianca R. schrieb:
> Wenn ich das richtig verstanden habe geb ich den PIN´s namen

Nein, Du legst eine Variable an und initialisierst sie.
Der Compiler erlaubt beides, eine Variable oder einen konstanten Wert 
als Argument für den Funktionsaufruf.

Bianca R. schrieb:
> Habe ich jetzt hier nicht gemacht

Das ist aber grob unhöflich, ungenutzten Füllcode zu erzeugen. Willst Du 
den Leser absichtlich verwirren?
#4744934
Lesenswert?

Bianca R. schrieb:
> Wie ich geschrieben habe,
> ich habe ein Verständnis Problem und ich frage hier um Hilfe um
> herauszufinden wo ich meinen Denkfehler habe.

das fing mit Taster auf (4) output an, aber das wurde ja nicht 
verstanden!

Etwas später kam dann INPUT

Bianca R. schrieb:
> digitalRead(4);

wird keiner Variablen zugewiesen und auch mit nichts verglichen!

normalerweise wäre es snnvoll den PIN abzufragen und mit high oder low 
zu vergleichen, aber einen Plan deiner Verschaltung fehlt ja auch, liegt 
der Taster an + oder an GND, high aktiv oder low aktiv?
Sind pullups oder pulldowns verschaltet?

http://www.elektronik-kompendium.de/public/schaerer/pullr.htm

Da fehlen noch Grundlagen und nicht nur im Programmieren!
Gast #4744946
Lesenswert?

Bilde dir doch mal ein Satz daraus:
1
if( 4 == 1) //High ist ja gleich 1
2

3
//Wenn 4 gleich 1 dann tue folgendes

Das wird aber nie eintreffen, weil 4 nicht gleich 1 werden kann. Du 
vergleichst da die Zahl mit der Zahl eins.

Nun aber:
1
if(inputRead[4] == 1)
2

3
//Wenn der gelesene Eingang gleich eins ist

Damit vergleichst du ob der Eingang auf eins (high) geschaltet ist... 
und somit wird es wahr (true) und geht in die Schleife sobald der 
Eingang gedrückt wurde.

Mal so ganz grob.
Gast #4744956
Lesenswert?

Bianca R. schrieb:
> Klingt besser als meins aber es klappt trotzdem nicht...
Wie ist der Taster angeschlossen, nach GND oder Plus?
Ist ein PullDown-Widerstand dran?
Kannst Du mit einem Multimeter prüfen, ob das Signal an (4) tatsächlich 
wechselt?

Werner P. schrieb:
> Es wäre auch schön bei so einfachen Sachen das Internet zu bemühen. Nach
> der Eingabe "Arduino Taster anschließen" kommt z.B.:
> http://coptermagazin.de/arduino-grundlagen-teil-10-taster-arduino-anschliessen/
Jou, da ist es sehr gut beschrieben, fertig zum Abmalen :-)
#4744969
Lesenswert?

Bianca R. schrieb:
> Arduinoquäler schrieb:
>> Oder auch
>> if (1 == 39731)
>
> Hmm. Wie kommt man auf die zahl 10 bzw. 39731?

Diese Beispiele sollen dir nur zeigen, dass es egal ist was du einsetzt. 
Egal welche Zahl du mit welcher vergleichst, es wird nie eintreten weil 
du eben zwei feste konstante Werte miteinander vergleichst. Du kannst 
von -unendlich bis 0 und von 2 bis unendlich jede Zahl nehmen, die if 
wird nie funktionieren bzw aufgerufen, da zwei unterschiedliche 
Konstanten verglichen werden.
Bei 1 == 1 würde die If-Schleife jedesmal funktionieren.

Bei einer If vergleicht man z.B. eine Konstate mit einer Variablen. Wie 
bereits von Draco als Text-Code erklärt.
Draco schrieb:
1
if(inputRead[4] == 1)
2
 
3
//Wenn der gelesene Eingang gleich eins ist
> Damit vergleichst du ob der Eingang auf eins (high) geschaltet ist...
> und somit wird es wahr (true) und geht in die Schleife sobald der
> Eingang gedrückt wurde.
>
> Mal so ganz grob.
Gast #4745069
Lesenswert?

Werner P. schrieb:
> Ich glaube ganz einfach dass diese Generation ne Arduino App benötigt.
> Weil ohne App geht da heute nix mehr ;-)

Na na na ....

Bis Frau, oder auch Mann, egal, ordentlich programmieren kann, gehen 
Jahre ins Land.

Und in der Arduino Welt schlagen nun mal Unmengen unbedarfte Anfänger 
ein.
Das ist so! Und wird sich auch erstmal nicht ändern.

Zwischen Arduino Anfänger und versiertem 
Schaltungsentwickler/Programmierer dürften ca 5 Jahre intensive Arbeit 
liegen.


Provokation:
Wer Arduino Anfänger wegen ihrer Unbedarftheit erniedrigt, schlägt auch 
kleine Kinder, wenn sie laufen lernen und das am ersten Tag noch nicht 
richtig klappt.
Gast #4745075
Lesenswert?

Hallo Bianca,

funcktioniert das "Button"-Beispiel bei Dir?:
1
const int buttonPin = 4;     // the number of the pushbutton pin
2
const int ledPin =  13;      // the number of the LED pin
3

4
int buttonState = 0;         // variable for reading the pushbutton status
5

6
void setup() {
7
  pinMode(ledPin, OUTPUT);
8

9
  pinMode(buttonPin, INPUT);
10
}
11

12
void loop() {
13
  buttonState = digitalRead(buttonPin);
14

15
  // check if the pushbutton is pressed.
16
  // if it is, the buttonState is HIGH:
17
  if (buttonState == HIGH) {
18
    // turn LED on:
19
    digitalWrite(ledPin, HIGH);
20
  } else {
21
    // turn LED off:
22
    digitalWrite(ledPin, LOW);
23
  }
24
}
Gast #4745088
Lesenswert?

Arduino F. schrieb:
> Provokation:
> Wer Arduino Anfänger wegen ihrer Unbedarftheit erniedrigt, schlägt auch
> kleine Kinder, wenn sie laufen lernen und das am ersten Tag noch nicht
> richtig klappt.

ok, ok.

Mich wundert einfach dass viele keine Ausdauer haben. Dieses Beispiel 
ist typisch.

Dabei braucht es nur ein paar Sucheingaben in Google und ich werde mit 
Arduino Beispielen erschlagen. Da ist alles dabei:

Was brauche ich um Taster anzuschließen. Wie frage ich Taster ab. Alles 
komplett und auch noch mit Video wenn es sein muss.

Entweder können viele heute nicht mehr suchen oder sie wollen einfach 
nicht. Ist ja einfacher in einem Forum zu fragen. Werden schon genügend 
da sein die mir Lösungen bringen.

Wenn ich mich mit was Neuem auseinandersetzen muss, dann suche ich mir 
die Informationen zusammen. Sei es im Internet oder durch Bücher. Und 
wenn ich damit nicht weiter komme dann kann ich ja jemanden fragen. Aber 
ich muss halt davon ausgehen dass derjenige von mir erwartet dass ich 
mich vorher ausgiebig informiert habe. Und den Respekt verdient er auch.

Was machen die später im Berufsleben? Den Chef per Email Fragen stellen 
und auf Lösungen warten?
#4745094
Lesenswert?

Werner P. schrieb:
> ok, ok.
>
> Mich wundert einfach dass viele keine Ausdauer haben. Dieses Beispiel
> ist typisch.

ich wollte ja nichts mehr schreiben, mich ärgert nur das beim Tippen 
kein verstehendes Lesen einsetzt:

Bianca R. schrieb:
> void setup()
> {
>   pinMode(8, OUTPUT);

LED ist klar

>   pinMode(4, OUTPUT);
>
> }

aber was soll ein Taster ausgeben?

Darf man nicht mal mehr anmerken das OUTPUT auf deutsch eine Bedeutung 
hat?
Dafür kassiert man -3 Bewertung, derdiedas TO gönne ich 10 + für 
effektive Aufgabenlösung ohne Eigeninitiative.
#4745127
Lesenswert?

Werner P. schrieb:
> Außerdem sollte man das Bewertungssystem
> abschaffen. Ich sehe nicht wozu das gut sein sollte.

ganz meine Meinung, ich habe auch schon nicht lesenswert kassiert bei 
Nennung von Lieferanten für spezielle Bauteile, so ist das 
Bewertungssystem doch NICHTS wert und das wird immer wieder hier 
angemerkt!

Klar verständlich das andere Wissende auch Lieferanten kennen, auch 
andere als ich nannte, aber deswegen negativ bewerten oder sagen wir 
nicht lesenswert?
Gast #4745136
Lesenswert?

Werner P. schrieb:
> Joachim B. schrieb:
>> Dafür kassiert man -3 Bewertung
>
> schon mies. Ich war es nicht. Außerdem sollte man das Bewertungssystem
> abschaffen. Ich sehe nicht wozu das gut sein sollte.

Fast alle Beiträge von "jar" sind doch die reine unkonstruktive 
Provokation. Schon die zweite Antwort hier zeigt das doch.
Man darf sich auch mal als "erfahrender" Forum-User und Programmierer 
die Frage stellen, ob man irgendwelche Provokationen posten muss oder ob 
man einfach gar nichts schreibt, wenn man die Art und Weise der 
Fragestellung unsinnig und beleidigend findet.
#4745154
Lesenswert?

eins schrieb:
> Fast alle Beiträge von "jar"

wie war mal ein Spruch, viel Feind viel Ehr? manche haben es echt nötig 
und so schön anonym, ich kann mir denken wer es war, einer der 
vermutlich ALLES weiss und immer Recht hat, äh haben will.

Wenn ich irre, eiere ich nicht rum und kann das eingestehen, schafft 
eben nicht jeder ;)

Na ja die meisten Moderatoren machen einen guten Job und löschen derlei 
Schmähpostings obwohl das eigentlich unnötig sein sollte.
Gast #4745164
Lesenswert?

Schön geblubbert aber von Selbstreflexion keine Spur. Kein Wunder das 
die negativen Bewertungen nicht nochvollzogen werden können.

Vielleicht mal selber fragen, ob man die Postings so auch im "echten" 
Leben gemacht hätte, wenn ein im programmieren unerfahrenes 
Kind/Jugendlicher die selbe Frage gestellt hätte. Wenn man soziel nicht 
ein totales Wrack ist, kommt man da zur Antwort "Nein" und daher kommen 
dann auch die negativen Bewertungen der anderen User.

Nur mal als Denkanstoß nicht anonymer Joachim B. aka jar  ;-)
#4745176
Lesenswert?

eins schrieb:
> Schön geblubbert aber von Selbstreflexion keine Spur.

oh doch manchmal reflektiere ich mich auch selber, nimm die Finger von 
der Tastatur, man kann mir auch eine Mail schicken, man kann 
Meinungsverschiedenheiten ausdiskutieren oder auch mal 5 gerade sein 
lassen oder eben den anderen nehmen wie er ist.

Nicht jeder ist jeden Tag gleich gut drauf, auch damit kann ich bei mir 
und anderen leben. Dann reicht man sich (hier virtuell) die Hände und 
gut ist.
Andere trinken ein virtuelles Bierchen zusammen und das passt das 
wieder.

Wer ständig aus der Deckung schiesst auch noch anonym nun ja, OHNE 
Kommentar mögen andere darüber urteilen.
Gast #4745229
Lesenswert?

@Bianca R.

Porbier das mal aus.

int taster = 4;
int led = 8;
int i = 0;
int SchalterZusatand;

void setup()
{
   pinMode(led, OUTPUT);
   pinMode(taster, INPUT);
}

void loop()
{
   i = digitalRead(taster);

    if(SchalterZusatand == 1)
    {
       for (i = 0; i < 5; i++);

       digitalWrite(led, HIGH);
       delay(500);
       digitalWrite(led, LOW);
       delay(500);
      }
}
Gast #4745241
Lesenswert?

Werner P. schrieb:
> Entweder können viele heute nicht mehr suchen oder sie wollen einfach
> nicht. Ist ja einfacher in einem Forum zu fragen. Werden schon genügend
> da sein die mir Lösungen bringen.

Statt das ein Schüler oder eine Schülerin den Lehrer fragt und ich
war eigentlich immer der Meinung, dass das ja sein bezahlte Funktion
ist, wird ein Verständnisproblem einfach in ein Forum ausgelagert.
Da wird erst gar nicht gegoogelt um nach Lösungen zu suchen.
Gibt ja genug Nerds, die glauben, genug Ahnung zu haben und sich mit
stolzer Brust hier selbstbeweihräuchern und dann einen auf dicke
Hose machen wenn man widerspricht.
Problem ist, dass hier alle anonym sind und was die fachlichen
Fähigkeiten angeht, oft nicht überzeugen können.
Hauptsache dabeisein ist alles.

Hier muss dem Admin auch mal der Vorwurf gemacht werden, diesen Zustand
sowohl herbeigeführt zu haben, als auch kein Interesse zu haben, dass
mal zu ändern, z.B. durch UserProfile.
Das hilft der TO zwar nicht, aber sie soll sich halt mit ihrem Problem
an den Lehrer wenden.
Gast #4745267
Lesenswert?

Klaus schrieb:
> Porbier das mal aus.

+++ BULLSHIT+++

1. Wie ist jetzt das mit der Variable "SchalterZusatand" (sic! Typo)
Warum wird digitalRead in die Variable "i" gelesen und dann aber 
(richtigerweise) in der Bedingung die Variable "SchalterZusatand" gegen 
HIGH verglichen?

2. Wo sind die geschweiften Klammern für die For Schlaufe?, was macht 
das Semikolon am Ende der For Definition?

3. Des weiteren verstehe ich nicht, wozu die ganzen Variablen mit 
Ausnahme von "i" überhaupt deklariert werden? Um RAM zu vergeuden. Das 
geht doch auch eleganter mit einem #DEFINE
Mir ist klar, dass das hier in diesem Beispiel keine Rolle spielt, mit 
der Zeit werden aber Projekte aufwändiger und da ist man auf einem 
kleinen Controller um jedes gesparte Bit im RAM oder Flash froh.
Gast #4745276
Lesenswert?

Cyborg schrieb:
> oft nicht überzeugen können.
Das geht mir auch so....
Alleine mein NickName reicht schon um keinen überzeugen zu können.
Und um mit Schmähungen überschüttet zu werden.

Damit keinem der Stoff ausgeht, stelle ich hier mal meine "Arduino" 
Version von Biancas Problem vor.
Die Lösung ist sicherlich nicht sonderlich Anfänger gerecht.
Aber doch stecken da einige Features drin.
1. kein delay(), ist also nicht blockierend
2. der Taster wird nur abgefragt, wenn nötig.
3. das Blinken erfolgt per endlichem Automaten
1
const byte taster            = 4;   // Taster zwischen Pin und GND
2
const byte led               = 13;  // Led zwischen Pin und GND
3
const unsigned long interval = 500; // ms
4
const byte zyklen            = 5;   // Anzahl Blinker
5

6
bool blinkAnforderung        = false; // Merker für Blink Anforderung
7

8
void blink() // Blink Task
9
{
10
  static unsigned long timestamp = 0;  // lokaler Zeitmerker
11
  static unsigned int  state     = 0;  // Wiedereintrittspunkt der FSM
12
  static byte          i         = 0;  // Wiederholungszaehler
13
  switch(state)
14
  {
15
    case 0 :  // Startpunkt
16
    while(!blinkAnforderung) return; // warte auf Blinkanforderung
17

18
    // Tastendruck wurde erkannt
19
    for(i=0;i<zyklen;i++)
20
    {
21
      // Hellphase
22
      timestamp = millis(); // Zeitpunkt merken
23
      digitalWrite(led, HIGH); // leuchte an
24
      state=__LINE__; return; case __LINE__:
25
      while(millis()-timestamp<interval) return;
26

27
      // Dunkelphase
28
      timestamp = millis(); // Zeitpunkt merken
29
      digitalWrite(led, LOW); // leuchte aus
30
      state=__LINE__; return; case __LINE__:
31
      while(millis()-timestamp<interval) return;
32
    } 
33
    
34
    // Endzustand, gehe wieder zu start
35
    blinkAnforderung = false ; // Anforderung konsumieren
36
    state = 0; // FSM auf Start setzen
37
  }  
38
}
39

40

41
void setup()
42
{
43
  pinMode(led, OUTPUT);
44
  pinMode(taster,INPUT_PULLUP);
45
}
46

47
void loop()
48
{
49
  blinkAnforderung = blinkAnforderung || !digitalRead(taster); // short circuit boolean expression evaluation
50
  blink();
51
}

So:
Und jetzt möge man mir den Kopf abreißen!
Gast #4745323
Lesenswert?

Guest schrieb:
> 1. Wie ist jetzt das mit der Variable "SchalterZusatand" (sic! Typo)
> Warum wird digitalRead in die Variable "i" gelesen und dann aber
> (richtigerweise) in der Bedingung die Variable "SchalterZusatand" gegen
> HIGH verglichen?

Hopsala da hat sich ein Fehler eingeschlichen du hast recht.

SchalterZusatand = digitalRead(taster); sollte es heißen.

So ist es jetzt hoffentlich besser.

int taster = 4;
int led = 8;
int i = 0;
int SchalterZusatand;

void setup()
{
   pinMode(led, OUTPUT);
   pinMode(taster, INPUT);
}

void loop()
{
   SchalterZusatand = digitalRead(taster);

    SchalterZusatand = digitalRead(taster);
    {
       for (int i = 0; i < 5; i++)
       {

         digitalWrite(led, HIGH);
         delay(500);
         digitalWrite(led, LOW);
         delay(500);
       }
      }
}

Guest schrieb:
> 3. Des weiteren verstehe ich nicht, wozu die ganzen Variablen mit
> Ausnahme von "i" überhaupt deklariert werden? Um RAM zu vergeuden. Das
> geht doch auch eleganter mit einem #DEFINE
> Mir ist klar, dass das hier in diesem Beispiel keine Rolle spielt, mit
> der Zeit werden aber Projekte aufwändiger und da ist man auf einem
> kleinen Controller um jedes gesparte Bit im RAM oder Flash froh.

Denke daran jeder hat mal klein Angefangen!
Nicht jeder ist so ein Profi wie du?
Von dir kam bis jetzt nur gemotze aber keine hilfe.
Gast #4745326
Lesenswert?

Korrektur *seufz
void loop()
{
   SchalterZusatand = digitalRead(taster);

    if ( SchalterZusatand == 1)
    {
       for (int i = 0; i < 5; i++)
       {

         digitalWrite(led, HIGH);
         delay(500);
         digitalWrite(led, LOW);
         delay(500);
       }
      }
}
#4745333
Lesenswert?

Arduino F. schrieb:
> Damit keinem der Stoff ausgeht, stelle ich hier mal meine "Arduino"
> Version von Biancas Problem vor.

Heiliger Strohsack. Das wird Bianca doch absolut nicht nachvollziehen 
können!

Ausserdem, was soll dieser Unfug:

>     while(!blinkAnforderung) return; // warte auf Blinkanforderung

Eine while wo du nur direkt wieder rausspringst??

und diese:
>       state=__LINE__; return; case __LINE__:
...
>   blinkAnforderung = blinkAnforderung || !digitalRead(taster);
>    // short circuit boolean expression evaluation

Ist das hier ein IOCCC Einrtag? (http://www.ioccc.org/)

Lesbar geht so:
1
// pin definitions
2
#define LED    8
3
#define BUTTON 4
4

5
#define BLINKCOUNT 5
6

7
/* LED must blink with 2Hz, so 2x on and 2x off in one second
8
   --> each phase is 250 msec */
9
#define BLINKDELAY 250
10

11
void setup()
12
{
13
  pinMode(LED, OUTPUT);
14
  pinMode(BUTTON,INPUT_PULLUP);
15
}
16

17
loop()
18
{
19
  // button pushed?
20
  if(digitalRead(BUTTON) == HIGH)
21
  { 
22
    // ...then blink
23
    for(int i=0; i < BLINKCOUNT; i++)
24
    {
25
      digitalWrite(LED, HIGH);
26
      delay(BLINKDELAY);
27

28
      digitalWrite(LED, LOW);
29
      delay(BLINKDELAY);
30
    }
31
  }
32
}
Gast #4745334
Lesenswert?

Markus F. schrieb:
> Du solltest ein Buch über Joberhaltungs-Strategien schreiben.

Hmmm ...
(werde ich drüber nachdenken....)

Die kompakte (Macro getriebene) Form möchte ich euch nicht vor 
enthalten:
1
Task blink() 
2
{
3
  static byte i = 0;  // Wiederholungszaehler
4
  taskBegin();
5
  while(1)
6
  {
7
    taskWaitFor(blinkAnforderung);
8
    for(i=0;i<zyklen;i++)
9
    {
10
      digitalWrite(led, HIGH); // leuchte an
11
      taskPause(interval);
12
      digitalWrite(led, LOW); // leuchte aus
13
      taskPause(interval);
14
    }
15
    blinkAnforderung = false ; // Anforderung konsumieren
16
  }
17
  taskEnd();
18
}
Und das ist doch schon etwas übersichtlicher...
(sieht zumindest von weitem so aus)
Gast #4745419
Lesenswert?

Eric B. schrieb:
> Ausserdem, was soll dieser Unfug:
>
>>     while(!blinkAnforderung) return; // warte auf Blinkanforderung
1
while  == solange, während
2
!      == not, kein, nicht
3
return == gehe raus, verschwinde, zurück


> while(!blinkAnforderung) return;
Solange keine Blinkanforderung, verschwinde von hier!
#4745429
Lesenswert?

Ein "if" wäre hier wohl lesbarer.

Was allerdings wirklich unschön ist (und ich bin mir auch nicht sicher, 
wie das überhaupt funktionieren soll):

die beiden
"case __LINE__:"

sind im case 0, und auch noch in der Schleife eingebettet.
Das kann eigentlich nicht funktionieren. Zumindest macht es keinen Sinn.
#4745508
Lesenswert?

Die Idee von Fanboy mit der Statemachine ist ja nicht schlecht, und
trotz der kleinen Pampigkeitsanflüge möchte ich ihm nicht vorenthalten,
wie eine solche Statemachine üblicherweise aussieht.
Ganz ohne eklige Makros und lesbar.
Ach, und ich habe mir erlaubt einen weiteren State hinzuzufügen, der
dafür sorgt, dass die Taste erstmal losgelassen werden muss, bevor es
wieder anfängt zu blinken.
Angehängte Dateien:
#4745523
Lesenswert?

chris_ schrieb:
> Ein Blink-Programm ist wie Autofahren: jeder kann mitreden.
>

Sogar die Rollstuhlfahrer.

> Das Blink without delay gibt es schon in den Beispielen:
> https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Das ist ja toll.
Dann muss man ja nur noch dazu programmieren, dass der Tastendruck 
ausgewertet wird, und dass es jeweils nur 5x blinkt.
Fällt dir was auf?
Gast #4745712
Lesenswert?

Hinweis: Echauffiert Euch nicht mehr so sehr, die TO hat um 13:08 Uhr 
aufgegeben. Seid stolz auf Euch, super Leistung der Galerie der 
schönsten Selbstdarsteller. Druckt Euch den Thread aus und hängt ihn im 
verchromten Rahmen über die Chaiselongue.
#4746048
Lesenswert?

Arduino F. schrieb:
> Eric B. schrieb:
>> Lesbar geht so:
> Dein Blinken ist blockierend.
> No, das ist nicht schön.....

Und wem juckt das? Der uC hat in diesem Fall eh nix anderes zu tun und 
der Code ist für einen Anfänger komplett nachvollziehbar. Darum geht's.
Wenn die Aufgabe "Blink 5x wenn Taster gedrückt" Teil wäre von einem 
größeren Projekt, worin zB auch noch ein Display angesteuert werden 
soll, ADCs ausgelesen usw, dannn muss die Sache anders angegangen 
werden; das ist klar.
Aber einem Anfänger soll man dein Code nicht antun.
#4746093
Lesenswert?

Bianca R. schrieb:
> Es funktioniert.
> Ich hatte einen echt dummen Verdrahtungsfehler beim Taster....

Ja, jetzt... sieht man auf dem Breadboard Aufbau :-D Du hast ihn mit 
Pullup auf High gelegt und hast ihn auf High schalten lassen. Mit jeden 
Tastendruck hast du das gesamte System kurzgeschlossen.

Eric B. schrieb:
> // pin definitions
> #define LED    8
> #define BUTTON 4
>
> #define BLINKCOUNT 5
>
> /* LED must blink with 2Hz, so 2x on and 2x off in one second
>    --> each phase is 250 msec */
> #define BLINKDELAY 250
>
> void setup()
> {
>   pinMode(LED, OUTPUT);
>   pinMode(BUTTON,INPUT_PULLUP);
> }
>
> loop()
> {
>   // button pushed?
>   if(digitalRead(BUTTON) == HIGH)
>   {
>     // ...then blink
>     for(int i=0; i < BLINKCOUNT; i++)
>     {
>       digitalWrite(LED, HIGH);
>       delay(BLINKDELAY);
>
>       digitalWrite(LED, LOW);
>       delay(BLINKDELAY);
>     }
>   }
> }

Der Code funktioniert und ist gut lesbar, die delays sind nicht schön 
und könnten den - sollte das Programm mal erweitert werden - Ablauf sehr 
stören, da diese den Prozessor quasi während des Delay "gefangen" 
halten. Für dein angestrebtes Ziel aber völlig ausreichend.
OP #4746103
Lesenswert?

Rene K. schrieb:
> Der Code funktioniert und ist gut lesbar, die delays sind nicht schön
> und könnten den - sollte das Programm mal erweitert werden - Ablauf sehr
> stören, da diese den Prozessor quasi während des Delay "gefangen"
> halten. Für dein angestrebtes Ziel aber völlig ausreichend.

Wie man das delay umschreibt, das habe ich noch nicht verstanden.
Da informieren ich mich nochmal ausgiebig drüber.
Gast #4746136
Lesenswert?

>Wie man das delay umschreibt, das habe ich noch nicht verstanden.
>Da informieren ich mich nochmal ausgiebig drüber.

Da ist hier das richtige Beispiel:
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Vielleicht kann man die Funktion vereinfacht so beschreiben: Man nutzt 
quasi die eingebaute Arduino Uhr mit der Funktion

int zeit;

zeit = millis();

und schaut dann in einer Schleife immer wieder auf die Uhr. Wenn eine 
bestimmte Zeit abgelaufen ist, schaltet man dann die Leuchtdiode.
Man kann dann auch gucken, ob ein Schalter gedrückt ist.
Gast #4746212
Lesenswert?

Peter D. schrieb:
> Joe F. schrieb:
>> Arduino F. schrieb:
>>> state=__LINE__; return; case __LINE__:
>>
>> Schöner kann man C nicht vergewaltigen.
>
> Stimmt.
> Sowas macht einfach kein Programmierer, der seinen Beruf ernst nimmt.
> Als Programmierer sollte man immer so schreiben, daß auch ein anderer
> der Code weiter pflegen kann.

No!
Einspruch!
Das halte ich für ein zu schnelles und zu vernichtendes Urteil.


1.
Hast du evtl. die besser lesbare Version, aber inhaltlich identische 
Version über sehen?

2.
Tausende ernstzunehmende Programmierer machen das genau so!
(wissen es nur oft nicht)
Das hier von mir präsentierte Verfahren ist das, was auch bei den 
Protothreads verwendet wird. Fast gleich. Zumindest sehr sehr ähnlich.
Siehe: http://dunkels.com/adam/pt/index.html


Also, deine Aussage, frei übertragen:
Jeder, welcher die Protothreads nutzt, ist kein ernst zu nehmender 
Programmierer.
Wenn das dann ernst gemeint ist, dann reihe ich mich gerne bei den 
Stümpern und Pfuschern ein. Denn ich verwende dieses schon seit vielen 
vielen Jahren. Habe es allerdings erst kürzlich von "Goto" getrieben, 
auf "switch-case" getrieben umgebaut. Und aufs Arduino Umfeld angepasst.

Einfacher, Uebersichtlicher  und schlanker bekommt man kooperatives 
Multitasking und Ablaufsteuerungen nicht auf einen AVR gebrannt.
Im Anhang, eine nutzbare, für den Arduino angepasste Version. Ein paar 
Beispiele sind auch im Paket.


Danke für deine Aufmerksamkeit.
Angehängte Dateien:
Gast #4746289
Lesenswert?

Ich halte Programmierer, welche von sich behaupten "Ich habe noch nie 
eine von anderen geschriebene Lib in meine Projekte übernommen." für 
unglaubwürdig. Und wenn glaubwürdig, dann sind sie wohl nicht sehr 
produktiv in ihrer Arbeit.

Ein paar solche Einzelkämpfer mag es geben.....

Der übliche Weg ist wohl:
Man verwendet fertige Bausteine, so weit wie möglich. Der Rest wird dann 
selber geschrieben.
Und das ist völlig unabhängig von Sprache, oder zu dem Grunde liegendem 
System.
Gast #4746332
Lesenswert?

Arduino F. schrieb:
> Einfacher, Uebersichtlicher  und schlanker bekommt man kooperatives
> Multitasking und Ablaufsteuerungen nicht auf einen AVR gebrannt.
> Im Anhang, eine nutzbare, für den Arduino angepasste Version. Ein paar
> Beispiele sind auch im Paket.

(Wir kapern Biancas Threat…Übrigends Lob an Bianca, dass sie sich von 
uns Klugscheissern nicht abschrecken lässt!)

Dunkels Code ist natürlich witzig, aber das Problem mit solchen Dingen 
ist das Kleingedruckte!
* Bei Anwendung der Makros kann eine weitere "switch" Anweisungen in der 
Funktion nicht mehr genutzt werden!
* Ein versehentliches '}' zerlegt die komplette Struktur, da die Makros 
in sich die Klammerungen nicht abschliessen. Sowas kann bei der 
Fehlersuche sehr lustig werden. (und verstößt gegen diverse 
Codierstandards, z.B. MISRA)
* Multitasking ist es nur für verschiedene Funktionen. Ich kann keine 
zwei Tasks auf Basis der gleichen Funktion starten.

>Tausende ernstzunehmende Programmierer machen das genau so!
>(wissen es nur oft nicht)
Du sagst es… haben sie das Kleingedruckte gelesen?

Jeder Code hat Vor- und Nachteile. Er ist durchaus sehr lesbar, aber die 
versteckten Nachteile sind mir persönlich zu gefährlich.  Aber um aus 
einem AVR das letzte zu holen…
#4746394
Lesenswert?

Arduino F. schrieb:
> Tausende ernstzunehmende Programmierer machen das genau so!

Dann zeig mir bitte mal einen Link, wo "case __LINE__:" noch benutzt 
wird.
Bisher hat sich jeder Programmierer scheckig gelacht, dem ich das 
gezeigt hab.
Selbst ein case innerhalb einer weiteren Kontrollstruktur unterhalb des 
zugehörenden switch ist schon arg grenzwertig.
Die meisten Programmierer verwenden switch/case/break so wie es sich 
gehört. Und das tun sie aus Erfahrung heraus.

C erlaubt viele Syntax-Schweinereien, die man besser nicht nachmachen 
sollte.
#4746475
Lesenswert?

@Arduino F.

Ich hab mir Dein TaskMacro.zip mal angesehen. Ganz verstanden hab ich es 
nicht, aber ungefähr ne Ahnung, was es machen soll.
Ich glaub nicht, daß es ernsthaft in professionellen Projekten Anwendung 
finden könnte. Dazu haben die Macros zuviele Seiteneffekte.
Für Anfänger würde ich es auch nicht empfehlen. Man versaut sich damit 
nur den Programmierstil, wenn die Projekte mal größer werden sollen.
Für den IOCCC ist es aber wunderbar geeignet. Und zum Schmunzeln, was 
man mit dem Präprozessor so alles machen kann.
Gast #4746545
Lesenswert?

Danke für die "Durchsicht".

Peter D. schrieb:
> Und zum Schmunzeln, was
> man mit dem Präprozessor so alles machen kann.
Dann habe ich ja eins der Ziele erreicht!
Programmieren, muss auch etwas Spaß machen....

Und das Zweite vielleicht auch:
Arduino Leute werden hier gerne runter gemacht, weil sie alle keine 
Ahnung von ihrer Programmierumgebung haben. Vielleicht ist das Vorurteil 
jetzt etwas aufgeweicht.

Peter D. schrieb:
> Ich glaub nicht, daß es ernsthaft in professionellen Projekten Anwendung
> finden könnte. Dazu haben die Macros zuviele Seiteneffekte.
Ja, mit meinem Kram, werde ich nicht die Welt erobern. Das haben die 
Protothreads schon genug getan. Und die haben genau die gleichen 
Probleme mit Seiteneffekten.
Die Seiteneffekte lassen sich, mit ein wenig Disziplin, vermeiden.

Die nächste Stufe ist dann sowas wie RTOS. Das vermeidet die Probleme, 
ist aber auch erheblich Speicherhungriger, da für jede Task ein Stack 
bereit gestellt werden muss.

Peter D. schrieb:
> Für Anfänger würde ich es auch nicht empfehlen.
Ja, zumindest wenn es ans Debuggen geht, wirds problematisch. Das geht 
nicht ohne die Macros verstanden zu haben.

Peter D. schrieb:
> Man versaut sich damit
> nur den Programmierstil, wenn die Projekte mal größer werden sollen.
Da bin ich wiederum nicht so sicher.
Denn der Stil, wie ein solcher Task geschrieben wird, hat schon etwas 
Ähnlichkeit mit den Verfahren bei echten Multitasking Systemen.

Peter D. schrieb:
> Für den IOCCC ist es aber wunderbar geeignet.
;-)
Insbesondere der Output, wenn der Präprozessor damit durch ist. Das 
sieht dann doch schon etwas komisch aus.

Der erzeugte Assembler Code ist dagegen schon eher gut lesbar und recht 
kompakt.
Gast #4746793
Lesenswert?

Rene K. schrieb:
> Bianca R. schrieb:
>> Es funktioniert.
>> Ich hatte einen echt dummen Verdrahtungsfehler beim Taster....
> Ja, jetzt... sieht man auf dem Breadboard Aufbau :-D Du hast ihn mit
> Pullup auf High gelegt und hast ihn auf High schalten lassen.
Die Frage nach Anschluss des Tasters / Pegel messen hatte ich gestellt, 
wurde scheinbar ignoriert.

Diese Fotos von Steckbrettern (auch in div. Arduino-Foren) verursachen 
bei mir immer Kackreiz und Fluchtreflexe! Ich will einen klassischen 
Stromlauf sehen, diese Spielebretter kenne ich nicht und habe sie in 
meinem (gewerblichen) Umfeld noch nie gesehen.

Markus schrieb:
> Vielleicht kann man die Funktion vereinfacht so beschreiben: Man nutzt
> quasi die eingebaute Arduino Uhr mit der Funktion
> int zeit;
> zeit = millis();
> und schaut dann in einer Schleife immer wieder auf die Uhr.
Und nach 32s (37268ms) stellte meine Regelung ihre Funktion ein bzw. 
machte dummes Zeug. Variablen wurden erschaffen, um programmierende 
Bastler zu ärgern :-)

Arduino F. schrieb:
> Der übliche Weg ist wohl:
> Man verwendet fertige Bausteine, so weit wie möglich. Der Rest wird dann
> selber geschrieben.
Und erzählt anschließend "Den Fehler kann ich nicht beheben, weil er in 
der Library xxx enthalten ist" - Softwerker im realen Leben :-(
#4747602
Lesenswert?

Arduino F. schrieb:
> Insbesondere der Output, wenn der Präprozessor damit durch ist. Das
> sieht dann doch schon etwas komisch aus.

Ja, die Reaktionen hast Du ja gesehen. Wenn man nicht weiß, daß Macros 
dahinter stecken, denkt man wirklich, was hat der denn geraucht.

Vielleicht könnte man anstelle des __LOOP__ den Programmcounter in eine 
Variable laden. Dann könnte man das switch weglassen und müßte das 
Sprungziel nicht erst berechnen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren