Помогите с написанием скетча для PIR

slavagerm
Offline
Зарегистрирован: 19.04.2015
Здравствуйте.
 
Помогите пожалуйста написать скетч.
В электронике разбираюсь, а в программировании  новичок.
Задача такая.
 
1. При движении проверяем освещенность
2. если темно зажигаем подсветку на 10 сек
3. если движение больше 10 сек зажигаем основной свет
4. если движения нет через 1 мин выкл. основной свет через 10 сек выкл подсветку
(время выкл при каждом движении передвигается чтобы не мигать светом)
5. проверяется команда на вкл от Выключателя света и от радио модуля.
6. Если команда есть минуем датчик освещения и движениея и включаем всё, но на 5 мин
7. выключаем проверяя пункт 4
8. проверяем температуру и отправляем на радиомодуль каждые 5 минут
 
Delay использовать нельзя! Использовать millis()
 
Пункт 5 и 8 попробую вставить сам (только куда?)
 
В наличии arduinominipro,  датчик движения, освещения, температуры, радиомодули приёмник и передатчик
 
Отталкивался от этого кода но ничего не получается.
Заранее спасибо.
 
 //Если обнаружено движение
 if(digitalRead(pirPin) == HIGH)
 {
   // Записываем время когда началось дижение
     timee=millis();
      digitalWrite(ledPin2, LOW);
   // Проверяем освещённость в комнате
if (PhotoRValue<500)
 {
 //Включаем реле.
 digitalWrite(relayPin, HIGH);
 digitalWrite(ledPin, HIGH);
 // delay(50);
 } 
 }
 //Елидвижениянет
 if(digitalRead(pirPin) == LOW)
 { 
 digitalWrite(ledPin2, HIGH); 
//Если время без движение превышает паузу => движение окончено
if(millis()- timee > pause)
 {
 digitalWrite(relayPin, LOW);
digitalWrite(ledPin, LOW);
 // delay(50);
 }
 }
}
 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
В этой строчке Вы запоминаете начало движения!
// Записываем время когда началось дижение
     timee=millis();
 А здесь Вы проверяете не сколько Вы стояли а сколько двигались!
Хотя в коментарии пишете про паузу
//Если время без движение превышает паузу
 if(millis()- timee > pause)
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Мне кажется Ваш код должен выглядеть вот так

void loop() {
  static bool flagPause = 1;
 //Если обнаружено движение
 if(digitalRead(pirPin) == HIGH)
 {
   flagPause = 0; // Запустит паузу при остановке
   digitalWrite(ledPin2, LOW);
   // Проверяем освещённость в комнате
   if (PhotoRValue<500)
   {
    //Включаем реле.
    digitalWrite(relayPin, HIGH);
    digitalWrite(ledPin, HIGH);
    // delay(50);
  } 
}
  //Елидвижения нет
  if(digitalRead(pirPin) == LOW)
  { 
   if(flagPause == 0)
{
 timee=millis();
 flagPause =1;
}
   digitalWrite(ledPin2, HIGH); 
//Если время без движение превышает паузу => движение окончено
if(millis()- timee > pause)
{
 digitalWrite(relayPin, LOW);
 digitalWrite(ledPin, LOW);
// flagPause = 0;
 // delay(50);
}
}
}

 

slavagerm
Offline
Зарегистрирован: 19.04.2015

Спасибо за ответ.

Я поместил только кусок программы, пауза задана в setup.

Если движения нет timee не обнуляется и при условии что millis()-timee>pause свет выкл.

Программа работает я проверял, НО для одной лампы.

хотелось бы обьединить подсветку и вкл из вне как описанно выше.

Спасибо.

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
void loop() {
  static bool flagPause = 1;
 //Если обнаружено движение
 if(digitalRead(pirPin) == HIGH)
 {
  if(flagPause == 1)
{
 timee=millis();
 flagPause = 0;
}
if(millis()- timee > 10000)
{
// зажигаем основной свет
}
 digitalWrite(ledPin2, LOW);
   // Проверяем освещённость в комнате
   if (PhotoRValue<500)
   {
    //Включаем реле.
    digitalWrite(relayPin, HIGH);
    digitalWrite(ledPin, HIGH);
    // delay(50);
  } 
}
  //Елидвижения нет
  if(digitalRead(pirPin) == LOW)
  { 
   if(flagPause == 0)
{
 timee=millis();
 flagPause = 1;
}
   digitalWrite(ledPin2, HIGH); 
//Если время без движение превышает паузу => движение окончено
if(millis()- timee > 60000)
{
  // выкл. основной свет
 digitalWrite(relayPin, LOW);
 digitalWrite(ledPin, LOW);
 // delay(50);
}
if(millis()- timee > 70000)
{
   // выкл подсветку
}
}
}

 

vov4ik
Offline
Зарегистрирован: 10.09.2013
bool a1 = 0;
bool a2 = 0;
unsigned long a3 = 0UL;
bool b1 = 0;
bool b2 = 0;
unsigned long b3 = 0UL;
bool c1 = 0;
bool c2 = 0;
unsigned long c3 = 0UL;
bool d1 = 0;
bool d2 = 0;
unsigned long d3 = 0UL;
bool dvig = 0; // если 1 двигается
bool komanda = 0; // если 1 команда для 5 мин
void setup()
{
pinMode(3, OUTPUT); //подсветка
pinMode(5, OUTPUT); //основной свет
}
void loop()
{
  // analogRead (0); датчик освещенности уставка 50
  
if( (( (analogRead (0))) < (50UL)) && ( dvig) ) {a2 = 1; a1 = 1;} else { if(a1) {a1 = 0; a3 = millis();} else { if (a2) {if ( Timer(a3, 10000)) a2 = 0;}}}
if ( dvig)
{ if (b1) { if (Timer(b3, 10000)) {b2 = 1;}} else {b1 =1; b3 = millis();}} else {b2 = 0; b1 = 0;}
if(b2) {c2 = 1; c1 = 1;} else { if(c1) {c1 = 0; c3 = millis();} else { if (c2) {if ( Timer(c3, 60000)) c2 = 0;}}}
if( komanda) {d2 = 1; d1 = 1;} else { if(d1) {d1 = 0; d3 = millis();} else { if (d2) {if ( Timer(d3, 300000)) d2 = 0;}}}
digitalWrite(3,  (a2) || (d2) );
digitalWrite(5,  (c2) || (d2) );
}
bool Timer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }

 

slavagerm
Offline
Зарегистрирован: 19.04.2015

Всё заработало.

Спасибо vosara за подсказку в коде

04  if(digitalRead(pirPin) == HIGH)
05  {
06   if(flagPause == 1)
07 {
08  timee=millis();
09  flagPause = 0;
10 }

До этого мучился с обнулением времени для отсчета 10 секунд.

vov4ik тоже спасибо, но код для меня ещё сложноват.

Первая моя программа всё работает:(за совет и или подправления буду очень рад)


[code]


static bool flagPause = 1;
long unsigned int timee;
long unsigned int timee1;
int pirPin = 41;       //вывод подключения PIR датчика
int ledPin = 50;       //вывод сигнального диода
int ledPin2 = 44;       //вывод сигнального диода 2
int PhotoRPin = A8;    //Фоторезистор
int PhotoRValue;

void setup()
{

  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin, LOW);
  digitalWrite(ledPin2, LOW);
  Serial.println("SENSOR ACTIVE");
  delay(50);

}


void loop()
{
serial();
moove();
//kn();
//temperatur();
//rf tx();
//rf rx();
}


  void serial()
  {
    PhotoRValue = analogRead(PhotoRPin);

    Serial.println("Liht: ");
    Serial.println(PhotoRValue);

    Serial.println("Moove: ");
    Serial.println(pirPin);

    Serial.println("Timee: ");
    Serial.println(millis() - timee);

    Serial.println("Timee1: ");
    Serial.println(millis() - timee1);

    Serial.println("flagPause: ");
    Serial.println(flagPause);

    delay(1000);
  }

void moove ()
  //Если обнаружено движение
{
  if (digitalRead(pirPin) == HIGH)
    if (PhotoRValue < 500)  // Проверяем освещённость в комнате

    {
      timee = millis();  // Записываем время когда началось дижение

      if (flagPause == 1)  //Записываем время1 когда началось дижение
      {
        timee1 = millis();
        flagPause = 0;
        digitalWrite(ledPin, HIGH);  //Включаем led
      }

      if (digitalRead(ledPin) == HIGH)  //Проверяем led
        if (millis() - timee1 >= 10000)
          digitalWrite(ledPin2, HIGH);  //Включаем led2
    }

  //Ели движения нет

  if (digitalRead(pirPin) == LOW)
  {
    if (millis() - timee > 30000)  //Если время без движение превышает паузу => движение окончено
      digitalWrite(ledPin2, LOW);

    if (millis() - timee > 40000)
    {
      digitalWrite(ledPin, LOW);
      flagPause = 1;
    }
  }
}


[/code]
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

После того как обьект остановился  нужно зафиксировать время остановки для того чтобы отсчитать 30000 и 40000

Вы можете сказать в какай строчке было зафиксировано время остановки?

Я подправил Ваш код, где зафиксировал это время, посмотрите:


bool flagPause = 1;
long unsigned int timee;
// long unsigned int timee1;
int pirPin = 41;       //вывод подключения PIR датчика
int ledPin = 50;       //вывод сигнального диода
int ledPin2 = 44;      //вывод сигнального диода 2
int analogPin = 8;
// int PhotoRPin = A8;    //Фоторезистор
int PhotoRValue;

void setup()
{
	Serial.begin(9600);
	pinMode(pirPin, INPUT);
	pinMode(ledPin, OUTPUT);
	pinMode(ledPin2, OUTPUT);
	digitalWrite(ledPin, LOW);
	digitalWrite(ledPin2, LOW);
	Serial.println("SENSOR ACTIVE");
	delay(50);
}

void loop()
{
	serial();
	moove();
//kn();
//temperatur();
//rf tx();
//rf rx();
}

void serial()
{
	PhotoRValue = analogRead(analogPin);

	Serial.println("Liht: ");
	Serial.println(PhotoRValue);

	Serial.println("Moove: ");
	Serial.println(digitalRead(pirPin));

	Serial.println("Timee: ");
	Serial.println(timee);

	Serial.println("flagPause: ");
	Serial.println(flagPause);

	Serial.println("  ");

	delay(1000);
}

void moove ()
  //Если обнаружено движение
{
  if (digitalRead(pirPin) == HIGH)
  {
    if (PhotoRValue < 500)  // Проверяем освещённость в комнате
    {
      digitalWrite(ledPin, HIGH);  //Включаем led
      if (flagPause == 1)  //Фиксируем время Низкой освещенности
      {
      	timee = millis();
      	flagPause = 0;
      }
     if (millis() - timee >= 10000)digitalWrite(ledPin2, HIGH);  //Включаем led2
    }
  }
  //Ели движения нет
  if (digitalRead(pirPin) == LOW)
  {
  	if (digitalRead(ledPin) == HIGH) //Если свет не включен то и проверять не надо
   {
  	 if (flagPause == 0)timee = millis(), flagPause = 1;// Фиксируем время остановки

     //Если время без движение превышает паузу => движение окончено
     if (millis() - timee > 30000)digitalWrite(ledPin2, LOW);
     if (millis() - timee > 40000)digitalWrite(ledPin, LOW);
   }
  }
}

 

slavagerm
Offline
Зарегистрирован: 19.04.2015

Всем привет.

Доработал код как хотел (когда задавал вопрс), начал писать для выключателя.

В коридоре два вык. в начале и в конце.

Одним вкл. другим выкл. и наобарот.

Собираюсь поставить реле вместо лампы,а с ардуино управлять ею.

Если каму интересно вот код для выключателя


[code]

//установки moove
static bool flagPause = 1;
long unsigned int timee;
long unsigned int timee1;
int pirPin = 41;       //вывод подключения PIR датчика
int ledPin = 50;       //вывод сигнального диода
int ledPin2 = 44;       //вывод сигнального диода 2
int PhotoRPin = A8;    //Фоторезистор
int PhotoRValue;
int calibrationTime = 2;  //Время калибровки датчика (10-60 сек. по даташиту)

//установки knopf
const int knPin = 2;     //вывод подключения реле выключателя 220в
const int ledPin13 =  13;      //для отладки
unsigned int knopf;
long unsigned int timeeKn;
static bool flagPauseKn = 0;



void setup()
{
  Serial.begin(9600);  //для отладки
  //moove
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin, LOW);
  digitalWrite(ledPin2, LOW);
  //knopf
  pinMode(ledPin13, OUTPUT);  //для отладки
  pinMode(knPin, INPUT);
  digitalWrite(ledPin13, LOW);  //для отладки
  delay(50);

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


void loop()
{
  serialmoove();
  //serialknopf();
  Moove();
  Knopf();
  //temperatur();
  //rf tx();
  //rf rx();
}


void serialmoove()
{
  PhotoRValue = analogRead(PhotoRPin);

  Serial.println("Liht: ");
  Serial.println(PhotoRValue);

  Serial.println("Moove: ");
  Serial.println(digitalRead(pirPin));

  Serial.println("Timee: ");
  Serial.println(millis() - timee);

  Serial.println("Timee1: ");
  Serial.println(millis() - timee1);

  Serial.println("flagPause: ");
  Serial.println(flagPause);

  delay(1000);
}

void serialknopf()
{
  Serial.println("Timee: ");
  Serial.println(millis() - timeeKn);
  Serial.println("Knopf: ");
  Serial.println(knopf);
  Serial.println("flagPause: ");
  Serial.println(flagPauseKn);
  Serial.println("knPin: ");
  Serial.println(digitalRead(knPin));
  delay (500);
  }

void Moove()
//Если обнаружено движение
{
  if (digitalRead(pirPin) == HIGH)
    if (PhotoRValue < 500)  // Проверяем освещённость в комнате

    {
      timee = millis();  // Записываем время когда началось дижение

      if (flagPause == 1)  //Записываем время1 когда началось дижение
      {
        timee1 = millis();
        flagPause = 0;
        digitalWrite(ledPin, HIGH);  //Включаем led
      }

      if (digitalRead(ledPin) == HIGH)  //Проверяем led
        if (millis() - timee1 >= 10000)
          digitalWrite(ledPin2, HIGH);  //Включаем led2
    }

  //Ели движения нет

  if (digitalRead(pirPin) == LOW)
  {
    if (millis() - timee > 10000 & millis() - timee < 15000)
    {
      digitalWrite(ledPin, LOW);
      flagPause = 1;
    }

    if (millis() - timee >= 20000 & digitalRead(ledPin2) == HIGH) //Если время без движение превышает паузу => движение окончено
    {
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin, HIGH);
      flagPause = 0;
    }
    if (millis() - timee > 30000)
    {
      digitalWrite(ledPin, LOW);
      flagPause = 1;
    }
  }
 } 
  
  void Knopf()

{
  if (digitalRead(knPin) == LOW)
    if (flagPauseKn == 0)
    {
      knopf = 1;
      digitalWrite(ledPin13, HIGH);
      timeeKn = millis();
      flagPauseKn = 1;
    }
  if (millis() - timeeKn > 2000)
    if (flagPauseKn == 1)
    { digitalWrite(ledPin13, LOW);
      knopf = 0;
      flagPauseKn = 1;
    }

  if (digitalRead(knPin) == HIGH)
    if (flagPauseKn == 1)
    {
      knopf = 1;
      digitalWrite(ledPin13, HIGH);
      timeeKn = millis();
      flagPauseKn = 0;
    }
  if (millis() - timeeKn > 2000)
    if (flagPauseKn == 0)
    {
      digitalWrite(ledPin13, LOW);
      knopf = 0;
      flagPauseKn = 0;
    }
}


[/code]