Дальномер HC-SR04

crazyman2004
Offline
Зарегистрирован: 21.07.2013

Подключил девайс из сабжа, закодил его таким примером

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

но проблема в том что как бы я не изменял расстояние перед дальнометром, постоянно получаю Out of range

подскажите из-за чего такое происходит, куда смотреть чтобы исправить?

crazyman2004
Offline
Зарегистрирован: 21.07.2013

попробовал другой код

const int Trig = 3; // обозначим к какой ножке и что подключаем 
const int Echo = 2;
void setup()
{
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
Serial.begin(9600); // Инициализируем сериал порт, дабы вывести результат на монитор
}

unsigned int time_us=0; // Переменная для хранения временного интервала
unsigned int distance_sm=0; // Переменная для хранения расстояния в сантиметрах

void loop()
{
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig, LOW); // Затем убираем
time_us=pulseIn(Echo, HIGH, 25000); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
Serial.print(distance_sm); // Выводим на порт
Serial.print(" ");
delay(500);
}

он постоянно ноль выдает (

Snubist
Offline
Зарегистрирован: 18.02.2013

Использовал этот код, брал помоему в примерах.

#define echoPin 7 // Echo Pin
#define trigPin 8 
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup() {
  // put your setup code here, to run once:
Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */ 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 Serial.println(distance);
 

 
 //Delay 50ms before next reading.
 delay(500);  
}

все работало отлично

crazyman2004
Offline
Зарегистрирован: 21.07.2013

тоже самое, ноль и больше ничего

Snubist
Offline
Зарегистрирован: 18.02.2013

Тогда проверяй железо. Правильно ли высталены пины. Хорший ли контакт, ...

Araris
Offline
Зарегистрирован: 09.11.2012

У меня при работе HC-SR04 слышны пакеты щелчков из него (да, я знаю, что 40 кГц по паспорту, но тем не менее), послушайте свой.

Пользую, кстати, библиотеку NewPing.

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring

Version 0.1-2013/08/04

подносим руку к дальномеру на расстояние не боле 9 сантиметров (параметр можно изменять),

сразу включится timer_led (жёлтый светодиод) информируя нас что мы "дотянулись до дальномера",

и сразу убираем руку (у нас полторы секунды чтоб успеть убрать руку )

timer_led отключается и включится led5 светодиод.

повторяя это телодвижение включаем led6 и led7



если удерживать руку перед дальномером больше 2 секунд все светодиоды led выключатся



----------------------------------------­-- 

скетч sketch: 

v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring

http://yadi.sk/d/MDGctp9B7Zz7y

================================ 

изчего состоит;

1.ARDUINO, или ATMEGA328P-PU Microcontrolle?r ARDUINO UNO Bootloader и 16MHz Crystal

2. дальномер HC-SR04 Distance Measuring 

3. Breadboard макетная плата

не обязательно; 

4. USB To RS232 TTL PL2303HX Auto Converter Module Converter Adapter для питания и заливки скетча + кнопка 

5. Светодиоды нужны только для визуального контроля за процессом.


/*             v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
 ****************************
 урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
 v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
 Version 0.1-2013/08/04
 -----------------------------
 изменения; в Version 0.1- 
 1. 
 2. 
 ------------------------------
 идеология;
 подносим руку к дальномеру на расстояние не боле 9 сантиметров (параметр можно изменять),
 сразу включится timer_led (жёлтый светодиод) информируя нас что мы "дотянулись до дальномера",
 и сразу убираем руку  (у нас полторы секунды чтоб успеть убрать руку )
 timer_led отключается и включится led5 светодиод.
 повторяя это телодвижение включаем led6 и led7
 
 если удерживать руку перед дальномером больше 2 секунд все светодиоды  led выключатся
 
 ------------------------------------------ 
 скетч sketch: 
 v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
 http://yadi.sk/d/MDGctp9B7Zz7y
 ================================ 
 изчего состоит;
 1.ARDUINO, или ATMEGA328P-PU Microcontrolle?r ARDUINO UNO Bootloader и 16MHz Crystal
 2. дальномер HC-SR04 Distance Measuring 
 3. Breadboard макетная плата
 не обязательно; 
 4. USB To RS232 TTL PL2303HX Auto Converter Module Converter Adapter для питания и заливки скетча + кнопка 
 5. Светодиоды нужны только для визуального контроля за процессом.
 --------------------------------
 программное:
 2. Библиотеки.
 =======================================================
 подробную видео инструкцию выложу здесь
 v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
 http://www.youtube.com/watch?v=_IlmwgxwG7A&feature=c4-overview&list=UU7a...
 
 ++++++++++++++++++++++++++++++ 
 Вспомогательные видео обзоры, скетчи.....
 
 Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
 http://www.youtube.com/watch?v=joSc-AT8o5k
 
 
 Arduino загрузить sketch В ATmega. USB To RS232 TTL PL2303HX Converter Adapter
 http://www.youtube.com/watch?v=W4LPlKKb__8
 
 sketch Demo HC-SR04 Distance Measuring
 http://yadi.sk/d/Xf14rWXW7Zz6E
 
 *******************************************************
 магазины где я покупал детали для устройства
 
 1pcs Ultrasonic Module HC-SR04 Distance Measuring Transducer Sensor for Arduino
 http://www.ebay.com/itm/1pcs-Ultrasonic-Module-HC-SR04-Distance-Measurin...
 
 5 X ATMEGA328P-PU Microcontrolle?r With ARDUINO UNO Bootloader
 http://www.ebay.co.uk/itm/5-X-ATMEGA328P-PU-Microcontrolle-r-With-ARDUIN...
 
 
 20Pcs New 16.000MHZ 16MHZ 16M HZ HC-49S Crystal Oscillator
 http://www.ebay.co.uk/itm/20Pcs-New-16-000MHZ-16MHZ-16M-HZ-HC-49S-Crysta...
 
 
 New Mini Solderless Breadboard Transparent Material 400 Points Available DIY
 http://www.ebay.co.uk/itm/New-Mini-Solderless-Breadboard-Transparent-Mat...
 
 
 USB To RS232 TTL PL2303HX Auto Converter Module Converter Adapter For arduino
 http://www.ebay.com/itm/USB-To-RS232-TTL-PL2303HX-Auto-Converter-Module-...
 
 
 ************************************************************
 
 */

//для дальномера
int TrigPin = 8;
int EchoPin = 9;

//для светодиодов
int led5 = 5;
int led6 = 6;
int led7 = 7;

//1.для удержания в HIGH пока рука не убрана
//2. для визуального контроля
int timer_led = 2;


//переменная для подсчета времени, продолжительности удержания руки перед дальномером
int position = 0;

void setup()
{
  pinMode(TrigPin,OUTPUT);
  pinMode(EchoPin,INPUT);

  pinMode(led5, OUTPUT); 
  pinMode(led6, OUTPUT); 
  pinMode(led7, OUTPUT);

  pinMode(timer_led, OUTPUT); 
}
void loop()
{
  int distance,duration;

  digitalWrite(TrigPin,HIGH);
  delayMicroseconds(11);
  digitalWrite(TrigPin,LOW);
  duration = pulseIn(EchoPin, HIGH);


  // устанавливаем расстояние для дальномера (impulseTime<900)
  //например только, после поднесения руки ближе чем 9 сантиметров  <900  ардуино начнёт обрабатывать команды
  //этот параметр можно настроить по своему вкусу

  if (duration<900) // Если расстояние менее 9 сантиметров 
  {     
    digitalWrite(timer_led, HIGH); // Светодиод горит 
  }  
  else 
  {   
    digitalWrite(timer_led, LOW); // иначе не горит 
  }   
  delay(100);   //защита от дребезга

  //после обнаружения (появления) сигнала ,начинаем прибавлять к переменной position по единице + 1
  if (duration<900) position = position + 1;


  //if(position > 0 если поднесена рука
  //проверяем убрана рука или нет &&(digitalRead(timer_led) == LOW
  //если рука НЕ убрана то с led нечего не делаем
  //если рука  убрана в течение 1 секунды включаем led7, HIGH. И ставим обратно в ноль position = 0

  // то бишь если рука не убрана в течение 1 секунды переменная position продолжает нарастать дальше
  //и дойдя где то за 2 секунды до значения 7 if (position > 6 ) выключит все led   

  if(position > 0 && (digitalRead(timer_led) == LOW && (digitalRead(led7) == LOW )))
    digitalWrite(led7, HIGH),(position = 0);
  delay(100); //чтоб успели убрать руку до начала следующей команды

  if(position > 0 && (digitalRead(timer_led) == LOW && (digitalRead(led7) == HIGH && (digitalRead(led6) == LOW ))))
    digitalWrite(led6, HIGH),(position =0);

  if(position > 0 && (digitalRead(timer_led) == LOW && (digitalRead(led6) == HIGH )))
    digitalWrite(led5, HIGH),(position =0);


  //чем более значение (position > 6, тем больше потребуется удерживать руку для отключения всех led
  if (position > 6 )digitalWrite(led7, LOW),digitalWrite(led6, LOW),digitalWrite(led5, LOW),(position =0),delay(1000); 
}

 

Cruetly
Offline
Зарегистрирован: 08.02.2015

Привет!Пока не буду создавать тему и напишу здесь,может кто поможет.

У меня проблема, когда расстояние становится такое что ответ в течении заданного времени (по умолчанию в библиотеке стоит 1с)-не получен (тобишь я отвожу датчик на большое расстояние 1м-9999м) ардуинка начинает слать постоянно 0 метров, встроенный светодиод на 13 пине перестает моргать и горит постоянно, даже если я снова подношу руку к датчику на расстояние 0-40 см, она как бы виснет в таком положении.А если залить скеч и не убирать руку от датчика более чем на 50см то всё норм, если больше-виснет. Сейчас заметил что чихнув, я вывел ардуинку из этого состояния :) и она снова начала отправлять сигналы и замерять расстояния, проверил — хлопки, постукивания и прочая имитация сигнала тоже выводит его из этого состояния.В чем может быть проблема? :wo_ol: 

Arduino pro mini 5v 16mhz , Arduino IDE 1.6.1 ,использовал библиотеку Ultrasonic и скетч из этого поста - http://robocraft.ru/blog/electronics/772.html

еще пробовал скетч из этого видео http://www.youtube.com/watch?v=MrkyIOtG6ok

он там в описании к видео вставил ссылку на скетч, скетч без использования библиотеки, у меня опять же виснет если отдалить на большое расстояние, и перестает слать импульсы

Serg16
Offline
Зарегистрирован: 15.05.2015

//HC-SR04
int echoPin = 9;
int trigPin = 8;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  float duration, cm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH, 17460);
  cm = duration / 58.2;
  if (cm > 300 || cm < 1)
  {
    Serial.println(" Out of Range");
  }
  else
  {

    Serial.print(cm, 1);
    Serial.println(" cm");
    delay(100);
  }
}

Основа   duration = pulseIn(echoPin, HIGH, 17460);

Чем мньше число 17460, тем быстрее возврат будет к измерению, но меньше максимальное растояние измерения.

17460 = 300 см * 58,2

Arhat109
Offline
Зарегистрирован: 26.05.2015

Тоже задам тут свой вопрос:

Arduino Mega 2560 R3, но у меня с кварцем на 12Мгц и этот же датчик.

Все скетчи, работают нормально. Но, при калибровке датчика внезапно оказалось что верный коэффициент деления у меня 75.2, взамен стандартного 58 - 59 ... как понимаю, если частота кварца и должна влиять, то наиборот, в меньшую сторону...

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Китайская Мега? Тогда большой кварц слева сверху платы - это кварц для USB<->UART ( обычно СН340g). А сам кварц на 16 МГц очень маленький, находится слева снизу контроллера.

Arhat109
Offline
Зарегистрирован: 26.05.2015

Угу, Китай. Упс, а слона-то я и неп приметил... пасибки. А почто калибровать пришлось "нестандартно"?

 

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Та же проблема с датчиком. Если расстояние кратковременно превысило пол-метра, датчик перестаёт работать. При этом светодиод tx, который мигал раз в 50мс, начинает мигать раз в секунду. Помогает рестарт датчика (но не ардуины) по питанию. ВОт и вопрос, если датчик повисает, почему меняется поведение ардуины? Или когда с датчика туфта приходит, ардуина на ноль делить начинает? Не уже ли аппаратный watchDog придумывать на полевике придётся?

#define echoPin 7 // Echo Pin
#define trigPin 8
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance
 
void setup() {

  // put your setup code here, to run once:

Serial.begin (9600);

 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);

}

 

void loop() {

  // put your main code here, to run repeatedly:

/* The following trigPin/echoPin cycle is used to determine the
17
 distance of the nearest object by bouncing soundwaves off of it. */

 digitalWrite(trigPin, LOW);

 delayMicroseconds(2);

 

 digitalWrite(trigPin, HIGH);

 delayMicroseconds(10);
  

 digitalWrite(trigPin, LOW);

 duration = pulseIn(echoPin, HIGH);

  

 //Calculate the distance (in cm) based on the speed of sound.

 distance = (duration/58.2+2);

  

  

 /* Send the distance to the computer using Serial protocol, and
32
 turn LED OFF to indicate successful reading. */

 Serial.print(distance);
 Serial.println("  Cm");
 
 //Delay 50ms before next reading.

 delay(50); 
}
 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я бы не рискнул пользоваться pulseIn без таймаута. По логике, он в этом месте просто обязан зависать.

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Таймаут я пробовал. Пишут, что по умолчанию он определён в секунду, что, кстати, и объясняет изменение в частоте посылок на комп. На разных сайтах пишут об аналогичной проблеме, а о решениях не пишут. Видимо, датчики из разных партий ведут себя по-разному. Какие-то перестартовывают после отсутствия эха, а какие-то ждут его бесконечно. Я вот думаю, если запитать датчик от одного из пинов, а в прогу ввести цикл, подсчитывающий количество нулей, пришедших подряд. И по переполнению некоего счётчика, сбрасывать питание датчика на пол-секунды. А значение хранить последнее годное до устранения всех проблем. Не тяжеловато ли порту будет, пишут, что дачтик 15мА берёт? Или есть более изящные способы решения? Пробовал и другой код (из примера ультрасоник....)так же.

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

Свой вопрос с дальномером я решил через замер длительности импульса по прерыванию от PCINT2 .. и задержка скетча на время замера меня больше не волнует. Измеряет точно и качественно до мм.

Ну и по таймауту: дальность по чуствительности приемника в даташите указана в 5м. Это по времени около 30 миллисекунд. Ставить таймаут на большее значение, имхо - бессмысленно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Тарас Петрович пишет:

Таймаут я пробовал. Пишут, что по умолчанию он определён в секунду, что, кстати, и объясняет изменение в частоте посылок на комп. На разных сайтах пишут об аналогичной проблеме, а о решениях не пишут. Видимо, датчики из разных партий ведут себя по-разному. Какие-то перестартовывают после отсутствия эха, а какие-то ждут его бесконечно. Я вот думаю, если запитать датчик от одного из пинов, а в прогу ввести цикл, подсчитывающий количество нулей, пришедших подряд. И по переполнению некоего счётчика, сбрасывать питание датчика на пол-секунды. А значение хранить последнее годное до устранения всех проблем. Не тяжеловато ли порту будет, пишут, что дачтик 15мА берёт? Или есть более изящные способы решения? Пробовал и другой код (из примера ультрасоник....)так же.

1. Вы физику хоть немного пыталтсь просчитать?

За секунду звук проходит примерно 340м. Интенсивность звуковой волня затухает как квадрат расстояния. Вы всерьез рассчитываете, что датчик обоадает достаточной чувствительностью, чтобы почувствовать сигнал отраженный от предмета, расположенного в 170 метрах от излучателя?

МАксимальная дальность указывается в дэйташитах на конкретный прибор. Для тех, что используется в Ардуино, она составляет порядка 2.5м. На 170м интенсивность эха будет в 4600 раз меньше и датчик его не услышит. Значит, таймаут нужно ставить примерно на 2.5*2/340=15мс.

 

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

 

3. О каких нулях Вы говорите? Что пришли от датчика в то время, когда он излучает?

Представьте себя на его месте. Вот Вы заблудились в лесу и кричите "Ау!", чтобы Вас услышали и ответили. Как Вы будете поступать? Вы прокричите, а потом прислушаетесь, есть ли ответ. Если Вы будете кричать беспрерывно, ответа Вы не услышите, т.к. Ваш голос его заглушит. ТОчно так же и с датчиком. Мы включилим излучатель, сделали посылку сигнала, выключили излучатель и ждем эха. Если мы не выключим излучатель, датчик будет реагировать на звук излучателя, а не на эхо.

 

Вывод: нужне не "брать другой код", который неизвестно кем, когда и для чего написан, а разбираться в физике и самому писать именно тот код, который решает Вашу конкретную задачу.

nevkon
Offline
Зарегистрирован: 20.01.2015

Дааа... Поиском пользоваться не умеем. Решение уже есть, хотя я если честно до сих пор его не опробовал: http://arduino.ru/forum/apparatnye-voprosy/hc-sr04-apparatnye-problemy?page=1

Тарас Петрович
Offline
Зарегистрирован: 21.11.2015

Спасибо всем откликнувшимся, а особенно nevkon за годную ссылочку. Действительно, если кратковременно замкнуть эхо на землю, датчик оживает. За час работы (с большим количеством потеряных посылок) ничего значительно не нагрелось. 

#define echoPin 7 // Echo Pin
#define trigPin 8

long duration, distance, lasdistance; // Duration used to calculate distance

void setup() {

  // put your setup code here, to run once:

Serial.begin (9600);

 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 }

 

void loop() {

  /*  */
int tries=0;
do{
   digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
   digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
   digitalWrite(trigPin, LOW);
 
 duration = pulseIn(echoPin, HIGH, 50000);

 //Calculate the distance (in cm) based on the speed of sound.

 distance = (duration/58.2);


   if (duration == 0 ) {
            delay(100);
            pinMode(echoPin, OUTPUT);
            digitalWrite(echoPin, LOW);
            delay(100);
            pinMode(echoPin, INPUT);
        }
    } while (duration == 0 && ++tries < 3);
    if (duration == 0){
      // Out of range
      Serial.print(" ");
      Serial.print("OSHIBKA :(");
      Serial.println(" ");
      delay(500);
      }
    else{
      // Read ok!
 /* Send the distance to the computer using Serial protocol  */

      Serial.print("Rasstoyanie  ");
      Serial.print(distance);
      Serial.println("  Cm");
 
 //Delay 50ms before next reading.

 delay(500); }
}

 

Arc-dc
Offline
Зарегистрирован: 23.08.2016

Добрый день. Задача стоит в измерении угла, пронадеявшись на акселерометр с гиро mpu6050 (погрешности большие чисто по математике). 

Решил попробовать этот датчик под задачу. подключение и базовые скетч взят из http://zelectro.cc/HC-SR04 

И собственно вопрос который пока не разобрал - можно ли измерять с точностью более 1см. Понятно что в коде можно поставить мм и пересчитывая в мм взять коэф. 5,8 вместо 58 (для см)

distance_mm=impulseTime/5.8;

работает, выдает значения приближенные к реальности (к приложенной линейке)).

Что нашел на датчик это http://robocraft.ru/files/sensors/Ultrasonic/HC-SR04/HC-SR04.pdf в котором говорится о разрешающей способности 0,3см. Так меняя в коде значения переменной (см на мм) можно надеяться на точность в мм?

Или не стоит.. или ко всему нужно менять выходной импульс с 10мкс или это не принципиально (считаю что можно оставить, но мнение хотелось бы услышать)

 

nevkon
Offline
Зарегистрирован: 20.01.2015

На точность выше сантиметра я бы не надеялся, хотя можно приблизиться к миллиметровому диапазону сделав 10-20-100 последовательных измерений и рассчитать по Гауссу например.

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

Можно получать точность в миллиметровом диапазоне согласно даташиту. Но ваш пример для таких измерений не годится, измерять длительность нужно по прерываниям или таймером по сигналу захвата. Ну и "типовой делитель" - никуда не годен для точных измерений. Правильное преобразование: t*343/2048 (сдвиг право на 11 разрядов). Это для стандартной скорости звука в нормальных условиях (типовое состояние внутри помещений 1-го этажа), ошибка преобразования - менее 0.1мм.

Есть готовый код на прерываниях PCINT .. смотрите github/ARHAT_H .. можете переработать под себя как Вам удобно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вообще-то для точных измерений по минимуму нужен еще и термометр, чтобы скорость звука брать не с потолка, а рассчитывать для конкретной температуры.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

Вообще-то для точных измерений по минимуму нужен еще и термометр, чтобы скорость звука брать не с потолка, а рассчитывать для конкретной температуры.

Тогда плюсовать сюда ещё и коррекцию по влажности воздуха ;)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если влажность менее 100%, это не окажет сколь-нибудь заметного влияния на результат.

Vestint
Offline
Зарегистрирован: 25.06.2016

Ребят помогите с hc-sr04. Абсолютно полный ноль в программировании.

В общем имею рабочий скетч, но нужно чтобы при поднесении руки на расстояние 40 см включалось реле и работало бы 3-5 минут после того как руку убрать. как я не пытался лепить код куда попало, у  меня ничего не выходило. вы знатоки. ткинте пальцем что куда поставить. буду Вам весьма признаателен.

const int Trig = 6; 
const int Echo = 7; 
const int ledPin = 8;  // 13 – если будете использовать встроенный в Arduino светодиод
unsigned long previousMillis = 0;
unsigned long interval = 180000;

void setup() 
{ 
pinMode(Trig, OUTPUT); 
pinMode(Echo, INPUT); 
pinMode(ledPin, OUTPUT); 
  
Serial.begin(9600); 
}

unsigned int time_us=0;

unsigned int distance_sm=58;

void loop() 
{ 
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера 
delayMicroseconds(10); // Удерживаем 10 микросекунд 
digitalWrite(Trig, LOW); // Затем убираем 
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса 
distance_sm=time_us/58; // Пересчитываем в сантиметры 
Serial.println(distance_sm); // Выводим на порт

if (distance_sm<40) // Если расстояние менее 40 сантиметром 
{ 
   digitalWrite(ledPin, 1); // Зажигаем светодиод 
} 
else 
{ 
   digitalWrite(ledPin, 0); // иначе тушим 
} 
  
delay(1000); 
}
}

 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Попробуйте

const int Trig = 6; 
const int Echo = 7; 
const int ledPin = 8;  // 13 – если будете использовать встроенный в Arduino светодиод
unsigned long lastActuationMillis = 0;
unsigned long interval = 180000;

void setup() 
{ 
pinMode(Trig, OUTPUT); 
pinMode(Echo, INPUT); 
pinMode(ledPin, OUTPUT); 
  
//Serial.begin(9600); 
}

void loop() 
{ 
// Опрашиваем датчик ПОСТОЯННО
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера 
delayMicroseconds(10); // Удерживаем 10 микросекунд 
digitalWrite(Trig, LOW); // Затем убираем 
unsigned int time_us = pulseIn(Echo, HIGH); // Замеряем длину импульса 
unsigned int distance_sm = time_us/58; // Пересчитываем в сантиметры 
// Serial.println(distance_sm); // Выводим на порт

// Анализируем результат опроса датчика
if ( distance_sm < 40 ) // Если расстояние менее 40 сантиметром 
 { 
 lastActuationMillis = millis(); // запоминаем время последнего включения
 digitalWrite(ledPin, 1); // Зажигаем светодиод 
 } 

// Проверяем, не порa ли выключить  
if (millis() - lastActuationMillis > interval) 
 {
 digitalWrite(ledPin, 0); // тушим 
 } 
delay(250); // дадим датчику "отдохнуть" )))
}

// Максимальная частота опроса датчика: 20Гц (Период опроса 50мс)

 

Vestint
Offline
Зарегистрирован: 25.06.2016

Заработала))) Спасибо большое) 

ua3msi
Offline
Зарегистрирован: 07.05.2017
highprofi
Offline
Зарегистрирован: 22.12.2018

Araris, задействовал ваш код в выключателе света в туалете, работает отлично.

Теперь появилась необходимость привязать вентиляцию к данной системе

Логика вроде не сложная, но как реализовать в коде не соображу

Появилась единичка на ledPin, ждем к примеру 120 сек, если не пропала (курим ,или сидим по большому) включаем ledPin2 на 20 минут.

Помогите кодом, пожалуйста

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

А если и через 20 минут "не пропала"? 

highprofi
Offline
Зарегистрирован: 22.12.2018

Вентилятор должен заработать через 120 сек после включения ledPin, и работать 20 минут после отключения. Тоесть таймер отключения вентилятора стартует после отключения света

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

А если кому-нибудь приспичит в течение этих 20 минут? Вентилятор-то уже включён.

highprofi
Offline
Зарегистрирован: 22.12.2018

Если он там задержится более 120 секунд, таймер отключения можно перезапустить

highprofi
Offline
Зарегистрирован: 22.12.2018

Всем спасибо.

Я сделал то что хотел на FLProg. Теоретически работать должно. Практически проверю завтра-послезавтра.

highprofi
Offline
Зарегистрирован: 22.12.2018

Вот мои изыски. Все работает. Код прикладывать не буду, т.к. он создается автоматом. И там нет комментариев.

highprofi
Offline
Зарегистрирован: 22.12.2018

Какой-то косяк с картинкой, всё размыто. Пытаюсь поменять разрешение, становится только хуже.

Работает так:

сигнал с датчика приходит на реле сравнения СОМР1. Если значение с датчика меньше заданного, реле срабатывает.

Своим контактом, через блок дребезга контактов (поставил для фильтрации разовых абстрактных данных с датчика), включает реле времени КТ1 с задержкой на отключение 15 сек.

Своим контактом КТ1 подает единичку  на 9pin. Вторым контактом включает реле времени КТ2 с задержкой на включение на 2 минуты.

Своим контактом КТ2 включает реле времени с задержкой на отключение 20мин. При срабатывании подает единичку на 13pin.

sadman41
Offline
Зарегистрирован: 19.10.2016

highprofi пишет:

Какой-то косяк с картинкой, всё размыто. Пытаюсь поменять разрешение, становится только хуже.

С FLProg-ом всегда так.

highprofi
Offline
Зарегистрирован: 22.12.2018

Нет, косяк с вставкой картинки на сайте. Походу нехило пережимает. У меня на скриншоте все хорошо.

А FLProg работает неплохо кстати. На нем за неполный час я смог сделать то, чего не смог за полдня активного гугления, разбора чужих примеров, и попыток подогнать последний код на этой странице под свои хотелки. Я не программист не разу, зато релейно-контакторные схемы читаю и немного с промышленными контроллерами знаком.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

highprofi пишет:

Нет, косяк с вставкой картинки на сайте. Походу нехило пережимает. У меня на скриншоте все хорошо.

Сайт не принимает картинки шириной больше, если мне не изменяет память, 780 пикселей. Все, что больше - ужимает.

Поэтому не следуеть делать скриншот шириной во весь экран - уменьшите окошко программы до 780 пикселей в ширину.

highprofi
Offline
Зарегистрирован: 22.12.2018