Подсветка рабочей зоны кухни
- Войдите на сайт для отправки комментариев
Добрый день! Задался вопросом об автоматической подсветке рабочих зон в кухне. Нашёл в инете код, но он работает процентов на 30. Значит имеем два HC-SR04 для двух зон и кнопку для принудительного включения зоны №1. Из всего этого нормально работает только зона №2. На кнопку никак не реагирует, а на датчик срабатывает но не гаснет.
// подключаем библиотеку I2C:
#include <Wire.h>
// подключаем библиотеку датчика BH1750:
#include <BH1750.h>
// объявляем объект lightMeter:
BH1750 lightMeter;
int a = 0;
const int Trig1 = 6;
const int Echo1 = 7;
const int Trig2 = 8;
const int Echo2 = 9;
const int ledPin1 = 12; // 13 – если будете использовать встроенный в Arduino светодиод
const int ledPin2 = 11;
long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода
long interval = 1000; // интервал мигания в миллисекундах
void setup()
{
pinMode(Trig1, OUTPUT);
pinMode(Echo1, INPUT);
pinMode(Trig2, OUTPUT);
pinMode(Echo2, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(3, INPUT_PULLUP);
Serial.begin(9600);
lightMeter.begin(); //инициализация датчика BH1750
}
unsigned int time_us = 0;
unsigned int distance_sm1 = 0;
unsigned int distance_sm2 = 0;
void loop()
{
//считываем показания с BH1750:
uint16_t lux = lightMeter.readLightLevel();
Serial.print("Light:");
Serial.print(lux);
Serial.println("lx");
delay(100);
digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig1, LOW); // Затем убираем
time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса
distance_sm1 = time_us / 58; // Пересчитываем в сантиметры
Serial.println(distance_sm1); // Выводим на порт
digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig2, LOW); // Затем убираем
time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса
distance_sm2 = time_us / 58; // Пересчитываем в сантиметры
Serial.println(distance_sm2); // Выводим на порт
if (lux < 80) {
if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром
{
digitalWrite(ledPin1, 1); // Зажигаем светодиод
previousMillis = millis();
}
else
{ if (previousMillis - millis() > previousMillis) {
previousMillis = millis();
}
if (millis() - previousMillis > interval) {
digitalWrite(ledPin1, 0); // тушим
}
}
// для второго датчика
if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром
{
digitalWrite(ledPin2, 1); // Зажигаем светодиод
delay(400);
}
else
{
digitalWrite(ledPin2, 0); // иначе тушим
}
}
if (lux > 80) {
if (digitalRead(3) == HIGH)
{
a = 1;
}
if (a == 1) {
Serial.println(distance_sm1); // Выводим на порт
if (distance_sm1 < 50) // Если расстояние менее 50 сантиметром
{
digitalWrite(ledPin1, 1); // Зажигаем светодиод
delay(400);
}
else
{
digitalWrite(ledPin1, 0); // иначе тушим
a = 0;
}
}
}
}
Если прописать кнопку - const int knopka = 3; и pinMode(knopka, INPUT_PULLUP); то кнопка отрабатывает нормально. Незнаю насколько это правильно, но работает.
[code]
// подключаем библиотеку I2C:
#include <Wire.h>
// подключаем библиотеку датчика BH1750:
#include <BH1750.h>
// объявляем объект lightMeter:
BH1750 lightMeter;
int a = 0;
const int knopka = 3;
const int Trig1 = 6;
const int Echo1 = 7;
const int Trig2 = 8;
const int Echo2 = 9;
const int ledPin1 = 12; // 13 – если будете использовать встроенный в Arduino светодиод
const int ledPin2 = 11;
long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода
long interval = 1000; // интервал мигания в миллисекундах
void setup()
{
pinMode(Trig1, OUTPUT);
pinMode(Echo1, INPUT);
pinMode(Trig2, OUTPUT);
pinMode(Echo2, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(knopka, INPUT_PULLUP);
Serial.begin(9600);
lightMeter.begin(); //инициализация датчика BH1750
}
unsigned int time_us = 0;
unsigned int distance_sm1 = 0;
unsigned int distance_sm2 = 0;
void loop()
{
//считываем показания с BH1750:
uint16_t lux = lightMeter.readLightLevel();
Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");
delay(400);
digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig1, LOW); // Затем убираем
time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса
distance_sm1 = time_us / 58; // Пересчитываем в сантиметры
Serial.println(distance_sm1); // Выводим на порт
digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig2, LOW); // Затем убираем
time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса
distance_sm2 = time_us / 58; // Пересчитываем в сантиметры
Serial.println(distance_sm2); // Выводим на порт
if (lux < 80){
if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром
{
digitalWrite(ledPin1, 1); // Зажигаем светодиод
previousMillis = millis();
}
else
{ if (previousMillis - millis() > previousMillis) {
previousMillis = millis();
}
if (millis() - previousMillis > interval) {
digitalWrite(ledPin1, 0); // тушим
}
}
if (lux < 80)// для второго датчика
if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром
{
digitalWrite(ledPin2, 1); // Зажигаем светодиод
delay(400);
}
else
{
digitalWrite(ledPin2, 0); // иначе тушим
}
}
if (lux > 80){
if (digitalRead(3) == HIGH)
{
a = 1;
}
if (a == 1) {
Serial.println(distance_sm1); // Выводим на порт
if (distance_sm1 < 80) // Если расстояние менее 50 сантиметром
{
digitalWrite(ledPin1, 1); // Зажигаем светодиод
delay(400);
}
else
{
digitalWrite(ledPin1, 0); // иначе тушим
a = 0;
}
}
}
}
[/code]
Подскажите как подправить:
1 Что бы зона №1 не зацикливалась, а отключалась если растояние до датчика станет более установленого (80) 2 Сделать задержку на выключение для каждой зоны отдельно. Например зона №1 - 2мин. зона №2 - 5 сек. (что бы не моргала когда отошёл на пару сек/мин.)
1. Функция millis() возвращает значение типа unsigned long, поэтому переменные previousMillis и interval логично тоже объявить как unsigned long.
2. Условие
if(previousMillis - millis() > previousMillis) не будет выполняться никогда, поскольку millis() в данном скетче всегда больше[равно] previousMillis.3.
А как это можно подправить или почитать про это более подробно? Из того, что я нашёл как-то поверхностно всё описано - не для моих тупых мозгов.
Боюсь у Вас по-прежнему проблемы с непониманием того, как работают эти if.
1. Условие if (previousMillis - millis() < previousMillis) будет выполняться всегда. Если от чего-то отнять что-то, результат будет меньше этого самого чего-то, утверждает Капитан Очевидность.
2. Функция millis() возвращает значение типа unsigned long, поэтому переменные long OnTime1 = 50000; long OnTime2 = 5000; логично тоже объявить как unsigned long. Да, повторяюсь, да, уже писал об этом. Направление считаю правильным.
посмотрите стандартный пример мигаем без задержек, разберитесь как он работает и будет вам счастье
Боюсь у Вас по-прежнему проблемы с непониманием того, как работают эти if.
Да похоже не только с if, но и вообще с построением и пониманием всего алгоритма.
[/quote]
посмотрите стандартный пример мигаем без задержек, разберитесь как он работает и будет вам счастье
[/quote]
а теперь догадайтесь как сделать с задержкой, так, что ли?
Я понимаю, что тут никто никому не обязан, но без более подробного пояснения что и для чего в этом коде и взможное решение исправления ошибок мне самому будет очень сложно разобраться.
Я понимаю, что тут никто никому не обязан, но без более подробного пояснения что и для чего в этом коде и взможное решение исправления ошибок мне самому будет очень сложно разобраться.
С Ардуино я знаком совсем недавно, но с программированием существенно дольше. Послушайте мой совет - выкинте этот код совсем и начните всё писать сами с нуля. Переделывать чужой код, который ещё и не понимаешь, часто сложнее, чем написать свой. На мой взгляд, это лучший способ учиться программированию - начать решать свою конкретную несложную задачку. Но нужно смириться с тем, что её решение потребует времени больше, чем Вы, возможно, рассчитывали. Разумеется, это если Вы хотите чему-то научиться. Если же Вам нужен только свет на кухне, то проще обратиться в раздел "Ищу исполнителя".
Свой код я напишу позже, когда буду чётко понимать всю логику построения тело программы. Я пока не нашёл более менее доступный для понимания обучающий материал и ковыряю чужие скетчи. На примерах с подробным описанием мне проще понять что и для чего, ну и конечно же лезем в тему которая интересует именно сегодня, а не изучаем от А до Я. С какойбы стороны не изучай, а вопросы будут всегда. И где их задавать как не на форуме - знакомых владеющих языками програмирования то нет.
Переписал код, всё вроде теперь работает, но есть один баг. Когда срабатывает датчик и загорается свет, то засвечивая датчик освещённости программа останавливается ожидая затемнения датчика. Можно конечно поискать тёмный уголок и там расположить датчик освещённости, но это ведь неправильно, программа должна работать и при вкюченом общем освещении. Может подскажет кто как можно поправить код.
// подключаем библиотеку I2C: #include <Wire.h> // подключаем библиотеку датчика BH1750: #include <BH1750.h> // объявляем объект lightMeter: BH1750 lightMeter; int a = 0; const int knopka = 3; const int Trig1 = 6; const int Echo1 = 7; const int Trig2 = 8; const int Echo2 = 9; const int ledPin1 = 12; // 13 – если будете использовать встроенный в Arduino светодиод const int ledPin2 = 11; long previousMillis1 = 0; // здесь будет храниться время последнего изменения состояния светодиода long interval1 = 6000; // интервал мигания в миллисекундах long previousMillis2 = 0; long interval2 = 4000; void setup() { pinMode(Trig1, OUTPUT); pinMode(Echo1, INPUT); pinMode(Trig2, OUTPUT); pinMode(Echo2, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(knopka, INPUT_PULLUP); Serial.begin(9600); lightMeter.begin(); //инициализация датчика BH1750 } unsigned int time_us = 0; unsigned int distance_sm1 = 0; unsigned int distance_sm2 = 0; void loop() { //считываем показания с BH1750: uint16_t lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); delay(400); digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig1, LOW); // Затем убираем time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса distance_sm1 = time_us / 58; // Пересчитываем в сантиметры Serial.println(distance_sm1); // Выводим на порт digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig2, LOW); // Затем убираем time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса distance_sm2 = time_us / 58; // Пересчитываем в сантиметры Serial.println(distance_sm2); // Выводим на порт if (lux < 80) if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром { digitalWrite(ledPin1, 1); // Зажигаем светодиод previousMillis1 = millis(); } else { if (millis() - previousMillis1 > previousMillis1) { previousMillis1 = millis(); } if (millis() - previousMillis1 > interval1) { digitalWrite(ledPin1, 0); // тушим } } if (lux < 80)// для второго датчика if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin2, 1); // Зажигаем светодиод previousMillis2 = millis(); } else { if (millis() - previousMillis2 > previousMillis2) { previousMillis2 = millis(); } if (millis() - previousMillis2 > interval2) { digitalWrite(ledPin2, 0); // иначе тушим } } if (lux > 80) { if (digitalRead(3) == HIGH) { a = 1; } if (a == 1) { Serial.println(distance_sm1); // Выводим на порт if (distance_sm1 < 80) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin1, 1); // Зажигаем светодиод previousMillis1 = millis(); } else if (millis() - previousMillis1 > interval1) { digitalWrite(ledPin1, 0); // иначе тушим a = 0; } } } }Вроде сам поправил. Убрал фигурные скобки на 71 и 77 строке.
{if(millis() - previousMillis1 > previousMillis1) {072previousMillis1 = millis();073}074if(millis() - previousMillis1 > interval1) {075digitalWrite(ledPin1, 0);// тушим076}077}Они мне с самого начала там не нравились.
Так же и для второго датчика. Буду дальше тестировать.
ПС: Подскажите зачем это -
if(a == 1) И какую функцию оно выполняет?строки 71 и 85 полный бред.
трудно посмотреть пример блинк визаут делей?
Скетч копилируется,но в работе не проверял
/* ардуино пин 12 <-> светодиод 1 (ledPin1) ардуино пин 11 <-> светодиод 2 (ledPin2) ардуино пин 6 <-> TRIG УЗ1 (Trig1) ардуино пин 7 <-> ECHO УЗ1 (Echo1) ардуино пин 8 <-> TRIG УЗ2 (Trig2) ардуино пин 9 <-> ECHO УЗ2 (Echo2) ардуино I2C <-> BH1750 датчик освещености ардуино пин 3 <-> кнопка (knopka) */ //-----------------Cl_Led---------------------------- class Cl_Led { const byte _pin; bool _led; public: Cl_Led(byte pin): _pin(pin) {} void setup() { pinMode(_pin, OUTPUT); digitalWrite(_pin, _led = 0); } void ON() { digitalWrite(_pin, _led = 1); } void CS_ON() { digitalWrite(_pin, _led ); } void OFF() { digitalWrite(_pin, _led = 0); } void CS_OFF() { digitalWrite(_pin, 0); } void invert() { digitalWrite(_pin, _led = !_led); } void loop() {} }; //-------------Cl_HC_SR04-------------------------------- class Cl_HC_SR04 { const byte _Trig_pin; const byte _Echo_pin; public: uint16_t dis_sm = 100; Cl_HC_SR04(byte Trig_pin, byte Echo_pin): _Trig_pin(Trig_pin), _Echo_pin(Echo_pin) {} void setup() { pinMode(_Trig_pin, OUTPUT); digitalWrite(_Trig_pin, LOW); pinMode(_Echo_pin, INPUT); } unsigned int read() { digitalWrite(_Trig_pin, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(_Trig_pin, LOW); // Затем убираем dis_sm = pulseIn(_Echo_pin, HIGH) / 58; return dis_sm; // возврат данных в сантиметрах } }; //----------------Cl_lightMeter---------------------------- #include <Wire.h> // подключаем библиотеку I2C: #include <BH1750.h> // подключаем библиотеку датчика BH1750: class Cl_lightMeter { BH1750 *lightMeter = NULL; // указатель на устройство uint32_t past = 0; void (*Do_CS_OFF)(), (*Do)(); // указатель на обработчики: выкл свет перед измерениями, сделать операцию после измерения public: uint16_t lux; Cl_lightMeter(void (* _Do_CS_OFF)(), void (* _Do)()): Do_CS_OFF(_Do_CS_OFF), Do(_Do) {}; void setup() { lightMeter = new BH1750; lightMeter->begin(); //инициализация датчика BH1750 past = millis(); read(); } void loop() { if (millis() - past >= 400) { past = millis(); read(); } } uint16_t read() { Do_CS_OFF(); lux = lightMeter->readLightLevel(); Do(); } }; //----------------Cl_Btn------------------------------------------------------------ // класс на механич кнопку подкл к кнопке Ардуины. class Cl_Btn { byte pin; // номер ноги на кнопке void (*Do)();// указатель на обработчик bool btn, btn_old; bool bounce = 0; // антидребезговый флаг uint32_t past = 0 ; public: //конструктор Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {} void setup() { pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой btn = digitalRead(pin); // прочитать реальное значение на выводе}; } void loop () { if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн bounce = 1; // выставить флаг past = millis(); // сделать временую засветку } else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время bounce = 0; // то снять флаг btn_old = btn ; btn = digitalRead(pin) ; // прочитать реальное значение на выводе if (btn_old && ! btn) Do(); } } }; //----------------------компоновка--------------------------- Cl_Led Led1(/*пин*/12); Cl_Led Led2(/*пин*/11); Cl_HC_SR04 HC_SR04_1(/*Trig*/6,/*Echo*/7); Cl_HC_SR04 HC_SR04_2(/*Trig*/8,/*Echo*/9); void Do_CS_OFF() { // притушить лампы перед измерением освещености Led1.CS_OFF(); Led2.CS_OFF(); } void Do_lightMeter(); Cl_lightMeter lightMeter(/*обработчик*/Do_CS_OFF,/*обработчик*/Do_lightMeter); // объявляем объект lightMeter: void Do_lightMeter() { Led1.CS_ON(); Led2.CS_ON(); Serial.print("Light: "); Serial.print(lightMeter.lux); Serial.println(" lx"); if (lightMeter.lux < 80 && HC_SR04_1.dis_sm < 50) Led1.ON(); else Led1.OFF(); if (lightMeter.lux < 80 && HC_SR04_2.dis_sm < 80) Led2.ON(); else Led2.OFF(); } void Do_Btn1() { Led2.invert();// переключить состояние лампы } Cl_Btn Btn1(/*пин*/3,/*обработчик*/Do_Btn1); //-------------------main()----------------------- void setup() { Serial.begin(9600); lightMeter.setup(); HC_SR04_1.setup(); HC_SR04_2.setup(); Led1.setup(); Led2.setup(); Btn1.setup(); } void loop() { lightMeter.loop(); Btn1.loop(); }Не работает. Или перед загрузкой а ардуино я должен что то с кодом ещё сделать?
Не работает. Или перед загрузкой а ардуино я должен что то с кодом ещё сделать?
Что сделать, что сделать. Провести отладку и бета-тестирование. Посмотреть в чем затык, и отключть часть кода. Ведь что бы проверить код собрать макетную плату. А то кажется новичкам, что код пишется и сразу работает.
Вот примеры аналогичных кодов.http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
Я же без притензий, просто сообщил, что не работает. Макетка собрана, на ней и тестирую.
/* ардуино пин 12 <-> светодиод 1 (ledPin1) ардуино пин 11 <-> светодиод 2 (ledPin2) ардуино пин 6 <-> TRIG УЗ1 (Trig1) ардуино пин 7 <-> ECHO УЗ1 (Echo1) ардуино пин 8 <-> TRIG УЗ2 (Trig2) ардуино пин 9 <-> ECHO УЗ2 (Echo2) */ //-----------------Cl_Led---------------------------- class Cl_Led { const byte _pin; bool _led; public: Cl_Led(byte pin): _pin(pin) {} void setup() { pinMode(_pin, OUTPUT); digitalWrite(_pin, _led = 0); } void ON() { digitalWrite(_pin, _led = 1); } void CS_ON() { digitalWrite(_pin, _led ); } void OFF() { digitalWrite(_pin, _led = 0); } void CS_OFF() { digitalWrite(_pin, 0); } void invert() { digitalWrite(_pin, _led = !_led); } void loop() {} }; //-------------Cl_HC_SR04-------------------------------- class Cl_HC_SR04 { const byte _Trig_pin; const byte _Echo_pin; public: uint16_t dis_sm = 100; Cl_HC_SR04(byte Trig_pin, byte Echo_pin): _Trig_pin(Trig_pin), _Echo_pin(Echo_pin) {} void setup() { pinMode(_Trig_pin, OUTPUT); digitalWrite(_Trig_pin, LOW); pinMode(_Echo_pin, INPUT); } unsigned int read() { digitalWrite(_Trig_pin, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(_Trig_pin, LOW); // Затем убираем dis_sm = pulseIn(_Echo_pin, HIGH, 6000ul) / 58; return dis_sm; // возврат данных в сантиметрах } }; //----------------------компоновка--------------------------- Cl_Led Led1(/*пин*/12); Cl_Led Led2(/*пин*/11); Cl_HC_SR04 HC_SR04_1(/*Trig*/6,/*Echo*/7); Cl_HC_SR04 HC_SR04_2(/*Trig*/8,/*Echo*/9); //-------------------main()----------------------- void setup() { Serial.begin(9600); Led1.setup(); Led2.setup(); HC_SR04_1.setup(); HC_SR04_2.setup(); } void loop() { static uint32_t past = 0; if (millis() - past >= 400) { HC_SR04_1.read(); Serial.println(); Serial.print("HC_SR04 1= "); Serial.print(HC_SR04_1.dis_sm); if ( HC_SR04_1.dis_sm == 0 || HC_SR04_1.dis_sm > 50) Led1.OFF(); else Led1.ON(); HC_SR04_2.read(); Serial.println(); Serial.print("HC_SR04 2= "); Serial.print(HC_SR04_2.dis_sm); if ( HC_SR04_2.dis_sm == 0 || HC_SR04_2.dis_sm > 50) Led2.OFF(); else Led2.ON(); } }Теперь есть реакция на приближение к датчикам, но если растояние меняется то светодиоды моргают.
Издержки УЗ датчиков. Можете отключить один и попробовать . Может в одиночку стабильней будет.
Нет, так же моргает.
Если это не пойдет, то больше идей нет.
/* ардуино пин 12 <-> светодиод 1 (ledPin1) ардуино пин 11 <-> светодиод 2 (ledPin2) ардуино пин 6 <-> TRIG УЗ1 (Trig1) ардуино пин 7 <-> ECHO УЗ1 (Echo1) ардуино пин 8 <-> TRIG УЗ2 (Trig2) ардуино пин 9 <-> ECHO УЗ2 (Echo2) */ //-----------------Cl_Led---------------------------- class Cl_Led { const byte _pin; bool _led; public: Cl_Led(byte pin): _pin(pin) {} void setup() { pinMode(_pin, OUTPUT); digitalWrite(_pin, _led = 0); } void ON() { digitalWrite(_pin, _led = 1); } void OFF() { digitalWrite(_pin, _led = 0); } }; //-------------Cl_HC_SR04-------------------------------- class Cl_HC_SR04 { const byte _Trig_pin; const byte _Echo_pin; public: uint16_t dis_sm = 100; Cl_HC_SR04(byte Trig_pin, byte Echo_pin): _Trig_pin(Trig_pin), _Echo_pin(Echo_pin) {} void setup() { pinMode(_Trig_pin, OUTPUT); digitalWrite(_Trig_pin, LOW); pinMode(_Echo_pin, INPUT); } unsigned int read() { digitalWrite(_Trig_pin, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(_Trig_pin, LOW); // Затем убираем dis_sm = pulseIn(_Echo_pin, HIGH, 6000ul) / 58; return dis_sm; // возврат данных в сантиметрах } }; //----------------------компоновка--------------------------- Cl_Led Led1(/*пин*/12); Cl_Led Led2(/*пин*/11); Cl_HC_SR04 HC_SR04_1(/*Trig*/6,/*Echo*/7); Cl_HC_SR04 HC_SR04_2(/*Trig*/8,/*Echo*/9); //-------------------main()----------------------- void setup() { Serial.begin(9600); Led1.setup(); Led2.setup(); HC_SR04_1.setup(); HC_SR04_2.setup(); } void loop() { static uint32_t past = 0; if (millis() - past >= 400) { HC_SR04_1.read(); Serial.println(); Serial.print("HC_SR04 1= "); Serial.print(HC_SR04_1.dis_sm); if ( HC_SR04_1.dis_sm == 0); else if (HC_SR04_1.dis_sm > 50) Led1.OFF(); else Led1.ON(); HC_SR04_2.read(); Serial.println(); Serial.print("HC_SR04 2= "); Serial.print(HC_SR04_2.dis_sm); if ( HC_SR04_2.dis_sm == 0); else if (HC_SR04_2.dis_sm > 50) Led2.OFF(); else Led2.ON(); } }На УЗ1 иногда проскакивают ещё мырги, на УЗ2 нет. Второе, если подойти к датчикам и уйти в сторону то светодиоды продолжают светиться. Если подойти и так же отойти то всё чётко - тухнут.