Dotarł do mnie sensor PIR połączyłem wszystko razem i skleciłem "jakiś tam" kod gdzie "TYLKO" gdy oba sensory potwierdzą ruch nastąpi wykonanie zdjęcia. Po wyregulowania sensora PIR zaczęło to nawet w miarę sensownie działać. Tylko to chyba nadal nie jest do końca to o co mi chodzi.
Wolałbym aby priorytet miał odbiornik aktywny activeIR - jest dokładniejszy od PIR i zdjęcia wykona dokładnie w odpowiedniej chwili. Sensor PIR chciałbym traktować jako rezerwowe zabezpieczenie które zareaguje dopiero gdy pójdzie długa seria zdjęć (powiedzmy 20). Sprawdzi wtedy czy coś nie nawala i aparat nie będzie robił zdjęć aż do wyczerpania baterii lub karty. Krótko mówiąc sprawdzi czy na pewno przed układem znajduje się jakieś żywe stworzenie - jeśli wykryje ruch to nie zrobi nic (zdjęcia dalej będą się wykonywały), a jeśli nie wykryje ruchu zatrzyma wykonywanie zdjęć. Wtedy aby układ się "zresetował" odbiornik actieIR musi wrócić do stanu wysokiego (bo ruch = LOW). Trochę mnie to już przerasta Czytam... ale....
Tu obecne rozwiązanie:
Wolałbym aby priorytet miał odbiornik aktywny activeIR - jest dokładniejszy od PIR i zdjęcia wykona dokładnie w odpowiedniej chwili. Sensor PIR chciałbym traktować jako rezerwowe zabezpieczenie które zareaguje dopiero gdy pójdzie długa seria zdjęć (powiedzmy 20). Sprawdzi wtedy czy coś nie nawala i aparat nie będzie robił zdjęć aż do wyczerpania baterii lub karty. Krótko mówiąc sprawdzi czy na pewno przed układem znajduje się jakieś żywe stworzenie - jeśli wykryje ruch to nie zrobi nic (zdjęcia dalej będą się wykonywały), a jeśli nie wykryje ruchu zatrzyma wykonywanie zdjęć. Wtedy aby układ się "zresetował" odbiornik actieIR musi wrócić do stanu wysokiego (bo ruch = LOW). Trochę mnie to już przerasta Czytam... ale....
Tu obecne rozwiązanie:
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;
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
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 ); // 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);
// 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.
delay (13); // czekamy po 2 zdjęciach i idziemy spać jak nie ma na pinie 2 LOW
}
}
void Budzenie()
{
//Zatrzymujemy się w pustej pętli
}