Ультразвуковой датчик HC-SR04

Сергей M
Offline
Зарегистрирован: 23.09.2017

Добрый вечер !

Для создания девайса для своего аквариума нужна Ваша помощь, о чём я и прошу. Речь идёт о автодоливе воды.

Имеется Ардуино Уно, датчик расстояния HC-SR04 и обычный светодиод. В сети нашёл самый простой и наиболее подходящий скетч: 

#define echoPin 7 // Вывод Echo 
#define trigPin 8 // Вывод Trigger
#define LEDPin 13 // Светодиод "вне зоны доступа"

int maximumRange = 20; // Максимально доступный диапазон
int minimumRange = 4;   // Минимально доступный диапазон
long duration, distance; // Длительность эхо, расстояния

void setup() {
 Serial.begin (9600); //Включаем отладочный вывод
 //Настраиваем порты
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(LEDPin, OUTPUT); 
}

void loop() {
 //Выключаем Trigger
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 
 //Посылаем 10мкс импульс на Trigger
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 digitalWrite(trigPin, LOW);
 //Считаем длительность сигнала эхо
 duration = pulseIn(echoPin, HIGH);
 
 //Рассчитываем расстояние (по скорости звука)
 distance = duration/58.2;
 
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Выводим отрицательное значение расстояния на компьютер и зажигаем светодиод
 "Вне зоны доступа"*/
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH); 
 }
 else {
 /* Отправляем расстояние на компьютер и гасим светодио */
 Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
 }
 
 //Delay 50ms before next reading.
 delay(50);
}

Понравился тем что в рамках заданного расстояния можно отслеживать уровень воды. Вместо/или в парралель  светодиоду установив пищалку получится "алярм", в случае когда уровень воды от автослива опустится ниже нужного уровня(20см, 5-я строчка скетча) или выше(4см, 6-я строчка) - светодиод и пищалка дадут знать. 

Но это в вышеописанном скетче присутствует. Моя просьба в другом. Можете добавить ещё один диапазон, чтоб он как раз и управлял столь желаемым мной -автодоливом, посредством подключения через реле??? Тот диапазон что есть сейчас (4см-20см) - останется для аварийного сигнализирования. Новый нужен в внутренних рамках, например 5см-19см, получается по 1см до аварийного срабатывания диапазона 4см-20см. Данные расстояния приблизительные. И можно ли чтоб светодиод /пищалка, диапазона 4-20 не просто включался - а моргал/пищал зуммером.

С уважением.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Обычно такие задачи решает
датчик давления.
Уз не вызывает доверия.
Мойник@мэйл.ру

Сергей M
Offline
Зарегистрирован: 23.09.2017

Датчик давления ?? какая у него точность ? 

Сергей Звягинцев
Offline
Зарегистрирован: 02.03.2017

arduino.maingroup@mail.ru, пишите, соревноваться готовы.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

В стиралках работает точно.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Вы серьёзно ?? Можете назвать цифры ?? точность в мл? 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

 Ну поищите свми в интернете. К тому же я не знаю требуемую вам точность. Для стиралки - точно. Для вас - решайте сами. А HC-SR04 сгниет за неделю из-за испарений.

Сергей M
Offline
Зарегистрирован: 23.09.2017

brokly пишет:
Ну поищите свми в интернете.

Так я даже не знаю что искать ?! Вы просто сказали - датчик давления, но их тысячи, как найти то что я даже не слышал ??

В HC-SR04 точность 3 мм, полностью подходит. Как я писал выше - данный девайс для аквариума. Датчик давления ультраточный должен быть - чтоб не доливать воду до края аквариума 2см, и при этом не учитывать движение воды от фильтра, рыбы, растений, не учитывать водорослевые зарастания, постоянного вмешательства любопытных рыб и т.п.

Я почему выбрал именно ультразвуковой - не в воде (рыбы, растения, вода), ничего не имеет прямого контакта с датчиками. Многие отказываются от самых долгих и точных в использовании поплавков, типа таких - https://ru.aliexpress.com/item/MYLB-SODIAL-R-Wired-Liquid-Water-Level-Sensor-Float-Switch-for-Aquarium/32745946983.html?spm=a2g0v.search0204.3.10.xF9iPy&ws_ab_test=searchweb0_0,searchweb201602_4_10152_10065_10151_10068_10344_10342_10343_10340_10341_10307_10137_10060_10155_10154_10056_10055_10054_5470020_10059_10532_100031_10099_5460020_10338_10339_10103_10102_10052_10053_10142_10107_10050_10051_10170_5380020_10326_10084_10083_5370020_10080_10082_10081_10110_10111_10112_10113_10114_143_10312_10313_10314_10078_10079_10073_10125,searchweb201603_14,ppcSwitch_5_ppcChannel&btsid=f7a57685-c1c2-4308-88c1-a84d917d0df4&algo_expid=a3551e16-67fa-45a8-b3dd-53b32f8cece7-0&algo_pvid=a3551e16-67fa-45a8-b3dd-53b32f8cece7 , так как при постоянном обрастании как самого поплавка, так и на оси датчика. Улитки и рыбы слишком любят всякие движущиеся предметы в воде. 

brokly пишет:
А HC-SR04 сгниет за неделю из-за испарений.

Есть такие проэкты, работают уже не один год, но к сожалению написаны не под ардуину, а под ATiny26, ни программатора ни умений прошивать такие чипы - пока нет. 

strarbit
Offline
Зарегистрирован: 12.06.2016

Сергей M пишет:
Есть такие проэкты, работают уже не один год, но к сожалению написаны не под ардуину, а под ATiny26, ни программатора ни умений прошивать такие чипы - пока нет.

Тоже самое можно написать для arduiono

Интересно, ультразвук рыбкам не вредит?????

 

Сергей M
Offline
Зарегистрирован: 23.09.2017

Можно и под ардуино - так именно за этим я тут )) А про вред рыбкам - пока не знаю, там 40KHz.

В дополнение к вышесказанному :

А не гниёт - так как нет прямого контакта, мало того - нет даже крышки, аквариум открытый поэтому испарения не оседают так серьёзно. Сам датчик будет в аккуратном корпусе, а излучатели уже приметил другие - https://ru.aliexpress.com/item/Transceiver-integrated-16mm-40KHz-Ultrasonic-Sensor-waterproof-type-Ultrasonic-module/32561790166.html?spm=a2g0v.search0204.3.2.0c9Siw&ws_ab_test=searchweb0_0,searchweb201602_4_10152_10065_10151_10068_10344_10342_10343_10340_10341_10307_10137_10060_10155_10154_10056_10055_10054_5470020_10059_10532_100031_10099_5460020_10338_10339_10103_10102_10052_10053_10142_10107_10050_10051_10170_5380020_10326_10084_10083_5370020_10080_10082_10081_10110_10111_10112_10113_10114_143_10312_10313_10314_10078_10079_10073_10125-10050,searchweb201603_14,ppcSwitch_5_ppcChannel&btsid=21fab4d7-ef64-40e6-8c70-81b52c4564ca&algo_expid=ab64b601-f1dc-4859-8ae2-690ab26d3a93-0&algo_pvid=ab64b601-f1dc-4859-8ae2-690ab26d3a93 им вообще всё равно, хоть подводный эхолот делать.

strarbit
Offline
Зарегистрирован: 12.06.2016

Ясно, спасибо! Хочется  не навредить рыбкам. Эти не работают, если вместо открытых TR впаять закрытые.

DrProg
Offline
Зарегистрирован: 07.08.2015

Чтобы, даже в теории, навредить рыбкам, надо пищать в режиме 24/7. А на самом деле с какой частотой можно опрашивать уровень? Раз в минуту? Раз в час?

Сергей M
Offline
Зарегистрирован: 23.09.2017

Ну теперь я задумался, наведу побольше справок насчёт вреда, так как хотел чтоб автодолив работал постоянно.

Но так как испаряется вода даже лелом не так сильно, можно включать раз в час например на 5 минут - можно и реже. А во время подмены воды - раз в день - на 10-15 минут.

Тогда и переживать не буду о здоровье рыбок )

Всем спасибо! Скетч написан и находится в стадии практической обкатки. Надеюсь данная тема будет полезна многим аквариумистам.

С уважением.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

в крайнем случае есть датчик "2 гвоздя" Soil moisture sensor + платка компаратор к нему. На основе этого набора можно сделать твой автодлив. без контроллера.

DrProg
Offline
Зарегистрирован: 07.08.2015

Мне тоже непонятно зачем нужен УЗ. Датчика из ТРЕХ гвоздей достаточно. Или двух поплавков. Чтобы отслеживать минимальный и максимальный уровень.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Гвозди или другие щупы — это уже ток в воде, который ещё более вреден рыбам, чем ультразвук. Так же ржавчина гвоздей или бактериальный налет на щупах — приводит к неточности, данные темы не раз поднимались на разных аквафорумах.
Про поплавки читайте выше, уже разъяснил. Тем более что они точно будут, так как перепроверку ещё никто не отменял. Без УЗдатчиков поплавков пришлось бы ставить 4шт., в разных углах аквариума. Если ставить всего 2 поплавка, и хоть на один из них залезет улитка — будет беда!! Всегда нужен резерв. А ставить 4 это очень не красиво, во всех аквариумах с такой системой это выглядит жутко. Не забываем что кроме этого ещё есть другое оборудование (нагреватели, датчики рН, температуры, трубки СО2 и кислорода, и много другого.
Надеюсь объяснил хоть часть. Ведь это далеко не все «подводные камни» в аквариумистике.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Космонаты МКС сейчас завидуют вашим рыбкам....

Электрические методы не подходят - они могут убить рыбок(вероятно).

пневматическо - гидравлические - не обладают требуемой точностью( наверное...).

оптические - не являются грязе/водо защищёнными.

УЗ - вызывает мутацию(возможно).

поплавки - залипают.

Остаётся поставить аквариум на весы - и доливать недостаток массы.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Конечно Вы во всем правы, поэтому это и звучит так смешно...
Намного легче и точнее бегать с ведром, подменивая 100л. воды в неделю из 400 литрового аквариума.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Специально для вас: https://mysku.ru/blog/aliexpress/56013.html

dmitron1036
Offline
Зарегистрирован: 10.01.2016

ёмкостной датчик - сами понимаете может быть опасен для рыбок. Там же электрический ток .

Сергей M
Offline
Зарегистрирован: 23.09.2017

dmitron1036, даже мене (полному неучу в Ардуино) понятно, что ёмкостной датчик не имеет прямого контакта с водой, поэтому никакого тока - в воду не попадёт. Только в отличие от Вас - здесь все дают дельные советы. Да, и на нашем аквафоруме клоунов хватает, которые заходят исключительно - "а поговорить". Ни слова по делу, только бла-бла и насмешки.

sadman41, Хорошее решение, многие сейчас с ним экспериментируют, к сожалению не для всех аквариумов он подходит. У меня именно этот случай, при лёгком обрастании стекла бактериальным налётом такие датчики перестают видеть воду через него, как бы "видят" её постоянно, и не выключаются. Но уверен что смогут что-то с ними придумать и обойти данную проблему.

Как более точный датчик можно рассматривать лазерные датчики расстояния.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Сергей M пишет:

Только в отличие от Вас - здесь все дают дельные советы. Да, и на нашем аквафоруме клоунов хватает, которые заходят исключительно - "а поговорить". Ни слова по делу, только бла-бла и насмешки.

Почему же, весы - тоже неплохой вариант, наверное. В изготовлении сложнее будет, но к любой конфигурации аквариума должна подойти. Если там не кашалот живет, конечно. Вам же, как понимаю, нужно красиво сделать и унитазный поплавок не подходит...

Тензодатчики на али есть, обвес к ним тоже. В принципе недорогие.

P.S. Но как-то это все небезопасно. Заклинит систему и будет насос к соседям воду гнать. Неплохо бы еще, наверное, как-то учитывать сколько вкачано в аквариум.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Пока нашёл для своих целей ультразвуковой датчик, он не в воде, для меня это главное, так как электродные виды датчиков не подходят, они влияют на показания рН датчика в воде, что послужит бесконтрольной подаче СО2 в воду, всего 2-4 часа и вся живность умирает.

Про тензодатчики не слышал, даже не представляю по какому принципу они работают, и как они могут точно доливать воду с точностью 1-1.5см до края аквариума. Обязательно почитаю о них.

Сергей M
Offline
Зарегистрирован: 23.09.2017

sadman41 пишет:
Р.S. Но как-то это все небезопасно. Заклинит систему и будет насос к соседям воду гнать. Неплохо бы еще, наверное, как-то учитывать сколько вкачано в аквариум.

Как писал выше - поплавковые датчики будут, но не в том кол-ве которые необходимо ставить при использовании только их. Будут только 2, верхнего и нижнего уровня, и будут использоваться как аварийные полностью выключая систему слива/долива.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Сергей M пишет:

Пока нашёл для своих целей ультразвуковой датчик, он не в воде, для меня это главное, так как электродные виды датчиков не подходят

Да, тут суть не в том, какой вы датчик нашли, а в том, что качества он неважнецкого на али. И таких звеньев цепи управления у вас достаточно. И каждое, как вы понимаете, повышает вероятность отказа. Поэтому - чем меньше электроники с алиэкспресса, тем надежней система.

А тензодатчик доливать не будет. С его помощью вы можете понять, сколько воды испарилось и начать лить, пока вес аквариума не превысит заданный. Способ тоже так себе по надежности, но, на мой взгляд, как альтернативу рассмотреть можно.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

У меня высшее образование по ЭДРРВ(ЭлектроДинамика и распространение РадиоВолн).

Поэтому я могу говорить, как вам кажется, ерунду.

Например: подходит любой из предложенных методов кроме того что вы хотите применить.

и это мы пытаемся втолковать вам уж третью страницу.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

вспомнил ещё один метод: линейка термисторов. даже серийно выпускаемую можно найти.

но! там опять же электрический ток.

Сергей M
Offline
Зарегистрирован: 23.09.2017

А где Вы, уважаемый, видели мою просьбу о совете по выбору каких-либо датчиков или других приспособлений???
В первом же посте я указал на необходимость написания кода для имеющегося датчика, всё. Были предложения, я обосновывал их непригодность в моём случае. Никого не просил ничего объяснять, а только выполнить условия указанные в первом посте.
Мне нужно знать РАССТОЯНИЕ от кромки стекла до поверхности воды, я выбрал датчик РАССТОЯНИЯ, что удивительного?
Никто при покупке сахара не измеряет его объём? нет же, почему то используют весы. При покупке плинтуса никто его не взвешивает, рулетка помогает. Или кто-то по весу себе газ в машину заправяет?, нет — по литражу/по м3.
Данная тема уже исчерпана, в связи с тем что код уже есть (как я писал выше), а разговоры просто ни о чем.
Всем спасибо.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Задача настолько проста, что гуру считают обидным за неё браться.

было:

if (distance >= maximumRange || distance <= minimumRange){
 /* Выводим отрицательное значение расстояния на компьютер и зажигаем светодиод
 "Вне зоны доступа"*/
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH);
 }

Надо 

#define LEDPin2 12
#define maximumRange2 20
#define minimumRange2 5
///////////////////////////// это было и остаётся:
 if (distance >= maximumRange || distance <= minimumRange){
 /* Выводим отрицательное значение расстояния на компьютер и зажигаем светодиод
 "Вне зоны доступа"*/
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH);
 }else{
 /* Отправляем расстояние на компьютер и гасим светодио */
 Serial.println(distance);
 digitalWrite(LEDPin, LOW);
 }

///// добавляем код тут:
if(distance <= maximumRange2 && distance >= minimumRange2){
  digitalWrite(LEDPin2, HIGH);
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

else {} с выключателем насоса забыли. Затопит же.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Эх гуру гуру...
То что Вы написали, простой пример проверки датчика. А где указанные диапазоны?
Вот то что искал:

#include "Arduino.h"

#define echoPin 7 // HC-SR04
#define trigPin 8 // HC-SR04
#define LEDInfo 11
#define LEDWarning 12
#define LEDError 13

long duration, distance;

void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDInfo, OUTPUT);
pinMode(LEDWarning, OUTPUT);
pinMode(LEDError, OUTPUT);
}

void loop() {

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration / 58.2;

/*
* 0-4 20 - > - LEDError1 (ON)
* 5 -19 - LEDInfo2 (ON)
* 4-5 19-20 LEDWarning3 (ON)
*/
if ((distance >= 0 && distance < 4) || distance > 20) {
//LEDError1 (ON)
if (digitalRead(LEDError) == LOW) {
digitalWrite(LEDError, HIGH);
}

} else {
//LEDError1 (OFF)
if (digitalRead(LEDError) == HIGH) {
digitalWrite(LEDError, LOW);
}
}

if (distance >= 5 && distance <= 19) {
//LEDInfo2 (ON)
if (digitalRead(LEDInfo) == LOW) {
digitalWrite(LEDInfo, HIGH);
}
} else {
//LEDInfo2 (OFF)
if (digitalRead(LEDInfo) == HIGH) {
digitalWrite(LEDInfo, LOW);
}
}
if ((distance >= 4 && distance < 5) || (distance > 19 && distance <= 20)) {
// LEDWarning3 (ON)
if (digitalRead(LEDWarning) == LOW) {
digitalWrite(LEDWarning, HIGH);
}
} else {
// LEDWarning3 (OFF)
if (digitalRead(LEDWarning) == HIGH) {
digitalWrite(LEDWarning, LOW);
}
}
delay(50);
}
Даже если будет насос — будет 1 поплавковый датчик на размыкание питания насоса долива, исключительно в страховочных целях. И ещё 1 на насос слива, тоже для страховки, не более. Если использовать только поплавки — их нужно 4, 2 основных(верх/низ), 2дублирующих страховочных.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Сорри, пишу с телефона, поэтому не могу корректно вставить код.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Люблю таких заказчиков! Насмотрятся "Битву экстрасенсов" и давай мысли на расстояние транслировать.

В прошлов веке такие задачи на одном транзисторе решали.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Никаких «битв», всё написано в первом посте.
Даже добавили 3—й светодиод показывающий состояние нормального уровня, между аварийным диапазоном (передолив и переслив) и диапазоном долива.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Что-то вам накидали кода, как будто вы им построчно платили. 

Я бы вот так  изобразил, пожалуй (вроде бы не ошибся в логике?):

...
error = warning = info = LOW;
                               
if (distance > maxError)           // 20
   { error   = HIGH; } 
else if (distance >= maxWarn)      // 19
   { warning = HIGH; }
else if (distance >= minInfo)      // 5 
   { info    = HIGH; }
else if (distance >= minWarn)      // 4
   { warning = HIGH; }
else if 
   { error   = HIGH; }

digitalWrite(ledInfo, info);
digitalWrite(ledWarning, warning);
digitalWrite(ledError, error);
...

 

 

Алексей911
Offline
Зарегистрирован: 04.11.2016
int _FLPArray170567780[1];
int _ultrasonic1O = 0;
unsigned long _ultrasonic1P = 0UL;
void setup()
{
pinMode(5, OUTPUT);

pinMode(4, OUTPUT);
pinMode(3, INPUT);
}
void loop()
{



if (abs((millis() - _ultrasonic1P))>100) {
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);
int _ultrasonicTemp=(pulseIn(3, HIGH))/58;
if( _ultrasonicTemp<200) {_ultrasonic1O=_ultrasonicTemp;}
_ultrasonic1P=millis();}
digitalWrite(5, ((_ultrasonic1O)) > ((_FLPArray170567780[0])));




}

 

CatSoup
Offline
Зарегистрирован: 01.05.2017

У меня уже год стоят 2 бочки отстойника для воды из скважины с электроклапанами включающими отстояную воду в разбор и набирающиеся одна за другой - уровень контролируется ультразвуком, доступный объем чистой воды пересчитывается в литры и выводится на дисплей. Ничего не гниет, одна плата полита лаком, другая - термоклеем. 

skif
skif аватар
Offline
Зарегистрирован: 24.03.2015

Сергей M пишет:

Датчик давления ?? какая у него точность ? 

плюс-минус 10 см. 

Сергей M
Offline
Зарегистрирован: 23.09.2017

Ого, -10см +10см = 20см

У ультразвука точность 3мм.

skif
skif аватар
Offline
Зарегистрирован: 24.03.2015

Знаю, собирал на нём робота. А датчик давления от стиралки - резиновая мембрана с концевиками, срабатывает от веса воды. К тому же и высота срабатывания нестабильна.  Если что, пишите на почту. Возможно, помогу. skif7361@ya.ru

 

 

CatSoup
Offline
Зарегистрирован: 01.05.2017

Сергей M пишет:

Ого, -10см +10см = 20см

У ультразвука точность 3мм.

Исходя из реально получаемых уже год цифр на воде +/- 1см у него точность, зависит от температуры воздуха. Ближе 10 см - становится еще хуже. В даташите про точность вообще ни слова.

Сергей M
Offline
Зарегистрирован: 23.09.2017

Уруз, типа да, но всё уже готово (как я писал выше) , поэтому уже не актуально.