Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Menu principal

Le projet arduino d'un gros noob.

Démarré par Zofran, Décembre 09, 2023, 11:58:24 AM

« précédent - suivant »

Zofran

#15
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("       ");
}

philchamp51

#16
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.

philchamp51

#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);
}

philchamp51

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

philchamp51

Bonjour.

As-tu essayé le code que je t'ai fait ?

Zofran

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


philchamp51

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.

philchamp51

Bonjour.

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