#1 Re: Програмування Arduino » Датчик движения и датчик освещенности на плате Arduino UNO » 2019-05-13 21:21:52

vvr пише:

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

1) Брал часть примера отсюда. А там реле запитано от Ардуино:
https://voltiq.ru/arduino-and-sensor-hc-sr501/

2) Алгоритм простой: При появлении человека на пути датчика движения - срабатывает реле, включается свет (лампочка), при появлении дополнительного источника света, датчик освещенности должен убавить яркость лампочки. Вообщем и целом так должна выглядеть задумка.

#2 Програмування Arduino » Датчик движения и датчик освещенности на плате Arduino UNO » 2019-05-13 20:00:22

Alex_G
відповідей: 12

Всем привет!

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

Идея была сделать освещение в комнате, которое работает от датчика движения PIR SR501 установленном на плате Arduino UNO вместе с датчиком BH1750, который регулирует освещение в комнате.

Подсоединил по такой схеме:

Skhema-programmy.jpeg

На схеме не рисовал светодиод на цифровом 13 порту для индикации калибровки датчика движения. Но он есть в скетче.

Правильно ли подсоединено всё на схеме?

Текущий код программы с комментариями далее:

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

//Тестировалось на Arduino IDE 1.0.1
//Время калибровки датчика (10-60 сек. по даташиту)
int calibrationTime = 30;       

//Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int lowIn;        

//Пауза, после которой движение считается оконченным
long unsigned int pause = 5000; 

//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow = true;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime; 

int pirPin = 2;    //вывод подключения PIR датчика
int ledPin = 13;   //вывод сигнального диода
int relayPin = 3;  //реле пин

void setup()
{
  Serial.begin(9600);
  lightMeter.begin();
  Serial.println("Running...");
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(relayPin, OUTPUT);


  digitalWrite(relayPin, HIGH);
  delay(4000);
  digitalWrite(pirPin, LOW);

  //дадим датчику время на калибровку
  for(int i = 0; i < calibrationTime; i++)
  {
    //Во время калибровки будет мигать сигнальный диод
    i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
    delay(1000);
  }
  //По окончанию калибровки зажжем сигнальный диод 
  digitalWrite(ledPin, HIGH);
  delay(50);
}

void loop()
{
  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(500);
  //Если обнаружено движение
  if(digitalRead(pirPin) == HIGH)
  {
    //Если до этого момента еще не включили реле
    if(lockLow)
    {
      lockLow = false;      
      //Включаем реле.
      digitalWrite(relayPin, LOW);
      delay(50);
    }        
    takeLowTime = true;
  }

  //Ели движения нет
  if(digitalRead(pirPin) == LOW)
  {      
    //Если время окончания движения еще не записано
    if(takeLowTime)
    {
      lowIn = millis();          //Сохраним время окончания движения
      takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    }
    //Если время без движение превышает паузу => движение окончено
    if(!lockLow && millis() - lowIn > pause)
    { 
      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
      lockLow = true;                
      digitalWrite(relayPin, HIGH);
      delay(50);
  }
}
}

Включаю схему, светодиод мигает, что сигнализирует о калибровке датчика, но по истечению 30 секунд реле то включается, то выключается, то непрерывно замкнуто (лампочка горит). Каждый раз после включения ведет себя хаотично. В общем не работает как следует.

Перепроверьте, пожалуйста, что не так со скетчем или схемой или железом?

Підвал форуму