affichage sur nano

Bonjour a tous,

je fais mes cablages sur une arduino nano et une extension shield pour l'acces aux pins plus facile.

je rencontre un probleme d'affichage persistent sans appel de la fonction.
si vous pouviez me dire ce qui ne va pas, je seche.

j'ai 5 boutons et une serie de resistances sur le pin A0.
jái un etalonnage de 50, 195, 380, 560, 790
chaque bouton indique : gauche, droite, entrer, haut et bas, zero si rien n'est appuye.
Tous les appuis s'affichent bien sur le serial.

Sauf sur le lcd, l'affichage reste bloque sur l'affichage du bouton droit des le demarrage et 2 boutons sur 3 seulement reagissent sur le lcd.

Si vous avez une idee, je suis preneur.

Avec le code ce sera plus facile de répondre.

ha oui bien sur, desole. je fais ca de suite :

unsigned char read_LCD_buttons()
{
key = analogRead(0); lecture de la valeur
if (key > 1000) return btnNONE;
if (key < 50)   return btnRIGHT; 
if (key < 195)  return btnUP;
if (key < 380)  return btnDOWN;
if (key < 560)  return btnLEFT;
if (key < 790)  return btnSELECT;   
return btnNONE;  
}

void avance(){
   lcd.clear();
   lcd.setCursor(2,1);
  lcd.print("o>>");      

}
void recule(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("<<o");             
} 


void arret(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(" <o>  ");

}


void loop(){
  key = read_LCD_buttons();  // read the buttons
   if(key == btnLEFT){recule();}
   if(key == btnRIGHT){avance();}
   if(key == btnSELECT){displayMenu(MAIN_MENU);}
   if(key == btnNONE){arret();}  
   Serial.print("sensor = " );
  Serial.println(analogRead(0)); // affichage sur le serial
  delay(2);

}

resultat sur le serial :

sensor = 329
sensor = 387
sensor = 422
sensor = 0
sensor = 527
sensor = 0
sensor = 696

affichage permanent sur le lcd et des le demarrage:
" o>>"

peut etre un manque de ram mais je sais pas comment la tester pour le moment et puis je n'ai pas eu ce probleme sur la UNO avec le meme code. merci de votre aide

Il n'y a pas de risque de manque de RAM avec un petit code comme ça.

Par contre il y a un même nom de variable pour faire des choses différentes :
key = read_LCD_buttons(); la variable key est ici de type char
key = analogRead(0); la variable key est ici de type int

oui merci de la remarque, je modifie cette valeur.
par contre cela ne change rien a mon affichage sur le lcd.
ne serait ce pas une assignation a ecraser dans un fichier de config ? :o

[edit] maintenant l'affichage du LCD est inoperant. seulement le serial affiche quelque chose.
je comprends pas, merci de votre pascience et de vos remarques.

hello
si ton code fonctionne sur UNO, il fonctionne sur Nano
regarde du coté du hard.

j'ai chargé et ouvert ton code chez moi. avec l'intention de chercher à t'aider.

puis en voyant que tu n'avais pas donné l'intégralité de ton code ( manque au moins le set up )
pas moyen de deviner quel est ton LCd par exemple, ni les affectations de pinoches)

donc j'ai tout refermé...............

bonjour dfgh,
desole pour ce contre temps, n'ayant pas vu de difference notoire avec les setup de la UNO, je pensais pas necessaire le de le poster. voici le code complet :

#include <LiquidCrystal.h>
#include "Menu.h" // Fichier d'entête avec les types pour le menu
#include <Servo.h>
#include "Arduino.h"#include <SoftwareSerial.h>

// config pour arduino UNO
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // avec la UNO et shield lcd + boutons : tout fonctionne normalement
//OU confog pour NANO
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// define some values used by the panel and buttons
int backLight   = 10;    // LCD Panel Backlight LED connected to digital pin 10
int lightLevel  = 230;   // Initialise back light at 75%
int lcd_key     = 0;
int key  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


void setup()
{
  Serial.begin(9600);
lcd.begin(16, 2);  // init LCD library
}

unsigned char read_LCD_buttons()
{
key = analogRead(0); lecture de la valeur
if (key > 1000) return btnNONE;
if (key < 50)   return btnRIGHT; 
if (key < 195)  return btnUP;
if (key < 380)  return btnDOWN;
if (key < 560)  return btnLEFT;
if (key < 790)  return btnSELECT;   
return btnNONE;  
}

void avance(){
   lcd.clear();
   lcd.setCursor(2,1);
  lcd.print("o>>");      

}
void recule(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("<<o");             
} 


void arret(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(" <o>  ");

}


void loop(){
   read_LCD_buttons();  // read the buttons
   if(key == btnLEFT){recule();}
   if(key == btnRIGHT){avance();}
   if(key == btnSELECT){displayMenu(MAIN_MENU);}
   if(key == btnNONE){arret();}  
   Serial.print("sensor = " );
  Serial.println(analogRead(0)); // affichage sur le serial
  delay(2);	

}

resultat sur le serial :

sensor = 329
sensor = 387
sensor = 422
sensor = 0
sensor = 527
sensor = 0
sensor = 696

affichage sur le lcd :
" o>>"

J'utile une resistance de 2.2 k entre chaque bouton.
Merci encore pour vos suggestions
je ne vois pas ce que je pourrais changer cote hardware. Je prends toutes les idees ? :slight_smile:

change ton code par ceci

void loop(){
   key = read_LCD_buttons();  // read the buttons

nota: j'ai effectué ton montage sur UNO, ton code ne fonctionnait pas non plus

merci de ton intervention dfgh,
jái remis le key a sa place, effetivement j'avais besoin de la variable pour la suite du code. merci de cette confirmation. pour la UNO je nái pas indique que les valeurs de analogRead sont differentes car les boutons sont greffes sur le shied lcd/buttons :

// read the buttons
unsigned char read_LCD_buttons() {// lecture des boutons du menu principal
key = analogRead(A0);      // read the value from the sensor
if (key > 1000) return btnNONE;
if (key < 50)   return btnRIGHT; 
if (key < 195)  return btnUP;
if (key < 380)  return btnDOWN;
if (key < 555)  return btnLEFT;
if (key < 790)  return btnSELECT; 
return btnNONE;
delay(100);

les pins sont connectes comme suit :
// config pour arduino UNO + shield
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
cette config fonctionne sans probleme. j'ai juste deporte les boutons et le LCD.

voici le code complet :

 #include <LiquidCrystal.h>
#include "Menu.h" // Fichier d'entête avec les types pour le menu
#include <Servo.h>
#include "Arduino.h"
#include <SoftwareSerial.h>

// config pour arduino UNO
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // avec la UNO et shield lcd + boutons : tout fonctionne normalement
//OU config pour NANO
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// valeurs des boutons
unsigned char key  = 0;// var resultat de lecture des boutons
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


void setup()
{
  Serial.begin(9600);
lcd.begin(16, 2);  // init LCD library
}

unsigned char read_LCD_buttons()
{
key = analogRead(A0); //lecture de la valeur
if (key > 1000) return btnNONE;
if (key < 50)   return btnRIGHT; 
if (key < 195)  return btnUP;
if (key < 380)  return btnDOWN;
if (key < 555)  return btnLEFT;
if (key < 790)  return btnSELECT; 
return btnNONE;  
}

void avance(){
   lcd.clear();
   lcd.setCursor(2,1);
  lcd.print("o>>");      

}
void recule(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("<<o");             
} 


void arret(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(" <o>  ");

}


void loop(){
  key = read_LCD_buttons();  // read the buttons
   if(key == btnLEFT){recule();}
   if(key == btnRIGHT){avance();}
   if(key == btnSELECT){lcd.print("menu");}
   if(key == btnNONE){arret();}  
   Serial.print("sensor = " );
  Serial.println(analogRead(0)); // affichage sur le serial
  delay(2);  

}

Maintenant j'ai cette erreur a la compile :

In file included from sketch_aug05a.ino:4:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:117:14: error: conflicting declaration 'typedef bool boolean'
 typedef bool boolean;
              ^
In file included from C:\Users\..\Desktop\Arduino\libraries\Menu/WProgram.h:10:0,
                 from C:\Users\..\Desktop\Arduino\libraries\Menu/Menu.h:33,
                 from sketch_aug05a.ino:2:
C:\Users\..\Desktop\Arduino\libraries\Menu/wiring.h:97:17: error: 'boolean' has a previous declaration as 'typedef uint8_t boolean'
 typedef uint8_t boolean;
                 ^
In file included from sketch_aug05a.ino:4:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:235:83: error: default argument given for parameter 3 of 'long unsigned int pulseIn(uint8_t, uint8_t, long unsigned int)' [-fpermissive]
 unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
                                                                                   ^
In file included from sketch_aug05a.ino:4:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:136:15: error: after previous specification in 'long unsigned int pulseIn(uint8_t, uint8_t, long unsigned int)' [-fpermissive]
 unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
               ^
In file included from sketch_aug05a.ino:4:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:238:75: error: default argument given for parameter 3 of 'void tone(uint8_t, unsigned int, long unsigned int)' [-fpermissive]
 void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
                                                                           ^
In file included from C:\Users\guy\Desktop\Arduino\libraries\Menu/Menu.h:33:0,
                 from sketch_aug05a.ino:2:
C:\Users\guy\Desktop\Arduino\libraries\Menu/WProgram.h:22:6: error: after previous specification in 'void tone(uint8_t, unsigned int, long unsigned int)' [-fpermissive]
 void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
      ^
Erreur lors de la compilation.

Je ne comprends plus rien. Please help.

ce dernier code se compile sans erreur chez moi
que ce soit pour UNO ou pour NANO

je suis en IDE 164

ben :o . ce serait pas un probleme de configuration ? un erase tampon ou memoire du precedent code envoye ? :slight_smile:
[edit] je suis en IDE 1.6.5 on dirait bien
merci de ton test.

[edit] comment je passe en IDE 164 ? Svp

non, ne cherches pas a changer de version, le prob est ailleurs.

testes en virant les deux librairies

//#include "Menu.h" // Fichier d'entête avec les types pour le menu
//#include <Servo.h>

chez moi, ça compile aussi sans ces deux lib que tu n'utilises pas

merci de la reponse dfgh, en enlevant ces 2 include, maintenant l'affichage sur le LCD devient blanc.
bizarre.
(j'ai toujours le bon affichage sur le Serial.)

voici le code qui se compile et fonctionne chez moi avec UNO et shield LCD et Boutons poussoirs

#include <LiquidCrystal.h>
//#include "Menu.h" // Fichier d'entête avec les types pour le menu
//#include <Servo.h>
#include "Arduino.h"#include <SoftwareSerial.h>

// config pour arduino UNO
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // avec la UNO et shield lcd + boutons : tout fonctionne normalement
//OU confog pour NANO
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// define some values used by the panel and buttons
int backLight   = 10;    // LCD Panel Backlight LED connected to digital pin 10
int lightLevel  = 230;   // Initialise back light at 75%
int lcd_key     = 0;
int key  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


void setup()
{
  Serial.begin(57600);
lcd.begin(16, 2);  // init LCD library
}

unsigned char read_LCD_buttons()
{
key = analogRead(0); //lecture de la valeur
Serial.print("Key = " );Serial.println(key);
if (key > 1000) return btnNONE;

if (key < 50)   return btnRIGHT;

if (key < 195)  return btnUP;

if (key < 380)  return btnDOWN;

if (key < 560)  return btnLEFT;

if (key < 790)  return btnSELECT;

return btnNONE;  
}

void avance(){
   lcd.clear();
   lcd.setCursor(2,1);
  lcd.print("o>>");      

}
void recule(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("<<o");             
} 


void arret(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(" <o>  ");

}


void loop(){
   key=read_LCD_buttons();  // read the buttons
   Serial.print("Key = " );Serial.println(key);
   if(key == btnLEFT){recule();}
   if(key == btnRIGHT){avance();}
   if(key == btnSELECT){};//displayMenu(MAIN_MENU);}
   if(key == btnNONE){arret();}  
  // Serial.print("sensor = " );
 // Serial.println(analogRead(0)); // affichage sur le serial
  delay(2);	

}

oui le code compile et transfert mais as tu un affichage correct sur le LCD sans shield ?
quel est la difference entre les deux a part les pins ?
Merci encore de mávoir aide.

oui, au démarrage j'ai
puis appui sur gauche j'ai <<o
et appui sur droite j'ai o>>

par contre j'ai du faire cela
if(key == btnSELECT){}; //displayMenu(MAIN_MENU);}

desole jávais pas vu la reponse precedente.
oui j'ai du faire une faute en ecrivant les ==.Ils sont dans le sketch.

Le code compile et transfert mais as tu un affichage correct sur le LCD sans shield ?

Avec le shield il ný a pas de probleme non plus.
Des que je passe sur un lcd deporte et boutons deportes :
L'appui de tous les boutons est reconnu sur le serial mais sur le lcd, seulement 2 et le "o>>" reste affiche des le demarrage.
C'est l'origine de mon post, j'etais passe directement de UNO shield a NANO.
Effectivement le meme probleme sur la UNO sans shield.
Comment est ce possible ? Je ne comprends pas.

Merci encore de mávoir repondu.

[edit]
Le Serial.print affiche zero tant que je n'appuis pas sur un bouton.
Ce n'est donc pas les connections des boutons.

Le LCD affiche bien les caracteres fixes. Il est donc correctement connecte.

Le LCD reste bloque sur btnRIGHT.
Seulement l'appui sur btnSELECT et btnLEFT sont effectifs sur le LCD alors que
les valeurs d'appui sur les boutons s'affichent normalement sur le serial. :blush:

Ce serait pas un probleme de librarie ?

non, les "==" sont correct, c'est la fonction que tu appelles qui n'existe pas, je l'ai "commentée" comme ceci "//"

je viens de câbler un nano avec un shield lcd+BP
le test est concluant, j'ai le même affichage que sur UNO avec le même shield

a savoir au démarrage
<<o si BP gauche pressé
o>> si BP droit pressé

nota: quand tu test avec NANO,
tu penses bien à valider les pinoches du LCD pour NANO et non pour UNO ?

donne les branchements de ton LCD

bonjour dfgh, merci de ta reponse.

comme precedemment je disais n'avoir aucun probleme avec la meme configuration que toi.
mes boutons sont deportes (hors du shield) ainsi que le LCD.
Ce doit etre un probleme materiel. Jái essaye avec des condos. rien
je vais essayer un pullup, aussi.
mon pin config est le meme que dans le sketch, la je suis sur UNO.
bon ben voila je ferai part de mes recherches.
Apres tout jái encore des pins. je voulais juste faire plus smart. lol
Merci de ta visite dfgh.

je remets un code tout propre au cas ou les precedents semblaient trop fournis ?!

#include <LiquidCrystal.h>
#include "Arduino.h"
#include <SoftwareSerial.h>

// config pour arduino UNO
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // avec la UNO et shield lcd + boutons : tout fonctionne normalement
//OU config pour NANO
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// define some values used by the panel and buttons
int backLight   = 10;    // LCD Panel Backlight LED connected to digital pin 10
int lightLevel  = 230;   // Initialise back light at 75%
int lcd_key     = 0;
int key  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5


void setup()
{
  Serial.begin(9600);
lcd.begin(16, 2);  // init LCD library

}

unsigned char read_LCD_buttons()
/****** fonctionne pas
{ 				
key = analogRead(A0); //lecture de la valeur
delay(200);
Serial.print("Key = " );Serial.println(key);
if (key > 1000) {
  if (key > 310) {
    if (key > 360) {
      if (key > 410){
        if (key > 500) {
          if (key > 680) {
            return btnSELECT; }
          return btnLEFT; }            
        return btnDOWN; }
      return btnUP; }
    return btnRIGHT; }
  return btnNONE;
}
}
*/
if (key > 310)   return btnRIGHT;

if (key > 360)  return btnUP;

if (key > 410)  return btnDOWN;

if (key > 500)  return btnLEFT;

if (key > 680)  return btnSELECT;
delay(200);
return btnNONE; 

}
void avance(){
   lcd.clear();
   lcd.setCursor(2,1);
  lcd.print("o>>");     

}
void recule(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("<<o");             
}


void arret(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(" <o>  ");

}


void loop(){
   key = read_LCD_buttons(); 	 // read the buttons
   Serial.print("Key = " );Serial.println(key);

   if(key == btnLEFT){		 // btn droit
    Serial.print("sensor = " );
 Serial.println("gauche");
   }
   if(key == btnRIGHT){   	// btn gauche
    Serial.print("sensor = " );
 Serial.println("droit");
   }
   if(key == btnSELECT){    	// btn menu
    Serial.print("sensor = " );
 Serial.println("select");
   }
   if(key == btnNONE){		// retour
     Serial.print("sensor = " );
 Serial.println("RIEN");
   }
   Serial.print("sensor = " ); 	
 Serial.println(analogRead(0)); // affichage sur le serial
  delay(220);  

}

hello
j'ai pensé que tu utilise un LCD séparé avec NANO et c'est le cablage réeel du LCD que je te demandais
le lCD à d'autre pinoches que celles qui sont sur NANO et je voulais voir comment tu avais câblé les autres pinoches du LCD