Pololu Robotics & Electronics
Menu
My account Comments or questions? About Pololu Contact Ordering information Distributors

Pololu Forum

VL53L0X подключил два датчика, зависает arduino, нужна помощь

Подключаю два датчика, вроде работает, через какое-то время 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");
}

Hi.

Unfortunately, we can only offer technical support in English, though another member of the forum might be able to help in other languages. If you can, please post again in English.

-Claire