Lauflicht Sketch hängt sich auf

Hallo,

Ich versuche mich zurzeit an einem Sketch für ein Lauflicht.

Es sind 2 Sensoren VL53L1X und nen MCP23017 am I2C

Jedoch hängt sich der Arduino Nano nach ungewisser zeit auf und wenn er sich mal nicht aufhängt habe ich das Problem dass nach mehrmaligem “Auslösen des Lauflichtes” die Sensoren nur noch “0” zurückgeben.

Wo könnte ich anfang nach dem Problem(en) zu suchen?

#include <Wire.h>
#include "Adafruit_MCP23017.h"
#include <VL53L1X.h>
//#include <avr/wdt.h>


VL53L1X sensor;
VL53L1X sensor2;

const int lichtdaueran = 7;
const int freigabepin = 9;

const int led_error = 11;
const int led_alive = 13;

const int sensor_oben = 6;
const int sensor_unten = 8;

int freigabe = 0;
int lichteran = 0;
int lichtstatus = 0;
int lauflichthoch = 0;
int lauflichtrunter = 0;
int ledposition = 0;
int lastposition = 0;
int sensortimeout = 0;
int sensor2timeout = 0;


const byte leds[] = {7, 15, 6, 14, 5, 13, 4, 12, 3, 11, 2, 10, 1, 9, 0};
const byte ledshoch[] = {7, 15, 6, 14, 5, 13, 4, 12, 3, 11, 2, 10, 1, 9, 0, 7, 15, 6, 14, 5, 13, 4, 12, 3, 11, 2, 10, 1, 9, 0}; //lauflicht hoch
const byte ledsrunter[] = {0, 9, 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, 0, 9, 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7}; //lauflicht runter
const byte ANZAHL_LED = sizeof(leds) / sizeof(leds[0]);


unsigned long previousMillis = 0;
unsigned long previousMillis2 = 0;
unsigned long currentMillis = 0;
unsigned long MillisStart = 0;

const long interval1 = 400;
const long interval2 = 5000;
long interval;

Adafruit_MCP23017 mcp;

void setup()
{
  Serial.begin (9600);
  Serial.println("Serial start");
  pinMode(lichtdaueran, INPUT); //lichttaster daueran
  pinMode(freigabepin, INPUT); //lauflicht freigeben

  pinMode(sensor_oben, OUTPUT);  //sensor1
  pinMode(sensor_unten, OUTPUT);  //sensor2

  pinMode(led_error, OUTPUT);  //led rot
  pinMode(led_alive, OUTPUT);  //led grün



  digitalWrite(sensor_oben, LOW);
  digitalWrite(sensor_unten, LOW);
  digitalWrite(led_error, LOW);
  digitalWrite(led_alive, LOW);


  Wire.setClock(100000);
  mcp.begin(&Wire);
  Serial.println("MCP start");

  delay(500);
  Wire.begin();
  Wire.setClock(100000);
  Wire.beginTransmission(0x29);

  for (byte i = 0; i < ANZAHL_LED; i++) {
    mcp.pinMode(leds[i], OUTPUT);
  }

  for (byte i = 0; i < ANZAHL_LED; i++) {
    mcp.digitalWrite(leds[i], HIGH);
  }

  Serial.println("Start");

  digitalWrite(sensor_oben, HIGH);
  delay(150);
  if (!sensor2.init())
  {
    Serial.println("Fehler Sensor oben");
    digitalWrite(led_alive, LOW);
    digitalWrite(led_error, HIGH);
    //Reset_A();
  }
  //sensor2.init();
  delay(100);
  sensor2.setAddress(0x33);

  digitalWrite(sensor_unten, HIGH);
  delay(150);
  if (!sensor.init())
  {
    Serial.println("Fehler Sensor unten");
    digitalWrite(led_alive, LOW);
    digitalWrite(led_error, HIGH);
    //Reset_A();
  }
  //sensor.init();
  delay(100);


  sensor.setDistanceMode(VL53L1X::Long);
  sensor.setMeasurementTimingBudget(50000);
  sensor.startContinuous(50);
  sensor.setTimeout(100);

  sensor2.setDistanceMode(VL53L1X::Long);
  sensor2.setMeasurementTimingBudget(50000);
  sensor2.startContinuous(50);
  sensor2.setTimeout(100);


  delay(150);
  Serial.println("addresses set");

  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;


  for (byte i = 1; i < 120; i++)
  {

    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
    {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
    } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");

  //wdt_enable(WDTO_8S);   // Watchdog auf 8 s stellen

}

void loop()
{
  //lichteran = digitalRead(lichtdaueran);
  lichteran = 0;
  freigabe = digitalRead(freigabepin);
  currentMillis = millis();

  sensor.read();
  sensor2.read();


  if (sensor.timeoutOccurred()) {
    sensortimeout++;
    Serial.print("Sensor timeout: ");
    Serial.println(sensortimeout);
  }

  if (sensor2.timeoutOccurred()) {
    sensor2timeout++;
    Serial.print("Sensor2 timeout: ");
    Serial.println(sensor2timeout);
  }


  /*
      Serial.print("Sensor unten ");
      Serial.print(sensor.read());
      if (sensor.timeoutOccurred()) {
        Serial.print(" TIMEOUT");
      }
      Serial.println();
      //delay(100);
      Serial.print("Sensor oben ");
      Serial.print(sensor2.read());
      if (sensor2.timeoutOccurred()) {
        Serial.print(" TIMEOUT");
      }
      Serial.println();
  */

  if (lichteran == HIGH && lichtstatus == 0) {
    Serial.println("licht dauer an");
    for (byte i = 0; i < ANZAHL_LED; i++) {
      mcp.digitalWrite(leds[i], LOW);
    }
    lichtstatus = 1;

  } else {

    if (lichteran == LOW && lichtstatus == 1) {
      Serial.println("licht dauer aus");
      for (byte i = 0; i < ANZAHL_LED; i++) {
        mcp.digitalWrite(leds[i], HIGH);
      }
      lichtstatus = 0;
    }




    if (sensor.ranging_data.range_mm <= 700 && sensor.ranging_data.range_mm > 0 && freigabe == 1 && lauflichthoch == 0 && lauflichtrunter == 0)
    {
      Serial.println(sensor.read());
      Serial.println("trigger lauflicht hoch");
      MillisStart = currentMillis;
      lauflichthoch = 1;
    }

    if (sensor2.ranging_data.range_mm <= 600 && sensor2.ranging_data.range_mm > 0 && freigabe == 1 && lauflichthoch == 0 && lauflichtrunter == 0)
    {
      Serial.println(sensor2.read());
      MillisStart = currentMillis;
      lauflichtrunter = 1;
    }


    if (lauflichtrunter == 1 || lauflichthoch == 1)
    {
      if (ledposition == 15 || ledposition == 30) {
        interval = interval2;
      } else {
        interval = interval1;
      }

      if (currentMillis - previousMillis2 >= interval && ledposition == lastposition) {

        if (ledposition <= 29) {

          if (ledposition <= 14) {
            Serial.print("LED ");
            if (lauflichtrunter == 1) {
              mcp.digitalWrite(ledsrunter[ledposition], LOW);
              Serial.print(ledsrunter[ledposition]);
            } else {
              mcp.digitalWrite(ledshoch[ledposition], LOW);
              Serial.print(ledshoch[ledposition]);
            }
            Serial.print(" an nach: ");
            Serial.print(currentMillis - previousMillis2);
            Serial.println(" ms");

          } else {

            if (lauflichtrunter == 1) {
              Serial.print("LED ");
              mcp.digitalWrite(ledsrunter[ledposition], HIGH);
              Serial.print(ledsrunter[ledposition]);
            } else {
              mcp.digitalWrite(ledshoch[ledposition], HIGH);
              Serial.print(ledshoch[ledposition]);
            }
            Serial.print(" aus nach: ");
            Serial.print(currentMillis - previousMillis2);
            Serial.println(" ms");
          }

          previousMillis2 = currentMillis;

          ledposition++;
          lastposition++;

        } else {
          if (lauflichtrunter == 1) {
            Serial.println("stop lauflicht runter");
          } else {
            Serial.println("stop lauflicht hoch");
          }
          Serial.print("Start: ");
          Serial.println(MillisStart);
          Serial.print("ende: ");
          Serial.println(currentMillis);
          Serial.print("dauer: ");
          Serial.print(currentMillis - MillisStart);
          Serial.print(" ms - in Sek: ");
          Serial.println((currentMillis - MillisStart) / 1000 );

          ledposition = 0;
          lastposition = 0;
          lauflichtrunter = 0;
          lauflichthoch = 0;
        }
      }
    }
  }

  //wdt_reset();
}

void Reset_A(void) {
  asm volatile ("jmp 0 \n");
}

Du könntest in deinen Sketch serielle Ausgaben auf den seriellen Monitor einbauen und daran feststellen, wo der Sketch hängen bleibt.

Hängen bleibt er während dem an/aus schalten. Mal nach der ersten LED mal nach der X. ten laut der aktuellen Ausgabe

Dann nenne doch mal den Speicherbedarf deines Sketches.

hier wäre mal die ausgabe:

"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-size" -A "C:\\Users\\mpl13\\AppData\\Local\\Temp\\arduino_build_810253/sketch_jan14a.ino.elf"
Der Sketch verwendet 11266 Bytes (36%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 956 Bytes (46%) des dynamischen Speichers, 1092 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM4 -b115200 -D -Uflash:w:C:\Users\mpl13\AppData\Local\Temp\arduino_build_810253/sketch_jan14a.ino.hex:i 

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM4
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\mpl13\AppData\Local\Temp\arduino_build_810253/sketch_jan14a.ino.hex"
avrdude: writing flash (11266 bytes):

Writing | ################################################## | 100% 2.11s

avrdude: 11266 bytes of flash written
avrdude: verifying flash memory against C:\Users\mpl13\AppData\Local\Temp\arduino_build_810253/sketch_jan14a.ino.hex:
avrdude: load data flash data from input file C:\Users\mpl13\AppData\Local\Temp\arduino_build_810253/sketch_jan14a.ino.hex:
avrdude: input file C:\Users\mpl13\AppData\Local\Temp\arduino_build_810253/sketch_jan14a.ino.hex contains 11266 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.75s

avrdude: verifying ...
avrdude: 11266 bytes of flash verified

avrdude done.  Thank you.

Irgendwas stimmt da nicht!

  Wire.setClock(100000);
  mcp.begin(&Wire);
  Serial.println("MCP start");

  delay(500);
  Wire.begin();
  Wire.setClock(100000);
  Wire.beginTransmission(0x29);

  for (byte i = 0; i < ANZAHL_LED; i++) {
    mcp.pinMode(leds[i], OUTPUT);
  }

Sollte nicht Wire.begin(); vor mcp.begin(&Wire); stattfinden?

Und das Wire.beginTransmission(0x29); kommt mir noch seltsamer vor…
Was soll es bedeuten?
Wo ist das zugehörige Wire.endTransmission()?

Hallo,

Ich habe die Initialisierung der Sensoren von hier übernommen:

Ich habe das ganze jetzt probehalber mal über 3 x I2C Extender P82B715 laufen da ich längere strecken habe und dachte dass es daran liegen könnte, jedoch hat sich nichts verbessert

aus irgend einem grund verliert er sporadisch einen Sensor

Funktionieren denn deine Sensoren fehlerfrei, wenn du dein Lauflicht nicht dran hast ?
Das solltest du mal unabhängig voneinander testen. Ich vermute, da kommt sich was in die Quere.

Ich hab jetzt mal die Sensorauswertung rausgenommen und zyklisch das lauflicht ausgelöst... bisher läuft es ohne Aussetzer

Das Problem wird dann wohl in der Sensorauswertung liegen :confused:

Und jetzt nochmal die Sensoren prüfen.

hab jetzt 20min lang beide Sensoren alleine ohne weiterem Code am laufen und die werte kommen alle ohne Aussetzer an.

mpl1337:
hab jetzt 20min lang beide Sensoren alleine ohne weiterem Code am laufen und die werte kommen alle ohne Aussetzer an.

Das zeigt, dass die Sketch sich gegenseitig stören.
Da solltest du jetzt langsam beide Sketch miteinander verbinden.

Ich würde den Sensoren-Sketch als Basis nehmen und den Sketch für den Portexpander mit einer Library aufbauen.

Hab jetzt ne andere Sache festgestellt.

Wenn ich das Flachbandkabel vom Relaisboard(1&Kanal China ding) nicht angeschlossen habe läuft der Sketch durch... sobald ich das Relaisboard wieder anschließe kommen die Probleme.

Der Portexpander sitzt 30cm vom Relaisboard entfernt und ist per Flachband verbunden.

Fange ich mir hier eventuell Störungen durch das schalten der Relais ein?

Gut möglich, dass da was stört.
Freilaufdiode dran ?
Was schaltest du damit ?

es handelt sich um dieses Board

https://www.amazon.de/AZDelivery-16-Relais-Optokoppler-Low-Level-Trigger-Arduino/dp/B07N2Z1DWG/ref=sr_1_5?__mk_de_DE=ÅMÅŽÕÑ&dchild=1&keywords=16-Relais+Modul&qid=1612293471&sr=8-5

da die Relais über den ULN2803 getrieben werden ist die Freilaufdiode vorhanden, jedoch etwas entfernt vom Relais

geschaltet werden 12v LEDs

Und was schaltest du damit ?
Hast du für I2C Pullup-Widerstände drauf.

Ich schalte 12v LEDs damit.

Ja es sind 4,7k pull-up Widerstände vorhanden.

Ich teste es morgen mal mit geringeren widerständen.

Und auch mal ohne die Leds testen.

Habs jetzt ohne Verbraucher getestet und es läuft sauber durch

mpl1337:
Habs jetzt ohne Verbraucher getestet und es läuft sauber durch

Dann machen die Relaiskontakte wohl das Problem.
Da muss dann ein Snubber ran, der den Funken löscht.

Da stellt sich dann die Frage, warum du die Leds mit Relais schaltest und nicht mit Mosfet (Transistoren) ?