#include <Servo.h>
const int ldrLeftPin = A0;
const int ldrRightPin = A1;
const int servoLeftPin = 9;
const int servoRightPin = 10;
const int afferentLesionPin = 2;
const int efferentLesionPin = 3;
Servo leftIris;
Servo rightIris;
// Thresholds: tweak based on ambient tuning
const int brightThreshold = 800;
const int darkThreshold = 300;
void setup() {
leftIris.attach(servoLeftPin);
rightIris.attach(servoRightPin);
pinMode(afferentLesionPin, INPUT_PULLUP);
pinMode(efferentLesionPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int lightLeft = analogRead(ldrLeftPin);
int lightRight = analogRead(ldrRightPin);
// For consensual reflex, use the brighter eye (lower analogRead = more light)
int dominantLight = min(lightLeft, lightRight);
Serial.print("Left LDR: "); Serial.print(lightLeft);
Serial.print(" | Right LDR: "); Serial.print(lightRight);
Serial.print(" | Using: "); Serial.println(dominantLight);
int servoAngle = mapLightToIris(dominantLight);
bool afferentLesion = digitalRead(afferentLesionPin) == LOW;
bool efferentLesion = digitalRead(efferentLesionPin) == LOW;
if (afferentLesion) {
// No light sensed → both pupils stay dilated
leftIris.write(150);
rightIris.write(150);
} else if (efferentLesion) {
// One eye fixed dilated, other responds
leftIris.write(servoAngle);
rightIris.write(150);
} else {
// Normal: both respond to light in either eye
leftIris.write(servoAngle);
rightIris.write(servoAngle);
}
delay(100);
}
// Convert light value into servo angle (mapped around 90)
int mapLightToIris(int lightVal) {
if (lightVal > brightThreshold) {
return 150; // Constricted
} else if (lightVal < darkThreshold) {
return 30; // Dilated
} else {
return 90; // Neutral
}
}