// Time-lapse photography with display // Displays the time remaining before next photo, // displays the number of photos taken if a switch connected // on SENSOR_2 is pressed // RCX 2 firmware is necessary for display function // Suppress the #define RCX2 to compile for firmware 1.5 // and loose display functions // Shoots "NumberOfPhotos" separated by "Interval" minutes. // First image shot after "StartupTime" minutes. // Version for long intervals: // - The camera _is_ supposed to enter sleep mode // (program Coolpix Auto-off to 30 s to preserve batteries // and be sure it enters sleep mode) // If you use a Coolpix external supply, the camera won't go in // sleep mode. In that case suppress the #define NoSupply // - Total shooting time must be less than 24 hours // After each interval, the shutter release is pressed once to wake-up camera, // and 5 seconds later it is pressed a second time to shoot the photo #define NumberOfPhotos 10 #define Interval 1 #define StartupTime 1 #define RCX2 #define Nosupply // Shutter release definitions #define ReleaseMotor OUT_A #define ReleaseTouch SENSOR_1 #define DisplayMode SENSOR_2 #define PressWait 5 #define PressedWait 5 #define WakeWait 200 // The shutter release must be pressed long enough for wake-up #define WakeTime 300 // Time to wait for Coolpix wake-up #define ReleaseWait 15 int Aff; // variable used to refresh display. Must be global. task main() { int time; int i,j,k; int OldWatch; SetSensor(ReleaseTouch ,SENSOR_TOUCH); SetSensor(DisplayMode ,SENSOR_TOUCH); SetWatch(0,0); // Timer are too short, use RCX watch start SyncSeconds; // Create a second counter synch'ed on minutes change time=StartupTime; for(i=0; i=time){ #ifdef RCX2 if (DisplayMode==1) { Aff=i; SetUserDisplay( Aff, 0); } else { k=time-Watch(); if (k<=60) { j=(k-1)*100+59-Timer(1)/10; // if time < 1 hour, displays minutes.seconds } else { j=(k/60)*100+(k%60); // else displays hour.minutes } // intermediate calculation can't be done in Aff Aff=j; // or you get spurious display if (Timer(1)%10 < 5) // second heartbeat on dot { SetUserDisplay( Aff, 2); } else { SetUserDisplay( Aff, 0); } } #endif } #ifdef RCX2 Aff=i+1; SetUserDisplay( Aff, 0); // displays number of photo to be taken during shooting time #endif ShutterRelease(); time+=Interval; } PlaySound(2); } sub ShutterRelease() { PlaySound(1); #ifdef NoSupply // Wake-up camera OnRev(ReleaseMotor); until (ReleaseTouch == 1); Wait(PressWait); Off(ReleaseMotor); Wait(WakeWait); OnFwd(ReleaseMotor); until (ReleaseTouch == 0); Wait(ReleaseWait); Off(ReleaseMotor); // Wait for wake-up Wait(WakeTime); #endif // Shoot photo OnRev(ReleaseMotor); until (ReleaseTouch == 1); Wait(PressWait); Off(ReleaseMotor); Wait(PressedWait); OnFwd(ReleaseMotor); until (ReleaseTouch == 0); Wait(ReleaseWait); Off(ReleaseMotor); } // Create a second counter synch'ed on minutes change task SyncSeconds() { int OldWatch; ClearTimer(1); OldWatch=Watch(); while (true) { if(OldWatch