Помогите с написанием скетча для PIR
- Войдите на сайт для отправки комментариев
Вс, 19/04/2015 - 16:03
Здравствуйте.
Помогите пожалуйста написать скетч.
В электронике разбираюсь, а в программировании новичок.
Задача такая.
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);
}
}
}
Мне кажется Ваш код должен выглядеть вот так
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); } } }Спасибо за ответ.
Я поместил только кусок программы, пауза задана в setup.
Если движения нет timee не обнуляется и при условии что millis()-timee>pause свет выкл.
Программа работает я проверял, НО для одной лампы.
хотелось бы обьединить подсветку и вкл из вне как описанно выше.
Спасибо.
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) { // выкл подсветку } } }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));} }Всё заработало.
Спасибо vosara за подсказку в коде
04if(digitalRead(pirPin) == HIGH)05{06if(flagPause == 1)07{08timee=millis();09flagPause = 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]После того как обьект остановился нужно зафиксировать время остановки для того чтобы отсчитать 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); } } }Всем привет.
Доработал код как хотел (когда задавал вопрс), начал писать для выключателя.
В коридоре два вык. в начале и в конце.
Одним вкл. другим выкл. и наобарот.
Собираюсь поставить реле вместо лампы,а с ардуино управлять ею.
Если каму интересно вот код для выключателя
[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]