Arduino days 2025 Cotonou at Seme City Open Park Hackathon's project : The crypt at forgotten colors
An ancient chest has been sealed for generations in the darkness of a forgotten crypt. A riddle engraved on the walls draws your attention: “Red and Blue unite to reveal the invisible.” In front of you, a three-colored lantern flickers faintly. Only a precise blend of colors will reveal the secret ritual and open the chest. Can you restore the forgotten color and unlock the secrets of the crypt?
Components and supplies
1
RGB led
15
jumpers
3
push buttons
3
Resistor 220ohm
1
Arduino Uno V3
1
Breadboard - 830 contacts
1
10kOhm potentiometer
Apps and platforms
1
Arduino IDE
Project description
Code
Code
cpp
1//Déclaration des entrées(bouton poussoir et potentiomètre) 2#define PIN_POT A0 // Potentiomètre sur A0 3#define buttonRed 2 // Bouton rouge 4#define buttonGreen 3 // Bouton vert 5#define buttonBlue 4 // Bouton bleu 6 7//Déclaration des sorties(LEDs) 8#define PIN_RED 9 // LED Rouge sur la broche D9 9#define PIN_GREEN 10 // LED Verte sur la broche D10 10#define PIN_BLUE 11 // LED Bleue sur la broche D11 11 12//Variables pour l'état des boutons(appuyé ou non) 13bool redState = false ; 14bool greenState = false ; 15bool blueState = false ; 16 17// Durées pour le Morse 18#define DOT 200 // Point : 200ms 19#define DASH 800 // Trait : 800ms 20#define GAP 200 // Pause entre signaux 21#define LETTER_GAP 900 // Pause entre lettres 22 23 24int sequence[] = {2, 2, 4, 2}; // Séquence correcte (Rouge, Rouge, Bleu, Rouge) 25int userSequence[4]; //Tableau pour le stockage de la séquence de l'utilisateur 26int currentStep = 0; 27const int sequenceLength = 4; //Taille de la séquence(nombre d'appuis) 28bool sequenceComplete = false; //Etat de la séquence(correcte ou non) 29int mode = 0; //Choix du mode(mode simple ou mode code mystique) 30 31//Initialisation des LEDs 32int redValue = 255, greenValue = 255, blueValue = 255; // Eteindre la LED 33 34void setup() 35{ 36 //Configuration des broches en sorties 37 pinMode(PIN_RED, OUTPUT); 38 pinMode(PIN_GREEN, OUTPUT); 39 pinMode(PIN_BLUE, OUTPUT); 40 41 //Configuration des broches en entrées 42 pinMode(buttonRed, INPUT_PULLUP); 43 pinMode(buttonBlue, INPUT_PULLUP); 44 pinMode(buttonGreen, INPUT_PULLUP); 45 Serial.begin(9600); //Initialisation de la communication série 46} 47 48void loop() { 49 int potValue = analogRead(PIN_POT); // Lire la valeur du potentiomètre 50 51 redState = digitalRead(buttonRed) == LOW; // Vérifie l'état douton rouge (pressé ou non) 52 blueState = digitalRead(buttonBlue) == LOW; // Vérifie l'état douton bleu (pressé ou non) 53 greenState = digitalRead(buttonGreen) == LOW; // Vérifie l'état douton vert (pressé ou non) 54 delay(100); 55 56 if (greenState) { //Si bouton vert appuyé, activé le mode code mystique 57 mode = 1; 58 Serial.println("Activation du mode Code Mystique !"); 59 delay(100); 60 while (mode == 1) { 61 modeSequence(); //Récupéré et vérifier la séquence de l'utilisateur 62 delay(100); 63 } 64 } 65 if (potValue < 9) { //Activer le mode simple si la valeur du potentiomètre est inférieure à 9 66 ButonMode(redState, blueState); 67 68 } else if (potValue < 1000) { //Activé le mode Arcane Total si la valeur du potentiomètre est supérieure à 9 et inférieure à 1000 69 ArcEnCiel(potValue); 70 } else { //Activé le mode énigme interdite si la valeur du potentiomètre est superieure à 1000 71 morseCode(); 72 } 73} 74 75 76void ArcEnCiel(int potValue) 77{ 78 // Déterminer la couleur selon la plage de valeurs du potentiomètre 79 if (10 < potValue && potValue < 146) { // Couleur Rouge 80 redValue = 0; greenValue = 255; blueValue = 255; 81 } 82 else if (146 < potValue && potValue < 292) { // Couleur Orange 83 redValue = 0; greenValue = 128; blueValue = 255; 84 } 85 else if (292 < potValue && potValue < 438) { // Couleur Jaune 86 redValue = 0; greenValue = 0; blueValue = 255; 87 } 88 else if (438 < potValue && potValue < 584) { // Couleur Verte 89 redValue = 255; greenValue = 0; blueValue = 255; 90 } 91 else if (584 < potValue && potValue < 730) { // Couleur Bleu 92 redValue = 255; greenValue = 255; blueValue = 0; 93 } 94 else if (730 < potValue && potValue < 876) { // Couleur Indigo 95 redValue = 180; greenValue = 250; blueValue = 125; 96 } 97 else if (876 < potValue && potValue < 1000) { // Couleur Violette 98 redValue = 100; greenValue = 255; blueValue = 44; 99 } 100 101 // Appliquer les couleurs 102 analogWrite(PIN_RED, redValue); 103 analogWrite(PIN_GREEN, greenValue); 104 analogWrite(PIN_BLUE, blueValue); 105 106 delay(50); // Petite pause pour éviter les rafraîchissements trop rapides 107} 108 109 110void ButonMode(bool redState, bool blueState) 111{ 112 if (redState && blueState) { //Allumé la couleur violette si les boutons rouge et bleu sont appuyés au même moment 113 analogWrite(PIN_RED, 0); // Allume la LED rouge à pleine intensité 114 analogWrite(PIN_BLUE, 0); // Allume la LED bleu à pleine intensité 115 analogWrite(PIN_GREEN, 255); // Eteint la LED verte 116 } 117 else if (redState) { //Allumer la couleur rouge si le bouton rouge est appuyé 118 analogWrite(PIN_RED, 0); 119 analogWrite(PIN_BLUE, 255); 120 analogWrite(PIN_GREEN, 255); 121 } 122 else if (blueState) {//Allumer la couleur bleu si le bouton bleu est appuyé 123 analogWrite(PIN_RED, 255); 124 analogWrite(PIN_BLUE, 0); 125 analogWrite(PIN_GREEN, 255); 126 } 127 else { //Eteindre la LED si aucun bouton n'est appuyé 128 analogWrite(PIN_RED, 255); 129 analogWrite(PIN_BLUE, 255); 130 analogWrite(PIN_GREEN, 255); 131 } 132} 133 134 135void morseCode () { 136 if (redState && !blueState) { // Bouton rouge appuyé : Morse "R" 137 morse(".-."); // Lettre R 138 139 } else if (!redState && blueState) { 140 // Bouton bleu appuyé : Morse "B" 141 morse("-..."); // Lettre B 142 143 } else if (redState && blueState) {// Les deux boutons appuyés : Morse "V" 144 145 //morse("...-"); // Lettre V 146 delay(500); 147 // Ensuite, clignoter la séquence mystique en Morse (rouge, rouge, bleu, rouge -> RRBR) 148 morse(".-. .-. -... .-."); 149 } else { //Acun bouton pressé : Éteindre la LED 150 //setColor(255, 255, 255); 151 analogWrite(PIN_RED, 255); 152 analogWrite(PIN_GREEN, 255); 153 analogWrite(PIN_BLUE, 255); 154 } 155 } 156 157 158 159 160void morse(const char* code) { 161 while (*code) { 162 if (*code == '.') { 163 blinkMorse(DOT); 164 } else if (*code == '-') { 165 blinkMorse(DASH); 166 } else if (*code == ' ') { 167 delay(LETTER_GAP); // Pause entre lettres 168 } 169 code++; 170 } 171 delay(LETTER_GAP); // Pause entre les lettres 172} 173 174void blinkMorse(int duration) { 175 digitalWrite(PIN_RED, LOW); 176 digitalWrite(PIN_GREEN, HIGH); 177 digitalWrite(PIN_BLUE, HIGH); 178 delay(duration); 179 digitalWrite(PIN_RED, HIGH); 180 digitalWrite(PIN_GREEN, HIGH); 181 digitalWrite(PIN_BLUE, HIGH); 182 delay(GAP); 183} 184 185 186void modeSequence() { 187 188 if (digitalRead(buttonGreen) == LOW) { 189 Serial.println("Désactivation du mode Code Mystique !"); 190 resetSequence(); 191 mode = 0; 192 delay(100); 193 } 194 if (digitalRead(buttonRed) == LOW) { 195 userSequence[currentStep] = 2; // 2 correspond au bouton rouge 196 currentStep++; 197 delay(100); // Anti-rebond 198 } 199 if (digitalRead(buttonBlue) == LOW) { 200 userSequence[currentStep] = 4; // 4 correspond au bouton bleu 201 currentStep++; 202 delay(100); // Anti-rebond 203 } 204 205 if (currentStep == sequenceLength) { 206 checkSequence(); 207 } 208} 209 210void checkSequence() { //Vérification de la séquence entrée par l'utilisateur 211 bool correct = true; 212 for (int i = 0; i < sequenceLength; i++) { 213 if (userSequence[i] != sequence[i]) { 214 correct = false; 215 break; 216 } 217 } 218 219 if (correct) { //Si la séquence est correcte, allumer la couleur violette : rouge + bleu 220 Serial.println("Séquence validée, ouverture du coffre !"); 221 analogWrite(PIN_RED, 0); // Allume la LED rouge 222 analogWrite(PIN_BLUE, 0); // Allume la LED bleue 223 analogWrite(PIN_GREEN, 255); // Éteint la LED verte 224 delay(3000); 225 } else { //Si la séquence est incorrecte, réinitialiser la séquence saisie 226 Serial.println("Séquence incorrecte, réinitialisation..."); 227 } 228 resetSequence(); 229} 230 231void resetSequence() { //Fonction de réinitialisation 232 currentStep = 0; 233 for (int i = 0; i < sequenceLength; i++) { 234 userSequence[i] = 0; // Réinitialise la séquence saisie 235 } 236 237 analogWrite(PIN_RED, 255); // Éteindre la LED rouge 238 analogWrite(PIN_BLUE, 255); // Éteindre la LED bleue 239 analogWrite(PIN_GREEN, 255); // Éteindre la LED verte 240}
Comments
Only logged in users can leave comments