@@ -59,6 +59,7 @@ int iPupilFactor = 42;
5959uint32_t boopSum = 0 ;
6060bool booped = false ;
6161int fixate = 7 ;
62+ uint8_t lightSensorFailCount = 0 ;
6263
6364// For autonomous iris scaling
6465#define IRIS_LEVELS 7
@@ -191,19 +192,21 @@ void setup() {
191192 eye[e].iris .startAngle = (e & 1 ) ? 512 : 0 ; // Rotate alternate eyes 180 degrees
192193 eye[e].iris .angle = eye[e].iris .startAngle ;
193194 eye[e].iris .mirror = 0 ;
194- eye[e].iris .spin = 0 ;
195+ eye[e].iris .spin = 0.0 ;
196+ eye[e].iris .iSpin = 0 ;
195197 eye[e].sclera .color = 0xFFFF ;
196198 eye[e].sclera .data = NULL ;
197199 eye[e].sclera .filename = NULL ;
198200 eye[e].sclera .startAngle = (e & 1 ) ? 512 : 0 ; // Rotate alternate eyes 180 degrees
199201 eye[e].sclera .angle = eye[e].sclera .startAngle ;
200202 eye[e].sclera .mirror = 0 ;
201- eye[e].sclera .spin = 0 ;
203+ eye[e].sclera .spin = 0.0 ;
204+ eye[e].sclera .iSpin = 0 ;
202205
203206 // Uncanny eyes carryover stuff for now, all messy:
204207 eye[e].blink .state = NOBLINK;
205- eye[e].eyeX = 512 ;
206- eye[e].eyeY = 512 ;
208+ // eye[e].eyeX = 512;
209+ // eye[e].eyeY = 512;
207210 eye[e].blinkFactor = 0.0 ;
208211 }
209212
@@ -328,6 +331,12 @@ void setup() {
328331 Serial.printf (" Free RAM: %d\n " , availableRAM ());
329332
330333 randomSeed (SysTick->VAL + analogRead (A2));
334+ eyeOldX = eyeNewX = eyeOldY = eyeNewY = mapRadius; // Start in center
335+ for (e=0 ; e<NUM_EYES; e++) { // For each eye...
336+ eye[e].eyeX = eyeOldX;
337+ eye[e].eyeY = eyeOldY;
338+ }
339+ lastLightReadTime = micros () + 2000000 ; // Delay initial light reading
331340}
332341
333342// LOOP FUNCTION - CALLED REPEATEDLY UNTIL POWER-OFF -----------------------
@@ -429,12 +438,21 @@ void loop() {
429438 // both eyes. This comment has nothing to do with the code.
430439 uint16_t rawReading = (lightSensorPin >= 100 ) ?
431440 seesaw.analogRead (lightSensorPin - 100 ) : analogRead (lightSensorPin);
432- if (rawReading < lightSensorMin) rawReading = lightSensorMin; // Clamp light sensor range
433- else if (rawReading > lightSensorMax) rawReading = lightSensorMax; // to within usable range
434- float v = (float )(rawReading - lightSensorMin) / (float )(lightSensorMax - lightSensorMin); // 0.0 to 1.0
435- v = pow (v, lightSensorCurve);
436- lastLightValue = irisMin + v * irisRange;
437- lastLightReadTime = t;
441+ if (rawReading <= 1023 ) {
442+ if (rawReading < lightSensorMin) rawReading = lightSensorMin; // Clamp light sensor range
443+ else if (rawReading > lightSensorMax) rawReading = lightSensorMax; // to within usable range
444+ float v = (float )(rawReading - lightSensorMin) / (float )(lightSensorMax - lightSensorMin); // 0.0 to 1.0
445+ v = pow (v, lightSensorCurve);
446+ lastLightValue = irisMin + v * irisRange;
447+ lastLightReadTime = t;
448+ lightSensorFailCount = 0 ;
449+ } else { // I2C error
450+ if (++lightSensorFailCount >= 50 ) { // If repeated errors in succession...
451+ lightSensorPin = -1 ; // Stop trying to use the light sensor
452+ } else {
453+ lastLightReadTime = t - LIGHT_INTERVAL + 40000 ; // Try again in 40 ms
454+ }
455+ }
438456 }
439457 irisValue = (irisValue * 0.97 ) + (lastLightValue * 0.03 ); // Filter response for smooth reaction
440458 } else {
@@ -556,8 +574,18 @@ void loop() {
556574 }
557575
558576 float mins = (float )millis () / 60000.0 ;
559- eye[eyeNum].iris .angle = (int )((float )eye[eyeNum].iris .startAngle + eye[eyeNum].iris .spin * mins + 0.5 );
560- eye[eyeNum].sclera .angle = (int )((float )eye[eyeNum].sclera .startAngle + eye[eyeNum].sclera .spin * mins + 0.5 );
577+ if (eye[eyeNum].iris .iSpin ) {
578+ // Spin works in fixed amount per frame (eyes may lose sync, but "wagon wheel" tricks work)
579+ eye[eyeNum].iris .angle += eye[eyeNum].iris .iSpin ;
580+ } else {
581+ // Keep consistent timing in spin animation (eyes stay in sync, no "wagon wheel" effects)
582+ eye[eyeNum].iris .angle = (int )((float )eye[eyeNum].iris .startAngle + eye[eyeNum].iris .spin * mins + 0.5 );
583+ }
584+ if (eye[eyeNum].sclera .iSpin ) {
585+ eye[eyeNum].sclera .angle += eye[eyeNum].sclera .iSpin ;
586+ } else {
587+ eye[eyeNum].sclera .angle = (int )((float )eye[eyeNum].sclera .startAngle + eye[eyeNum].sclera .spin * mins + 0.5 );
588+ }
561589
562590 // END ONCE-PER-FRAME EYE ANIMATION ----------------------------------
563591
0 commit comments