Go Down

Topic: Programme arduino LCD shield 16x2 (Read 3615 times) previous topic - next topic

projetbeaumont

Bonjour,

J'ai un probleme dans un programme que je suis en train de faire. J'ai un ecran lcd 16x2 avec des boutons et je souhaite, lorsque j'appuie sur l'un des boutons, ajouter 1 à une variable puis l'afficher.

Voila mon code.

Code: [Select]



// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>


#define WHITE 0x7



void setup() {

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

  // Print a message to the LCD. We track how long it takes since
  // this library has been optimized a bit and we're proud of it :)
  lcd.print("Hello, world!");
}

uint8_t i=0;
void loop() {

  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
 
  int n=0;

  uint8_t buttons = lcd.readButtons();

  if (buttons) {
    lcd.clear();
    lcd.setCursor(0,0);
    if (buttons & BUTTON_UP) {
      n = n+1;
      lcd.print("Argent disponible :");
    }
    if (buttons & BUTTON_DOWN) {
      lcd.print("Argent disponible :");
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
    }
    if (buttons & BUTTON_LEFT) {
      lcd.print("Argent disponible :");
    }
    if (buttons & BUTTON_RIGHT) {
      lcd.print("Argent disponible :");
    }
    if (buttons & BUTTON_SELECT) {
      lcd.print("Menu");
    }
  }
}



Mon probleme : Le programme n'ajoute pas 1 a la variable a chaque fois que j'appuie sur un bouton ou si il le fait, il ne le fait qu'une fois.

bricoleau

Dans ton programme, n est définie en tant que variable locale à ta fonction loop()
Elle est donc réinitialisée à 0 à chaque exécution de la fonction loop()

Si tu souhaites que la valeur de ta variable soit conservée entre deux appels à la fonction loop(), il faut la déclarer en variable globale (=déplacer la ligne au-dessus de void loop()) ou mieux, la laisser là où elle est en la déclarant de cette manière : static int n = 0;
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

projetbeaumont

Merci beaucoup, maintenant ça fonctionne !

projetbeaumont

Il me reste un dernier problème : faire défiler un texte sur une ligne que je ne vois pas totalement.

Est-il possible de le faire simplement avec une fonction de la librairie LiquidCrystal ?

dfgh

Hello
voir l'exemple scroll dans les exemples  (de la lib LiquidCrystal)
le chemin:
exemples, LiquidCristal, scroll.

projetbeaumont

J'ai vu l'exemple mais je ne comprend pas vraiment comment il fonctionne, surtout sur cette ligne de code :

Code: [Select]
  for (int positionCounter = 0; positionCounter < 13; positionCounter++) {


dfgh

simple boucle "for"
qui appelle la fonction "lcd.scrollDisplayLeft();" qui est dans la librairie" LcdCrystal".

13 est la longueur du texte "hello, World"

cette boucle "for" appelle donc 13 fois la fonction de décalage de l'écran .

projetbeaumont

Pour un bout de mon code cela donnerai donc ceci ?


Code: [Select]
if (buttons & BUTTON_UP) {
     
      n = n+1;
     
      for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
      lcd.scrollDisplayLeft();
      delay(150);
      lcd.print("Argent disponible :"); }

      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
     
    }



La j'ai un problème d'affichage, il me décale les 2 lignes et la deuxième devient la même que la première.


J'ai un peu de mal avec LiquidCrystal

dfgh

essaye ça
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int n;int C;int L;
void setup() {
  lcd.begin(16, 2);
  C=0;L=0;lcd.setCursor(C, L);
  lcd.print("Argent dispo :");  lcd.print(n);  lcd.print(" euros");
}

void loop() {
      if (buttons & BUTTON_UP)
      {
      n ++;
      C=0;L=0;lcd.setCursor(C, L);
      lcd.print("Argent dispo :");  lcd.print(n);  lcd.print(" euros");
      for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
      lcd.scrollDisplayLeft();
      delay(150);
    }
}

projetbeaumont

Bonjour,

Tout d'abord merci pour les réponses apporté à mon sujet.


Cela me semble aller dans le bon sens mais cette fois des erreurs lors de la compilation me bloquent.

Voici mon code complet :

Code: [Select]

// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include "LiquidCrystal.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int C;int L;


Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

// Change Backlight color
#define WHITE 0x7



void setup() {

  // Debugging output
  Serial.begin(9600);
 
  C=0;L=0;lcd.setCursor(C, L);
 
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);

  // Print a message to the LCD. We track how long it takes since
  // this library has been optimized a bit and we're proud of it :)
  lcd.print("    Tirelire");
  lcd.setCursor(0, 1);
  lcd.print ("   automatise");
}

uint8_t i=0;
void loop() {

  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
 
 static int n=0;

  uint8_t buttons = lcd.readButtons();

  if (buttons) {
    lcd.clear();
    lcd.setCursor(0,0);
   
    if (buttons & BUTTON_UP) {
     
      n = n+1;

      C=0;L=0;lcd.setCursor(C, L);

      lcd.print("Argent disponible :");
     
      for (int positionCounter = 0; positionCounter < 17; positionCounter++) {
      lcd.scrollDisplayLeft();
      delay(150);
      }
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
     
    }
   
    if (buttons & BUTTON_DOWN) {
     
      n = n+1;
      lcd.print("Argent disponible :");
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
     
    }
    if (buttons & BUTTON_LEFT) {
     
      n = n+1;
      lcd.print("Argent disponible :");
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
     
    }
   
    if (buttons & BUTTON_RIGHT) {
     
      n = n+1;
      lcd.print("Argent disponible :");
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
     
    }
   
    if (buttons & BUTTON_SELECT) {
     
      n = n+1;
      lcd.print("Menu");
      lcd.setCursor(0, 1);
      lcd.print (n);
      lcd.print (" euros");
     
    }
  }
}



Et voici les erreurs

Quote
Arduino : 1.6.3 (Windows 8.1), Carte : "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Les options de compilation ont été modifiées, tout sera recompilé

Utilisation de la bibliothèque Wire prise dans le dossier : D:\Programmes\Arduino\hardware\arduino\avr\libraries\Wire

Utilisation de la bibliothèque Adafruit RGB LCD Shield Library prise dans le dossier : C:\Users\Admin\Documents\Arduino\libraries\Adafruit-RGB-LCD-Shield-Library-master

Utilisation de la bibliothèque LiquidCrystal prise dans le dossier : C:\Users\Admin\Documents\Arduino\libraries\LiquidCrystal (legacy)



D:\Programmes\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10603 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I
D:\Programmes\Arduino\hardware\arduino\avr\cores\arduino -I
D:\Programmes\Arduino\hardware\arduino\avr\variants\mega -I
D:\Programmes\Arduino\hardware\arduino\avr\libraries\Wire -I
C:\Users\Admin\Documents\Arduino\libraries\Adafruit-RGB-LCD-Shield-Library-master -I
C:\Users\Admin\Documents\Arduino\libraries\LiquidCrystal
C:\Users\Admin\AppData\Local\Temp\build1375211619911298017.tmp\HelloWorld2.cpp -o
C:\Users\Admin\AppData\Local\Temp\build1375211619911298017.tmp\HelloWorld2.cpp.o

HelloWorld2.ino:11:23: error: conflicting declaration 'Adafruit_RGBLCDShield lcd'

HelloWorld2.ino:7:15: error: 'lcd' has a previous declaration as 'LiquidCrystal lcd'

HelloWorld2.ino: In function 'void loop()':

HelloWorld2.ino:44:25: error: 'class LiquidCrystal' has no member named 'readButtons'

Erreur lors de la compilation.
J'ai relis tout mon code pour voir si je voyais des erreurs mais pour l'instant je ne remarque rien. Je continu mes recherches sur les messages d'erreurs.

icare

Bonjour,
C'est un LCD en I2C, commente ces 2 lignes

Code: [Select]
//#include "LiquidCrystal.h"
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

projetbeaumont


icare

#12
Apr 24, 2015, 11:42 am Last Edit: Apr 24, 2015, 11:42 am by icare Reason: complément
Re,
Supprime les 2 lignes car du déclares 2 objets lcd
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

projetbeaumont


Go Up