Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=register Les demandes d'inscription sont révisées quotidiennement.

Auteur Sujet: Le projet arduino d'un gros noob.  (Lu 4370 fois)

Zofran

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #15 le: Janvier 28, 2024, 03:53:08 pm »

Hello,

Actuellement le projet est au stade de breadboard.

Sur la photo j'ai alimenté le circuit via une lipo et un régulateur L7805CV.
L'Atmega à droite n'est pas utilisé (mais c'est celui la qui sera intégré dans le montage final), je fais mes essais avec l'arduino.

Pour mon essai, c'est le fil bleu entouré en vert qui simule la future pointe de touche.



Et voici le code, à mon avis il peut être largement amélioré, j'espère ne pas avoir provoquée une crise cardiaque aux pros du code.  ;D
#include <Adafruit_MCP23X17.h>
#include <LiquidCrystal.h>

Adafruit_MCP23X17 mcp1;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
 
void setup() {

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);

  // set up the MCP
  mcp1.begin_I2C(0x20);      // Utiliser l'adresse par défaut 0x20
  activationEntreeMcp1();
 
}
void loop() {
 
  if (!mcp1.digitalRead(0)){
  affichagelcd("A");
  }

  if (!mcp1.digitalRead(1)){
  affichagelcd("B");
  }

  if (!mcp1.digitalRead(2)){
  affichagelcd("C");
  }

  if (!mcp1.digitalRead(3)){
  affichagelcd("D");
  }

  if (!mcp1.digitalRead(4)){
  affichagelcd("E");
  }

  if (!mcp1.digitalRead(5)){
  affichagelcd("F");
  }

  if (!mcp1.digitalRead(6)){
  affichagelcd("G");
  }

  if (!mcp1.digitalRead(7)){
  affichagelcd("H");
  }

  if (!mcp1.digitalRead(8)){
  affichagelcd("J");
  }

  if (!mcp1.digitalRead(9)){
  affichagelcd("K");
  }

  if (!mcp1.digitalRead(10)){
  affichagelcd("L");
  }

  if (!mcp1.digitalRead(11)){
  affichagelcd("M");
  }

  if (!mcp1.digitalRead(12)){
  affichagelcd("N");
  }

  if (!mcp1.digitalRead(13)){
  affichagelcd("P");
  }

  if (!mcp1.digitalRead(14)){
  affichagelcd("R");
  }

  if (!mcp1.digitalRead(15)){
  affichagelcd("S");
  }
}

void activationEntreeMcp1() {
  for (int entree=0; entree <=15; entree++){
    mcp1.pinMode(entree, INPUT_PULLUP);
  }
}

char affichagelcd(const char* point){
  lcd.setCursor(0, 1);
  lcd.print("Point ");
  lcd.print(point);
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("       ");
}
« Modifié: Janvier 28, 2024, 03:58:44 pm par Zofran »
IP archivée

philchamp51

  • Full Member
  • ***
  • Messages: 247
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #16 le: Janvier 29, 2024, 04:19:39 pm »

Et bien tu as bien avancé. C'est super. Des "if" répétés et du "delay" ne sont pas trop optimisés. Je vais regarder et te proposer une solution alternative.
Je n'ai pas de mcp, alors tu feras l'essai si tu veux.
« Modifié: Janvier 29, 2024, 04:22:11 pm par philchamp51 »
IP archivée

philchamp51

  • Full Member
  • ***
  • Messages: 247
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #17 le: Janvier 29, 2024, 04:31:05 pm »

#include <Adafruit_MCP23X17.h>
#include <LiquidCrystal.h>

Adafruit_MCP23X17 mcp1;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);

  // set up the MCP
  mcp1.begin_I2C(0x20);  // Utiliser l'adresse par défaut 0x20
  activationEntreeMcp1();
}
void loop() {

  for (int pin = 0; pin <= 15; pin++) {
    if (!mcp1.digitalRead(pin)) {
      switch (pin) {

        case 0:
          affichagelcd("A");
          break;

        case 1:
          affichagelcd("B");
          break;

        case 2:
          affichagelcd("C");
          break;

        case 3:
          affichagelcd("D");
          break;

        case 4:
          affichagelcd("E");
          break;

        case 5:
          affichagelcd("F");
          break;

        case 6:
          affichagelcd("G");
          break;

        case 7:
          affichagelcd("H");
          break;

        case 8:
          affichagelcd("J");
          break;

        case 9:
          affichagelcd("K");
          break;

        case 10:
          affichagelcd("L");
          break;

        case 11:
          affichagelcd("M");
          break;

        case 12:
          affichagelcd("N");
          break;

        case 13:
          affichagelcd("P");
          break;

        case 14:
          affichagelcd("R");
          break;

        case 15:
          affichagelcd("S");
          break;
      }
    } else {
      affichagelcd("");
    }
  }
}
void activationEntreeMcp1() {
  for (int entree = 0; entree <= 15; entree++) {
    mcp1.pinMode(entree, INPUT_PULLUP);
  }
}

char affichagelcd(const char* point) {
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("Point ");
  lcd.print(point);
}
IP archivée

philchamp51

  • Full Member
  • ***
  • Messages: 247
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #18 le: Janvier 29, 2024, 04:33:34 pm »

Cela te fera peut-être connaître la fonction "switch" qui est beaucoup plus rapide que des "if"
IP archivée

philchamp51

  • Full Member
  • ***
  • Messages: 247
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #19 le: Février 02, 2024, 01:31:55 pm »

Bonjour.

As-tu essayé le code que je t’ai fait ?
IP archivée

Zofran

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #20 le: Février 02, 2024, 05:32:05 pm »

Pas eu le temps de bidouiller cette semaine, je pense que demain ou après demain je pourrais essayer.

Je ne connaissais pas la fonction switch, j'avais essayé des choses avec for et while, mais sans réussir à faire quelque chose de fonctionnel.

J'ai un peu de mal à comprendre cette modification du code proposé (surtout les deux premières lignes) :
lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("Point ");
  lcd.print(point);
Pourquoi "reset" les caractères de la première ligne qui n'est pas vraiment utilisé pour afficher les points ?

Je n'aurais surement pas toujours des contacts francs quand je toucherais les fils avec ma pointe de touche, est ce que, sans delay, ça ne vas pas provoquer des "rebonds" (comme pour les bouton poussoir) ?

Sinon, je viens de me rendre compte que je n'ai pas mis de résistances de pullup sur ma liaison I2C, pourtant je n'ai pas rencontré de soucis de communication...

IP archivée

philchamp51

  • Full Member
  • ***
  • Messages: 247
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #21 le: Février 02, 2024, 05:42:06 pm »

C’est simplement pour que la première Ligne n’affiche pas de caractères hasardeux.

Fais un essai déjà comme ça et si tu as des rebonds, on fera un anti rebond avec millis, plutôt que delay mais étant donné que tu restes sur le même fil quelques secondes, un rebond ne devrait pas être gênant.

Je n’ai jamais mis de résistances pullup sur les liaisons I2C et je n’ai jamais eu de problème vu la courte longueur des fils.
IP archivée

philchamp51

  • Full Member
  • ***
  • Messages: 247
    • Voir le profil
Re : Le projet arduino d'un gros noob.
« Réponse #22 le: Février 27, 2024, 05:48:49 pm »

Bonjour.

Où en es-tu de ta réalisation ? Ça fonctionne ?
IP archivée