#include <Servo.h>
#define leftArm 3
#define rightArm 5
#define leftBack 6
#define rightBack 9
#define motorA 2
#define motorB 4
#define backRecline 7
#define frontRecline 8
#define longSitting 10
#define backSensor 11
#define seatSensor 12
#define reclineSensor 13
#define reclineBackTimeout 10000
#define reclineFrontTimeout 10000
#define sittingTimeout 30000
#define windTime 1600
#define unwindTime 1400
#define slideTime 2800
#define armTime 10000
#define relaxTime 10000
Servo left;
Servo right;
Servo rBack;
Servo lBack;
long reclineBackTime = millis();
long sittingTime = millis();
long reclineFrontTime = millis();
void setup()
{
Serial.begin(9600);
left.attach(leftArm);
right.attach(rightArm);
rBack.attach(leftBack);
lBack.attach(rightBack);
digitalWrite(motorA, OUTPUT);
digitalWrite(motorB, OUTPUT);
digitalWrite(backRecline, OUTPUT);
digitalWrite(frontRecline, OUTPUT);
digitalWrite(longSitting, OUTPUT);
digitalWrite(backSensor, INPUT);
digitalWrite(reclineSensor, INPUT);
digitalWrite(seatSensor, INPUT);
//Default states
lBack.write(180);
rBack.write(0);
left.write(180);
right.write(0);
}
void loop()
{
delay(10);
Serial.print(millis());
Serial.print(" ");
Serial.print(digitalRead(backSensor));
Serial.print(":");
Serial.print(reclineFrontTime);
Serial.print(" ");
Serial.print(digitalRead(reclineSensor));
Serial.print(":");
Serial.print(reclineBackTime);
Serial.print(" ");
Serial.print(digitalRead(seatSensor));
Serial.print(":");
Serial.println(sittingTime);
//Apply NOT-----------------------------------
//Front recline
if(!digitalRead(backSensor)) //Update if in correct posture //front recline -> 1
reclineFrontTime = millis();
//---------------------------------------------
//Back recline
if(digitalRead(reclineSensor)) //Update if not reclining //recline -> 0
reclineBackTime = millis();
//Sitting
if(digitalRead(seatSensor)) //Update if not sitting //Sitting -> 0
sittingTime = millis();
//Front recline
if((millis() - reclineFrontTime) >= reclineFrontTimeout)
{
//ON
Serial.print(millis());
Serial.print(" ");
Serial.print(reclineFrontTime);
Serial.print(" ");
Serial.println("front TO");
digitalWrite(frontRecline, HIGH);
left.write(90);
right.write(90);
delay(armTime);
left.write(180);
right.write(0);
Serial.print("Relaxing...");
delay(relaxTime);
Serial.println("Done!");
reclineBackTime = millis();
reclineFrontTime = millis();
sittingTime = millis();
}
else
{
digitalWrite(frontRecline, LOW);
left.write(180);
right.write(0);
}
//Back recline
if((millis() - reclineBackTime) >= reclineBackTimeout)
{
//
Serial.print(millis());
Serial.print(" ");
Serial.print(reclineBackTime);
Serial.print(" ");
Serial.println("back TO");
digitalWrite(backRecline, HIGH);
lBack.write(90);
rBack.write(70);
Serial.print("Relaxing...");
delay(relaxTime);
Serial.println("Done!");
reclineBackTime = millis();
reclineFrontTime = millis();
sittingTime = millis();
}
else
{
digitalWrite(backRecline, LOW);
lBack.write(180);
rBack.write(0);
}
//Long sitting
if((millis() - sittingTime) >= sittingTimeout)
{
//ON
Serial.print(millis());
Serial.print(" ");
Serial.print(sittingTime);
Serial.print(" ");
Serial.println("sit TO");
digitalWrite(longSitting, HIGH);
digitalWrite(motorA, HIGH);
digitalWrite(motorB, LOW);
delay(windTime);
digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
delay(slideTime);
digitalWrite(motorA, LOW);
digitalWrite(motorB, HIGH);
delay(unwindTime);
digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
Serial.print("Relaxing...");
delay(relaxTime);
Serial.println("Done!");
reclineBackTime = millis();
reclineFrontTime = millis();
sittingTime = millis();
}
else
{
digitalWrite(longSitting, LOW);
digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
}
}
Side View
Down View
Front View