hc-sr04 Наполнение бочки для полива, помогите пожалуйста.

kka
Offline
Зарегистрирован: 25.04.2016

Есть емкость на 1000 литров, дальномер hc-sr04, электромагнитный клапан 12 вольт, Ардуино UNO и реле.

Задача ултразвукового hc-sr04: Включить реле ( открыть клапан ) на  расстоянии 90 см от дальномера и выключить реле на расстоянии 10 см, и ОЧЕНЬ важный цикл - НЕ включать реле пока уровень воды не опустился на 90 см, потом открыл клапан, емкость наполнилась до 10 см от УЗ hc-sr04, и снова реле выключилось, и НЕ включается до 90 см.  Нашел в форуме код но для моей задачи он не пдходит. Помогите с кодом.

 
#define Trig 6
#define Echo 7
#define ledPin 8

void setup() 
{  
  pinMode(Trig, OUTPUT); //инициируем как выход 
  pinMode(Echo, INPUT); //инициируем как вход 
  pinMode(ledPin, OUTPUT); 
  Serial.begin(9600); 
  /* задаем скорость общения. В нашем случае с компьютером */
} 
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

void loop() 
{  
  digitalWrite(Trig, HIGH); 
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  Serial.println(distance_sm); // Выводим на порт 
  if (distance_sm<40) // Если расстояние менее 30 сантиметром 
  {     
    digitalWrite(ledPin, HIGH); // Светодиод горит 
  }  
  else 
  {   
    digitalWrite(ledPin, LOW); // иначе не горит 
  }   
  delay(100); 
  /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. 
   Это время называется периодом цикла (cycle period). 
   Рекомендованный период между импульсами должен быть не менее 50 мс.  */
}

 

 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

У Вас есть две границы, нижняя 90см и верхняя 10см. Область определения для работы мотора от 90 до 10. Помните математику за 7-й класс, как находится область определения функции графическим методом? Нарисовали бы на листочке и стало бы понятно, ибо наглядно. :)

В нижней границе мотор необходимо включить, в верхней - выключить.

const int LowLevel=90, HighLebel=10;

if (Level>=LowLevel) {включить}; // как только вода слилась до нижнего уровня, включаем мотор
if (Level<=HighLevel) {выключить}; // как только вода набралась до верхнего уровня, выключаем мотор

 

kka
Offline
Зарегистрирован: 25.04.2016

Извените за безграмотность но очень хочется реализовать проект  

При компиляции кода программа ругается на строку 

if (Level<=HighLevel) {выключить}; // как только вода набралась до верхнего уровня, выключаем мотор

Почему так происходит ?

Jek
Offline
Зарегистрирован: 05.01.2014

Потому что надо не тупо копировать, а сначала понять что копируешь.

kka
Offline
Зарегистрирован: 25.04.2016

Должно получиться так ?

#include <Ultrasonic.h>

#define Trig 6
#define Echo 7
#define ledPin 8

void setup() 
{  
  const int LowLevel=90, HighLebel=10;

  pinMode(ledPin, OUTPUT); 
   
} 


void loop() 
{  
  if (Level>=LowLevel) {включить}; // как только вода слилась до нижнего уровня, включаем мотор
  if (Level<=HighLevel) {выключить}; // как только вода набралась до верхнего уровня, выключаем мотор
  
}

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Примерно. Только в loop() надо ещё регулярно получать этот самый Level с датчика .. :)

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

УЗ датчик на 100% влажность + конденсат как реагирует?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Советую ( настоятельно) добавить усреднение показаний датчика.
А то они очень любят часто бросаться случайными импульсами от нуля до бесконечности.
И прочтите про третий параметр
pulseIn(pin, value, timeout)

http://arduino.ru/Reference/PulseIn

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Видимо "смотря какой датчик" или "какая библиотека" .. мой работает как часы с точностью в 1мм на всем диапазоне измерений.

Или я "что-то делаю не так"? :)

kka
Offline
Зарегистрирован: 25.04.2016

В итоге, продолжительной работы и основной помощью одного из участников данного проекта, был скомпелирован скетч, и загружен в Ардуину, но похоже Ардуина не правильно понимает on, off, реле выключено на расстоянии более 90 см и включено при менее 90 как надо, но на 10 см ни как не реагирует хотя должно выключиться, пока ситуация вот такая, буду разбираться с работой.

#include <Ultrasonic.h>

#define Trig 6
#define Echo 7
#define ledPin 8
#define ON HIGH // если реле инверсное, то LOW
#define OFF LOW // если реле инверсное, то HIGH
const int LowLevel=90;
const int HighLevel=10;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(Trig, OUTPUT); //возможно это не нужно
pinMode(Echo, INPUT); //возможно это не нужно
}

void loop()
{
int volume = readUltrasonic();
if(volume > HighLevel) relay(ON);
if(volume < LowLevel) relay(OFF);
delay(100);
}

int readUltrasonic()
{
unsigned int impulseTime=0;
unsigned int distance_sm=0;
digitalWrite(Trig, HIGH);
/* Подаем импульс на вход trig дальномера */
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(Trig, LOW); // Отключаем
impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=impulseTime/58; // Пересчитываем в сантиметры
//Serial.println(distance_sm); // Выводим на порт
return distance_sm;
}
 
#define RELAY_PIN   8   // реле подключено к пину 13
void relay(byte state)
{
  digitalWrite(RELAY_PIN, state);
 // Serial.print("Relay click!");
}

 

kka
Offline
Зарегистрирован: 25.04.2016
Ура !!! Ура !!! Ура !!! Поменял в некоторых строках HIGH на LOW, ON на OFF и все получилось !!!  
Благодаря Tomasina (из другого форума) ПРИОГРОМНЕЙШЕЕ Вам СПАСИБО !!!!!!  
Работает так : (по месту скоро прикреплю) Бочка пустая - включается эл.клапан - наполняет бочку - наполнилась - выключился клапан - при сливе воды до 90 см ни чего ни происходит (так и надо ) - бочка опустела до 90 см клапан открылся наполняет. Полный цикл !!!
Собственно сам результат 100% рабочий: Может кому пригодится !
#include <Ultrasonic.h>

#define Trig 6
#define Echo 7
#define ledPin 8
#define ON LOW // если реле инверсное, то LOW
#define OFF HIGH // если реле инверсное, то HIGH
const int HighLevel=90;
const int LowLevel=10;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(Trig, OUTPUT); //возможно это не нужно
pinMode(Echo, INPUT); //возможно это не нужно
}

void loop()
{
int volume = readUltrasonic();
if(volume > HighLevel) relay(ON);
if(volume < LowLevel) relay(OFF);
delay(100);
}

int readUltrasonic()
{
unsigned int impulseTime=0;
unsigned int distance_sm=0;
digitalWrite(Trig, HIGH);
/* Подаем импульс на вход trig дальномера */
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(Trig, LOW); // Отключаем
impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=impulseTime/58; // Пересчитываем в сантиметры
//Serial.println(distance_sm); // Выводим на порт
return distance_sm;
}
 
#define RELAY_PIN   8   // реле подключено к пину 8
void relay(byte state)
{
  digitalWrite(RELAY_PIN, state);
 // Serial.print("Relay click!");
}

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

"О сколько нам открытий чудных, готовит Просвещенья дух ..". (с) Кто-то из древних.

Приятно видеть, что у Вас получилось.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Надо было не "поменял HIGH на LOW", а понять почему надо было поменять. Не ждать пока один напишет логику решения, а другой найдёт ошибку Вашей реализации логики.  :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

faeton пишет:

Надо было не "поменял HIGH на LOW", а понять почему надо было поменять. Не ждать пока один напишет логику решения, а другой найдёт ошибку Вашей реализации логики.  :)

Господь с Вами, о чём это Вы? Вы разве не поняли почему компилятор ругался на строку

if (Level>=LowLevel) {включить};

Открою Вам страшный секрет - потому. что именно в таком виде она компилятору и подсовывалась :)))

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

ЕвгенийП пишет:

faeton пишет:

Надо было не "поменял HIGH на LOW", а понять почему надо было поменять. Не ждать пока один напишет логику решения, а другой найдёт ошибку Вашей реализации логики.  :)

Господь с Вами, о чём это Вы? Вы разве не поняли почему компилятор ругался на строку

if (Level>=LowLevel) {включить};

Открою Вам страшный секрет - потому. что именно в таком виде она компилятору и подсовывалась :)))

Очевидно! Я как раз и предложил человеку попытаться думать. Но, мало ли, может там совсем юное создание, или наоборот человек преклонных лет, или литературный критик, или разовая задача... :)