Créer des boucles non-interchangeables

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 :wink:
... 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

Y aurait-il un problème de visibilité du bandeau en tête du Forum ?

Merci :wink: 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 :wink:

Bonjour danyschibli

Oui, nkckel :wink:

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 :wink:.
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

smiley-1

Ç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.