I already wrote code like this to manage two cameras in a high-altitude balloon. Had the same LDR to watch the Record light. Also had two wires into the guts of the camera to detect power, turn on power, and activate the Record button.
The Arduino was also logging GPS coordinates, RTC, and temperatures. Each module has a setup function and a loop function so that could share the Arduino's time.
// Fault flags
extern const unsigned int Cam1_fault;
extern const unsigned int Cam2_fault;
extern unsigned int Faults;
const int APIN_CAMERA_1_RECORD_LIGHT = 0;
const int DPIN_CAMERA_1_POWER = 3; // Ground for a second to turn on power
const int DPIN_CAMERA_1_RECORD = 4; // Reads HIGH if power is on. Pull LOW to start recording
const int APIN_CAMERA_2_RECORD_LIGHT = 1;
const int DPIN_CAMERA_2_POWER = 5; // Ground for a second to turn on power
const int DPIN_CAMERA_2_RECORD = 6; // Reads HIGH if power is on. Pull LOW to start recording
boolean camera1_is_recording = false;
boolean camera2_is_recording = false;
unsigned long lastCamera1RecordLightTime = 0;
unsigned long lastCamera2RecordLightTime = 0;
unsigned int camera1_minReading = 1023;
unsigned int camera1_maxReading = 0;
unsigned int camera2_minReading = 1023;
unsigned int camera2_maxReading = 0;
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define CAMERA_INTERVAL 5000 // mills between entries (reduce to take more/faster data)
unsigned long LastCameraTime = 0;
void Cameras_setup(void)
{
// Initialize the cameras
InitializeCamera(APIN_CAMERA_1_RECORD_LIGHT, DPIN_CAMERA_1_POWER, DPIN_CAMERA_1_RECORD);
InitializeCamera(APIN_CAMERA_2_RECORD_LIGHT, DPIN_CAMERA_2_POWER, DPIN_CAMERA_2_RECORD);
}
void Cameras_loop(void)
{
unsigned long currentTime = millis();
CheckRecordingLight(camera1_is_recording, lastCamera1RecordLightTime, APIN_CAMERA_1_RECORD_LIGHT, camera1_minReading, camera1_maxReading, Cam1_fault);
CheckRecordingLight(camera2_is_recording, lastCamera2RecordLightTime, APIN_CAMERA_2_RECORD_LIGHT, camera2_minReading, camera2_maxReading, Cam2_fault);
if (currentTime - LastCameraTime > CAMERA_INTERVAL)
{
LastCameraTime = currentTime;
ManageCamera(camera1_is_recording, lastCamera1RecordLightTime, APIN_CAMERA_1_RECORD_LIGHT, DPIN_CAMERA_1_POWER, DPIN_CAMERA_1_RECORD, Cam1_fault);
ManageCamera(camera2_is_recording, lastCamera2RecordLightTime, APIN_CAMERA_2_RECORD_LIGHT, DPIN_CAMERA_2_POWER, DPIN_CAMERA_2_RECORD, Cam2_fault);
}
}
void InitializeCamera(int APIN_RECORDING, int DPIN_POWER, int DPIN_RECORD)
{
pinMode(DPIN_POWER, OUTPUT);
digitalWrite(DPIN_POWER,LOW);
pinMode(DPIN_RECORD, INPUT);
}
void CheckRecordingLight(boolean &isRecording, unsigned long &lastRecordLightTime,int APIN_RECORDING,
unsigned int &minReading, unsigned int &maxReading, unsigned int faultFlag)
{
int reading = analogRead(APIN_RECORDING);
if (reading < minReading)
minReading = reading;
if (reading > maxReading)
maxReading = reading;
unsigned int avgReading = (minReading + maxReading) / 2;
boolean recordLight = (reading < avgReading) && (minReading != maxReading);
if (recordLight)
{
lastRecordLightTime = millis();
isRecording = true;
}
// If the light has been off for more than two seconds
if (millis() - lastRecordLightTime > 2000)
{
isRecording = false;
Faults |= faultFlag;
}
}
void ManageCamera(boolean &isRecording, unsigned long &lastRecordLightTime, int APIN_RECORDING, int DPIN_POWER, int DPIN_RECORD, unsigned int faultFlag)
{
// Every 10 seconds...
// Check that power is on
pinMode(DPIN_RECORD, INPUT);
if (digitalRead(DPIN_RECORD) == LOW)
{
// Power is off.
Faults |= faultFlag;
// Turn the power on
// Serial.println("Power is off. Turning on.");
digitalWrite(DPIN_POWER, HIGH);
delay(500);
digitalWrite(DPIN_POWER,LOW);
// Check again in 10 seconds
}
else
{
// Power is on. Make sure we are recording
if (isRecording)
{
Faults &= ~faultFlag;
}
else
{
// Serial.println("Power is ready. Start recording.");
digitalWrite(DPIN_RECORD, LOW);
pinMode(DPIN_RECORD, OUTPUT); // Pull the line low
delay(500);
pinMode(DPIN_RECORD, INPUT); // Let it float again
}
}
}