pour le montage vous pouvez prévoir des fiches bananes sur vos fils volants et des socles adaptés de couleur (rouge pour la source A B C D, noir pour la destination 1,2,3,4)
Ça avance
... et ça marche très bien.
J'y ai ajouté un mini oled, c'est top.
Led jaune = jeu en cours
Led verte = gagné
Par contre, puisque j'y suis, mes leds ne s'allument que très faiblement, et je sais pas pourquoi (les mêmes leds sur un autre jeu fonctionnent très bien)
je ne vois pas de résistances de limitation de courant pour les LEDs.
quelle est cette carte utilisée ?
Et comment sont-elles branchées, et comment est la déclaration des leds et les lignes qui permettent de les allumer (ou le code complet).
Comment vous faites pour partager un sketch ?
cf "Les bonnes pratiques du Forum Francophone”
ça décrit comment bien poster un code avec les balises de code
Merci J'espère avoir compris
/*
Name: ARDFR_boucles_non_interchangeables.ino
Created: 19.03.2022 19:14:50
Author: jpbbricole
Modifications: Dany en avril 2022
12 ==> Pin de validation du jeu
A4 et A5 ==> oled
2 ==> Pin Led verte
3 ==> Pin Led rouge
Sketch prévu pour Arduino Nano (Arduino Duemilanova or Diecimila)
*/
#include "SSD1306Ascii.h" // Librairie pour l'écran
#include "SSD1306AsciiAvrI2c.h" // Librairie pour l'écran
#define I2C_ADDRESS 0x3C // définit l'adresse de l'écran
SSD1306AsciiAvrI2c oled;
enum puzzPortsTypeIndex { portPoint, portBorne};
const int puzzPoiBor[][2] =
{ // A 1 B 2 C 3 D 4 E 5 F 6
{A0, 6}, {A1, 7}, {A2, 8}, {A3, 9}, {4, 10}, {5, 11} // Pin Points (sorties) et Bornes (Entrées)
};
const int puzzIndexMax = (sizeof(puzzPoiBor) / sizeof(puzzPoiBor[0])) - 1;
int puzzNombreDeCables = puzzIndexMax + 1; // Nombre de pièces
const int Validation = 12; // Port de validation du jeu = 12
const int LedRouge = 3; // Définit la Pin pour la led rouge = 3
const int LedVerte = 2; // Définit la Pin pour la led verte = 2
String puzzSolution = "D0-E1-B2-A3-F4-C5"; // En partant du haut, la colonne de gauche s'appelle A B C D E F
// et celle de droite s'appelle 0 1 2 3 4 5
// Solution : A-2 / B-4 / C-0 / D-1 / E-5 / F-3
void setup()
{
Serial.begin(115200);
oled.begin(&Adafruit128x64, I2C_ADDRESS); // Communication avec l'écran
oled.setFont(Adafruit5x7); // Définit la police sur l'écran
// Initialisation des ports
for (int p = 0; p <= puzzIndexMax; p ++)
{
pinMode(puzzPoiBor[p][portPoint], OUTPUT); // Ports en sortie
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à LOW
pinMode(puzzPoiBor[p][portBorne], INPUT_PULLUP); // Bornes en entrée
pinMode(Validation, OUTPUT); // Port de validation en sortie
digitalWrite(Validation, LOW); // Validation n'est pas validée
digitalWrite(LedRouge, HIGH);
}
}
void loop()
{
int cablesConnectes = puzzNombreConnectes();
if (cablesConnectes == puzzNombreDeCables) // Si tout les câbles connectés
{
String solutionJoueur = puzzLireSolutionJoueur();
if (solutionJoueur == puzzSolution)
{
Serial.println("Gagne avec " + solutionJoueur); // Action quand solution trouvée
oled.clear();
oled.set2X();
oled.println(" ");
oled.println("C'EST JUSTE");
oled.set1X();
oled.println(" ");
oled.println(" Felicitations !");
oled.println(" ");
oled.println(" Scanne le QR suivant");
digitalWrite(Validation, HIGH); // Validation est validé
Serial.println("Pin validation validée");
digitalWrite(LedRouge, LOW); // Eteint la led rouge
digitalWrite(LedVerte, HIGH); // Allume la led verte
while (1); // Suspend le programme
}
else
{
Serial.println("Pas encore ca avec " + solutionJoueur);
oled.clear();
oled.set1X();
oled.println("Pas encore ca avec");
oled.println(solutionJoueur);
}
}
else
{
Serial.print("Il n'y a que " + String(cablesConnectes));
oled.clear();
oled.set1X();
oled.println(" ");
oled.println(" Il n'y a que");
oled.println(" ");
oled.print(" " + String(cablesConnectes));
oled.println(" cables sur " + String(puzzNombreDeCables));
oled.println(" ");
oled.println(" connectes");
Serial.println(" cables sur " + String(puzzNombreDeCables));
}
delay(1000);
}
/*--------------------------------------------------------------
Retourne la solution proposée par le joueur'*--------------------------------------------------------------
'*--------------------------------------------------------------
*/
String puzzLireSolutionJoueur()
{
String soluceJoueur = ""; // Solution sous forme A3-C0-D1 ... si XX pas de Point connecté sur cette Borne
for (int b = 0; b <= puzzIndexMax; b ++) // Toutes les bornes
{
soluceJoueur += puzzLiaisonPointBorne(b) + "-";
}
return soluceJoueur.substring(0, soluceJoueur.length() - 1); // Pour supprimer le dernier -
}
/*--------------------------------------------------------------
Retourne la liaison entre la borne borneNum et
son point A4 ou C2 ou XX si pas de liaison sur cette Borne
'*--------------------------------------------------------------
*/
String puzzLiaisonPointBorne(int borneNum)
{
String lienPoiBor = ""; // Liaison entre Point et Borne
for (int p = 0; p <= puzzIndexMax; p ++)
{
lienPoiBor = "XX"; // Liaison entre Point et Borne
int test = 0;
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à OFF
if (digitalRead(puzzPoiBor[borneNum][portBorne]) == LOW) // Contrôle si continuité LOW
{
test ++;
}
digitalWrite(puzzPoiBor[p][portPoint], HIGH); // Port à ON
if (digitalRead(puzzPoiBor[borneNum][portBorne]) == HIGH) // Contrôle si continuité HIGH
{
test ++;
}
if (test == 2) // Si tout OK
{
lienPoiBor = char('A' + p) + String(borneNum);
break;
}
}
return lienPoiBor;
}
/*--------------------------------------------------------------
Compte le nombre de câble(s) connecté(s)
entre Point et Borne
'*--------------------------------------------------------------
*/
int puzzNombreConnectes()
{
int connTotal = 0;
for (int b = 0; b <= puzzIndexMax; b ++) // Tout les ports à OFF
{
digitalWrite(puzzPoiBor[b][portPoint], LOW);
}
for (int b = 0; b <= puzzIndexMax; b ++) // Tout les bornes
{
if (digitalRead(puzzPoiBor[b][portBorne]) == LOW)
{
connTotal ++;
}
}
return connTotal;
}
et pour le moment je n'ai pas soudé la résistance 330 aux leds... (parce que justement elles ne s'allument déjà pas assez...)
Bonjour,
Tu n'as pas configuré les pins qui commandent tes leds en sortie.
Une fois les pins configurées en sortie, il vaudrait mieux que les LEDs soient câblées avant de mettre sous tension
Bonjour danyschibli
Oui, nkckel
Une petite remarque, concernant ton initialisation des ports
pinMode(Validation, OUTPUT); // Port de validation en sortie
digitalWrite(Validation, LOW); // Validation n'est pas validée
digitalWrite(LedRouge, HIGH);
Tu as mis ça dans la boucle for (int p = 0;, cette boucle sert à initialiser le tableau des E/S de puzzPoiBor.
C'est mieux de mettre ça, en dehors, en dedans, tes ports sont initialisés 6x .
Tu n'as pas initialisé tes LedRouge et LedVerte (pinMode)
Ton initialisation de ports devrait être ainsi:
// Initialisation des ports
for (int p = 0; p <= puzzIndexMax; p ++)
{
pinMode(puzzPoiBor[p][portPoint], OUTPUT); // Ports en sortie
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à LOW
pinMode(puzzPoiBor[p][portBorne], INPUT_PULLUP); // Bornes en entrée
}
pinMode(Validation, OUTPUT); // Port de validation en sortie
pinMode(LedRouge, OUTPUT); // Port LED rouge
pinMode(LedVerte, OUTPUT); // Port LED vertte
digitalWrite(Validation, LOW); // Validation n'est pas validée
digitalWrite(LedRouge, HIGH);
digitalWrite(LedVerte, HIGH);
Cordialement
jpbbricole
Ça marche du tonnerre !
Initialiser les ports... j'avoue que là j'avais raté un truc.
Je joins le fichier qui fonctionne, si quelqu'un en a besoin.
/*
Name: ARDFR_boucles_non_interchangeables.ino
Created: 19.03.2022 19:14:50
Author: jpbbricole
Modifications: Dany en avril 2022
12 ==> Pin de validation du jeu
A4 et A5 ==> un potentiel écran
2 ==> Pin Led verte
3 ==> Pin Led rouge
Sketch prévu pour Arduino Nano (Arduino Duemilanova or Diecimila)
*/
#include "SSD1306Ascii.h" // Librairie pour l'écran
#include "SSD1306AsciiAvrI2c.h" // Librairie pour l'écran
#define I2C_ADDRESS 0x3C // définit l'adresse de l'écran
SSD1306AsciiAvrI2c oled;
enum puzzPortsTypeIndex { portPoint, portBorne};
const int puzzPoiBor[][2] =
{ // A 1 B 2 C 3 D 4 E 5 F 6
{A0, 6}, {A1, 7}, {A2, 8}, {A3, 9}, {4, 10}, {5, 11} // Pin Points (sorties) et Bornes (Entrées)
};
const int puzzIndexMax = (sizeof(puzzPoiBor) / sizeof(puzzPoiBor[0])) - 1;
int puzzNombreDeCables = puzzIndexMax + 1; // Nombre de pièces
const int Validation = 12; // Port de validation du jeu = 12
const int LedRouge = 3; // Définit la Pin pour la led rouge = 3
const int LedVerte = 2; // Définit la Pin pour la led verte = 2
String puzzSolution = "D0-E1-B2-A3-F4-C5"; // En partant du haut, la colonne de gauche s'appelle A B C D E F
// et celle de droite s'appelle 0 1 2 3 4 5
// Solution : A-2 / B-4 / C-0 / D-1 / E-5 / F-3
void setup()
{
Serial.begin(115200);
oled.begin(&Adafruit128x64, I2C_ADDRESS); // Communication avec l'écran
oled.setFont(Adafruit5x7); // Définit la police sur l'écran
// Initialisation des ports
for (int p = 0; p <= puzzIndexMax; p ++)
{
pinMode(puzzPoiBor[p][portPoint], OUTPUT); // Ports en sortie
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à LOW
pinMode(puzzPoiBor[p][portBorne], INPUT_PULLUP); // Bornes en entrée
}
pinMode(Validation, OUTPUT); // Port de validation en sortie
pinMode(LedVerte, OUTPUT); // Pin LedVerte configurée en sortie
pinMode(LedRouge, OUTPUT); // Pin LedRouge configurée en sortie
digitalWrite(Validation, LOW); // Validation n'est pas validée
digitalWrite(LedRouge, HIGH);
}
void loop()
{
int cablesConnectes = puzzNombreConnectes();
if (cablesConnectes == puzzNombreDeCables) // Si tout les câbles connectés
{
String solutionJoueur = puzzLireSolutionJoueur();
if (solutionJoueur == puzzSolution)
{
Serial.println("Gagne avec " + solutionJoueur); // Action quand solution trouvée
oled.clear();
oled.set2X();
oled.println(" ");
oled.println("C'EST JUSTE");
oled.set1X();
oled.println(" ");
oled.println(" Felicitations !");
oled.println(" ");
oled.println(" Scanne le QR suivant");
digitalWrite(Validation, HIGH); // Validation est validé
Serial.println("Pin validation validée");
digitalWrite(LedRouge, LOW); // Eteint la led rouge
digitalWrite(LedVerte, HIGH); // Allume la led verte
while (1); // Suspend le programme
}
else
{
Serial.println("Pas encore ca avec " + solutionJoueur);
oled.clear();
oled.set1X();
oled.println("Pas encore ca avec");
oled.println(solutionJoueur);
}
}
else
{
Serial.print("Il n'y a que " + String(cablesConnectes));
oled.clear();
oled.set1X();
oled.println(" ");
oled.println(" Il n'y a que");
oled.println(" ");
oled.print(" " + String(cablesConnectes));
oled.println(" cables sur " + String(puzzNombreDeCables));
oled.println(" ");
oled.println(" connectes");
Serial.println(" cables sur " + String(puzzNombreDeCables));
}
delay(1000);
}
/*--------------------------------------------------------------
Retourne la solution proposée par le joueur'*--------------------------------------------------------------
'*--------------------------------------------------------------
*/
String puzzLireSolutionJoueur()
{
String soluceJoueur = ""; // Solution sous forme A3-C0-D1 ... si XX pas de Point connecté sur cette Borne
for (int b = 0; b <= puzzIndexMax; b ++) // Toutes les bornes
{
soluceJoueur += puzzLiaisonPointBorne(b) + "-";
}
return soluceJoueur.substring(0, soluceJoueur.length() - 1); // Pour supprimer le dernier -
}
/*--------------------------------------------------------------
Retourne la liaison entre la borne borneNum et
son point A4 ou C2 ou XX si pas de liaison sur cette Borne
'*--------------------------------------------------------------
*/
String puzzLiaisonPointBorne(int borneNum)
{
String lienPoiBor = ""; // Liaison entre Point et Borne
for (int p = 0; p <= puzzIndexMax; p ++)
{
lienPoiBor = "XX"; // Liaison entre Point et Borne
int test = 0;
digitalWrite(puzzPoiBor[p][portPoint], LOW); // Port à OFF
if (digitalRead(puzzPoiBor[borneNum][portBorne]) == LOW) // Contrôle si continuité LOW
{
test ++;
}
digitalWrite(puzzPoiBor[p][portPoint], HIGH); // Port à ON
if (digitalRead(puzzPoiBor[borneNum][portBorne]) == HIGH) // Contrôle si continuité HIGH
{
test ++;
}
if (test == 2) // Si tout OK
{
lienPoiBor = char('A' + p) + String(borneNum);
break;
}
}
return lienPoiBor;
}
/*--------------------------------------------------------------
Compte le nombre de câble(s) connecté(s)
entre Point et Borne
'*--------------------------------------------------------------
*/
int puzzNombreConnectes()
{
int connTotal = 0;
for (int b = 0; b <= puzzIndexMax; b ++) // Tout les ports à OFF
{
digitalWrite(puzzPoiBor[b][portPoint], LOW);
}
for (int b = 0; b <= puzzIndexMax; b ++) // Tout les bornes
{
if (digitalRead(puzzPoiBor[b][portBorne]) == LOW)
{
connTotal ++;
}
}
return connTotal;
}
Bonjour danyschibli
Super, bons jeux!
Cordialement
jpbbricole
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.