Bombe Airsoft Mode Domination v1
Description :
La Bombe Airsoft Mode Domination v1 est un dispositif interactif conçu pour animer des scénarios de jeu en mode « Domination ». Le système est équipé d’un clavier matriciel à membrane 16 touches permettant de saisir facilement les différents paramètres du jeu directement sur l’Arduino.
Les paramètres programmables incluent :
- Le temps total de la partie,
- Le délai avant le début du jeu (compte à rebours pré-partie).
Une fois la partie lancée, chaque équipe dispose d’un bouton dédié. Lorsqu’un joueur appuie sur le bouton de son équipe, le temps associé à cette équipe commence à s’incrémenter. Un anneau LED (ring LED) affiche alors la couleur correspondant à l’équipe active, offrant une indication visuelle immédiate du contrôle de l’objectif.
Lorsque l’une des deux équipes atteint le temps programmé, un affichage visuel indique automatiquement l’équipe gagnante.
Un relais a également été ajouté afin de signaler le début et la fin de la partie, permettant par exemple d’activer une alarme, un buzzer ou un signal lumineux externe.
Prérequis :
- 1 x Carte Arduino Uno
- 1 x LCD 20×4 2004 avec adaptateur d interface série IIC I2C
- 1 x Anneau LED x12 RGB WS2812
- 2 x Bouton
- 1 x KY-019 module relais 5V
- 1 x Clavier matricé à membrane 16 touches
- 1 x Buzzer passif 5v
- 1 x Résistance 220Ω
- 1 x Breadboard
Version IDE :
- Arduino IDE 2.3.5
Bibliothèque :
- Keypad.h (version 3.1.1)
- LiquidCrystal_I2C.h(version: 1.1.4 par
johnrickman) - Adafruit_NeoPixel.h (version 1.15.2 par Adafruit)
Vidéo de démonstration :
Schéma de câblage :


Code :
Code Arduino :
//Gestion des entrées//////////////////
const int BtRouge = A1; //Pin du bouton Rouge
const int BtVert = A2; //Pin du bouton Vert
//Variable gestion entrées
bool EtatBtRouge;
bool EtatBtVert;
///////////////////////////////////////
//Gestion des sorties//////////////////
const int bipper = 12; //Broche du bipper
const int relayalarme = 10; //Broche Relay alarme
///////////////////////////////////////
//Gestion RING Led//////////////////
#include <Adafruit_NeoPixel.h>
#define PIN 11 // Pin du pixels du ring LED
#define NUMPIXELS 12 // Nombre de pixels du ring LED
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//Variable gestion RING Led
int Pixelsshow;
///////////////////////////////////////
//Gestion Keypad///////////////////////
#include <Keypad.h>
const byte ROWS = 4; //quatre rangées
const byte COLS = 4; //quatre colonnes
//définir les symboles sur les boutons des claviers
char hexaKeys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte rowPins[ROWS] = { 9, 8, 7, 6 }; //connecter aux broches de rangée du clavier
byte colPins[COLS] = { 5, 4, 3, 2 }; //se connecter aux broches de colonne du clavier
//initialiser une instance de la classe NewKeypad
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
///////////////////////////////////////
//Gestion LCD /////////////////////////
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
char customKey;
byte tiretdroite[8] = { B00001, B00001, B00001, B00001, B00001, B00001, B00001, B00001 };
byte tiretgauche[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 };
byte barrepleinechargement[8] = { B11111, B00000, B11111, B11111, B11111, B11111, B00000, B11111 };
byte barrevidechargement[8] = { B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111 };
byte fleche[] = { B00000, B00100, B00010, B11111, B00010, B00100, B00000, B00000 };
///////////////////////////////////////
//Variables programme//////////////////
int NavModejeu = 1; //Navigation mode jeu
int Modedejeu = 0; //Stock le N° du jeu selectionner
int NavModeDomination = 0; //Navigation dans mode Domination
int TpsjeuDomination[7] = { 0, 0, 0, 0, 0, 0, 0 }; //Stock la valeur des temps(H,H,M,M,S,S,M)
int GestionTemps[6] = { 0, 0, 0, 0, 0, 0 };
char msg[20];
boolean Btactif[2] = { 0, 0 };
///////////////////////////////////////
//Variables Timer//////////////////
unsigned long currentMillis;
unsigned long Clignotementsaisie;
unsigned long Timersecpartie;
unsigned long previousMillis1;
unsigned long previousMillis2;
///////////////////////////////////////
//Variable Bt reset
unsigned long Timereset = 0;
int ImpulsBtReset = 0; //Stock le nombre impulsion sur bouton reset
///////////////////////////////////////
void setup() {
pinMode(BtRouge, INPUT_PULLUP);
pinMode(BtVert, INPUT_PULLUP);
pinMode(relayalarme, OUTPUT);
pinMode(bipper, OUTPUT);
lcd.init();
lcd.backlight();
pixels.begin();
pixels.clear();
pixels.show();
lcd.createChar(2, tiretdroite);
lcd.createChar(3, tiretgauche);
lcd.createChar(4, barrepleinechargement);
lcd.createChar(5, barrevidechargement);
lcd.createChar(6, fleche);
intro();
chargement();
}
void loop() {
customKey = customKeypad.getKey();
currentMillis = millis();
btreset();
if (Modedejeu == 0) {
NavModejeuMenu();
selectmodejeu();
} else if (Modedejeu == 1) {
Domination();
}
}
void chargement() {
//BARRE CHARGEMENT ////////////////////
lcd.setCursor(1, 1);
lcd.write(byte(2));
for (int i = 2; i <= 17; i++) {
lcd.setCursor(i, 1);
lcd.write(byte(5));
}
lcd.setCursor(18, 1);
lcd.write(byte(3));
for (int i = 2; i <= 17; i++) {
lcd.setCursor(i, 1);
lcd.write(byte(4));
delay(100);
}
///////////////////////////////////////
}
void RingLEDAn1(int Vert, int Rouge) {
if (currentMillis - previousMillis1 >= 200) {
previousMillis1 = currentMillis;
if (Pixelsshow <= NUMPIXELS) {
if (Rouge == 1) {
pixels.setPixelColor(Pixelsshow, pixels.Color(150, 0, 0));
}
if (Vert == 1) {
pixels.setPixelColor(Pixelsshow, pixels.Color(0, 150, 0));
}
pixels.show();
Pixelsshow++;
}
if (Pixelsshow > NUMPIXELS - 1) {
Pixelsshow = 0;
pixels.clear();
}
}
}
void RingLEDAn2(int Couleur) {
if (currentMillis - previousMillis1 >= 200) {
previousMillis1 = currentMillis;
if (Couleur == 20) {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(150, 0, 0));
}
} else {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 150, 0));
}
}
pixels.show();
} else {
pixels.clear();
pixels.show();
}
}
void bipper1(int Vert, int Rouge) {
if (currentMillis - previousMillis2 < 100) {
if (Rouge == 1) {
tone(bipper, 600);
}
if (Vert == 1) {
tone(bipper, 1000);
}
}
if (currentMillis - previousMillis2 > 100 && currentMillis - previousMillis2 < 200) {
noTone(bipper);
}
if (currentMillis - previousMillis2 > 200) {
previousMillis2 = currentMillis;
}
}
void intro() {
//INTRO BOMB SIMULATOR ////////////////
lcd.setCursor(0, 0);
lcd.print("-- Bomb simulator --");
lcd.setCursor(0, 3);
lcd.print(" -- V1.0 -- ");
delay(500);
///////////////////////////////////////
}
void Domination() {
//GESTION JEU DOMINATION //////////////
switch (NavModeDomination) {
case 0:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
NavModeDomination++;
break;
case 1:
chargement();
NavModeDomination++;
break;
case 2:
lcd.setCursor(0, 1);
lcd.print(" Temps de jeu : ");
sprintf(msg, "%d%d:%d%d:%d%d", TpsjeuDomination[0], TpsjeuDomination[1], TpsjeuDomination[2], TpsjeuDomination[3], TpsjeuDomination[4], TpsjeuDomination[5]);
lcd.setCursor(6, 2);
lcd.print(msg);
NavModeDomination++;
break;
case 3:
//Saisie H
Clignotsaisie();
if (chiffre() == 0 || chiffre() == 1 || chiffre() == 2) {
TpsjeuDomination[0] = chiffre();
lcd.setCursor(6, 2);
lcd.print(TpsjeuDomination[0]);
NavModeDomination++;
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination + btvalider();
break;
case 4:
//Saisie HH
Clignotsaisie();
if (chiffre() >= 0) {
TpsjeuDomination[1] = chiffre();
lcd.setCursor(7, 2);
lcd.print(TpsjeuDomination[1]);
NavModeDomination++;
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 5:
//Saisie M
Clignotsaisie();
if (chiffre() >= 0 && chiffre() <= 5) {
TpsjeuDomination[2] = chiffre();
lcd.setCursor(9, 2);
lcd.print(TpsjeuDomination[2]);
NavModeDomination++;
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 6:
Clignotsaisie();
if (chiffre() >= 0) {
TpsjeuDomination[3] = chiffre();
lcd.setCursor(10, 2);
lcd.print(TpsjeuDomination[3]);
NavModeDomination++;
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 7:
Clignotsaisie();
if (chiffre() >= 0 && chiffre() <= 5) {
TpsjeuDomination[4] = chiffre();
lcd.setCursor(12, 2);
lcd.print(TpsjeuDomination[4]);
NavModeDomination++;
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 8:
Clignotsaisie();
if (chiffre() >= 0) {
TpsjeuDomination[5] = chiffre();
lcd.setCursor(13, 2);
lcd.print(TpsjeuDomination[5]);
NavModeDomination++;
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 9:
lcd.setCursor(0, 3);
lcd.print("Press # pour valider");
if (btgauche() == 1) {
lcd.setCursor(0, 3);
lcd.print(" ");
}
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 10:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
lcd.setCursor(0, 1);
lcd.print(" Debut du jeu : ");
NavModeDomination++;
break;
case 11:
Clignotsaisie();
if (chiffre() >= 0 && chiffre() <= 9) {
TpsjeuDomination[6] = chiffre();
lcd.setCursor(5, 2);
lcd.print(TpsjeuDomination[6]);
NavModeDomination++;
}
if (TpsjeuDomination[6] <= 1) {
lcd.setCursor(6, 2);
lcd.print(" minute ");
} else {
lcd.setCursor(6, 2);
lcd.print(" minutes");
}
NavModeDomination = NavModeDomination + btdroite();
NavModeDomination = NavModeDomination + btvalider();
break;
case 12:
lcd.setCursor(0, 3);
lcd.print("Press # pour valider");
if (btgauche() == 1) {
lcd.setCursor(0, 3);
lcd.print(" ");
}
NavModeDomination = NavModeDomination - btgauche();
NavModeDomination = NavModeDomination + btvalider();
break;
case 13:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
NavModeDomination++;
break;
case 14:
sprintf(msg, "Tps jeu : %d%d:%d%d:%d%d", TpsjeuDomination[0], TpsjeuDomination[1], TpsjeuDomination[2], TpsjeuDomination[3], TpsjeuDomination[4], TpsjeuDomination[5]);
lcd.setCursor(0, 1);
lcd.print(msg);
sprintf(msg, "Debut jeu : %d min", TpsjeuDomination[6]);
lcd.setCursor(0, 2);
lcd.print(msg);
lcd.setCursor(0, 3);
lcd.print("Press # pour lancer");
NavModeDomination = NavModeDomination + btvalider();
break;
case 15:
lcd.clear();
GestionTemps[0] = TpsjeuDomination[6];
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
lcd.setCursor(0, 1);
lcd.print(" Debut du jeu : ");
lcd.setCursor(6, 2);
sprintf(msg, "00:0%d:00", GestionTemps[0]);
lcd.print(msg);
NavModeDomination++;
break;
case 16:
if (Timersecpartie == 0) {
Timersecpartie = currentMillis;
} else if (currentMillis > (Timersecpartie + 1000)) {
if (GestionTemps[1] > 0) {
GestionTemps[1]--;
} else if (GestionTemps[1] == 0 && GestionTemps[0] > 0) {
GestionTemps[1] = 59;
GestionTemps[0]--;
} else {
NavModeDomination++;
}
Timersecpartie = currentMillis;
}
lcd.setCursor(10, 2);
sprintf(msg, "%d:%02d", GestionTemps[0], GestionTemps[1]);
lcd.print(msg);
break;
case 17:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
lcd.setCursor(0, 2);
lcd.print(" good luck have fun ");
tone(bipper, 1000);
digitalWrite(relayalarme, HIGH);
delay(4000);
noTone(bipper);
digitalWrite(relayalarme, LOW);
NavModeDomination++;
break;
case 18:
for (int i = 0; i <= 5; i++) {
GestionTemps[i] = 0;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
lcd.setCursor(0, 1);
lcd.print("Equipe R Equipe V");
lcd.setCursor(0, 2);
lcd.print("00:00:00");
lcd.setCursor(12, 2);
lcd.print("00:00:00");
lcd.setCursor(0, 3);
lcd.print("Objectif :");
sprintf(msg, "%d%d:%d%d:%d%d", TpsjeuDomination[0], TpsjeuDomination[1], TpsjeuDomination[2], TpsjeuDomination[3], TpsjeuDomination[4], TpsjeuDomination[5]);
lcd.setCursor(12, 3);
lcd.print(msg);
NavModeDomination++;
break;
case 19:
EtatBtRouge = digitalRead(BtRouge);
EtatBtVert = digitalRead(BtVert);
if (EtatBtRouge == 0) {
Btactif[0] = 0;
Btactif[1] = 1;
} else if (EtatBtVert == 0) {
Btactif[0] = 1;
Btactif[1] = 0;
}
RingLEDAn1(Btactif[0], Btactif[1]);
bipper1(Btactif[0], Btactif[1]);
if (Timersecpartie == 0) {
currentMillis = millis();
Timersecpartie = currentMillis;
} else if (currentMillis > (Timersecpartie + 1000)) {
if (Btactif[0] == 1) {
GestionTemps[2]++;
} else if (Btactif[1] == 1) {
GestionTemps[5]++;
}
if (GestionTemps[5] > 59) {
GestionTemps[4]++;
GestionTemps[5] = 0;
}
if (GestionTemps[4] > 59) {
GestionTemps[3]++;
GestionTemps[4] = 0;
}
if (GestionTemps[2] > 59) {
GestionTemps[1]++;
GestionTemps[2] = 0;
}
if (GestionTemps[1] > 59) {
GestionTemps[0]++;
GestionTemps[1] = 0;
}
Timersecpartie = currentMillis;
}
lcd.setCursor(0, 2);
sprintf(msg, "%02d:%02d:%02d", GestionTemps[3], GestionTemps[4], GestionTemps[5]);
lcd.print(msg);
lcd.setCursor(12, 2);
sprintf(msg, "%02d:%02d:%02d", GestionTemps[0], GestionTemps[1], GestionTemps[2]);
lcd.print(msg);
if ((GestionTemps[0] >= ((TpsjeuDomination[0] * 10) + TpsjeuDomination[1])) && (GestionTemps[1] >= (TpsjeuDomination[2] * 10) + TpsjeuDomination[3]) && (GestionTemps[2] >= (TpsjeuDomination[4] * 10) + TpsjeuDomination[5])) {
NavModeDomination = 21;
lcd.clear();
}
if ((GestionTemps[3] >= ((TpsjeuDomination[0] * 10) + TpsjeuDomination[1])) && (GestionTemps[4] >= (TpsjeuDomination[2] * 10) + TpsjeuDomination[3]) && (GestionTemps[5] >= (TpsjeuDomination[4] * 10) + TpsjeuDomination[5])) {
NavModeDomination++;
lcd.clear();
}
break;
case 20:
digitalWrite(relayalarme, HIGH);
RingLEDAn2(NavModeDomination);
tone(bipper, 1000);
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
lcd.setCursor(0, 2);
lcd.print(" Rouge WIN ");
break;
case 21:
digitalWrite(relayalarme, HIGH);
RingLEDAn2(NavModeDomination);
tone(bipper, 1000);
lcd.setCursor(0, 0);
lcd.print(" -- DOMINATION -- ");
lcd.setCursor(0, 2);
lcd.print(" VERT WIN ");
break;
}
}
int Clignotsaisie() {
int Cursor;
int PosTpsjeuDomination;
if (NavModeDomination == 3 || NavModeDomination == 4) {
Cursor = NavModeDomination + 3;
PosTpsjeuDomination = NavModeDomination - 3;
}
if (NavModeDomination == 5 || NavModeDomination == 6) {
Cursor = NavModeDomination + 4;
PosTpsjeuDomination = NavModeDomination - 3;
}
if (NavModeDomination == 7 || NavModeDomination == 8) {
Cursor = NavModeDomination + 5;
PosTpsjeuDomination = NavModeDomination - 3;
}
if (NavModeDomination == 11) {
Cursor = NavModeDomination - 6;
PosTpsjeuDomination = NavModeDomination - 5;
}
if (currentMillis < (Clignotementsaisie + 500) && btdroite() == 0 && btgauche() == 0 && btvalider() == 0) {
lcd.setCursor(Cursor, 2);
lcd.print(" ");
} else if (currentMillis >= (Clignotementsaisie + 500) && currentMillis < (Clignotementsaisie + 1600) || btdroite() == 1 || btgauche() == 1 || btvalider() == 1) {
lcd.setCursor(Cursor, 2);
lcd.print(TpsjeuDomination[PosTpsjeuDomination]);
} else if (currentMillis >= (Clignotementsaisie + 1600)) {
Clignotementsaisie = currentMillis;
}
}
int flechehaut() {
//GESTION BOUTON FLECHE HAUT ///////
int Saisie = 0;
if (customKey == 'A') {
Saisie = 1;
}
return Saisie;
///////////////////////////////////////
}
int flechebas() {
//GESTION BOUTON FLECHE BAS ///////
int Saisie = 0;
if (customKey == 'B') {
Saisie = 1;
}
return Saisie;
///////////////////////////////////////
}
int btgauche() {
//GESTION BOUTON FLECHE GAUCHE ///////
int Saisie = 0;
if (customKey == 'C') {
Saisie = 1;
}
return Saisie;
///////////////////////////////////////
}
int btdroite() {
//GESTION BOUTON FLECHE DROITE ///////
int Saisie = 0;
if (customKey == 'D') {
Saisie = 1;
}
return Saisie;
///////////////////////////////////////
}
int btvalider() {
//GESTION BOUTON VALIDER /////////////
int Saisie = 0;
if (customKey == '#') {
Saisie = 1;
}
return Saisie;
///////////////////////////////////////
}
int chiffre() {
//GESTION CHIFFREs /////////////
int Saisie = -1;
if (customKey == '1') {
Saisie = 1;
} else if (customKey == '2') {
Saisie = 2;
} else if (customKey == '3') {
Saisie = 3;
} else if (customKey == '4') {
Saisie = 4;
} else if (customKey == '5') {
Saisie = 5;
} else if (customKey == '6') {
Saisie = 6;
} else if (customKey == '7') {
Saisie = 7;
} else if (customKey == '8') {
Saisie = 8;
} else if (customKey == '9') {
Saisie = 9;
} else if (customKey == '0') {
Saisie = 0;
}
return (Saisie);
///////////////////////////////////////
}
void btreset() {
//GESTION BOUTON RESET ////////////////
if (customKey == '*' && Timereset == 0) {
Timereset = millis();
ImpulsBtReset++;
} else if (customKey == '*' && ImpulsBtReset == 3) {
reset();
} else if (customKey == '*' && Timereset > 0 && currentMillis < (Timereset + 2000)) {
ImpulsBtReset++;
} else if (Timereset > 0 && currentMillis > (Timereset + 2000)) {
ImpulsBtReset = 0;
Timereset = 0;
}
///////////////////////////////////////
}
void selectmodejeu() {
if (flechehaut() == 1 && Modedejeu == 0) {
NavModejeu--;
if (NavModejeu < 2) {
NavModejeu = 4;
}
}
if (flechebas() == 1 && Modedejeu == 0) {
NavModejeu++;
if (NavModejeu > 4) {
NavModejeu = 2;
}
}
if (btvalider() == 1 && Modedejeu == 0 && NavModejeu == 2) {
Modedejeu = NavModejeu - 1;
NavModejeu = 0;
}
if (btvalider() == 1 && Modedejeu == 0 && NavModejeu == 3) {
//Libre
}
if (btvalider() == 1 && Modedejeu == 0 && NavModejeu == 3) {
//Libre
}
}
void NavModejeuMenu() {
switch (NavModejeu) {
case 0:
break;
case 1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SELECTION DU JEUX : ");
lcd.setCursor(2, 1);
lcd.print("Domination ");
lcd.setCursor(2, 2);
lcd.print("--------");
lcd.setCursor(2, 3);
lcd.print("--------");
NavModejeu++;
break;
case 2:
lcd.setCursor(0, 1);
lcd.write(byte(6));
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
break;
case 3:
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.write(byte(6));
lcd.setCursor(0, 3);
lcd.print(" ");
break;
case 4:
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.write(byte(6));
break;
default:
break;
}
}
void reset() {
pixels.clear();
pixels.show();
noTone(bipper);
lcd.clear();
lcd.setCursor(0, 0);
digitalWrite(relayalarme, LOW);
lcd.print(" - Bombe Reset. - ");
delay(2000);
//Variables à remettre à 0 pour le reset
NavModejeu = 1;
Modedejeu = 0;
ImpulsBtReset = 0;
Timereset = 0;
Timersecpartie = 0;
Pixelsshow = 0;
//Variable Mode Domination à remettre à 0 pour le reset
NavModeDomination = 0;
for (int i = 0; i <= 5; i++) {
GestionTemps[i] = 0;
}
Btactif[0] = 0;
Btactif[1] = 0;
Clignotementsaisie = 0;
}
