Ультразвуковой Модуль HC-SR04+реле

PEN
Offline
Зарегистрирован: 21.04.2017

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

PEN
Offline
Зарегистрирован: 21.04.2017

PEN пишет:
PEN пишет:
Ардуино Уно+ультразвуковой датчик + реле - все подключил работает но реле часто срабатывает,лампочка мигает как светомузыка.

Вопрос остался открытым ,кто что подскажет

IVAN222
Offline
Зарегистрирован: 19.04.2017

 

Поставь конденсатор, начни с 1 мкф и увеличивай емкость.

bwn
Offline
Зарегистрирован: 25.08.2014

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

P/S Вот интересно, если покалечишься, к хирургу идешь или газету с разделом "снятие сглаза и порчи" покупаешь?

PEN
Offline
Зарегистрирован: 21.04.2017

IVAN222 пишет:

 

Поставь конденсатор, начни с 1 мкф и увеличивай емкость.

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

PEN
Offline
Зарегистрирован: 21.04.2017

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

PEN пишет:
Я понимаю Вас всех бесит когда едет на автомобиле с буквой У но вспомните все через это проходили. Сами были такими.
 Особено бесит, когда новичек букву У путает с Синей Мигалкой.  Хорошая традиция это дать плюху новичку, что бы он все же увидел у себя эту букву У, и не путал с мигалкой.

PEN
Offline
Зарегистрирован: 21.04.2017

Вы все такие умны 99 % правил не знаете про мигалки разговаривате

PEN
Offline
Зарегистрирован: 21.04.2017

Если по существу не чего сказать проходим мимо

IVAN222
Offline
Зарегистрирован: 19.04.2017

bwn
Offline
Зарегистрирован: 25.08.2014

PEN пишет:
Если по существу не чего сказать проходим мимо

По существу, ты сделал, что в 54 посте сказано?

PEN
Offline
Зарегистрирован: 21.04.2017

У меня провода подключенные как у Вас с права коричневый,серый ,белый с лева вообще не подключено.конденсатора нет и не припаивал

IVAN222
Offline
Зарегистрирован: 19.04.2017

На провода не смотри, это рисунок с интернета. Если у Вас задействована  левая половина то как на ресунке (установка конденсатора), если правая то зеркално перенеси на правую.

IVAN222
Offline
Зарегистрирован: 19.04.2017

У Вас с левой стороны джампер стоит и как он стоит?

PEN
Offline
Зарегистрирован: 21.04.2017

У меня с лева есть 3 контакта vcc vcc gnd так джампер стоит на vcc

IVAN222
Offline
Зарегистрирован: 19.04.2017

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

PEN
Offline
Зарегистрирован: 21.04.2017

Jeka_M пишет:

Чем больше разница между значениями в строках 25 и 29, тем меньше должна моргать (ложно срабатывать) лампочка. Запаса в 6 см я думаю хватит.

#define Trig 9
#define Echo 8
#define ledPin 7

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<30) // Если расстояние менее 30 сантиметров 
  {     
    digitalWrite(ledPin, HIGH); // Светодиод горит 
  }  
  if (distance_sm>35) // Если расстояние более 35 сантиметров 
  {   
    digitalWrite(ledPin, LOW); // иначе не горит 
  }   
  delay(100); 
}

 


Можно попробовать,тыкни пальцем и
29 страницу убирать?

bwn
Offline
Зарегистрирован: 25.08.2014

Не, какой убежденный балбес. Как шаман в третьем поколении, утверждаю, если убрать питание с реле и оставить только VCC и IN0 по схеме с 53 поста, с вероятностью в 98% все заработает. Но легкие пути не для нас, скрепов и православия маловато.

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

bwn пишет:

Не, какой убежденный балбес. 

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

IVAN222
Offline
Зарегистрирован: 19.04.2017
#define Trig 9
#define Echo 8
#define ledPin 7

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

unsigned int impulseTime=0;
unsigned int distance_sm=0;
uint32_t time=10000;
 
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<30) // Если расстояние менее 30 сантиметром
  { 
    digitalWrite(ledPin, HIGH); // Светодиод горит 
  }
  else
   if( millis()-time > 10000) //  задан интервал 10сек.
  {  
    digitalWrite(ledPin, LOW); // иначе не горит
     time = millis();
  }  
}

Попробуй , если, что подкорректируй.

PEN
Offline
Зарегистрирован: 21.04.2017

IVAN222 Большое тебе спасибо,сейчас мало таких отзывчивых людей в этой теме только пару человек дали дельные советы,остальные только тролить могут.Я еще не вкурил только зарегистрировался могу я тебе балы поставить ?

IVAN222
Offline
Зарегистрирован: 19.04.2017

Спасибо. Это лишнее.

PEN
Offline
Зарегистрирован: 21.04.2017

IVAN222 пишет:

#define Trig 9
#define Echo 8
#define ledPin 7

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

unsigned int impulseTime=0;
unsigned int distance_sm=0;
uint32_t time=10000;
 
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<30) // Если расстояние менее 30 сантиметром
  { 
    digitalWrite(ledPin, HIGH); // Светодиод горит 
  }
  else
   if( millis()-time > 10000) //  задан интервал 10сек.
  {  
    digitalWrite(ledPin, LOW); // иначе не горит
     time = millis();
  }  
}

Попробуй , если, что подкорректируй.


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

bwn
Offline
Зарегистрирован: 25.08.2014

Не слухаешь шамана, ню ню.

PEN
Offline
Зарегистрирован: 21.04.2017

bwn пишет:

Не слухаешь шамана, ню ню.


Кажи шаман шо робиты треба,паять конденсатор к плате?

bwn
Offline
Зарегистрирован: 25.08.2014

Посты: 68, 61, 54.

afen
Offline
Зарегистрирован: 24.04.2017

Это потому что HC-SR04 измеряет все что угодно но только не расстояние. Проблема в том что ультразвук от датчика разному отражается от разных поверхностей. Выведи данные с датчика и направляй на разные поверхности (кофты шубы рубашки) получишь разные данные.

Я делал от обратного.  Если в туалете никого нет то расстояние от стены до стены 80см  (на кафеле показания точны) если расстояние не в пределах 75-85 см то в туалете кто-то есть.

А еще мелкие дети обязательно засунут туда палец и сломают и  погнут сеточку, в результате чего датчик врать будет еще больше 

 

IVAN222
Offline
Зарегистрирован: 19.04.2017

HC-SR04 работает хорошо когда обьект имеет гладкую поверхность, одежда если она еще и ворсистая ультразвук отражается плохо или вобще не отражается. В данном случае установи канденсатор на 10-50 мкф и установи скейч (пост 4).

IVAN222
Offline
Зарегистрирован: 19.04.2017

Еще вариант HS-SR501+ релейный модуль, ардуина тогда не нужна, но HS-SR501 работает когда обьект (человек) переодически двигается (в HS-SR501есть переменный реостатик которым можно сделать задержку ну примерно на 0,5 -200 секунд ) , если не двигатся дольше установленного времени свет потухнет, если опять будет какое то движение свет опять включется мин. на установленное время.

PEN
Offline
Зарегистрирован: 21.04.2017

IVAN222 пишет:

HC-SR04 работает хорошо когда обьект имеет гладкую поверхность, одежда если она еще и ворсистая ультразвук отражается плохо или вобще не отражается. В данном случае установи канденсатор на 10-50 мкф и установи скейч (пост 4).


Конднсатор в реле нужно паять? а как его через макетку подключить ?

PEN
Offline
Зарегистрирован: 21.04.2017

IVAN222 пишет:

Еще вариант HS-SR501+ релейный модуль, ардуина тогда не нужна, но HS-SR501 работает когда обьект (человек) переодически двигается (в HS-SR501есть переменный реостатик которым можно сделать задержку ну примерно на 0,5 -200 секунд ) , если не двигатся дольше установленного времени свет потухнет, если опять будет какое то движение свет опять включется мин. на установленное время.

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

IVAN222
Offline
Зарегистрирован: 19.04.2017

пин 7 + канденсатора,  END  - канденсатора.  Кандер начни с 10 мкф, чем больше емкость тем больше задержка.

IVAN222
Offline
Зарегистрирован: 19.04.2017

Желательно бы еще диод поставить.

диод любой маломощный.

IVAN222
Offline
Зарегистрирован: 19.04.2017
ua3msi
Offline
Зарегистрирован: 07.05.2017
piharev1
Offline
Зарегистрирован: 10.07.2019

Здравствуйте! Вы знаете, я из-за Вас зарегистрировался, посмотрел всякие значения, очень понравился сайт, голову не греет как множество видио

кстати(1) ваш скетч работает на ура, я 2 дня такое пытался сделать ничего не вышло

кстати(2)   опыт работы с ардуино 6 дней

Yurik
Offline
Зарегистрирован: 02.03.2020

Добрый день! В копилку мой вариант датчика присутствия человека в комнате на ардуино  и модуле HC-SR04.

1й вариант

// board_pro_micro_32u4 
// dalnomer_partronic 
    #define echoPin 2 
    #define trigPin 3 
    #define LedPin 4 
    #define LedPinBoard 17 // 17pin RX_Led
    #define NUM_avg 1500 
    #define NUM_mm *11/64  // 344/2000 ~~ 11/64 
  volatile uint32_t dim_t0, dim_t1;
  uint32_t tt, nn, old_nn, cc, old_cc, dist, old_dist, avg;
  uint8_t timer, old_timer;
  String str, stp;  
//
// медиана на N значений с буфером
uint32_t FindMedian(uint32_t newVal) {
  #define NUM_READ 8  // порядок медианы
  static uint32_t buff, buffer[NUM_READ];
  static uint8_t i, c;
  buffer[c] = newVal;
  if ((c < NUM_READ - 1) and (buffer[c] > buffer[c + 1])) {
    for (i = c; i < NUM_READ - 1; i++) {
      if (buffer[i] > buffer[i + 1]) {
        buff = buffer[i];
        buffer[i] = buffer[i + 1];
        buffer[i + 1] = buff;
       } } } else {
    if ((c > 0) and (buffer[c - 1] > buffer[c])) {
      for (i = c; i > 0; i--) {
        if (buffer[i] < buffer[i - 1]) {
          buff = buffer[i];
          buffer[i] = buffer[i - 1];
          buffer[i - 1] = buff;
        } } } }
  if (++c >= NUM_READ) {c = 0;}
  return buffer[NUM_READ/2]; }
//
// фильтр среднее с буфером
uint32_t RunMiddleArifm(uint32_t newVal) {
  #define NUM_Array 8  // порядок фильтра
  static uint32_t ret, buff, buffer[NUM_Array];
  static uint8_t i;
  if (++i >= NUM_Array) {i = 0;}
      buff += newVal;
      buff -= buffer[i];
      buffer[i] = newVal;
      ret = buff / NUM_Array;
      return ret; }
// 
    void int0() { dim_t1=micros();      // длительность высокого сигнала на пине Echo t1-t0
      //  if (digitalRead(echoPin)==1)  // on
         if (PIND & (1 << 1))           // D1 2pin
        { dim_t0=dim_t1; } } 
//
    void setup() { sei(); }
    void loop() { 
      pinMode(echoPin, INPUT_PULLUP);   // INPUT_PULLUP
      attachInterrupt(1, int0, CHANGE); // D1 2pin
      pinMode(trigPin, OUTPUT);
      pinMode(LedPin, OUTPUT);
      pinMode(LedPinBoard, OUTPUT);
      Serial.begin (115200); 
      Serial.print("\f\n\r"); 
      stp = "  OFF ";
   while (1) {  
      tt = micros(); 
      nn = tt - tt % (50000);                 // 50ms. ~~8.5м
      if (old_nn != nn) { 
    //  digitalWrite(trigPin, HIGH);          // on Trig 
      PORTD |= (1 << 0);    // высокий уровень D0 3pin
      delayMicroseconds(10);                  // delay 10 μs 
    //  digitalWrite(trigPin, LOW);           // off Trig 
      PORTD &= ~(1 << 0);   // низкий  уровень D0 3pin
    // dist = pulseIn(echoPin, HIGH, 30000);  // длительность высокого сигнала на пине Echo
    // if (dist==0) {dist=30000;}             // 30ms. ~~5.15м
      if (dim_t1 > dim_t0) {dist=dim_t1-dim_t0;} 
      else {dist=30000;}                 
      dist = dist NUM_mm;
      if (dist < 50) {dist=50;}          // min mm
      else if (dist > 5000) {dist=5000;} // max mm           
      dist = FindMedian(dist);
    //  dist = RunMiddleArifm(dist);     
      old_nn = nn; } 
      else { delayMicroseconds(10000); } // sleep 10ms.
// код...
    cc = tt - tt % 1000000;              // 1сек.
    if (old_cc != cc) {
       if (dist > NUM_avg) { 
         if (avg > dist) {avg -= (avg-dist+8)/8;} // мм/сек Cреднее, адаптация
         else { avg = dist; } }                   // dist >> avg >> NUM_avg  
       else { avg = NUM_avg; }                    // min NUM_avg 
      if (avg > dist + 50) {                      // триггер 50mm.       
        if (timer == 1) { timer += 1; }
        else if (timer < 1) { timer = 6; } }      // таймер 5сек. статус             
      if (timer > 0) { timer -= 1; }     
     old_cc = cc; old_dist=0; } 
// код...   
    if(old_dist != dist) { 
      if (old_timer != timer) { 
        if (timer != 0) { stp = "  ON  ";
      //  digitalWrite(LedPin, HIGH); 
           PORTD |= (1 << 4);     // высокий уровень PD4 4pin
      //  digitalWrite(LedPinBoard, LOW);
           PORTB &= ~(1 << 0); }  // низкий  уровень PB0 17pin RX_Led 
        else { stp = "  OFF ";
      //  digitalWrite(LedPin, LOW); 
           PORTD &= ~(1 << 4);    // низкий  уровень PD4 4pin
      //  digitalWrite(LedPinBoard, HIGH);
           PORTB |= (1 << 0); }   // высокий уровень PB0 17pin RX_Led 
          old_timer = timer; }
      str = stp + " timer> " +  String(timer) + " avg> " + String(avg) + " dist> " + String(dist) + " mm. speed> "+String(micros()-tt)+" us.     \r";
      Serial.print(str);  
      old_dist = dist; 
    } } } 
//end

 

2й вариант

// board_nano_328p 
// dalnomer_partronic 
    #define echoPin 2 
    #define trigPin 3 
    #define LedPin 4 
    #define LedPinBoard 13 
    #define NUM_avg 1500 
    #define NUM_mm *11/64  // 344/2000 ~~ 11/64 
  volatile uint32_t dim_t0, dim_t1;
  uint32_t tt, nn, old_nn, cc, old_cc, dist, old_dist, avg;
  uint8_t timer, old_timer;
  String str, stp;  
//
// медиана на N значений с буфером
uint32_t FindMedian(uint32_t newVal) {
  #define NUM_READ 8  // порядок медианы
  static uint32_t buff, buffer[NUM_READ];
  static uint8_t i, c;
  buffer[c] = newVal;
  if ((c < NUM_READ - 1) and (buffer[c] > buffer[c + 1])) {
    for (i = c; i < NUM_READ - 1; i++) {
      if (buffer[i] > buffer[i + 1]) {
        buff = buffer[i];
        buffer[i] = buffer[i + 1];
        buffer[i + 1] = buff;
       } } } else {
    if ((c > 0) and (buffer[c - 1] > buffer[c])) {
      for (i = c; i > 0; i--) {
        if (buffer[i] < buffer[i - 1]) {
          buff = buffer[i];
          buffer[i] = buffer[i - 1];
          buffer[i - 1] = buff;
        } } } }
  if (++c >= NUM_READ) {c = 0;}
  return buffer[NUM_READ/2]; }
//
// фильтр среднее с буфером
uint32_t RunMiddleArifm(uint32_t newVal) {
  #define NUM_Array 8  // порядок фильтра
  static uint32_t ret, buff, buffer[NUM_Array];
  static uint8_t i;
  if (++i >= NUM_Array) {i = 0;}
      buff += newVal;
      buff -= buffer[i];
      buffer[i] = newVal;
      ret = buff / NUM_Array;
      return ret; }
// 
    void int0() { dim_t1=micros();   // длительность высокого сигнала на пине Echo t1-t0 
   //  if (digitalRead(echoPin)==1)  // on 
      if (PIND & (1 << 2))           // D2 2pin 
        { dim_t0=dim_t1; } } 
//
    void setup() { sei(); }
    void loop() { 
      pinMode(echoPin, INPUT_PULLUP);   // INPUT_PULLUP 
      attachInterrupt(0, int0, CHANGE); // D2 2pin 
      pinMode(trigPin, OUTPUT);
      pinMode(LedPin, OUTPUT);
      pinMode(LedPinBoard, OUTPUT);
      Serial.begin (115200); 
      Serial.print("\f\n\r"); 
      stp = "  OFF ";
   while (1) {  
      tt = micros(); 
      nn = tt - tt % (50000);                 // 50ms. ~~8.5м
      if (old_nn != nn) { 
    // digitalWrite(trigPin, HIGH);           // on Trig 
      PORTD |= (1 << 3);    // высокий уровень D3 3pin
      delayMicroseconds(10);                  // delay 10 μs 
    // digitalWrite(trigPin, LOW);            // off Trig 
      PORTD &= ~(1 << 3);   // низкий  уровень D3 3pin
    // dist = pulseIn(echoPin, HIGH, 30000);  // длительность высокого сигнала на пине Echo
    // if (dist==0) {dist=30000;}             // 30ms. ~~5.15м
      if (dim_t1 > dim_t0) {dist=dim_t1-dim_t0;} 
      else {dist=30000;}                 
      dist = dist NUM_mm;
      if (dist < 50) {dist=50;}          // min mm
      else if (dist > 5000) {dist=5000;} // max mm           
      dist = FindMedian(dist);
    //  dist = RunMiddleArifm(dist);     
      old_nn = nn; } 
      else { delayMicroseconds(10000); } // sleep 10ms.
// код...
    cc = tt - tt % 1000000;              // 1сек.
    if (old_cc != cc) {
       if (dist > NUM_avg) { 
         if (avg > dist) {avg -= (avg-dist+8)/8;} // мм/сек Cреднее, адаптация
         else { avg = dist; } }                   // dist >> avg >> NUM_avg  
       else { avg = NUM_avg; }                    // min NUM_avg 
      if (avg > dist + 50) {                      // триггер 50mm.       
        if (timer == 1) { timer += 1; }
        else if (timer < 1) { timer = 6; } }      // таймер 5сек. статус             
      if (timer > 0) { timer -= 1; }     
     old_cc = cc; old_dist=0; } 
// код...   
    if(old_dist != dist) { 
      if (old_timer != timer) { 
        if (timer != 0) { stp = "  ON  ";
       // digitalWrite(LedPin, HIGH); 
         PORTD |= (1 << 4);     // высокий уровень PD4 4pin
       // digitalWrite(LedPinBoard, HIGH);
         PORTB |= (1 << 5); }   // высокий уровень PB5 13pin
        else { stp = "  OFF ";
       //  digitalWrite(LedPin, LOW); 
         PORTD &= ~(1 << 4);    // низкий  уровень PD4 4pin
       //  digitalWrite(LedPinBoard, LOW);
         PORTB &= ~(1 << 5); }  // низкий  уровень PB5 13pin     
          old_timer = timer; }
      str = stp + " timer> " +  String(timer) + " avg> " + String(avg) + " dist> " + String(dist) + " mm. speed> "+String(micros()-tt)+" us.     \r";
      Serial.print(str);  
      old_dist = dist; 
    } } } 
//end

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

надо попробовать

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

надо попробовать

Не пробуй каку!!! Воняеть...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

надо попробовать

Не пробуй каку!!! Воняеть...

да я о коде...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

DetSimen пишет:

ua6em пишет:

надо попробовать

Не пробуй каку!!! Воняеть...

да я о коде...

И я о коде