Arduino schéma - arduino.sk

vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie Android

Automatizácia v dome / byte. Monitorovanie zariadení a ich riadenie...
Obrázok užívateľa
Príspevky: 28
Registrovaný: Pon 13. Okt 2014 16:42:00
Bydlisko: Ružomberok

vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie Android

Poslaťod speko2 » Štv 27. Nov 2014 22:09:07

Zdravím mám spravené vonkajšie osvetlenie pomocou 5 pir snímačov HC-SR501 umiestnených pozdĺž domu ktoré ovládajú led pásy pomocou arduina .Postupne ako idem sa pasy rozsvecujú a za mnou zhášajú je to pekné ale má to zádrhel . Kedže pir drží HIGH uroven 2-3 sec a keď sa popred pir motkám aj viac problém spočíva v tom že pásy mi preblikávajú teda vypnú a postupne (PWM) rozsvietia pokiaľ som to mal na tvrdo ZAP VYP bolo všetko v poriadku ale kedže chcem využiť potenciál arduina tak som to urobil pomocou PWM.Chcel by som dosiahnuť to aby sa led pásy rozsvietili a ostali svieťiť kým sa budem motať popred pir a potom pekne krásne pohasli. Týmto prosím skúsenejších o radu a prikladám kód komplet celý aj s inými možnosťami čo to dokáže prípadne ak tam mam nejaké chyby (krásy...) alebo máte vylepšenia rád uvítam :-)
Tu je časť kódu v ktorom je zádrhel a nižšie prikladám celý kod:
Kód: Vybrať všetko
   //rozsvecovanie svetiel podla pohybu
  //prvá vetva svetlo pri kuchyne pir1
if ((digitalRead(pir1) == HIGH||digitalRead(pir5) == HIGH) && sumrak < 20)   
{
autoPWM(sv1, 1000, 'ON');
onTime1 = millis(); 
}
if(onTime1 > 0 && millis() - onTime1 > 5000)
{     
autoPWM(sv1, 500, 'OFF');
onTime1 = 0;
}


Komplet kód:
Kód: Vybrať všetko
/*
osvetlenie dvora
doplnene ovladanie z androidu 12.10.14
ovladanie osvetlenia zámku cez RF modul 13.10.14
časovač vypnutia zámku 15.10.14 22:50
auto zapnutie zámku pri zotmení a vypnutie po svitaní 16.10.14 21:40
doplnena kontrola denneho svitu po resete alebo spustení arduina 21.10.14
uprava nazvu premennych zjednodusenie programu na casove vypinanie a zapinanie 27.10.14 8:30
citanie analog vstupu kazdych 30 sekund 27.10.14 9:45
Doplnenie snimacov PIR 2.11.14 16:00
pouzitie kniznice autoPWM zlucenie pir do jedneho prikazu 27.11.2014
*/
#include <autoPWMlibrary.h>
#include <RCSwitch.h>
RCSwitch rfvysielac = RCSwitch();
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;
byte startHour = 5;    // Set our start and end times
byte startMinute = 9;  // Don't add leading zero to hour or minute - 7, not 07
byte endHour = 22;      // Use 24h format for the hour, without leading zero
byte endMinute = 26;
unsigned long previousMillis = 0;
unsigned long onTime1;
unsigned long onTime2;
unsigned long onTime3;
unsigned long onTime4;
int fotoodpor = A0; //fotoodpor na analogovom pine A0
int sumrak = 0;//fotoodpor sumrakovy snímač
//int jas_sv1=0 ;//kuchynka
//int jas_sv2=0 ;//vstup
//int jas_sv3=0 ;//dvor
int jas_sv4=0 ;//led pásy pod parapetami
//int jas_sv5=0;//balkon

int sv1 = 3;//kuchynka
int sv2 = 5;//vstup
int sv3 = 6;//dvor
int sv4 = 9;//led pásy pod parapetami
int sv5 = 10;//balkon
int pir1 = 2;//pri kuchynke
int pir2 = 4;//vstup
int pir3 = 7;//zaciatok dvora
int pir4 = 13;//okno pod spalnou
int pir5 = 11;//roh pri garáži
int pir6 = 12;//koniec dvora
void setup()
{
  rfvysielac.enableTransmit(8);//RF vysielac na pine 8
  rfvysielac.setPulseLength(320);//nastavenie dlžky impulzu
  Wire.begin();             
  RTC.begin();
  if (! RTC.isrunning()) {                       // Make sure RTC is running
    Serial.println("RTC is NOT running!");
  }
//RTC.adjust(DateTime(__DATE__, __TIME__));  // Odkomentovať pre nastavenie casu
onTime1 = millis();
  onTime2 = millis();
   onTime3 = millis();
    onTime4 = millis();
pinMode(sv1, OUTPUT);
pinMode(sv2, OUTPUT);
pinMode(sv3, OUTPUT);
pinMode(sv4, OUTPUT);
pinMode(sv5, OUTPUT);
pinMode(pir1, INPUT);
pinMode(pir2, INPUT);
pinMode(pir3, INPUT);
pinMode(pir4, INPUT);
pinMode(pir5, INPUT);
pinMode(pir6, INPUT);
Serial.begin(9600);
sumrak = analogRead(fotoodpor);
Serial.println(sumrak);
if (sumrak < 20) {
jas_sv4=10 ;
   analogWrite( sv4,jas_sv4);//led pásy pod parapetami
    delay(5);
     rfvysielac.switchOn("11111", "00010");//ZAP osvetlenie hradu na dvore
  }   
else if (sumrak > 20) {
jas_sv4=0 ;
   analogWrite( sv4,jas_sv4);//led pásy pod parapetami
     delay(5);
     rfvysielac.switchOff("11111", "00010");//VYP osvetlenie hradu na dvore
}
delay(100);
}
void loop()
{
  //ovladanie z androidu + ovladanie zamku
   while(Serial.available()){
char a = Serial.read();
if(a == 'A'){
autoPWM(sv1, 1000, 'ON');
}
else if(a == 'a'){
autoPWM(sv1, 1000, 'OFF');
}
  if(a == 'B'){
autoPWM(sv2, 1000, 'ON');
}
else if(a == 'b'){
autoPWM(sv2, 1000, 'OFF');
}
  if(a == 'C'){
autoPWM(sv3, 1000, 'ON');
}
else if(a == 'c'){
autoPWM(sv3, 1000, 'OFF');
}
  if(a == 'D'){
autoPWM(sv4, 1000, 'ON');
}
else if(a == 'd'){
autoPWM_od_do(sv4, 1000,255, jas_sv4);
}
   if(a == 'E'){
autoPWM(sv5, 1000, 'ON');
}
else if(a == 'e'){
autoPWM(sv5, 1000, 'OFF');
}
    if(a == 'F'){
rfvysielac.switchOn("11111", "00010");
}
else if(a == 'f'){
rfvysielac.switchOff("11111", "00010");
}
}                               
//koniec doplnenia ovladania z androidu
// automaticke zapnutie svetiel pri zotmeni a vypnutie pri svitaní
unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > 5000) {
    previousMillis = currentMillis;   
sumrak = analogRead(fotoodpor);
DateTime now = RTC.now();
    Serial.println(sumrak);
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
  }
if (sumrak == 20) {
  jas_sv4=10 ;
   analogWrite( sv4,jas_sv4);
     delay(10);
     rfvysielac.switchOn("11111", "00010");
  }   
else if (sumrak == 40) {
jas_sv4=0 ; 
   analogWrite( sv4,jas_sv4);
     delay(10);
     rfvysielac.switchOff("11111", "00010");
}
  DateTime now = RTC.now(); // Načítaj aktualny cas z modulu RTC 
  if (now.second() >= 0 && now.second()<5) {
   if (now.hour() == startHour && now.minute() == startMinute) {
         rfvysielac.switchOn("11111", "00010"); }
     if (now.hour() == endHour && now.minute() == endMinute) {
         rfvysielac.switchOff("11111", "00010");}
    }
   //rozsvecovanie svetiel podla pohybu
  //prvá vetva svetlo pri kuchyne pir1
if ((digitalRead(pir1) == HIGH||digitalRead(pir5) == HIGH) && sumrak < 20)   
{
autoPWM(sv1, 1000, 'ON');
onTime1 = millis(); 
}
if(onTime1 > 0 && millis() - onTime1 > 5000)
{     
autoPWM(sv1, 500, 'OFF');
onTime1 = 0;
}

  //druha vetva svetlo vstup
if (digitalRead(pir2) == HIGH && sumrak < 200) 
{
autoPWM(sv2, 1000, 'ON');
onTime2 = millis(); 
}
if(onTime2 > 0 && millis() - onTime2 > 5000)
{     
autoPWM(sv2, 500, 'OFF');
onTime2 = 0;
}
//tretia vetva svetlo dvor
if ((digitalRead(pir3) == HIGH||digitalRead(pir6) == HIGH) && sumrak < 20)   
  {
autoPWM(sv3, 1000, 'ON');
onTime3 = millis(); 
  }
if(onTime3 > 0 && millis() - onTime3 > 6000)
  {     
autoPWM(sv3, 500, 'OFF');
onTime3 = 0;
  }
 
  //štvrtá vetva svetlo pod balkonom
if (digitalRead(pir4) == HIGH && sumrak<20)   
  {
  autoPWM(sv5, 1000, 'ON');
onTime4 = millis(); 
  }
if(onTime4 > 0 && millis() - onTime4 > 5000)
  {     
autoPWM(sv5, 500, 'OFF');
onTime4 = 0;
  }
}

Obrázok užívateľa
Príspevky: 300
Registrovaný: Pon 19. Nov 2012 12:01:08
Bydlisko: HC/BA

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod tomXX » Pia 28. Nov 2014 8:30:31

Ahoj, možno by som to riešil hardverovo - pridať na výstup z PIR RC člen, takže cez odpor by sa nabíjal/vybíjal elektrolyt, tým by si predĺžil dobu svietenia ale hlavne by si zabránil vypnutiu a zapnutiu hneď po sebe (lebo elyt by bol nabitý a stále držal HIGH).
Prílohy
rc-pir.PNG
rc-pir.PNG (3.64 KiB) Zobrazené 3511 krát
blog.sitepoint.sk - zaujímavé riešenia okolo Arduina

Obrázok užívateľa
Príspevky: 28
Registrovaný: Pon 13. Okt 2014 16:42:00
Bydlisko: Ružomberok

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod speko2 » Pia 28. Nov 2014 11:51:44

Ahoj práve tomu sa chcem vyhnúť na pir sa dá trimrom nastaviť high úroveň od 2sec do cca 2000 sec ale ja by som potreboval aby program program ignoroval dlhsie podrzanie HIGH urovne lebo program cyklu-je v smyčke pokiaľ ma HIGH uroveň a svetla zhasnú a postupne rozsvecuju.Pokusil som sa to okomentovať v kóde. Dik

Kód: Vybrať všetko
if (digitalRead(pir1) == HIGH && sumrak < 20)   //ak je uroveň HIGH a je tma postupne zasviet
// to spravi ale hned vypne a postupne rozsvieti a dokola
{
for ( jas_sv1=0 ; jas_sv1 < 255; jas_sv1++) {  //TOTO TU STÁLE DOOKOLA OPAKUJE POKIAĽ JE HIGH na pir-ku (preblikáva)
analogWrite(sv1, jas_sv1);  //chcem docieliť aby rozsvietilo a ostalo svietit pokial je HIGH na pir
   delay(5); //a vyplo po 5 sec ako bude na pir uroveň LOW
}
onTime1 = millis(); 
}
if(onTime1 > 0 && millis() - onTime1 > 5000) //ak je uroven pir LOW a presiel cas 5sec postupne zhasni
{     
for ( jas_sv1; jas_sv1 >= 0; jas_sv1--)
{
analogWrite(sv1, jas_sv1);
   delay(5);
}
onTime1 = 0;
}

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod posjirka » Pia 28. Nov 2014 21:03:50

pokud to chapu spravne tak potrebujes aby pri tme a pohybu pred cidlem postupne narustal jas led az nakonec bude svitit naplno a tak zustane dokud budes pred cidlem.
pokud je to tak tak je chyba v logice programu resp v te smycce narustu jasu. v kazdem cyklu smycky loop se program pta zda tam ponihas a zda je tma. to je v poradku. chyba je dal kdy spustis smycku for pro narust jasu. ten jde s kazdou smyckou loop od nuly. videl bych to tak ze bych dal promennou jas defaultne na nulu. s kazdou smyckou kdy budou podminky splneni bych inkrementoval 1 az do hodnoty 255 na ktere bych zustal. navic pokud by podminky nebyli splneny odecetl bych 1 az do hodnoty 0. az budu u pc tak to dam to tveho kodu.

Obrázok užívateľa
Príspevky: 28
Registrovaný: Pon 13. Okt 2014 16:42:00
Bydlisko: Ružomberok

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod speko2 » Sob 29. Nov 2014 15:12:06

presne toto chcem docielit budem rád lebo uz som zufalý vie že tam je len nejaky malý zadrhel :)

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod posjirka » Sob 29. Nov 2014 22:37:24

Tak jsem se konecne na to dostal. Tady mas priklad pro 1 cidlo abych ukazal princip.

Kód: Vybrať všetko
#define fotoodpor A0     // fotoodpor na analogovom pine A0
#define pir1 2           // pri kuchynke
#define sv1 3            // kuchynka
int sumrak = 0;          // hodnota soumrakoveho snímače
int jas_sv1=0 ;          // jas LED kuchynka

void setup()
{
  jas_sv1=0 ;//kuchynka - vynulovani hodnot
}

void loop()
{
  sumrak = analogRead(fotoodpor);       // mereni osvetleni
  if (sumrak < 20) {                    // pokud je tma
    if (digitalRead(pir1) == HIGH){     // a je aktivni PIR senzor
      if (jas_sv1 < 255) {                  // zaroven jas neni nadoraz
        jas_sv1++;                         // zvedni jas o 1
      }
    }
    if (digitalRead(pir1) == LOW){      // pokud neni aktivni PIR senzor
      if (jas_sv1 > 0) {                    // a jas neni nanule
        jas_sv1--;                         // sniz jas o 1
      }
    }
  }
  analogWrite(sv1, jas_sv1);            // zapis aktualni hodnotu jasu na PWM vystup
  delay(100);                           // cekej 100ms - tim bude trvat prechod z 0 na 255 celkem 2.5s
}


Vyzkoušej a uvidíš ...
Jinak na to zpozdeni . nejsem priznivcem funkce millis(). To pretečeni za 50 dni a násladný hazardni stav se mi nelíbí a tak se teto funkci radši vyhybam.
Radši používám zpoždění celé smyčky v řádech 100ms funkci delay a pro zpoždění používám počítadla smyček. Až to zkusíš jestli to je ono nebo ne tak tam dodělám i to zpoždění 5s...

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod posjirka » Sob 29. Nov 2014 22:45:27

nebo ne tady je v02 se zpoždením zhasínání LED:

Kód: Vybrať všetko
// navic zpozdeni pohasinani o 5s

#define fotoodpor A0     // fotoodpor na analogovom pine A0
#define pir1 2           // pri kuchynke
#define sv1 3            // kuchynka
int sumrak = 0;          // hodnota soumrakoveho snímače
int jas_sv1=0 ;          // jas LED kuchynka
int smycka_sv1=0 ;       // pocitadlo smycek pro LED kuchynka

void setup()
{
  jas_sv1=0 ;            // kuchynka - vynulovani hodnot
  smycka_sv1=0 ;         // pocitadlo smycek pro LED kuchynka - vynulovani hodnot
}

void loop()
{
  sumrak = analogRead(fotoodpor);       // mereni osvetleni
  if (sumrak < 20) {                    // pokud je tma
    if (digitalRead(pir1) == HIGH){     // a je aktivni PIR senzor
      smycka_sv1=0 ;                    // vynulovani pocitadla smycek pro zpozdeni pohasinani
      if (jas_sv1 < 255) {              // zaroven jas neni nadoraz
        jas_sv1++;                      // zvedni jas o 1
      }
    }
    if (digitalRead(pir1) == LOW){      // pokud neni aktivni PIR senzor
      smycka_sv1++ ;                    // pocitam kolik smycek uplynulo v tomto stavu
      if (smycka_sv1 > 50) {            // a pokud je to vic nez 50 smycek (50x100ms = 5 sekund) tak zacni pohasinat LED
        if (jas_sv1 > 0) {              // podminka zda jas neni na nule
          jas_sv1--;                    // sniz jas o 1
        }
      }
    }
  }
  if (smycka_sv1 > 50) {
    smycka_sv1=50 ;                     // osetreni preteceni promenne pro pocitani smycek
  }
  analogWrite(sv1, jas_sv1);            // zapis aktualni hodnotu jasu na PWM vystup
  delay(100);                           // cekej 100ms - tim bude trvat prechod z 0 na 255 celkem 2.5s
}

Príspevky: 174
Registrovaný: Ned 16. Mar 2014 23:22:00

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod posjirka » Sob 29. Nov 2014 22:49:03

ještě jsem si všimnul že nemáš ošetřené stavy kdy soumrak > 20. V tu chvily by ti zustala LED v posledím zaznamenanem stavu. Chce to na konci ošetřit že v případě že soumrak > 20 vynuluj počitadlo i hodnotu jasu LED

Obrázok užívateľa
Príspevky: 28
Registrovaný: Pon 13. Okt 2014 16:42:00
Bydlisko: Ružomberok

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod speko2 » Ned 30. Nov 2014 11:04:55

Vďaka vyskúšam ale zas mam poznatok že sa da to aj iným spôsobom určite ma to nakoplo a posunulo ďalej. :)

Obrázok užívateľa
Príspevky: 28
Registrovaný: Pon 13. Okt 2014 16:42:00
Bydlisko: Ružomberok

Re: vonkajšie osvetlenie s PIR senzormi a PWM +ovladanie And

Poslaťod speko2 » Ned 30. Nov 2014 11:16:32

Jinak na to zpozdeni . nejsem priznivcem funkce millis(). To pretečeni za 50 dni a násladný hazardni stav se mi nelíbí a tak se teto funkci radši vyhybam.
Radši používám zpoždění celé smyčky v řádech 100ms funkci delay a pro zpoždění používám počítadla smyček. Až to zkusíš jestli to je ono nebo ne tak tam dodělám i to zpoždění 5s...


To ma ani nenapadlo ale to spozdenie možem vyriešiť elegantne priamo na pir sa da nastaviť čas podržania HIGH aj to je riešenie či :?:

Späť na Automatizácia