• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Fotopułapka do lustrzanki oparta na sensorach activ IR i arduino cz.2
#14
Coś wymyśliłem. Nie wiem czy spełni oczekiwania.
AIR wybudza a PIR sprawdza czy coś "ciepłego" jest w polu widzenia i się rusza. Jak jest to zeruje licznik zdjęć i zdjęcia wykonują się jak AIR jest aktywny.

Jak AIR się uszkodzi w stanie LOW i PIR będzie nieaktywny to wykona się 10 x po 2 zdjęcia i arduino  się zablokuje w stanie wybudzenia, nie "zaśnie". Reset lub wyłączenie zasilania i ponowne włączenie przywraca urządzenie do pracy.

Jeżeli AIR jest zawodny. Można przyjąć inną strategię. Może PIR wybudzać a AIR wyzwalać zdjęcie. Przy uszkodzeniu AIR w stanie LOW można pomyśleć o blokadzie wykonywania zdjęć lub wykonywać tak długo jak PIR jest pobudzony. Może coś się uda złapać.
Poniżej kod według pierwszej strategi.


Kod:
// **** INCLUDES *****
#include "LowPower.h"  //dodaje biliotekę obsługującą zaawansowane tryby oszczędzenia energii

/*-----( Declare Constants )-----*/
#define AIRsensor     2    // przewód sygnałowy z odbiornika AIR (active IR)wchodzi na pin 2 (jest to równoczesnie pin interrupt #1(INT0))
#define PIRsensor     3    // przewód sygnałowy z odbiornika PIR wchodzi na pin 3
#define shutter       4    // wyjscie cyfrowe 4 poprzez transoptor 4n26 do wyzwolenia migawki
#define focus         5    // wyjscie cyfrowe 5 poprzez transoptor 4n26 do ustawienia ostrości


/*-----( Zmienne )-----*/
// Zmienne dla wykrywania ruchu
int detector_state;  // zmienna utrzymuje ostatni stan przełącznika


//Zmienne wyzwalania aparatu
int trigger = 2;      // Ilość wykonanych zdjęć

//Zmienne dotyczace trybu usypiania arduino
int odliczanie = 5;  //zmienna odpowiedzialna za odliczanie czasu do uśpienia ATMegi

//Zmienne do zapamiętania wartości z czujników ruchu
int pirValue;
int airValue;
int licznikZdjec = 0;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------

void setup()    /*----( WYKONAJ RAZ )----*/
{
  CLKPR = 0x80;
  CLKPR = 0x03;  // przetaktowanie z 8Mhz do 1Mhz

  pinMode(LED_BUILTIN, OUTPUT);       //określa cyfrowy pin LED_BUILTIN jako WYJŚCIE...
  digitalWrite(LED_BUILTIN, LOW);    // ... i nakazuje poleceniem jej WYŁĄCZENIE (diody LED) poprzez odcięcie napięcia (LOW) w celu zmiejszenia poboru energii
 

  detector_state = 0; 

  // Setup shutter and focus as output
  pinMode (shutter, OUTPUT );     // określa cyfrowy pin (4) od którego poprzez transoptor 4n26 podłączyliśmy się do migawki jako WYJŚCIE
  pinMode (focus, OUTPUT );       // określa cyfrowy pin (5) od którego poprzez transoptor 4n26 podłączyliśmy się do focusa jako WYJŚCIE

  // Setup AIR as Input         
  pinMode (AIRsensor, INPUT_PULLUP );   // określa cyfrowy pin (2) do którego wchodzi przewód sygnałowy z odbiornika AIR jako WEJŚCIE

  // Setup PIR as Input
  pinMode(PIRsensor, INPUT);    // określa cyfrowy pin (3) do którego wchodzi przewód sygnałowy z sensora PIR jako WEJŚCIE

  Serial.begin(9600); // połaczenie z konsolą (tu w sumie zbędne, ale może rozpiszę debug)

  // początkowe opóźnienie o 15sek w celu ustabilizowania sensorów infrared w nowym środowisku
  delay(1875); // aby zrekompensować underclocking z 8Mhz do 1Mhz należy podzielić rządany czas przez 8 - w tym przypadku 15000:8=1875 (15sek)
}

/*--(end setup)---*/



void loop()     /*----( WYKONAJ W PĘTLI )----*/
{
   attachInterrupt(0, Budzenie, LOW);
 
   LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

   detachInterrupt(0);
 

  if (licznikZdjec < 10) // wykona się max 10 X po 2 zdjęcia jak na pinie 2 będzie LOW a PIR będzie nieaktywny (LOW)
  {
   // tu robimy 2 zdjęcia
    for (int x = 0; x < 2; x++)  // ilość wykonanych zdjęć (w tym przypadku 2: zdjęcie 0 i zdjęcie 1)
   {
    //if (digitalRead(AIRsensor) == 0 and digitalRead(PIRsensor) == 1)
    digitalWrite (focus, HIGH );
    delay (13);                // czas opożnienia w tym wypadku 13x8 = 104ms
    digitalWrite (shutter, HIGH );
    delay (13);
    digitalWrite (focus, LOW );
    digitalWrite (shutter, LOW);
    delay (125);              // czas opożnienia 1 sek.
   
   }
   licznikZdjec = licznikZdjec +1;
   if (digitalRead(PIRsensor) == 1)
   {
    licznikZdjec = 0;
   }
   // czas pomiędzy seriami zwiększyłem dla obserwacji, ustawić do potrzeb
    delay (113); // czekamy po 2 zdjęciach i idziemy spać jak nie ma na pinie 2 LOW
  }
}

void Budzenie()
{
    //Zatrzymujemy się w pustej pętli
}
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Fotopułapka do lustrzanki oparta na sensorach activ IR i arduino cz.2 - przez Agregacik - 12-12-2019, 20:02

Skocz do:


Przeglądający: 1 gości