hc-sr04 Наполнение бочки для полива, помогите пожалуйста.
- Войдите на сайт для отправки комментариев
Ср, 27/04/2016 - 21:15
Есть емкость на 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 мс. */
}
У Вас есть две границы, нижняя 90см и верхняя 10см. Область определения для работы мотора от 90 до 10. Помните математику за 7-й класс, как находится область определения функции графическим методом? Нарисовали бы на листочке и стало бы понятно, ибо наглядно. :)
В нижней границе мотор необходимо включить, в верхней - выключить.
const int LowLevel=90, HighLebel=10; if (Level>=LowLevel) {включить}; // как только вода слилась до нижнего уровня, включаем мотор if (Level<=HighLevel) {выключить}; // как только вода набралась до верхнего уровня, выключаем моторИзвените за безграмотность но очень хочется реализовать проект
При компиляции кода программа ругается на строку
if (Level<=HighLevel) {выключить}; // как только вода набралась до верхнего уровня, выключаем мотор
Почему так происходит ?
Потому что надо не тупо копировать, а сначала понять что копируешь.
Должно получиться так ?
#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) {выключить}; // как только вода набралась до верхнего уровня, выключаем мотор }Примерно. Только в loop() надо ещё регулярно получать этот самый Level с датчика .. :)
УЗ датчик на 100% влажность + конденсат как реагирует?
Советую ( настоятельно) добавить усреднение показаний датчика.
А то они очень любят часто бросаться случайными импульсами от нуля до бесконечности.
И прочтите про третий параметр
pulseIn(pin, value, timeout)
http://arduino.ru/Reference/PulseIn
Видимо "смотря какой датчик" или "какая библиотека" .. мой работает как часы с точностью в 1мм на всем диапазоне измерений.
Или я "что-то делаю не так"? :)
В итоге, продолжительной работы и основной помощью одного из участников данного проекта, был скомпелирован скетч, и загружен в Ардуину, но похоже Ардуина не правильно понимает 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!"); }#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!"); }"О сколько нам открытий чудных, готовит Просвещенья дух ..". (с) Кто-то из древних.
Приятно видеть, что у Вас получилось.
Надо было не "поменял HIGH на LOW", а понять почему надо было поменять. Не ждать пока один напишет логику решения, а другой найдёт ошибку Вашей реализации логики. :)
Надо было не "поменял HIGH на LOW", а понять почему надо было поменять. Не ждать пока один напишет логику решения, а другой найдёт ошибку Вашей реализации логики. :)
Господь с Вами, о чём это Вы? Вы разве не поняли почему компилятор ругался на строку
if (Level>=LowLevel) {включить};Открою Вам страшный секрет - потому. что именно в таком виде она компилятору и подсовывалась :)))
Надо было не "поменял HIGH на LOW", а понять почему надо было поменять. Не ждать пока один напишет логику решения, а другой найдёт ошибку Вашей реализации логики. :)
Господь с Вами, о чём это Вы? Вы разве не поняли почему компилятор ругался на строку
if (Level>=LowLevel) {включить};Открою Вам страшный секрет - потому. что именно в таком виде она компилятору и подсовывалась :)))
Очевидно! Я как раз и предложил человеку попытаться думать. Но, мало ли, может там совсем юное создание, или наоборот человек преклонных лет, или литературный критик, или разовая задача... :)