#include <Servo.h>
Servo eyes;
Servo eyelids;
Servo upperLip;
Servo lowerLip;
byte lidServoPin = 9, eyeServoPin = 10, uplipServoPin = 5, lolipServoPin = 6;
int lidOpen = 75;
int lidClose = 105;
int eyesLeft = 45;
int eyesCenter = 90;
int eyesRight = 135;
int mouthClosed = 90;
char openLeft[] = "[o ] [o ]";
char closeLeft[] = "[_ ] [_ ]";
char openRight[] = "[ o] [ o]";
char closeRight[] = "[ _] [ _]";
char openCenter[] = "[ o ] [ o ]";
char closeCenter[] = "[ _ ] [ _ ]";
char mouthShape[] = "=<";
int upLipAngle = 5; // upper lip opens less
int loLipAngle = 10; // lower lip opens more
// two timers for two events (left/right) and (open/close)
unsigned long timerEyes, timerMouth, intervalEyes = 1000, intervalMouth = 200;
void setup() {
randomSeed(analogRead(A0)); // create pseudo randomness
Serial.begin(115200);
eyes.attach(eyeServoPin);
eyelids.attach(lidServoPin);
upperLip.attach(uplipServoPin);
lowerLip.attach(lolipServoPin);
}
void loop() {
byte state = random(3); // eye states: left, center, right
// mouth
if (millis() - timerMouth > intervalMouth) {
int lips = map(analogRead(A0), 0, 1023, 0, 5); // mouth states, closed (0) to wide open (5)
timerMouth = millis();
upperLip.write(mouthClosed + lips * upLipAngle); // upper lips open less
lowerLip.write(mouthClosed - lips * loLipAngle); // lower lip opens more
delay(100);
upperLip.write(mouthClosed);
lowerLip.write(mouthClosed);
}
// eyes
if (millis() - timerEyes > intervalEyes) { // check timer
timerEyes = millis(); // reset timer
switch (state) {
case 0: lookLeft(); break;
case 1: lookRight(); break;
case 2: lookCenter(); break;
}
}
delay(50); // let relays arrive
}
void lookLeft() {
Serial.print(openLeft);
Serial.println(" left");
eyes.write(eyesLeft); //left
if (!random(3)) { // one in three chances
blinkLeft();
}
}
void lookRight() {
Serial.print(openRight);
Serial.println(" right");
eyes.write(eyesRight); //right
if (!random(3)) {
blinkRight();
}
}
void lookCenter() {
Serial.print(openCenter);
Serial.println(" center");
eyes.write(eyesCenter); // center
if (!random(3)) {
blinkCenter();
}
}
void blinkLeft() {
delay(500);
Serial.print(closeLeft);
Serial.println(" left closed");
eyelids.write(lidClose); //close
delay(250);
Serial.print(openLeft);
Serial.println(" left open");
eyelids.write(lidOpen); //open
delay(500);
}
void blinkRight() {
delay(500);
Serial.print(closeRight);
Serial.println(" right closed");
eyelids.write(lidClose); //close
delay(250);
Serial.print(openRight);
Serial.println(" right open");
eyelids.write(lidOpen); //open
delay(500);
}
void blinkCenter() {
delay(500);
Serial.print(closeCenter);
Serial.println(" center closed");
eyelids.write(lidClose); //close
delay(250);
Serial.print(openCenter);
Serial.println(" center open");
eyelids.write(lidOpen); //open
delay(500);
}EYES
EYELIDS
[oo_]
[_oo]
[ o ]
[ _ ]
UPPER LIP
LOWER LIP
[o o]