02-12-2019, 14:15
Spróbuj tego kodu:
Kod:
/*
* Fotopułapka DSLR AIR (active infrared) - 28/11/2019
*
* Fotopułapka DSLR oparta na aktywnych czujnikach IR (infrared)(komplet: nadajnik/odbiornik) i adafruit pro trinket
* odbiornik active IR po wykryciu ruchu przechodzi w stan niski (LOW)
*
*/
// **** INCLUDES *****
#include "LowPower.h" //dodaje biliotekę obsługującą zaawansowane tryby oszczędzenia energii
/*-----( Declare Constants )-----*/
#define IRsensor 3 // przewód sygnałowy z odbiornika AIR (active IR)wchodzi na pin 3 (jest to równoczesnie pin interrupt #1(INT1))
#define shutter 4 // wyjscie cyfrowe 4 poprzez transoptor 4n26 do wyzwolenia migawki
#define focus 8 // wyjscie cyfrowe 8 poprzez transoptor 4n26 do ustawienia ostrości
/*-----( Declare Variables )-----*/
int detector_state; // zmienna utrzymuje ostatni stan przełącznika
int trigger = 2; // Ilość wykonanych zdjęć
int odliczanie = 5; //zmienna odpowiedzialna za odliczanie czasu do uśpienia ATMegi
void setup() /*----( SETUP: RUNS ONCE )----*/
{
pinMode(LED_BUILTIN, OUTPUT); //określa cyfrowy pin LED_BUILTIN jako wyjście
digitalWrite(LED_BUILTIN, LOW); // wyłącza diodę LED poprzez odcięcie napięcia (LOW)
detector_state = 0;
pinMode (IRsensor, INPUT );
pinMode (shutter, OUTPUT );
pinMode (focus, OUTPUT );
CLKPR = 0x80;
CLKPR = 0x04; // przetaktowanie z 16Mhz do 1Mhz Ważne: przetaktowanie nie ma wpływu na opisany problem - na standardowej prędkości 16Mhz jest dokładnie to samo
Serial.begin(9600);
delay(312); // aby zrekompensować underclocking z 16Mhz do 1Mhz należy podzielić rządany czas przez 16 - w tym przypadku 5000:16=312 (5sekund)
}
/*--(end setup)---*/
void loop () /*----( LOOP: RUNS CONSTANTLY )----*/
{
attachInterrupt(1, Budzenie, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(1);
// 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)
{
digitalWrite (focus, HIGH );
delay (7); // czas opożnienia w tym wypadku 5x16 = 80ms
digitalWrite (shutter, HIGH );
delay (7);
digitalWrite (focus, LOW );
digitalWrite (shutter, LOW);
delay (62); // czas opożnienia 1 sek.
}
delay (7); // czekamy po 2 zdjęciach i idziemy spać jak nie ma na pinie 3 LOW
}
void Budzenie()
{
// tu nic nie robimy
}