Escame Room : la bombe à désamorcer

Escame Room : la bombe à désamorcer

L’ultime étape de challenge est de désamorcer la bombe soigneusement enfermée dans une mallette. Elle contient les tubes d’explosifs (fictifs bien sûr!) ainsi que l’électronique censé déclencher l’explosion. Le cœur est un Arduino Nano avec un clavier pour entrer le code de désamorçage, un module de huit afficheurs 7 segments pour le compte à rebours, un module nrf24l01+ pour démarrer le décompte à distance et un piezzo pour les bip du décompte et de prise en compte des touches du clavier. Le tout est alimenté par une batterie LiPo 3S, car j’en avait une sous la main,  mais une pile de 9V ça marche aussi.

Elle se compose de :

  • La mallette d’une perceuse HS.
  • Un arduino Nano (qui sur la photo est déjà parti sur un autre projet !)
  • Un afficheur de 8 digits avec un chip MAX7219
  • Un module Nrf24L01+ pour le contrôle à distance (pas encore implémenter dans le programme).
  • Un buzzer piezzo
  • Un clavier 12 touches à membrane

 

 

 

Schéma du circuit

 

Programme

#include <Keypad.h>
#include <LedControl.h>
#include <printf.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>


const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 3, 2}; //connect to the column pinouts of the keypad

RF24 radio(9, 10); // CNS, CE

Keypad keypad   = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LedControl lc   = LedControl(15,16,17,1);
long csecondsLeft = 60*6000L;
int decrement = 3;
bool explosed = false;
bool defused = false;

long minutes = 0;
long seconds = 0;
long hundredth = 0;

String code = "";

char radiobuffer[32] = {0};
byte playSound = 33;

void setup(){
  Serial.begin(9600);
  printf_begin();
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,1);
  /* and clear the display */
  lc.clearDisplay(0);

  radio.begin();
  radio.openReadingPipe(1,0xaabbccddee);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.printDetails();  

  pinMode(A0, OUTPUT);
  analogWrite(A0,0);
}
  
void loop(){
  char key = keypad.getKey();
    
  if (key){
    Serial.println(key);
    if(key != '#'){
      code += key;
    }
    else{
      code = "";
    }
    Serial.println(code);
    tone(A0, 4000, 50);
    if(code.length() == 4){
      if(code == "3802"){
        decrement = 0;
        defused = true;
      }
      else{
        code = "";
      }
    }
  }

  //check radio
  if(radio.available()){
    radio.read(&radiobuffer, 32);
  }

  
  printTime(csecondsLeft);
  if(playSound == 0 && (!explosed && !defused)){
    tone(A0, 3136, 100);
    //change sound speed
    if(csecondsLeft < 1000){
      playSound = 8;
    }
    else if(csecondsLeft < 3000){
      playSound = 15;
    }
    else{
      playSound = 33;
    }
  }
  else{
    playSound--;
  }


  delay(30) ;// delay 1ms
  csecondsLeft -= decrement;

  if(csecondsLeft < 0){
    csecondsLeft = 0;
    if(!explosed){
      tone(A0, 3136, 5000);
    }
    explosed = true;
  }
}

void printTime(long timeLeft){

  minutes = timeLeft / 6000;
  timeLeft -= (minutes * 6000); 

  seconds = timeLeft / 100;
  hundredth = timeLeft - (seconds * 100);  

  lc.setDigit(0,0,hundredth%10,false);
  lc.setDigit(0,1,hundredth/10,false);

  lc.setChar(0,2,34,false);

  lc.setDigit(0,3,seconds%10,false);
  lc.setDigit(0,4,seconds/10,false);  

  lc.setChar(0,5,39,false);

  lc.setDigit(0,6,minutes%10,false);
  lc.setDigit(0,7,minutes/10,false);

 }

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *