// Useless box
// Fernando Falci <falci at falci dot me>
#include <Servo.h>
Servo servo;
const int PIN_SERVO = 8;
const int PIN_BTN = 7;
const int POS_FECHADO = 100;
const int POS_ABRE_A_TAMPA = 70;
const int POS_ABERTO = 65;
const int POS_MEIO_CAMINHO = 50;
const int POS_TOCAR_BTN = 42;
const int POS_MUDAR_BTN = 34;
const int MOVE_LENTO = 10;
const int MOVE_NORMAL = 5;
const int MOVE_RAPIDO = 2;
int count = 0;
void setup() {
pinMode(PIN_BTN, INPUT);
servo.attach(PIN_SERVO); // attaches the servo on pin 9 to the servo object
servo.write( POS_FECHADO );
}
void loop() {
while(digitalRead(PIN_BTN) != HIGH){ }
executaAcao();
}
void executaAcao(){
count++;
switch(count){
case 1:
case 2:
case 3: acao1(); break;
case 4:
case 5: acao2(); break;
case 6:
case 7:
case 8:
case 9: acao3(); break;
case 10: acao4(); break;
case 11:
case 12: acao5(); break;
case 13: acao6(); break;
case 14: acao7(); break;
case 15: acao8(); break;
case 16: acao9(); break;
case 25:
count = 0;
executaAcao();
break;
default: aleatorio();
}
loop();
}
void aleatorio(){
int acao = random(1, 9);
switch(acao){
case 1: acao1(); break;
case 2: acao2(); break;
case 3: acao3(); break;
case 4: acao4(); break;
case 5: acao5(); break;
case 6: acao6(); break;
case 7: acao7(); break;
case 8: acao8(); break;
case 9: acao9(); break;
}
}
// Move bem lento
void acao1(){
move(POS_FECHADO, POS_MUDAR_BTN, MOVE_LENTO);
delayApertar();
move(POS_MUDAR_BTN, POS_FECHADO, MOVE_LENTO);
}
// Espera um pouco no começo, depois desliga e volta; velocidade normal
void acao2(){
delay(2500);
move(POS_FECHADO, POS_MUDAR_BTN, MOVE_NORMAL);
delayApertar();
move(POS_MUDAR_BTN, POS_FECHADO, MOVE_NORMAL);
}
// Move bem rapido
void acao3() {
move(POS_FECHADO, POS_MUDAR_BTN, MOVE_RAPIDO);
delayApertar();
move(POS_MUDAR_BTN, POS_FECHADO, MOVE_RAPIDO);
}
// Move rapido; Toca o btn mas nao muda e volta;
// depois faz igual acao3
void acao4() {
move(POS_FECHADO, POS_TOCAR_BTN, MOVE_RAPIDO);
delay(200);
move(POS_TOCAR_BTN, POS_FECHADO, MOVE_RAPIDO);
delay(2000);
acao3();
}
// Move normal; Para no meio do caminho; Move rapido e termina;
void acao5() {
move(POS_FECHADO, POS_MEIO_CAMINHO, MOVE_NORMAL);
delay(1000);
move(POS_MEIO_CAMINHO, POS_MUDAR_BTN, );
delayApertar();
move(POS_MUDAR_BTN, POS_FECHADO, MOVE_NORMAL);
}
// Move rapido; Fica alternando entre meio caminho a aberto;
// termina com acao3()
void acao6() {
move(POS_FECHADO, POS_MEIO_CAMINHO, MOVE_NORMAL);
for(int i=0; i<=3; i++){
delay(100);
move(POS_MEIO_CAMINHO, POS_ABERTO, MOVE_RAPIDO);
delay(100);
move(POS_ABERTO, POS_MEIO_CAMINHO, MOVE_RAPIDO);
}
delay(100);
move(POS_MEIO_CAMINHO, POS_ABERTO, MOVE_RAPIDO);
delay(100);
move(POS_ABERTO, POS_MUDAR_BTN, MOVE_RAPIDO);
delayApertar();
move(POS_TOCAR_BTN, POS_FECHADO, MOVE_NORMAL);
}
// Move rapido; Abre e fecha a tampa 3x;
// termina com acao3()
void acao7() {
move(POS_FECHADO, POS_ABRE_A_TAMPA, MOVE_RAPIDO);
delay(100);
move(POS_ABRE_A_TAMPA, POS_FECHADO, MOVE_RAPIDO);
delay(100);
move(POS_FECHADO, POS_ABRE_A_TAMPA, MOVE_RAPIDO);
delay(100);
move(POS_ABRE_A_TAMPA, POS_FECHADO, MOVE_RAPIDO);
delay(100);
move(POS_FECHADO, POS_ABRE_A_TAMPA, MOVE_RAPIDO);
delay(100);
move(POS_ABRE_A_TAMPA, POS_FECHADO, MOVE_RAPIDO);
delay(100);
acao3();
}
// Abre a tampa, espera e faz acao3();
void acao8() {
move(POS_FECHADO, POS_ABRE_A_TAMPA, MOVE_LENTO);
delay(2500);
move(POS_ABRE_A_TAMPA, POS_MUDAR_BTN, MOVE_RAPIDO);
delayApertar();
move(POS_TOCAR_BTN, POS_FECHADO, MOVE_RAPIDO);
}
// Igual a acao2, porem mais demorado
void acao9(){
delay(4000);
move(POS_FECHADO, POS_MUDAR_BTN, MOVE_RAPIDO);
delayApertar();
move(POS_MUDAR_BTN, POS_FECHADO, MOVE_RAPIDO);
}
void delayApertar(){
delay(200);
}
void move(int de, int para, int velocidade){
if(de == para) return;
if(de < para){
for(int i=de; i<=para; i++){
servo.write(i);
delay(velocidade);
}
} else {
for(int i=de; i>=para; i--){
servo.write(i);
delay(velocidade);
}
}
}