Switch Case hängt sich nach ca 60 Sekunden auf

Hallo alle zusammen.

Ich habe ein kleines Problem mit meinem Sketch.
Im Groben handelt es sich um ein Trainingsspiel für meinen Sohn. Es befinden sich 9 LED verteilt unter einer Kunststoffplatte,wobei eine LED "zufällig" über ein Random eingeschaltet wird und so lange leuchtet bis der zugehörige Hallsensor schaltet.Dann wird eine neues Random ausgelöst.

Das funktioniert auch alles wunderbar,nur hängt sich der Sketch nach ca 60 Sekunden auf und ich komme einfach nicht darauf warum. Es ist auch nicht abhängig davon wie oft ein Hallsensor ausgelöst wird.

Wird vermutlich einfach ein dummer Anfängerfehler von mir sein.

Plattform ist ein Mega 2560.Der Sketch ist noch im Aufbau,es sollen später noch ein Counter und Zeitanzeige dazu kommen. ( Wenn denn der blöde Fehler mal behoben ist )

Wäre echt super wenn ihr mir helfen könntet in meiner Unwissenheit ;-D

Gruß Oliver

deekertest1.ino (3.18 KB)

Setze deinen Sketch bitte in Code-Tags, verwende dazu die Schaltfläche </> oben links im Editorfenster.

Dann können alle, auch mobile User den Sketch lesen.

Das switch/case ist sowieso zum größten Teil überflüssig. Eigentlich verwendet man Arrays gerade weil man damit nicht ständig Code wiederholen muss. Das lässt sich stark vereinfachen

drück mal STRG-T in deiner IDE dann wirst du Sachen sehen die so nicht funkionieren werden wie du eigentlich willst.

Dann zu:

int  start = millis();

das wird so nicht klappen.

millis() ist uint32_t ... das must du für dein start auch nehmen. Sonst produzierst dir nach 32TSD Millisekunden einen Überlauf. Schon sehr verdächtig wenn du einen Fehler nach etwa einer Minute suchst oder?
Generell: alle Variablen prüfen ob sie die richtige Größe haben.
Und wie schon angesprochen, Case 0 ... 8 zusammenführen.
Noch ein Tipp: mach dir Debug Ausgaben auf die Serielle Schnittstelle damit du siehst, wo dein Arduino aktuell drinnen hängt.

Danke für die schnelle Hilfe.

Start Millis in Case 9 war schuld. Gelöscht und schon läuft der Hobel :grin: .

Sorry wenn der ganze Skecht noch recht umständlich und voller primitiver Dinge ist.Ich bin noch ganz am Anfang was Arduino betrifft und schon stolz das es jetzt funktioniert. :wink:

Und das mit dem Sketch ins Forum richtig hochladen bekomme ich hoffentlich auch noch hin . :slight_smile:

Gruß Oliver

Oliver77:
Start Millis in Case 9 war schuld. Gelöscht und schon läuft der Hobel :grin: .

Du müsstest nur den richtigen Datentyp verwenden. Wobei Löschen hier das Beste ist, da das sowieso eine komische Lösung ist für was auch immer das Problem ist

Oliver77:
Und das mit dem Sketch ins Forum richtig hochladen bekomme ich hoffentlich auch noch hin . :slight_smile:

Und warum versuchst du es nicht ?
Da kann man nur draus lernen.

int sensorValue ;
byte LED_PINS [] = {4, 5, 6, 7, 8, 9, 10, 11, 12};       // LED Ausgang
byte SENSOR_OUT [] = {22, 24, 26, 28, 30, 32, 34, 36, 38}; // Hallsensor Eingänge



int randNumber;                                          // Zufallszahl zum einschalten der LED

int i;
int x;
int y;
int state = 9;                                           // Case in dem die Zufallszahl erzeugt wird
void setup() {
  Serial.begin(115200);
  randomSeed(analogRead(A0));                            // Quelle für die Zufallszahl
  for (int i = 0; i < sizeof (LED_PINS) ; i++ )
    for (int x = 0; x < sizeof (SENSOR_OUT); x++)
      pinMode (LED_PINS[i], OUTPUT);
  pinMode (SENSOR_OUT[x], INPUT);
  digitalWrite(LED_PINS[i], HIGH);
}

void loop() {


  test();




}
void test() {

  Statemaschine();

}

void Statemaschine()
{

  if (state < 0)
    state = 0;
  if (state > 9)
    state = 9;
  for (int i = 0; i < sizeof (LED_PINS) ; i++ )
    digitalWrite(LED_PINS[i], HIGH);

  switch (state)
  {
    case 0:

      digitalWrite ( LED_PINS[0], LOW);

      digitalRead (SENSOR_OUT[0]);
      sensorValue = digitalRead (SENSOR_OUT[0]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[0], HIGH);

        state = 9;
        delay(50);
      }
      break;

    case 1:

      digitalWrite ( LED_PINS[1], LOW);
      digitalRead (SENSOR_OUT[1]);
      sensorValue = digitalRead (SENSOR_OUT[1]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[1], HIGH);

        state = 9;
        delay (50);
      }
      break;

    case 2:

      digitalWrite ( LED_PINS[2], LOW);
      digitalRead (SENSOR_OUT[2]);
      sensorValue = digitalRead (SENSOR_OUT[2]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[2], HIGH);
        state = 9;
        delay (50);
      }
      break;

    case 3:

      digitalWrite ( LED_PINS[3], LOW);
      digitalRead (SENSOR_OUT[3]);
      sensorValue = digitalRead (SENSOR_OUT[3]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[3], HIGH);
        state = 9;
        delay(50);
      }
      break;

    case 4:

      digitalWrite ( LED_PINS[4], LOW);
      digitalRead (SENSOR_OUT[4]);
      sensorValue = digitalRead (SENSOR_OUT[4]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[4], HIGH);
        state = 9;
        delay(50);
      }
      break;

    case 5:

      digitalWrite ( LED_PINS[5], LOW);
      digitalRead (SENSOR_OUT[5]);
      sensorValue = digitalRead (SENSOR_OUT[5]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[5], HIGH);
        state = 9;
        delay(50);
      }
      break;

    case 6:

      digitalWrite ( LED_PINS[6], LOW);
      digitalRead (SENSOR_OUT[6]);
      sensorValue = digitalRead (SENSOR_OUT[6]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[6], HIGH);
        state = 9 ;
        delay(50);
      }
      break;

    case 7:

      digitalWrite ( LED_PINS[7], LOW);
      digitalRead (SENSOR_OUT[7]);
      sensorValue = digitalRead (SENSOR_OUT[7]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[7], HIGH);
        state = 9;
        delay (50);
      }
      break;

    case 8:

      digitalWrite ( LED_PINS[8], LOW);
      digitalRead (SENSOR_OUT[8]);
      sensorValue = digitalRead (SENSOR_OUT[8]);
      if ( sensorValue == 0) {
        digitalWrite ( LED_PINS[8], HIGH);
        state = 9;
        delay (50);
      }
      break;

    case 9:
     
        randNumber = random(81 / 9);
        Serial.println (randNumber);
        delay (50);
        state = randNumber;
      
      break;


  }

}
byte SENSOR_OUT [] = {22, 24, 26, 28, 30, 32, 34, 36, 38}; // Hallsensor Eingänge

Eingänge mit OUT zu bezeichnen ist eine ganz dumme Sache, die Du Dir schnell wieder abgewöhnen solltest. Damit schießt Du Dir selbst ins Knie.

Gruß Tommy

Tommy: er schließt doch einen Sensorausgang dort an ^^
Oliver: 0 bis 8 machen doch das gleiche oder? Das kannst zusammenfassen

case 0 ... 8:
  digitalWrite ( LED_PINS[state], LOW);
  digitalRead (SENSOR_OUT[state]);
  sensorValue = digitalRead (SENSOR_OUT[state]);
  if ( sensorValue == 0) {
    digitalWrite ( LED_PINS[state], HIGH);
    state = 9;
    delay(50);
  }
  break;

oder überhaupt nur mehr auf if state !=9 abfragen und 9 im else abarbeiten.

Noiasca : Ach so kann man das auch schreiben. :slight_smile:

Das erspart natürlich sehr viel Schreibkram und macht das Ganze doch wesentlich übersichtlicher.

Vielen Dank für den Tip

Hi

Interessehalber: warum hat STATE den Typ INT?
INT kann negative Nummern annehmen - brauchst Du nicht, prüfst Du sogar gegen!!
Wenn bei Dir state kleiner Null ist, stellst Du state auf Null.
Nimm einen UNSIGNED Datentyp (unsigned int im Arduino-Slang, oder uint16_t - die Schreibweise bevorzuge ich - man sieht direkt, wie breit die Variable ist und durch das U am Anfang, daß nur positive Zahlen vorkommen - U=unsigned - nicht vorzeichenbehaftet).

Dann änderst Du den Datentyp von state noch auf 'byte' - Das wäre ein uint8_t - ist 8 Bit breit und kann Werte 0...255 annehmen - Deine 0...9 passen dort 'gerade so' rein, brauchst also noch lange kein uint16_t (0...65'535), uint32_t (0...4'294'967'295) oder gar uint64_t (0...18'446'744'073'709'551'615).
Die signed-Varianten davon gehen bis 'zur Hälfte' - aber in beide Richtungen.
Ein int16_t ginge von -32768...32767 (beide Werte vorzeichenlos addiert sind's wieder 65535).

MfG