Bonjour a tous. Ca marche, mais...

Avant tout, Bonjour a tous, Je suis nouveau sur ce forum ainsi que sur arduino. J’ai un petit niveau en VB.NET et VB6, je découvre le C avec intérêt. Je vis en Thailande et travaille dans l’électronique navale.

Voila, je vous en dirai volontier d’avantage mais j’ai peur de vous emmerder… loool.

Alors voila, j’ai ma premiere carte Arduino UNO depuis hier, tout va bien et j’ai fais un petit programme qui fonctionne correctement.

j’ai connecté un LCD keypad shield (16 digits 2 lignes 6 boutons) a ma UNO.

Le but de mon premier programme est d’avoir un message de bienvenu suivi d’un premier menu qui affiche les touches et agit sur le rétro éclairage de l’écran.
Avec le bouton SELECT on accede a un second menu qui permet d’allumer ou d’eteindre 3 lampes, puis on revient sur le premier menu.

Ca fonctionne mais je souhaiterai des conseils de codage pour limiter la taille du prog (18% de l’espace de stockage et 15 % de la ram…, c’est trop pour juste ca… mais je débute, j’ai donc du faire plein d’erreurs.

J’ai aussi eu un problème avec la déclaration de mon tableau en string.
String choose[2] =(“string1”,“string2”,“string3”);
ca marche po :frowning:
j’ai réussi en le faisant sur 3 lignes mais ca fait plus de code.
Bon, je vous colle tout ca la, n’hésitez pas à commenter.
Merci a ceux qui ont lu jusque là.
Amicalement,

lcd1602-3-documented.ino (7.81 KB)

// include the library code:
#include <LiquidCrystal.h>;
int dimmerM = 60;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  Serial.begin(9600);                 //start serial connection 
  pinMode(10,OUTPUT);                 //pin back lite
  pinMode(11,OUTPUT);                 //pin led1
  pinMode(12,OUTPUT);                 //pin led2
  pinMode(13,OUTPUT);                 //pin led3
  analogWrite(10,dimmerM);            //set back lite to default
  digitalWrite(11,HIGH);              //test led1 line
  delay(200);                         //wait
  digitalWrite(12,HIGH);              //test led2 line
  delay(200);                         //wait
  digitalWrite(13,HIGH);              //test led3 line
  delay(200);                         //test
  lcd.begin(16,2);                    //set display 16 char 2 lines
  lcd.setCursor(1, 0);                //set cursor at 1 line 0
  lcd.print("Bonjour Michel");        //say HI to me :-)
  delay(1500);                        //wait
  lcd.clear();                        //clear display
  lcd.setCursor(2,0);                 //set cursor 2 line 0
  lcd.print("J'espere que ");         // mesage test part 1
  lcd.setCursor(2,1);                 // set cursor 2 line 1
  lcd.print("tu vas bien.");          // message test part 2
  delay(1000);                        // wait
  changeOut(0);                       // reverse output 11 (off led1)
  changeOut(1);                       // reverse output 12 (off led2)
  changeOut(2);                       // reverse output 13 (off led3)
  lcd.clear();                        // clear display
}

void loop() {
    switch (keypad()){                //read buttons and start switch
      case 0:                         //if 0 (no button pressed)
        lcd.setCursor(5,0);           // set cursor to 5 line 0
        lcd.print("Ready");           // print Ready on the display
        break;                        //end of case
      case 1:                         //button select pressed
        select();                     //go to sub select (sub menu)
        break;                        //end of case
      case 2:                         //button left pressed
        lcd.print("left");            //print "left" on the display as long as you press it.
        break;                        //end of case
      case 3:                         //button up pressed
        lcd.print("up");              //print "up" on the display as long as you press it.
        dimmerM=dimmerM+10;           // increase the dimmer var
        if (dimmerM > 100) dimmerM=100;     // limit dimmer var at 100 max
        break;                        //end of case
      case 4:                         //button down pressed
        lcd.print("down");            //print "down" on the display as long as you press it.
        dimmerM=dimmerM-10;           // decrease dimmer
        if(dimmerM < 0) dimmerM=0;    // limit dimmer var at 0 min
        break;                        //end of case
      case 5:                         // button right pressed
        lcd.print("right");           //print "right" on the display as long as you press it.
        break;                        //end of case
    }
    analogWrite(10,dimmerM);          // write the value of dimmer
    delay(100);                       // wait (needed to see the values on the display, else it's dark)
    lcd.clear();                      // clear display
}
int keypad(void) {                    // sub keypad reading
  int key = analogRead( A0 );         //get value of A0 in var key (depend on the button pressed)
  if ( key < 65 ) {                   //if less than 65 
    key = 5;                          //button right is pressed, 
  } else if ( key < 218 ) {           //less than 218
    key = 3;                          //button up pressed
  } else if ( key < 392 ) {           //less than 392
    key = 4;                          //button down pressed
  } else if ( key < 600 ) {           //less than 600
    key = 2;                          //button left pressed
  } else if ( key < 871 ) {           //less than 871
    key = 1;                          //button select pressed
  } else {                            //no button pressed
    key = 0;                          //return 0
  }
  return key;                         //return key value
  
}
void select(){
  String choose[2];                   //=("Lamp1","Lamp2","Lamp3");// declare the array !! cannot assign the values dirrectly ???
  choose[0]="Lamp-1";                 //assign value 1
  choose[1]="Lamp-2";                 //assign value 2
  choose[2]="Lamp-3";                 //assign value 3 ... on this value, if I write "Lamp3", I have "Lampm" on the display ????????? no problem with Lamp1 and Lamp2... curious..
  int n=0;                            // var used to set the led and change the choose display
  lcd.clear();                        //clear display
  while(n!=-1) {                      //do until value of n is -1
    lcd.setCursor(5,0);               //set cursor 5 line 0
    lcd.print("SELECT");              //print select
    lcd.setCursor(5,1);               //set cursor to 5 line 1
    lcd.print(choose[n]);             // print the led selected
    int key = keypad();               // set key with the value of keypad
BCL:                                  // yes I know... GOTO is bad :-(
    if(key==keypad()) goto BCL;       // anti rebound (before this, the key was unstable due to multiple contacts on press
    switch (key){                     //switch on val of key var
      case 0:                         //no key
        //n=n;                        // do nothing
        break;                        //end of case
      case 1:                         //button select pressed
        //n=-1;                       // I try to quit the sub menu with key select (1) but doesn't work, the val of key still Select when the sub start. (I think I'm the only one who understand what I write lool)
        break;                        //end of case
      case 2:                         //button left pressed
        n=-1;                         // quit the sub menu and goback to main menu
        break;                        //end of case
      case 3:                         //button down pressed
        n=n-1;                        //change the value of n, this will display lamp3, and lamp2, and lamp1 and goback to lamp3 etc...
        if (n==-1) n=2;               //in n down to 0, go back to 3
        delay(150);                   //delay 150, else the number are not following (proc goes too fast and change from 3 to 1 without going to 2
        break;                        //end of case    
      case 4:                         //button down pressed
        n++;                          //same function as case 3 but going up (lamp1, lamp2 lamp3 lamp1 etc...)
        if (n==3) n=0;                //cannot be 3, if = 3 then = 0
        delay(150);                   // delay for stability reason (see case 3)
        break;                        //end of case
      case 5:                         //button left pressed
        changeOut(n);                 //set the light selected to On or Off (inverse of what it was)
        n=-1;                         //quit the sub menu
        break;                        //end of case
    }
  }
}
void changeOut(int n){                                                           //reverse the output selected
  if (n==0)n=11;                                                                  //if 0 set n as pin number 11
  if (n==1)n=12;                                                                  //if 0 set n as pin number 11
  if (n==2)n=13;                                                                  //if 0 set n as pin number 11
  if (digitalRead(n)== HIGH) digitalWrite(n,LOW); else digitalWrite(n,HIGH);      //if 0 set n as pin number 11
}

Bonjour,

Il y a un problème dans ta déclaration String choose[2] Ca veut dire que tu as deux éléments, en fait tu en as trois, il faut donc déclarer String choose[3]

merci a toi pour ce conseil, je vais corriger,

toutefois, pour moi, si tu met 2, tu as normalement accés à 3 variables [0], [1] et [2]…

j’essaye avec 3, mais ca marche déjà avec 2. :slight_smile:

Si tu met 3, normalement il y en a une qui restera nule (remarque, c’est pas pour l’espace memoire que ca prend, on est pas à ca pres)…

par contre, la déclaration du tableau m’a posé un problème.

String choose[2]={"lamp1","lamp2","lamp3"}; // ne fonctionne pas chez moi, erreur de vérification du compilateur, je dois faire une erreur quelque part. j'ai essayé un tableau avec str a la place de string mais pas trouvé la solution pour avoir plus d'un caractère, donc retour à String...

String choose[2];
choose[0]="Lamp1"; // pas de problème
choose[1]="Lamp2"; // pas de problème
choose[2]="Lamp3"; // me donne "Lampm" lorsque j'affiche la valeur de choose[2] ????

//si je remplace Lamp3 par Lamp-3, tout va bien... les joies des strings... rigolo mais pas grave

Bonne journée.

Bonjour et bienvenue

Je conseille d'oublier jusqu'à l'existence du langage VB... Et de lire quelques tutorials C, par exemple sur les tableaux. Quand tu crée un tableau de taille 2, il n'y a que 2 éléments disponibles dans ce tableau: 0 et 1. En écrivant un 3ème élément dans ce tableau, tu crée une erreur de dépassement de tampon.

  • Si tu veux économiser de la mémoire alors commence par ne pas utiliser la classe String, en C on utilise des tableaux de char depuis la nuit des temps, tu trouvera donc des exemples par millions.

  • Si dimmerM n'est jamais supérieur à 100 et jamais inférieur à 0, alors en le stockant dans un int tu gaspille un octet.

  • Tes chaines de caractères constantes, tu peux les mettre dans la flash, il suffit d'utiliser la macro F(), par exemple:

lcd.print( F( "Bonjour Michel" ) );
  • Il est déconseillé d'utiliser goto.

  • La fonction changeOut peut être simplifiée:

void changeOut( uint8_t n )
{
  n += 11;
  digitalWrite( n, !digitalRead( n ) );
}
  • Voir le lien dans ma signature

Comme je te l'ai indiqué c'est normal que String choose[2]={"lamp1","lamp2","lamp3"}; donne une erreur puisque tu essaie d'initialiser un tableau de 2 éléments avec 3 valeurs. Essaie String choose[3]={"lamp1","lamp2","lamp3"}; et ça va marcher.

Je suis d'accord avec guix évite d'utiliser les String si non nécessaire. J'utiliserai plutôt const char * choose[3]={"lamp1","lamp2","lamp3"};

Un grand merci a tous les deux pour le temps que vous avez passé à corriger ce premier code.

Je m’en vais de ce pas mettre de l’ordre dans tout cela, virer le string et mettre un slip.

pendant que j’y suis, une petite question (j’ai cherché un peu mais n’ai rien trouvé).

str * …

l’étoile est pour déclarer un tableau??

@guix : merci pour les liens dans ta signature. quel est l’intérêt d’utiliser la flash plutôt que l’adressage direct? gain de mémore??

Bon dimanche a tous les deux. Et encore merci.

L’astérisque c'est pour déclarer les pointeurs. Y'a un excellent tuto sur le sujet dans la partie tuto du forum français ;)

merci B@tto, je vais chercher ce tuto.

Je conseille d'oublier jusqu'à l'existence du langage VB

ok pour ce qui concerne la programmation de puces en langage c ou c++, mais pour la programmation sous windows, en relation ou pas avec un arduino, c'est ce que je persiste a utiliser : concernant l'efficacité je ne sais pas, mais pour l'ergonomie c et c++ me paraissent terriblement obsolètes ...

guix: Je conseille d'oublier jusqu'à l'existence du langage VB...

Un point de vue que je ne partage pas ... Certes c'est en langage surement voué dans un avenir à moyen (long?) terme à disparaitre, néanmoins ça ne tient qu'à une seule constante qui est la volonté de Microsoft à maintenir ce langage. Or il est assez ardemment défendu par ce dernier.

Certes également il ne colle pas dans la syntaxe à certaine façon de procéder dans d'autre langage, ce qui fait que quand on atteint un certain niveau, il devient en quelques sorte "illogique" dans sa syntaxe. N'empêche que pour un débutant (et c'est bien la cible affichée) il est plus simple à prendre en main.

Et on peut se poser la même question pour le C/C++ sur PC : d'autres langage prennent le pas et c'est pas sur que ça soit lui qui ressorte gagnant. Il est complexe à prendre en main sur PC, et il se limite à celui ci en fait. Peu d'éditeurs fonctionne sur ce langage pour les autres support (internet, app mobile etc ...). Java, javascript, python ... Sont maintenant largement privilégiés