Nächster schritt wird ignoriert!

Nächster schritt wird ignoriert!!

Hallo zusammen,
Ich habe hier ein Problem wo ich nicht weiter komme.
Als erstes muß ich sagen das ich soweit wie möglich alleine versuche klar zu
kommen. Ich will nicht irgend etwas nachbauen und den Inhalt des Sketches nicht
verstehen das hilft mir nicht weiter. Desshalb bitte nicht über den gesamten
Sketch Diskutieren sonder nur dieses eine Problem lösen. Und ganz wichtig
erklären warum das so ist. Da ich noch nicht verstanden habe ob es sich bei den
eigenen void Punkten um Routinen, Funktionen oder Methoden handelt, endschuldigt
bitte meine vieleicht falschen Bezeichnungen, ich bleibe bei Methoden.

Der LEDstreifen WS2812b 50 LED's ist nicht angeschlossen, das passiert erst wenn
alle anderen sachen geklärt sind und Funktionieren.

Das Problem begint in void loop, die Methode Halt(1) wird ausgeführt und macht
das was sie soll. Die Methode loss dagegen wird ignoriert und nicht ausgeführt.
Warum??

Erklärung und Hintergrund zu Halt(1) etc.

Es kommt vor das der Sketch nicht das macht was er soll und dann nutze
ich Halt(1). Ich stelle mit Halt(1) fest ob alle Methoden angesprochen werden
und auch alle Schleifen so laufen wie sie sollen.
in der Methode Halt stehen zwei feste Worte [Halt] und [Taste]. Zu Halt kommt
die Ziffer die in der Klammer beim Aufrufen steht, um fest zu stellen wo der
Halt gewesen ist. Jetzt wird sich der eine oder andere fragen warum nutzt er
nicht delay(). Ganz einfach delay() läuft weiter wenn ich z.B. durch ein
Telefonanruf o.ä. gestört werde, das passiert bei Halt() nicht.

Material

Arduino UNO
Display 2004A i2c 5V
Taster mit LED 5V
je 1x 470ohm und 220ohm Widerstände
LED Streifen WS2812b 50LED's ( nicht angeschlossen)

Aufbau

Display
GND= Arduino GND
VCC= Arduino 5V
SDA= A4
SCL= A5

Taster
Ta = D7 zu 470ohm dann zu GND
Ta = 5V +
LED Ta = 220ohm dann zu D11
LED Ta = GND

nicht angeschlossen Pin D9 für LED Streifen (Über ein Widerstand 470ohm zu Data in)

Der LED Streifen wird nachher mit 5V aus einem Netzteil
5V 20A Testweise betrieben.
Da mit sich der Strom (A) gleichmässig verteilt wird
5V + - etwa in der mitte des LED Streifen angeschlossen.

Der Sketch besteht aus zwei Tab's (Teile)

// Tab1

#include <Adafruit_NeoPixel.h>

#define PIN 9         // Pin für LED Streifen (Data in)
#define NUMPIXELS 50 // Anzahl der Pixel in der LED Kette
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);       
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // i2c Anschluß [ GND= Minus/ VCC= Plus5V/ SDA= D4/ SCL= D5]

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //Aktiv


int pause=1000;    // Hier wird die angegeben wie lang die Pause zwischen den einzelnen Schritten sein soll.
byte neu1=0;
byte neu2=2;
byte alt1=0;
byte alt2=0;
byte H=3;         
byte f1=0; // F1-f4 liegt zwischen 0 und 9 dies ist die Helligkeit der LED's. Je nach dem wo f1-f3 steht leuchtet  
byte f2=8; // die LED in der entsprechenden Farbe. F4 ist für den Fall das f1-f3 Null sind. Da bei Null keine LED
byte f3=0; // leuchtet ist das nicht gewollt daher wird f4 auf einen Wert festgelegt. Der Zufall endscheidet ob
byte f4=0; // dieser an Wert an 1. 2. oder 3. Stelle eingetragen wird. Näheres zu diesem Thema steht in der Beschreibung.

void setup() 
{
 pinMode(11, OUTPUT);  // LED Taster
 pinMode(7,INPUT);     //pin für Taster den anderen Pol mit + Verbinden. Und einen Widerstand 1K - 10K zwischen Pin5 und GND als PulldownWiderstand.
 lcd.begin(20,4); // initialisieren des Displays mit 20 Zeichen und 4 Zeilen
 /*
 pixels.begin();
 pixels.clear(); // Für den fall das anfangs LED's leuchten werden sie vorbereitet zum löschen.
 pixels.show();  // LED's werden gelöscht.

 pixels.setPixelColor(neu1, pixels.Color(f1,f2,f3)); 
 pixels.setPixelColor(neu2, pixels.Color(f1,f3,f2)); 
 delay (pause);
 */
}



void loop()
{
 Halt(1);
 loss;
} 

// End Tab1

// Tab2

void loss() // Springt nicht zu loss
{
 Halt(2);
 farbe;
 Halt(4);
 if (neu2 > 1 and neu2 < 50)// alt muß noch eingebaut werden!
 {
  alt2= neu2;
  neu2=neu2 + 1;
  if (neu1 < 50) // Da neu1 später 50 wird als neu2, wird er erst jetzt abgefragt.
  {
   alt1= neu1;
   neu1=neu1 + 1;
  }
  else
  {
   alt1= neu1;
   neu1=0;
  }
 }
 else  // der 2. wert ist 50 oder liegt zwischen 0 u. 1
 {
  if (neu2 = 50)
  {
   alt1= neu1;
   alt2= neu2;
   neu1=neu1 + 1;
   neu2=0;
  }
   else
   {
    alt1= neu1;
    alt2= neu2;
    neu1=neu1 + 1;
    neu2=neu2 + 1;
   }
 }

 pixels.setPixelColor(neu1, pixels.Color(f1,f2,f3)); // Bereitet neue Pixel vor
 pixels.setPixelColor(neu2, pixels.Color(f1,f3,f2)); // Mit f1-f3 werden die Farben durch Zufall gesetzt, siehe (void farbe).
 pixels.setPixelColor(alt1, pixels.Color(0,0,0));    // Bereitet alte Pixel zum löschen vor.
 pixels.setPixelColor(alt2, pixels.Color(0,0,0));    // Bereitet alte Pixel zum löschen vor.
 pixels.show();                                      // Alle vorbereitete Pixel werden gesetzt bzw. gelöscht.
 delay (pause);
}


void Halt(byte T) // Halt ist eine Pause die nur durch drücken der entsprechenden Taste beendet wird. Der Wert von T ist 0-255
{                
  lcd.clear();
  lcd.setCursor (0,1); // Wenn ein Fehler im Programmablauf auftritt kann man mit Halt Prüfen wo das Programm falsch abbiegt.
  lcd.print ("Halt "); //void Taste() Die Variable soll die Ziffer der Haltestelle sein damit man weis wo der Halt hin gehört.
  lcd.print (T);
  lcd.setCursor (0,2);
  lcd.print ("Taste");
  digitalWrite(11, HIGH);
 while( digitalRead(7) == LOW ) // Hier geht es erst raus wenn die Taste am Pin 7 gedrückt wurde.
 {
 }
 digitalWrite(11, LOW);
}


void farbe()
{
 Halt(3);
 f1 = random(0,9); // Durch zufall wird hier die Farbe und Helligkeit ermittelt
 f2 = random(0,9);
 f3 = random(0,9);
 lcd.setCursor (0,0); 
 lcd.print("1. Haltemarke"); // Danach Tastendruck zum abwarten einfügen, so das die Haltemarken gesehen werden.

 
if (f1 == 0 && f2 == 0 && f3 == 0) // Für den Fall das f1 - f3 null ist
{
 f4 = random(1,3); //zufall 1-3 und die auf der stelle mit variable 4 belegen
 if (f4 >1)
 {
  if (f4 < 3)
  {
   f2 = 4;
  }
   else
   {
    f3 = 4;
   }
 }
 else
 {
  f1 = 4;
 }
}
}



void setzen()
{
 pixels.setPixelColor(alt1, pixels.Color(0,0,H));
 pixels.setPixelColor(alt2, pixels.Color(0,0,H));
 pixels.setPixelColor(neu1, pixels.Color(0,0,H));
 pixels.setPixelColor(neu2, pixels.Color(0,0,H));

 pixels.show();
}

End Tab2

Hello

You forgot parenthesis, necessary to call the function

void loop()
{
 Halt(1);
 loss(); // <- here
} 

void loss() // Springt nicht zu loss
{
 Halt(2);
 farbe(); // <- here too
...

This is English forum, so write in English or post in German forum because not everyone understand German :wink:

It has been moved to the German section.

@pittiplatsch
zusätzlich hast du da noch einen Fehler

C:\Daten\myrepository\Arduino\forum\sketch_aug14a\sketch_aug14a.ino:75:14: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if (neu2 = 50)
         ~~~~~^~~~

das soll vermutlich

if (neu2 == 50) heißen.

= ist nicht gleich == !(!!!)

dreh dir in deinen Settings die Compiler Warnings auf, dann weist dich der Compiler schon darauf hin.

1 Like

Ah ja naj aber da werden noch einige Fehler sein.
Auf jeden fall ist das Thema erst ein mal erledigt.
guix hat das Problem gelöst. (Die Klammern hinter Loss fehlten).
Das ist halt so man steht im Wald und findet die Bäume nicht.

Thema closed

Thank you that was the error.

Topic closed

1 Like

Das was Du geschrieben hast, sind einfache Funktionen ( ohne Rückgabewert, deshalb 'void' ). Methoden gibt es im Zusammenhang mit Klassen. Den Unterschied erkennt man z.B beim Aufruf an dem vorangestellten Objektnamen:

Halt(1); //hier wird eine einfache Funktion aufgerufen
Serial.print("Test"); // die  Methode 'print' des Objektes 'Serial' wird aufgerufen.

Hallo MicroBahner,
Danke für die einfache erklärung, leider habe ich die Frage im Eng. Forum
gestellt und nicht ins DE Forum. Mal sehen ob ich den dreh beim nächsten
mal raus find.

pittiplatsch