ARDUINO Датчик присутствия на ардуино и модуле SRF05

Ursus

✩✩✩✩✩✩✩
4 Сен 2019
13
2
Приветствую, товарищи.
Пытаюсь собрать датчик присутствия на ардуино и модуле SRF05. Нашел библиотеку NewPing для работы с УЗ модулем. Данные с него снимаются нормально, но как заставить реле переключаться в соответствии с ними не понимаю.


#include <NewPing.h>

#define SONAR_NUM 1 // Number of sensors.
#define MAX_DISTANCE 350 // Maximum distance (in cm) to ping.
const int RLY_PIN = 9; // Пин реле
const int del = 15000; // Задержка перед выключением
int dist = 0; // Дистанция
int distLimit = 10; // Ограничение срабатывания

NewPing sonar[SONAR_NUM] = { // Sensor object array.
NewPing(6, 5, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
};

void setup() {
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
pinMode(RLY_PIN, OUTPUT);
}

void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
dist = sonar[i].ping_cm();
Serial.print(i);
Serial.print("=");
Serial.print(dist);
Serial.print("cm ");
}
Serial.println();
void Relay();

}
void Relay()
{
if (dist < distLimit) {

digitalWrite(RLY_PIN, LOW);
}

else {
//delay(del);
digitalWrite(RLY_PIN, HIGH);
}
}
 

Ursus

✩✩✩✩✩✩✩
4 Сен 2019
13
2
Функции не умеешь вызывать. Посмотри Уроки Arduino, подучи основы
Ппц я эту статью пять раз перечитал. И еще несколько других про функции. Так ниче и не понял. А посмотрел пример в видео и сразу понятно стало. Почему нельзя было в статью этот пример вставить.
 

Ursus

✩✩✩✩✩✩✩
4 Сен 2019
13
2
Допилил скетч до рабочего состояния. Добавил в него фильтр из видоса про дальномер. Так на всякий случай. Выложу, может кому пригодится. Скорее всего придется добавлять еще один сонар, т.к. луч узкий и все что мне надо не перекроет. Но второй сонар пока только едет из китая.\
Код конечно кривой, т.к. слеплен из кусков и разбираться и вычищать пока рано. Займусь как прикручу второй сенсор.


#include <NewPing.h>

#define SONAR_NUM 1 // Number of sensors.
#define MAX_DISTANCE 350 // Maximum distance (in cm) to ping.
const int RLY_PIN = 9; // Пин реле
const int del = 5000; // Задержка перед выключением
int distLimit = 30; // Дистанция срабатывания
uint32_t timer;
float dist_3[3] = {0.0, 0.0, 0.0}; // массив для хранения трёх последних измерений
float middle, dist, dist2, dist_filtered;
float k;
byte x, delta;
unsigned long sensTimer;


NewPing sonar[SONAR_NUM] = { // Sensor object array.
NewPing(6, 5, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
};

void setup() {
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
pinMode(RLY_PIN, OUTPUT);

}

void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
delay(200); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
dist2 = sonar[i].ping_cm();
Serial.print(i);
Serial.print("=");
Serial.print(dist_filtered);
Serial.print("cm ");
}
Serial.println();

if (millis() - sensTimer > 50) { // измерение и вывод каждые 50 мс
// счётчик от 0 до 2
// каждую итерацию таймера i последовательно принимает значения 0, 1, 2, и так по кругу
if (x > 1) x = 0;
else x++;

dist_3[x] = dist2; // получить расстояние в текущую ячейку массива
dist = middle_of_3(dist_3[0], dist_3[1], dist_3[2]); // фильтровать медианным фильтром из 3ёх последних измерений

delta = abs(dist_filtered - dist); // расчёт изменения с предыдущим
if (delta > 1) k = 0.7; // если большое - резкий коэффициент
else k = 0.1; // если маленькое - плавный коэффициент

dist_filtered = dist * k + dist_filtered * (1 - k); // фильтр "бегущее среднее"


sensTimer = millis(); // сбросить таймер
}

Relay();

}
void Relay()
{
if (dist_filtered < distLimit) {
digitalWrite(RLY_PIN, LOW);
}

else {
if (millis() - timer >= del) {
timer += del;
digitalWrite(RLY_PIN, HIGH);
}
}
}
// медианный фильтр из 3ёх значений
float middle_of_3(float a, float b, float c) {
if ((a <= b) && (a <= c)) {
middle = (b <= c) ? b : c;
}
else {
if ((b <= a) && (b <= c)) {
middle = (a <= c) ? a : c;
}
else {
middle = (a <= b) ? a : b;
}
}
return middle;
}