
/*
Useless box version 1.0
Sketch version 1.2
June 2021
Alex Pikkert

Components:
One Arduino UNO R3
Two Sound modules ISD1820 incl. speaker
One PIR HC-SR505  
Three servos SG90 180 degrees
Two toggle switches
Two resistors 2200 Ohm 1/8 watt
Two tricolor leds
One wooden box

cover rest position is 0.
cover full open position is 125.
cover minimum open is 35.
arm rest position is 0.
arm switching position is 145.
arm delay maximum is 60.

Commands:
ArmLeftOUT(distance,speed)
ArmLeftIN(distance,speed)
ArmRightOUT(distance,speed)
ArmRightIN(distance,speed)
CoverUP(distance,speed)
CoverDOWN(distance,speed)
CoverSHAKE(distance,speed,number)
Sound(1)
Sound(2)

*/

#include <Servo.h>
Servo ServoLeft;
Servo ServoRight;
Servo ServoCover;
int SwitchLeft = 2;
int SwitchRight = 3;
int Pir = 8;
int MemLeft = 0;
int MemRight = 0;
int MemCover = 0;
int CountLeft = 0;
int CountRight = 0;
int CountCover = 0;
int i = 0;
int j = 0;
int x = 0;
int y = 0;
int p = 100;

void setup() {
  pinMode(A0, OUTPUT); //blue led left
  pinMode(A1, OUTPUT); //green led left
  pinMode(A2, OUTPUT); //red led left
  pinMode(A3, OUTPUT); //blue led right
  pinMode(A4, OUTPUT); //green led right
  pinMode(A5, OUTPUT); //red led right
  pinMode(7, OUTPUT);  //spare output 
  pinMode(11, OUTPUT); //sound 2
  pinMode(12, OUTPUT); //sound 1
  pinMode(2, INPUT_PULLUP); //switch left
  pinMode(3, INPUT_PULLUP); //switch right
  ServoLeft.attach(4);      //arm left
  ServoRight.attach(5);     //arm right 
  ServoCover.attach(6);     // arm cover
  ServoLeft.write(0);       //start position
  ServoRight.write(0);      //start position
  ServoCover.write(0);      //start position
  
  WakeUp();StartLights(50); // initialisation 
}

void loop() 
{
if(digitalRead(SwitchRight)==LOW)
{GreenLeftOFF();GreenRightOFF();ActionRight();}

if(digitalRead(SwitchLeft)==LOW)
{GreenLeftOFF();GreenRightOFF();ActionLeft();}

if(digitalRead(Pir)==HIGH) {
RedLeftON();RedRightON();delay(p);RedLeftOFF();RedRightOFF();delay(p);
GreenLeftON();GreenRightON();delay(p);GreenLeftOFF();GreenRightOFF();delay(p);
BlueLeftON();BlueRightON();delay(p);BlueLeftOFF();BlueRightOFF();delay(p);}
else {RedLeftOFF();RedRightOFF();GreenLeftOFF();GreenRightOFF();BlueLeftOFF();BlueRightOFF();}
}


//SUBROUTINES********************************************************

void ArmLeftOUT(int y, int x)
{for(i= MemLeft; i < MemLeft+y; i += 1)
{ServoLeft.write(i);delay(x);}
MemLeft =i;
}

void ArmLeftIN(int y, int x)
{for(i= MemLeft; i > MemLeft-y; i -= 1)
{ServoLeft.write(i);delay(x);}
MemLeft =i;
}

void ArmLeftRESET()
{ServoLeft.write(0);MemLeft =0;}

void ArmRightOUT(int y, int x)
{for(i= MemRight; i < MemRight+y; i += 1)
{ServoRight.write(i);delay(x);}
MemRight =i;
}

void ArmRightIN(int y, int x)
{for(i= MemRight; i > MemRight-y; i -= 1)
{ServoRight.write(i);delay(x);}
MemRight =i;
}

void ArmRightRESET()
{ServoRight.write(0);MemRight =0;}

void CoverUP(int y, int x)
{for(i= MemCover; i < MemCover+y; i += 1)
{ServoCover.write(i);delay(x);}
MemCover =i;
}

void CoverDOWN(int y, int x)
{for(i= MemCover; i > MemCover-y; i -= 1)
{ServoCover.write(i);delay(x);}
MemCover =i;
}

void CoverRESET()
{ServoCover.write(0);MemCover =0;}

void Sound(int s){
if (s==1) {digitalWrite(12,HIGH);delay(20);digitalWrite(12,0);}
if (s==2) {digitalWrite(11,HIGH);delay(20);digitalWrite(11,0);}
}

void BlueLeftON(){analogWrite(A0,255);}
void BlueRightON(){analogWrite(A3,255);}
void GreenLeftON(){analogWrite(A1,255);}
void GreenRightON(){analogWrite(A4,255);}
void RedLeftON(){analogWrite(A2,255);}
void RedRightON(){analogWrite(A5,255);}
void BlueLeftOFF(){analogWrite(A0,0);}
void BlueRightOFF(){analogWrite(A3,0);}
void GreenLeftOFF(){analogWrite(A1,0);}
void GreenRightOFF(){analogWrite(A4,0);}
void RedLeftOFF(){analogWrite(A2,0);}
void RedRightOFF(){analogWrite(A5,0);}

void StartLights(int x)
{BlueLeftON();delay(x);BlueLeftOFF();delay(x);
GreenLeftON();delay(x);GreenLeftOFF();delay(x);
RedLeftON();delay(x);RedLeftOFF();delay(x);
BlueRightON();delay(x);BlueRightOFF();delay(x);
GreenRightON();delay(x);GreenRightOFF();delay(x);
RedRightON();delay(x);RedRightOFF();delay(x);
delay(2000);
}

void CoverSHAKE (int y, int x, int z)
{
for(j= 1; j < z; j += 1)
{ CoverDOWN(y,x);delay(50);CoverUP(y,x);delay(50);} 
}

void WakeUp()
{
for(j= 8; j >0; j -= 1)
    {BlueLeftON();BlueRightON();delay(70*j);BlueLeftOFF();
    BlueRightOFF();delay(70*j);}
}

void ActionRight()
{
    CountRight=CountRight+1; if(CountRight==6){CountRight=0;}
  switch (CountRight) { 

 case 1:
    BlueRightON();delay(1000);
    CoverUP(125,0);delay(500);
    ArmRightOUT(150,0);BlueRightOFF();delay(500);ArmRightRESET();
    delay(300);CoverDOWN(125,5);
    break;

 case 2:
    RedRightON();delay(1000);
    CoverUP(125,0);delay(500);
    ArmRightOUT(150,0);delay(100);RedRightOFF();delay(500);
    Sound(2);CoverSHAKE(30,0,10);
    ArmRightRESET();
    delay(300);CoverRESET();
    break;

 case 3:
    RedRightON();delay(1000);
    CoverUP(60,35);delay(500);CoverUP(65,0);delay(200);
    ArmRightOUT(120,0);ArmRightOUT(30,30); RedRightOFF();delay(1000);ArmRightIN(35,0);
    CoverSHAKE(35,5,3);
    ArmRightRESET();
    delay(300);CoverRESET();
    break;

 case 4:
    RedRightON();delay(1000);
    CoverUP(60,35);delay(500);CoverUP(65,0);delay(200);
    ArmRightOUT(120,0);ArmRightOUT(30,30); RedRightOFF();
    for(i= 0; i < 15; i += 1)
    {RedRightON();delay(40);RedRightOFF();delay(40);}
    for(j= 0; j < 8; j += 1)
    {ArmRightIN(40,0);delay(100);ArmRightOUT(40,0);delay(100);}
    delay(1500);ArmRightRESET();delay(300);
    CoverSHAKE(25,5,3);
    delay(300);CoverRESET();
    break;

 case 5:
    for(i= 0; i < 10; i += 1)
    {RedRightON();delay(50);RedRightOFF();
    BlueRightON();delay(50);BlueRightOFF();
    GreenRightON();delay(50);GreenRightOFF();}   
    CoverUP(60,30);delay(300);CoverUP(85,0);delay(200);
    ArmRightOUT(145,0);delay(600);
    Sound(1);ArmRightRESET();delay(300);
    ArmRightOUT(145,0);delay(600);
    ArmRightIN(145,0);delay(300);
    ArmRightOUT(145,0);delay(600);
    ArmRightIN(145,0);delay(300);
    ArmRightOUT(145,0);delay(600);
    ArmRightIN(145,0);delay(300);
    CoverDOWN(50,0);delay(300);CoverSHAKE(15,3,8);
    delay(500);CoverRESET();
    for(i= 0; i < 10; i += 1)
    {RedRightON();delay(50);RedRightOFF();
    BlueRightON();delay(50);BlueRightOFF();
    GreenRightON();delay(50);GreenRightOFF();}   
    Sound(1);
    break;
}
}
void ActionLeft()
{
    CountLeft=CountLeft+1; if(CountLeft==6){CountLeft=0;}
  switch (CountLeft) { 

  case 1:
    BlueLeftON();delay(1000);
    CoverUP(125,0);delay(500);
    ArmLeftOUT(150,0);BlueLeftOFF();delay(500);ArmLeftRESET();
    delay(300);CoverDOWN(125,5);
    break;

 case 2:
    RedLeftON();delay(1000);
    CoverUP(125,0);delay(500);
    ArmLeftOUT(150,0);delay(100);RedLeftOFF();delay(500);
    Sound(2);CoverSHAKE(30,0,10);
    ArmLeftRESET();
    delay(300);CoverRESET();
    break;
 
 case 3:
    RedLeftON();delay(1000);
    CoverUP(60,35);delay(500);CoverUP(65,0);delay(200);
    ArmLeftOUT(120,0);ArmLeftOUT(30,30); RedLeftOFF();delay(1000);ArmLeftIN(35,0);
    CoverSHAKE(35,5,3);
    ArmLeftRESET();
    delay(300);CoverRESET();
    break;

 case 4:
    RedLeftON();delay(1000);
    CoverUP(60,35);delay(500);CoverUP(65,0);delay(200);
    ArmLeftOUT(120,0);ArmLeftOUT(30,30); RedLeftOFF();
    for(i= 0; i < 15; i += 1)
    {RedLeftON();delay(40);RedLeftOFF();delay(40);}
    for(j= 0; j < 8; j += 1)
    {ArmLeftIN(40,0);delay(100);ArmLeftOUT(40,0);delay(100);}
    delay(1500);ArmLeftRESET();delay(300);
    CoverSHAKE(25,5,3);
    delay(300);CoverRESET();
    break;

 case 5:
    for(i= 0; i < 10; i += 1)
    {RedLeftON();delay(50);RedLeftOFF();
    BlueLeftON();delay(50);BlueLeftOFF();
    GreenLeftON();delay(50);GreenLeftOFF();}   
    CoverUP(60,30);delay(300);CoverUP(85,0);delay(200);
    ArmLeftOUT(145,0);delay(600);
    Sound(1);ArmLeftRESET();delay(300);
    ArmLeftOUT(145,0);delay(600);
    ArmLeftIN(145,0);delay(300);
    ArmLeftOUT(145,0);delay(600);
    ArmLeftIN(145,0);delay(300);
    ArmLeftOUT(145,0);delay(600);
    ArmLeftIN(145,0);delay(300);
    CoverDOWN(50,0);delay(300);CoverSHAKE(15,3,8);
    delay(500);CoverRESET();
    for(i= 0; i < 10; i += 1)
    {RedLeftON();delay(50);RedLeftOFF();
    BlueLeftON();delay(50);BlueLeftOFF();
    GreenLeftON();delay(50);GreenLeftOFF();}   
    Sound(1);
    break;
}
}
