//Useless Box "Hank" Style by Blayder
//the code is free to change, you can do whatever you want with it. Have fun :D
//You need the Servo.h library to use this code.
#include "driver/rtc_io.h"
#include <ESP32Servo.h>
Servo doorServo;
Servo handServo;
#define WAKEUP_GPIO GPIO_NUM_15 // Only RTC IO are allowed
int switch_pin = 15; //set switch on pin 15
int VibrationMotorPin = 14;
int DoorPin = 13;
int HandPin = 12;
int AngryLight = 27;
int handMin = 160; //Calibration Value Hand Min
int handMax = 0; //Calibration Value Hand Max
int doorMin = 180; //Calibration Value Door Min
int doorMax = 30; //Calibration Value Door Max
unsigned long peekperiod = 600000; //Variable timer - peek every 10 min (600000)
int pos = 0;
int AktHandpos = 0; //current HandPos
int AktDoorpos = 0; //current Doorpos
int selectedMove = 0; //Move selector
int TestMove = 0; //test mode: set to Move number to test only one selected Move (set to Zero to run normally)
int RandomMode = LOW; //After ran through all the modes, set to random
int Alreadyreset = LOW;
unsigned long time1 = 0; //saves millis when low
unsigned long time2 = 0; //millis - time1
unsigned long time3 = 20000; //Variable timer - used to reset random mode
unsigned long peekperiodmillis; //Variable timer - peek every 10 min
void setup(){
esp_sleep_enable_ext0_wakeup(WAKEUP_GPIO, 1); // 1 = High, 0 = Low
//rtc_gpio_pulldown_en(WAKEUP_GPIO); // GPIO15 is tie to GND in order to wake up in HIGH
//rtc_gpio_pullup_dis(WAKEUP_GPIO); // Disable PULL_UP in order to allow it to wakeup on HIGH
Serial.begin(9600);
pinMode(switch_pin, INPUT_PULLUP);
pinMode(VibrationMotorPin, OUTPUT);
pinMode(AngryLight, OUTPUT);
doorServo.attach(DoorPin); //set door servo on Pin 9 pwm
handServo.attach(HandPin); //set hand servo on Pin 10 pwm
doorServo.write(handMin); //set door to hiding position
handServo.write(handMin); //set hand to hiding position
}
void loop(){
Reset();
time2 = millis() - time1;
//SPECIAL TIMER MODE, PEEK EVERY 10 MIN
if(millis() > peekperiodmillis + peekperiod){
peekperiodmillis = millis();
{ PEEK(); }
}
//if the switch is on, then Move door and hand to switch it off...
else if(digitalRead(switch_pin) == LOW){
time1 = millis();
Alreadyreset = LOW;
if(RandomMode == LOW){
selectedMove++;
}
if (selectedMove > 11) {
RandomMode = HIGH;
}
if (RandomMode == HIGH){
selectedMove = random(1,11); //when all Moves are played, do random Moves
}
if (selectedMove == 0) { MOVE1(); }
else if (selectedMove == 1) { MOVE1(); }
else if (selectedMove == 2) { MOVE2(); }
else if (selectedMove == 3) { MOVE3(); }
else if (selectedMove == 4) { MOVE4(); }
else if (selectedMove == 5) { MOVE5(); }
else if (selectedMove == 6) { MOVE6(); }
else if (selectedMove == 7) { MOVE7(); }
else if (selectedMove == 8) { MOVE8(); }
else if (selectedMove == 9) { MOVE9(); }
else if (selectedMove == 10) { MOVE10(); }
else if (selectedMove == 11) { MOVE11(); }
}
if(time2 > time3 && Alreadyreset == LOW){
Alreadyreset = HIGH;
RandomMode = LOW;
selectedMove = 0;
Serial.println("going to sleep now");
esp_deep_sleep_start();
}
}
void Reset(){
AktDoorpos = doorMin;
AktHandpos = handMin;
}
void DoorOpen(int offset,int Speed){
//General routine for opening the door, an offset +/-
//can be specified how far it Moves, in addition to the speed
for(pos = AktDoorpos; pos > doorMax + offset; pos -= Speed){
doorServo.write(pos);
delay(8);
}
AktDoorpos = pos;
}
void DoorClose(int offset,int Speed){
//General routine for closing the door, an offset +/-
//can be specified how far it Moves, in addition to the speed
for(pos = AktDoorpos; pos<=doorMin+offset; pos+=Speed){
doorServo.write(pos);
delay(8);
}
AktDoorpos = pos;
}
void HandToPin(int offset,int Speed){
//General routine for Move the Hand to the Pin, an offset +/-
//can be specified how far it Moves, in addition to the speed
for(pos = AktHandpos; pos > handMax + offset; pos -= Speed){
handServo.write(pos);
delay(10);
}
AktHandpos = pos;
}
void HandToHide(int offset,int Speed){
//General routine for Move the Hand to the Hiding Position, an offset +/-
//can be specified how far it Moves, in addition to the speed
for(pos = AktHandpos; pos<=handMin+offset; pos+=Speed){
handServo.write(pos);
delay(10);
}
AktHandpos = pos;
}
//---------------------
// Library of Moves
//---------------------
// PEEK
void PEEK(){
Serial.println("PEEK");
DoorOpen(30,1); //higher offset value in DoorOpen = more closed
delay(random(1000,2000));
DoorClose(0,1);
}
// Move 1
void MOVE1(){
Serial.println("Move 1");
DoorOpen(30,1); //higher offset value in DoorOpen = more closed
HandToPin(-7,2);
delay(100);
HandToHide(0,3);
DoorClose(0,1);
}
// Move 2: open and wait, then Move hand and wait, then switch of and hide
void MOVE2(){
Serial.println("Move 2");
DoorOpen(60,3);
delay(random(1000,2000));
DoorClose(0,3);
delay(random(100,2000));
DoorOpen(60,3);
delay(random(100,2000));
DoorClose(0,3);
delay(700);
DoorOpen(0,3);
delay(700);
DoorClose(0,1);
delay(1000);
DoorOpen(0,3);
HandToPin(-7,5);
delay(100);
HandToHide(0,5);
DoorClose(0,3);
delay(random(100,2000));
DoorOpen(60,1);
delay(random(100,2000));
DoorClose(0,1);
}
//Move 3: open door then close it many times, wait, then quickly reoprn a nd switch off and hide.
void MOVE3(){
Serial.println("Move 3");
delay(random(100,2000));
DoorOpen(0,3);
delay(800);
HandToPin(15,7);
delay(2000);
HandToPin(-7,5);
HandToHide(0,5);
DoorClose(0,3);
}
// Move 4: open door, then Move hand very slowly forward and back to hiding very slowly, then quickly close door
void MOVE4(){
Serial.println("Move 4");
delay(random(100,2000));
DoorOpen(0,3);
HandToPin(-7,5);
delay(100);
HandToHide(0,5);
DoorClose(0,5);
delay(2000);
DoorOpen(0,5);
delay(random(1000,3000));
DoorClose(0,1);
}
//Move 5: open door, hand to pin, close door, open door and back to hinding hand
void MOVE5(){
Serial.println("Move 5");
delay(random(100,2000));
DoorOpen(0,3);
HandToPin(-7,5);
delay(800);
DoorClose(-90,2);
DoorOpen(0,5);
DoorClose(-90,2);
DoorOpen(0,5);
delay(500);
HandToHide(0,5);
DoorClose(0,2);
}
//Move 6:
void MOVE6(){
Serial.println("Move 6");
delay(random(100,2000));
DoorOpen(0,3);
delay(50);
HandToPin(10,5);
delay(1000);
HandToHide(30,5);
delay(1000);
HandToPin(10,5);
delay(1000);
DoorClose(-90,2);
delay(random(100,1000));
DoorOpen(0,5);
delay(random(100,1000));
DoorClose(-90,2);
delay(random(100,1000));
DoorOpen(0,5);
delay(random(100,1000));
DoorClose(-90,2);
delay(random(100,1000));
DoorOpen(0,5);
delay(250);
HandToPin(-7,5);
delay(200);
HandToHide(0,5);
DoorClose(0,2);
}
//Move 7:
void MOVE7(){
Serial.println("Move 7");
delay(random(100,2000));
DoorOpen(0,5);
delay(50);
HandToPin(-7,5);
DoorClose(-90,2);
delay(700);
DoorOpen(0,5);
delay(100);
DoorClose(-90,5);
delay(100);
DoorOpen(0,5);
delay(100);
DoorClose(-90,5);
delay(100);
DoorOpen(0,5);
delay(250);
HandToHide(0,5);
DoorClose(0,2);
}
//Move 8:
void MOVE8(){
Serial.println("Move 8");
delay(random(100,2000));
DoorOpen(0,4);
HandToPin(70,10);
delay(1000);
HandToHide(0,10);
delay(1500);
HandToPin(-7,10);
delay(100);
HandToHide(0,10);
DoorClose(0,4);
}
//Move 9:
void MOVE9(){
Serial.println("Move 9");
delay(random(100,2000));
digitalWrite(VibrationMotorPin, HIGH);
digitalWrite(AngryLight, HIGH);
delay(1000);
digitalWrite(VibrationMotorPin, LOW);
DoorOpen(20,4);
delay(2000);
DoorClose(0,1);
delay(3000);
DoorOpen(30,4);
delay(500);
DoorClose(0,1);
delay(1000);
DoorOpen(0,4);
delay(100);
HandToPin(5,5);
delay(100);
HandToHide(0,10);
delay(100);
HandToPin(5,5);
delay(100);
HandToHide(0,10);
delay(100);
HandToPin(-7,5);
delay(100);
HandToHide(0,5);
DoorClose(0,1);
delay(random(100,2000));
DoorOpen(60,1);
delay(random(100,2000));
DoorClose(0,1);
digitalWrite(AngryLight, LOW);
}
//Move 10:
void MOVE10(){
Serial.println("Move 10");
delay(random(1000,5000));
DoorOpen(80,random(1,3));
delay(random(100,2000));
DoorClose(0,1);
delay(random(3000,15000));
DoorOpen(0,4);
HandToPin(-7,5);
delay(100);
HandToHide(0,5);
DoorClose(0,3);
delay(random(100,2000));
DoorOpen(60,1);
delay(random(1000,3000));
DoorClose(0,1);
}
//Move 11:
void MOVE11(){
Serial.println("Move 11");
DoorOpen(0,5);
delay(random(100,2000));
HandToPin(-7,5);
delay(100);
HandToHide(0,5);
DoorClose(0,5);
}