Странно, прошлый пост удалили что ли
В общем, поставил датчик vl53l0x, хотел поставить выше, чтобы считать расстояние до соперника, но значения слишком прыгают
Поставил в прорезь снизу, но не могу добиться стабильности срабатывания
#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_NeoPixel.h> // Подключение бибилиотеки для управления светодиодами
#define LED_ON 1 // 1 is on, 0 is off
#define LED_SIGNAL 7
#define NUMPIXELS 13 // Кол-во диодов
struct RGB {
uint8_t r;
uint8_t g;
uint8_t b;
};
uint16_t distance_old;
VL53L0X sensor;
unsigned long previousTime = 0;
#if LED_ON
Adafruit_NeoPixel pixels(NUMPIXELS, LED_SIGNAL, NEO_GRB + NEO_KHZ800);
uint32_t color;
RGB color1 = {255, 0, 0}; // Цвет минимума
RGB color2 = {0, 255, 0}; // Цвет максимума
#endif
// +- zero is 40
#define ZERO 40;
const int outputPin = 13; // Номер выходного пина
const int minDistance = 10; // Минимальное расстояние в мм
const int maxDistance = 48; // Максимальное расстояние в мм
const int readingsRequired = 2; // Количество подряд измерений в диапазоне
int consecutiveCount = 0;
RGB gradientColor(RGB color1, RGB color2, int value) {
// Ограничиваем значение value в диапазоне от 0 до 1000
if (value < 0) value = 0;
if (value > 1000) value = 500;
// Вычисляем коэффициент t от 0.0 до 1.0
float t = value / 1000.0f;
// Интерполируем каждый компонент цвета
RGB result;
result.r = (uint8_t)(color1.r + (color2.r - color1.r) * t);
result.g = (uint8_t)(color1.g + (color2.g - color1.g) * t);
result.b = (uint8_t)(color1.b + (color2.b - color1.b) * t);
return result;
}
void setup() {
#if LED_ON
pixels.begin(); //Инициализация обьекта управления диодами
#endif
Serial.begin(115200);
Wire.begin();
pinMode(outputPin, OUTPUT);
sensor.setTimeout(500);
if (!sensor.init()) {
Serial.println("Не удалось обнаружить датчик VL53L0X!");
while (1);
}
sensor.setMeasurementTimingBudget(20000);
}
void loop() {
unsigned long currentTime = micros();
uint16_t distance = sensor.readRangeSingleMillimeters()-ZERO;
unsigned long deltaTime = currentTime - previousTime;
previousTime = currentTime;
if (sensor.timeoutOccurred()) {
Serial.println("Превышено время ожидания измерения!");
} else {
//Serial.print("Расстояние: ");
Serial.println(distance);
// Serial.print(" мм, Время между измерениями: ");
// Serial.print(deltaTime);
// Serial.println(" мкс");
// Проверяем, попадает ли расстояние в заданный диапазон
if (distance >= minDistance && distance <= maxDistance) {
consecutiveCount++;
} else {
consecutiveCount = 0;
}
// Управляем выходным пином на основе количества подряд измерений
if (consecutiveCount >= readingsRequired) {
digitalWrite(outputPin, HIGH);
//Serial.println("Fire");
} else {
digitalWrite(outputPin, LOW);
//Serial.println("clear");
}
#if LED_ON
if(abs(distance_old-distance)>10)
{
RGB resultColor = gradientColor(color1, color2, distance);
color=pixels.Color(resultColor.r, resultColor.g, resultColor.b);
pixels.fill(color);
pixels.show();
}
distance_old=distance;
#endif
}
}