Подсветка рабочей зоны кухни

viktor001
Offline
Зарегистрирован: 31.12.2016

Добрый день! Задался вопросом об автоматической подсветке рабочих зон в кухне. Нашёл в инете код, но он работает процентов на 30. Значит имеем два HC-SR04 для двух зон и кнопку для принудительного включения зоны №1. Из всего этого нормально работает только зона №2. На кнопку никак не реагирует, а на датчик срабатывает но не гаснет. 


// подключаем библиотеку I2C:
#include <Wire.h>
// подключаем библиотеку датчика BH1750:
#include <BH1750.h>

// объявляем объект lightMeter:
BH1750 lightMeter;

int a = 0;
const int Trig1 = 6;
const int Echo1 = 7;
const int Trig2 = 8;
const int Echo2 = 9;
const int ledPin1 = 12;  // 13 – если будете использовать встроенный в Arduino светодиод
const int ledPin2 = 11;

long previousMillis = 0;   // здесь будет храниться время последнего изменения состояния светодиода
long interval = 1000;      // интервал мигания в миллисекундах

void setup()
{
  pinMode(Trig1, OUTPUT);
  pinMode(Echo1, INPUT);
  pinMode(Trig2, OUTPUT);
  pinMode(Echo2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);

  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
  lightMeter.begin(); //инициализация датчика BH1750
}

unsigned int time_us = 0;

unsigned int distance_sm1 = 0;
unsigned int distance_sm2 = 0;

void loop()
{
  //считываем показания с BH1750:
  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light:");
  Serial.print(lux);
  Serial.println("lx");
  delay(100);

  digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
  delayMicroseconds(10); // Удерживаем 10 микросекунд
  digitalWrite(Trig1, LOW); // Затем убираем
  time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса
  distance_sm1 = time_us / 58; // Пересчитываем в сантиметры
  Serial.println(distance_sm1); // Выводим на порт

  digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера
  delayMicroseconds(10); // Удерживаем 10 микросекунд
  digitalWrite(Trig2, LOW); // Затем убираем
  time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса
  distance_sm2 = time_us / 58; // Пересчитываем в сантиметры
  Serial.println(distance_sm2); // Выводим на порт

  if (lux < 80) {
    if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром
    {
      digitalWrite(ledPin1, 1); // Зажигаем светодиод
      previousMillis = millis();
    }
    else
    { if (previousMillis - millis() > previousMillis) {
        previousMillis = millis();
      }
      if (millis() - previousMillis > interval) {
      digitalWrite(ledPin1, 0); // тушим
      }
    }

    // для второго датчика
    if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром
    {
      digitalWrite(ledPin2, 1); // Зажигаем светодиод
      delay(400);
    }
    else
    {
      digitalWrite(ledPin2, 0); // иначе тушим
    }
  }
  if (lux > 80) {
    if (digitalRead(3) == HIGH)
    {
      a = 1;
    }
    if (a == 1) {
      Serial.println(distance_sm1); // Выводим на порт
      if (distance_sm1 < 50) // Если расстояние менее 50 сантиметром
      {
        digitalWrite(ledPin1, 1); // Зажигаем светодиод
        delay(400);
      }
      else
      {
        digitalWrite(ledPin1, 0); // иначе тушим
        a = 0;
      }

    }
  }
}

Если прописать кнопку - const int knopka = 3; и pinMode(knopka, INPUT_PULLUP); то кнопка отрабатывает нормально. Незнаю насколько это правильно, но работает.

[code]
// подключаем библиотеку I2C:
#include <Wire.h>
// подключаем библиотеку датчика BH1750:
#include <BH1750.h>

// объявляем объект lightMeter:
BH1750 lightMeter;

int a = 0;
const int knopka = 3;
const int Trig1 = 6;
const int Echo1 = 7;
const int Trig2 = 8;
const int Echo2 = 9;
const int ledPin1 = 12;  // 13 – если будете использовать встроенный в Arduino светодиод
const int ledPin2 = 11;

long previousMillis = 0;   // здесь будет храниться время последнего изменения состояния светодиода
long interval = 1000;      // интервал мигания в миллисекундах

void setup()
{
  pinMode(Trig1, OUTPUT);
  pinMode(Echo1, INPUT);
  pinMode(Trig2, OUTPUT);
  pinMode(Echo2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(knopka, INPUT_PULLUP);
  Serial.begin(9600);
  lightMeter.begin(); //инициализация датчика BH1750
}

unsigned int time_us = 0;

unsigned int distance_sm1 = 0;
unsigned int distance_sm2 = 0;

void loop()
{
  //считываем показания с BH1750:
  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(400);

  digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
  delayMicroseconds(10); // Удерживаем 10 микросекунд
  digitalWrite(Trig1, LOW); // Затем убираем
  time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса
  distance_sm1 = time_us / 58; // Пересчитываем в сантиметры
  Serial.println(distance_sm1); // Выводим на порт

  digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера
  delayMicroseconds(10); // Удерживаем 10 микросекунд
  digitalWrite(Trig2, LOW); // Затем убираем
  time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса
  distance_sm2 = time_us / 58; // Пересчитываем в сантиметры
  Serial.println(distance_sm2); // Выводим на порт

  if (lux < 80){
    if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром
    {
      digitalWrite(ledPin1, 1); // Зажигаем светодиод
      previousMillis = millis();
    }
    else
    { if (previousMillis - millis() > previousMillis) {
        previousMillis = millis();
      }
      if (millis() - previousMillis > interval) {
        digitalWrite(ledPin1, 0); // тушим
      }
    }
  if (lux < 80)// для второго датчика
    if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром
    {
      digitalWrite(ledPin2, 1); // Зажигаем светодиод
      delay(400);
    }
    else
    {
      digitalWrite(ledPin2, 0); // иначе тушим
    }
}
 if (lux > 80){
  if (digitalRead(3) == HIGH)
  {
    a = 1;
  }
  if (a == 1) {
    Serial.println(distance_sm1); // Выводим на порт
    if (distance_sm1 < 80) // Если расстояние менее 50 сантиметром
    {
      digitalWrite(ledPin1, 1); // Зажигаем светодиод
      delay(400);
    }
    else
    {
      digitalWrite(ledPin1, 0); // иначе тушим
      a = 0;
    }
  }
}
}  

[/code]

Подскажите как подправить:

1 Что бы зона №1 не зацикливалась, а отключалась если растояние до датчика станет более установленого (80)   2 Сделать задержку на выключение для каждой зоны отдельно. Например зона №1 - 2мин. зона №2 - 5 сек. (что бы не моргала когда отошёл на пару сек/мин.)

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

1. Функция millis() возвращает значение типа unsigned long, поэтому переменные previousMillis и interval  логично тоже объявить как unsigned long.

2. Условие if (previousMillis - millis() > previousMillis) не будет выполняться никогда, поскольку millis() в данном скетче всегда больше[равно] previousMillis.

3.

viktor001 пишет:
Незнаю насколько это правильно, но работает.
В Интернете отсутствует информация о подключении к Ардуино кнопок и использовании INPUT_PULLUP ? 

 

viktor001
Offline
Зарегистрирован: 31.12.2016

А как это можно подправить или почитать про это более подробно? Из того, что я нашёл как-то поверхностно всё описано - не для моих тупых мозгов.

viktor001
Offline
Зарегистрирован: 31.12.2016
Поменял значение с большего на меньшее - теперь работает.  
{ if (previousMillis - millis() < previousMillis) {
   previousMillis = millis();
}
 
Осталось вставить время отключения после выхода из зоны действия датчиков. 
Будет ли правельным направление  - long OnTime1 = 50000; long OnTime2 = 5000; ?
 
Araris
Offline
Зарегистрирован: 09.11.2012

Боюсь у Вас по-прежнему проблемы с непониманием того, как работают эти if.

1. Условие if (previousMillis - millis() < previousMillis) будет выполняться всегда. Если от чего-то отнять что-то, результат будет меньше этого самого чего-то, утверждает Капитан Очевидность.

2. Функция millis() возвращает значение типа unsigned long, поэтому переменные long OnTime1 = 50000long OnTime2 = 5000;  логично тоже объявить как unsigned long. Да, повторяюсь, да, уже писал об этом. Направление считаю правильным.

 
vvadim
Offline
Зарегистрирован: 23.05.2012

viktor001 пишет:

Поменял значение с большего на меньшее - теперь работает.  
{ if (previousMillis - millis() < previousMillis) {
   previousMillis = millis();
}
 
Осталось вставить время отключения после выхода из зоны действия датчиков. 
Будет ли правельным направление  - long OnTime1 = 50000; long OnTime2 = 5000; ?
 

 

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

viktor001
Offline
Зарегистрирован: 31.12.2016

Araris пишет:

Боюсь у Вас по-прежнему проблемы с непониманием того, как работают эти if.

Да похоже не только с if, но и вообще с построением и пониманием всего алгоритма.

[/quote]

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

[/quote]

а теперь догадайтесь как сделать с задержкой, так, что ли?

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

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

viktor001 пишет:

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

С Ардуино я знаком совсем недавно, но с программированием существенно дольше. Послушайте мой совет - выкинте этот код совсем и начните всё писать сами с нуля. Переделывать чужой код, который ещё и не понимаешь, часто сложнее, чем написать свой. На мой взгляд, это лучший способ учиться программированию - начать решать свою конкретную несложную задачку. Но нужно смириться с тем, что её решение потребует времени больше, чем Вы, возможно, рассчитывали. Разумеется, это если Вы хотите чему-то научиться. Если же Вам нужен только свет на кухне, то проще обратиться в раздел "Ищу исполнителя".

viktor001
Offline
Зарегистрирован: 31.12.2016

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

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


// подключаем библиотеку I2C:
#include <Wire.h>
// подключаем библиотеку датчика BH1750:
#include <BH1750.h>

// объявляем объект lightMeter:
BH1750 lightMeter;

int a = 0;
const int knopka = 3;
const int Trig1 = 6;
const int Echo1 = 7;
const int Trig2 = 8;
const int Echo2 = 9;
const int ledPin1 = 12;  // 13 – если будете использовать встроенный в Arduino светодиод
const int ledPin2 = 11;

long previousMillis1 = 0;   // здесь будет храниться время последнего изменения состояния светодиода
long interval1 = 6000;      // интервал мигания в миллисекундах
long previousMillis2 = 0;
long interval2 = 4000;

void setup()
{
  pinMode(Trig1, OUTPUT);
  pinMode(Echo1, INPUT);
  pinMode(Trig2, OUTPUT);
  pinMode(Echo2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(knopka, INPUT_PULLUP);
  Serial.begin(9600);
  lightMeter.begin(); //инициализация датчика BH1750
}

unsigned int time_us = 0;

unsigned int distance_sm1 = 0;
unsigned int distance_sm2 = 0;

void loop()
{
  //считываем показания с BH1750:
  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(400);

  digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера
  delayMicroseconds(10); // Удерживаем 10 микросекунд
  digitalWrite(Trig1, LOW); // Затем убираем
  time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса
  distance_sm1 = time_us / 58; // Пересчитываем в сантиметры
  Serial.println(distance_sm1); // Выводим на порт

  digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера
  delayMicroseconds(10); // Удерживаем 10 микросекунд
  digitalWrite(Trig2, LOW); // Затем убираем
  time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса
  distance_sm2 = time_us / 58; // Пересчитываем в сантиметры
  Serial.println(distance_sm2); // Выводим на порт

  if (lux < 80) 
    if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром
    {
      digitalWrite(ledPin1, 1); // Зажигаем светодиод
      previousMillis1 = millis();
    }
    else
    { if (millis() - previousMillis1 > previousMillis1) {
        previousMillis1 = millis();
      }
      if (millis() - previousMillis1 > interval1) {
        digitalWrite(ledPin1, 0); // тушим
      }
    }
    if (lux < 80)// для второго датчика
      if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром
      {
        digitalWrite(ledPin2, 1); // Зажигаем светодиод
        previousMillis2 = millis();
      }
      else
      { if (millis() - previousMillis2 > previousMillis2) {
          previousMillis2 = millis();
        }
        if (millis() - previousMillis2 > interval2) {
          digitalWrite(ledPin2, 0); // иначе тушим
        }
      }
    if (lux > 80) {
      if (digitalRead(3) == HIGH)
      {
        a = 1;
      }
      if (a == 1) {
        Serial.println(distance_sm1); // Выводим на порт
        if (distance_sm1 < 80) // Если расстояние менее 50 сантиметром
        {
          digitalWrite(ledPin1, 1); // Зажигаем светодиод
          previousMillis1 = millis();
        }
        else
        if (millis() - previousMillis1 > interval1)
        {
          digitalWrite(ledPin1, 0); // иначе тушим
          a = 0;
        }
      }
    }
    }


 

viktor001
Offline
Зарегистрирован: 31.12.2016

Вроде сам поправил. Убрал фигурные скобки на 71 и 77 строке.

if (millis() - previousMillis1 > previousMillis1) {
072         previousMillis1 = millis();
073       }
074       if (millis() - previousMillis1 > interval1) {
075         digitalWrite(ledPin1, 0); // тушим
076       }
077     }

 Они мне с самого начала там не нравились. 

Так же и для второго датчика. Буду дальше тестировать.

ПС: Подскажите зачем это - if (a == 1) И какую функцию оно выполняет?

 

 

vvadim
Offline
Зарегистрирован: 23.05.2012

строки 71 и 85 полный бред.

трудно посмотреть пример блинк визаут делей?

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

Скетч копилируется,но в работе не проверял 

/*
  ардуино пин 12 <-> светодиод 1 (ledPin1)
  ардуино пин 11 <-> светодиод 2 (ledPin2)
  ардуино пин 6 <-> TRIG УЗ1 (Trig1)
  ардуино пин 7 <-> ECHO УЗ1 (Echo1)
  ардуино пин 8 <-> TRIG УЗ2 (Trig2)
  ардуино пин 9 <-> ECHO УЗ2 (Echo2)
  ардуино I2C   <-> BH1750  датчик освещености
  ардуино пин 3 <-> кнопка (knopka)
*/
//-----------------Cl_Led----------------------------
class Cl_Led {
    const byte _pin;
    bool _led;
  public:
    Cl_Led(byte pin): _pin(pin) {}
    void setup() {
      pinMode(_pin, OUTPUT);
      digitalWrite(_pin, _led = 0);
    }
    void ON() {
      digitalWrite(_pin, _led = 1);
    }
    void CS_ON() {
      digitalWrite(_pin, _led );
    }
    void OFF() {
      digitalWrite(_pin, _led = 0);
    }
    void CS_OFF() {
      digitalWrite(_pin,  0);
    }
    void invert() {
      digitalWrite(_pin, _led = !_led);
    }

    void loop() {}
};
//-------------Cl_HC_SR04--------------------------------
class Cl_HC_SR04 {
    const byte _Trig_pin;
    const byte _Echo_pin;
  public:
    uint16_t dis_sm = 100;
    Cl_HC_SR04(byte Trig_pin, byte Echo_pin): _Trig_pin(Trig_pin), _Echo_pin(Echo_pin) {}
    void setup() {
      pinMode(_Trig_pin, OUTPUT);
      digitalWrite(_Trig_pin, LOW);
      pinMode(_Echo_pin, INPUT);
    }
    unsigned int read() {
      digitalWrite(_Trig_pin, HIGH); // Подаем сигнал на выход микроконтроллера
      delayMicroseconds(10); // Удерживаем 10 микросекунд
      digitalWrite(_Trig_pin, LOW); // Затем убираем
      dis_sm = pulseIn(_Echo_pin, HIGH) / 58;
      return dis_sm; // возврат данных в сантиметрах
    }
};
//----------------Cl_lightMeter----------------------------
#include <Wire.h> // подключаем библиотеку I2C:
#include <BH1750.h> // подключаем библиотеку датчика BH1750:
class Cl_lightMeter {
    BH1750 *lightMeter = NULL; // указатель на устройство
    uint32_t past = 0;
    void (*Do_CS_OFF)(), (*Do)(); // указатель на обработчики: выкл свет перед измерениями, сделать операцию после измерения
  public:
    uint16_t lux;
    Cl_lightMeter(void (* _Do_CS_OFF)(), void (* _Do)()): Do_CS_OFF(_Do_CS_OFF), Do(_Do) {};
    void setup() {
      lightMeter = new BH1750;
      lightMeter->begin(); //инициализация датчика BH1750
      past = millis();
      read();
    }
    void loop() {
      if (millis() - past >= 400) {
        past = millis();
        read();
      }
    }
    uint16_t read() {
      Do_CS_OFF();
      lux = lightMeter->readLightLevel();
      Do();
    }
};
//----------------Cl_Btn------------------------------------------------------------
// класс на механич кнопку подкл к кнопке Ардуины.
class Cl_Btn {
    byte pin; // номер ноги на кнопке
    void (*Do)();// указатель на обработчик
    bool btn, btn_old;
    bool bounce = 0; // антидребезговый флаг
    uint32_t past = 0 ;
  public:
    //конструктор
    Cl_Btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {}
    void setup() {
      pinMode(pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
      btn = digitalRead(pin); // прочитать реальное значение на выводе};
    }
    void loop () {
      if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн
        bounce = 1;                              // выставить флаг
        past = millis();                         // сделать временую засветку
      }
      else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
        bounce = 0;                                // то снять флаг
        btn_old = btn ;
        btn = digitalRead(pin) ;                   // прочитать реальное значение на выводе
        if (btn_old && ! btn) Do();
      }
    }
};
//----------------------компоновка---------------------------
Cl_Led Led1(/*пин*/12);
Cl_Led Led2(/*пин*/11);
Cl_HC_SR04 HC_SR04_1(/*Trig*/6,/*Echo*/7);
Cl_HC_SR04 HC_SR04_2(/*Trig*/8,/*Echo*/9);

void Do_CS_OFF() { // притушить лампы перед измерением освещености
  Led1.CS_OFF();
  Led2.CS_OFF();
}
void Do_lightMeter();
Cl_lightMeter lightMeter(/*обработчик*/Do_CS_OFF,/*обработчик*/Do_lightMeter); // объявляем объект lightMeter:
void Do_lightMeter() {
  Led1.CS_ON();
  Led2.CS_ON();
  Serial.print("Light: ");
  Serial.print(lightMeter.lux);
  Serial.println(" lx");
  if (lightMeter.lux < 80 && HC_SR04_1.dis_sm < 50) Led1.ON();
  else Led1.OFF();
  if (lightMeter.lux < 80 && HC_SR04_2.dis_sm < 80) Led2.ON();
  else Led2.OFF();
}
void Do_Btn1() {
  Led2.invert();// переключить состояние лампы
}
Cl_Btn Btn1(/*пин*/3,/*обработчик*/Do_Btn1);
//-------------------main()-----------------------
void setup() {
  Serial.begin(9600);
  lightMeter.setup();
  HC_SR04_1.setup();
  HC_SR04_2.setup();
  Led1.setup();
  Led2.setup();
  Btn1.setup();
}
void loop() {
  lightMeter.loop();
  Btn1.loop();
}

 

viktor001
Offline
Зарегистрирован: 31.12.2016

Не работает. Или перед загрузкой а ардуино я должен что то с кодом ещё сделать? 

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

viktor001 пишет:

Не работает. Или перед загрузкой а ардуино я должен что то с кодом ещё сделать? 

Что сделать, что сделать. Провести отладку и бета-тестирование. Посмотреть в чем затык, и отключть часть кода. Ведь что бы проверить код собрать макетную плату. А то кажется новичкам, что код пишется и сразу работает.

Вот примеры аналогичных кодов.http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

viktor001
Offline
Зарегистрирован: 31.12.2016

Я же без притензий, просто сообщил, что не работает. Макетка собрана, на ней и тестирую. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
  ардуино пин 12 <-> светодиод 1 (ledPin1)
  ардуино пин 11 <-> светодиод 2 (ledPin2)
  ардуино пин 6 <-> TRIG УЗ1 (Trig1)
  ардуино пин 7 <-> ECHO УЗ1 (Echo1)
  ардуино пин 8 <-> TRIG УЗ2 (Trig2)
  ардуино пин 9 <-> ECHO УЗ2 (Echo2)
*/
//-----------------Cl_Led----------------------------
class Cl_Led {
    const byte _pin;
    bool _led;
  public:
    Cl_Led(byte pin): _pin(pin) {}
    void setup() {
      pinMode(_pin, OUTPUT);
      digitalWrite(_pin, _led = 0);
    }
    void ON() {
      digitalWrite(_pin, _led = 1);
    }
    void CS_ON() {
      digitalWrite(_pin, _led );
    }
    void OFF() {
      digitalWrite(_pin, _led = 0);
    }
    void CS_OFF() {
      digitalWrite(_pin,  0);
    }
    void invert() {
      digitalWrite(_pin, _led = !_led);
    }

    void loop() {}
};
//-------------Cl_HC_SR04--------------------------------
class Cl_HC_SR04 {
    const byte _Trig_pin;
    const byte _Echo_pin;
  public:
    uint16_t dis_sm = 100;
    Cl_HC_SR04(byte Trig_pin, byte Echo_pin): _Trig_pin(Trig_pin), _Echo_pin(Echo_pin) {}
    void setup() {
      pinMode(_Trig_pin, OUTPUT);
      digitalWrite(_Trig_pin, LOW);
      pinMode(_Echo_pin, INPUT);
    }
    unsigned int read() {
      digitalWrite(_Trig_pin, HIGH); // Подаем сигнал на выход микроконтроллера
      delayMicroseconds(10); // Удерживаем 10 микросекунд
      digitalWrite(_Trig_pin, LOW); // Затем убираем
      dis_sm = pulseIn(_Echo_pin, HIGH, 6000ul) / 58;
      return dis_sm; // возврат данных в сантиметрах
    }
};
//----------------------компоновка---------------------------
Cl_Led Led1(/*пин*/12);
Cl_Led Led2(/*пин*/11);
Cl_HC_SR04 HC_SR04_1(/*Trig*/6,/*Echo*/7);
Cl_HC_SR04 HC_SR04_2(/*Trig*/8,/*Echo*/9);

//-------------------main()-----------------------
void setup() {
  Serial.begin(9600);
  Led1.setup();
  Led2.setup();
  HC_SR04_1.setup();
  HC_SR04_2.setup();
}
void loop() {
  static uint32_t past = 0;
  if (millis() - past >= 400) {
    HC_SR04_1.read();
    Serial.println();
    Serial.print("HC_SR04 1=   ");
    Serial.print(HC_SR04_1.dis_sm);
    if ( HC_SR04_1.dis_sm == 0 || HC_SR04_1.dis_sm > 50) Led1.OFF();
    else  Led1.ON();
    HC_SR04_2.read();
    Serial.println();
    Serial.print("HC_SR04 2=  ");
    Serial.print(HC_SR04_2.dis_sm);
    if ( HC_SR04_2.dis_sm == 0 || HC_SR04_2.dis_sm > 50) Led2.OFF();
    else  Led2.ON();
  }
}

 

viktor001
Offline
Зарегистрирован: 31.12.2016

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

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

Издержки УЗ датчиков.  Можете отключить один и попробовать . Может в одиночку стабильней будет.

viktor001
Offline
Зарегистрирован: 31.12.2016

Нет, так же моргает. 

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

Если это не пойдет, то больше идей нет.

/*
  ардуино пин 12 <-> светодиод 1 (ledPin1)
  ардуино пин 11 <-> светодиод 2 (ledPin2)
  ардуино пин 6 <-> TRIG УЗ1 (Trig1)
  ардуино пин 7 <-> ECHO УЗ1 (Echo1)
  ардуино пин 8 <-> TRIG УЗ2 (Trig2)
  ардуино пин 9 <-> ECHO УЗ2 (Echo2)
*/
//-----------------Cl_Led----------------------------
class Cl_Led {
    const byte _pin;
    bool _led;
  public:
    Cl_Led(byte pin): _pin(pin) {}
    void setup() {
      pinMode(_pin, OUTPUT);
      digitalWrite(_pin, _led = 0);
    }
    void ON() {
      digitalWrite(_pin, _led = 1);
    }
    void OFF() {
      digitalWrite(_pin, _led = 0);
    }
};
//-------------Cl_HC_SR04--------------------------------
class Cl_HC_SR04 {
    const byte _Trig_pin;
    const byte _Echo_pin;
  public:
    uint16_t dis_sm = 100;
    Cl_HC_SR04(byte Trig_pin, byte Echo_pin): _Trig_pin(Trig_pin), _Echo_pin(Echo_pin) {}
    void setup() {
      pinMode(_Trig_pin, OUTPUT);
      digitalWrite(_Trig_pin, LOW);
      pinMode(_Echo_pin, INPUT);
    }
    unsigned int read() {
      digitalWrite(_Trig_pin, HIGH); // Подаем сигнал на выход микроконтроллера
      delayMicroseconds(10); // Удерживаем 10 микросекунд
      digitalWrite(_Trig_pin, LOW); // Затем убираем
      dis_sm = pulseIn(_Echo_pin, HIGH, 6000ul) / 58;
      return dis_sm; // возврат данных в сантиметрах
    }
};
//----------------------компоновка---------------------------
Cl_Led Led1(/*пин*/12);
Cl_Led Led2(/*пин*/11);
Cl_HC_SR04 HC_SR04_1(/*Trig*/6,/*Echo*/7);
Cl_HC_SR04 HC_SR04_2(/*Trig*/8,/*Echo*/9);

//-------------------main()-----------------------
void setup() {
  Serial.begin(9600);
  Led1.setup();
  Led2.setup();
  HC_SR04_1.setup();
  HC_SR04_2.setup();
}
void loop() {
  static uint32_t past = 0;
  if (millis() - past >= 400) {
    HC_SR04_1.read();
    Serial.println();
    Serial.print("HC_SR04 1=   ");
    Serial.print(HC_SR04_1.dis_sm);
    if ( HC_SR04_1.dis_sm == 0);
    else if  (HC_SR04_1.dis_sm > 50) Led1.OFF();
    else  Led1.ON();
    HC_SR04_2.read();
    Serial.println();
    Serial.print("HC_SR04 2=  ");
    Serial.print(HC_SR04_2.dis_sm);
    if ( HC_SR04_2.dis_sm == 0);
    else if  (HC_SR04_2.dis_sm > 50) Led2.OFF();
    else  Led2.ON();
  }
}

 

viktor001
Offline
Зарегистрирован: 31.12.2016

На УЗ1 иногда проскакивают ещё мырги, на УЗ2 нет. Второе, если подойти к датчикам и уйти в сторону то светодиоды продолжают светиться. Если подойти и так же отойти то всё чётко - тухнут.