12-12-2019, 20:02
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.
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
}