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");
}