Подключаю два датчика, вроде работает, через какое-то время arduino зависает, что сторожевой таймер не перезагружает устройство. Скетч внизу, что не так делаю.
#include <Wire.h>
#include <avr/wdt.h> // библиотека для watchdog
#include <VL53L0X.h> //библиотека лазерного дальномера
VL53L0X VL53L0X_1;
VL53L0X VL53L0X_3;
unsigned int c = 0; // переменная для хранения показаний с первого лазерного датчика
unsigned int e = 0; // переменная для хранения показаний с второго лазерного датчика
#define minDistance 600 // ширина дверного проёма у меня 70 с чем-то см, срабатывание датчиков будем засчитывать, если измерено расстояние менее 60-ти см.
#define zeroDistance 70 // расстояние от которого должен срабатывать датчик, если меньше , то это погрешность, сработал на линзу
bool VL53L0X_1_state = false; // флаг срабатывания первого датчика
bool VL53L0X_3_state = false; // флаг срабатывания 3 датчика
bool VL53L0X_1_already = false; // флаг "первый датчик уже сработал"
bool VL53L0X_reset = false; //
// номер цифрового пина реле 1 -- светофор - красный/красный
#define RELAY_1_PIN 9
unsigned long timing = 0; // Переменная для хранения точки отсчета
unsigned long timing_4_sec = 0; // Переменная для хранения точки отсчета
unsigned long timing_reset = 0; // Переменная для хранения точки отсчета
void setup()
{
wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop
// указывае что это реле и устанавливаем и первоначальное состояние ВЫКЛ
// назначаем 2 пина в режиме выхода
c = 0; // переменная для хранения показаний с первого лазерного датчика
e = 0; // переменная для хранения показаний с второго лазерного датчика
VL53L0X_1_state = false; // флаг срабатывания первого датчика
VL53L0X_3_state = false; // флаг срабатывания 3 датчика
VL53L0X_1_already = false; // флаг "первый датчик уже сработал"
VL53L0X_reset = false; //
timing = 0;
timing_4_sec = 0;
timing_reset = 0;
pinMode(RELAY_1_PIN, OUTPUT);
digitalWrite(RELAY_1_PIN, HIGH); // для этого реле HIGH выключено
pinMode(8, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(500);
Wire.begin();
Serial.begin (9600);
digitalWrite(6, HIGH);
delay(150);
VL53L0X_1.init(true);
delay(200);
VL53L0X_1.setAddress((uint8_t)03);
digitalWrite(8, HIGH);
delay(150);
VL53L0X_3.init(true);
delay(200);
VL53L0X_3.setAddress((uint8_t)05);
delay(10);
VL53L0X_1.startContinuous();
delay(10);
VL53L0X_3.startContinuous();
wdt_enable(WDTO_4S); // разрешить watchdog
// WDTO_15MS
// WDTO_30MS
// WDTO_60MS
// WDTO_120MS
// WDTO_250MS
// WDTO_500MS
// WDTO_1S
// WDTO_2S
// WDTO_4S
// WDTO_8S
Serial.println("start-------------------------------------------------------------------------------------------------------------");
}
void loop()
{
Begin: // метка
c = VL53L0X_1.readRangeContinuousMillimeters();
Serial.println(c);
e = VL53L0X_3.readRangeContinuousMillimeters();
Serial.println(e);
unsigned int Distance1 = VL53L0X_1.readRangeContinuousMillimeters();
unsigned int Distance3 = VL53L0X_3.readRangeContinuousMillimeters();
VL53L0X_1_state = (Distance1 < minDistance) && (Distance1 > zeroDistance);
VL53L0X_3_state = (Distance3 < minDistance) && (Distance3 > zeroDistance);
Serial.println(VL53L0X_1_state);
Serial.println(VL53L0X_3_state);
Serial.println(VL53L0X_reset);
// if ( Distance1 == 65535 || Distance3 == 65535 )
// {
// resetFunc();
// }
// begin-------------------------если с датчиков ничего не приходит то перезагружаем ------------------------
if ( !VL53L0X_1_state && !VL53L0X_3_state && !VL53L0X_reset) //&& !VL53L0X_2_state
{
VL53L0X_reset = true;
timing_reset = millis();
}
else if ( VL53L0X_1_state || VL53L0X_3_state && VL53L0X_reset)
{
VL53L0X_reset = false;
}
if ( VL53L0X_reset )
{
if (millis() - timing_reset > 20000)
{ // Вместо 10000 подставьте нужное вам значение паузы
Serial.println("ресет");
VL53L0X_reset = false;
timing_reset = millis();
resetFunc();
}
}
// end-------------------------если с датчиков ничего не приходит то перезагружаем ------------------------
//begin ----------------------если приходит одновременно на оба датчика то ошибка, начинаем заново от МЕТКИ---------------
if ( VL53L0X_1_state && VL53L0X_3_state)
{
Serial.println("Warning!!!");
goto Begin;
}
//end ----------------------если приходит одновременно на оба датчика то ошибка, начинаем заново от МЕТКИ---------------
//анализируем флаги срабатывания
if ( VL53L0X_1_state && !VL53L0X_1_already) //сработал первый датчик , параметры срабатывания 0
{
VL53L0X_1_already = true; // выставляем флаг , что сработал первый датчик
}
if ( VL53L0X_1_already) // если стоит флаг что сработал первый датчик
{
// зажигается лампа красного цвета - включаем реле 1
digitalWrite(RELAY_1_PIN, LOW);
Serial.println("красный!!!");
}
if ( VL53L0X_1_already && VL53L0X_3_state) //флаг первого датчика true и сработал третий датчик
{
// обнуляем флаги датчиков
VL53L0X_1_already = false;
}
if ( !VL53L0X_1_already ) //флаг первого датчика false
{
// включаем светофор зеленый
// выключаем светофор красный - выключаем реле 1
digitalWrite(RELAY_1_PIN, HIGH);
Serial.println("Зеленый!!!");
}
wdt_reset(); // сбрасываем тайсер watchdog
delay(300);
}
void resetFunc()
{
Serial.println("reset"); // функция перезагрузки контроллера, если контроллер не завис
asm volatile ("jmp 0");
}