Programme avec algorithme et afficheur lcd

j'ai vérifié, mais je ne vois pas d'erreurs voici une photo: http://www.heberger-image.fr/images/23902_IMGP1415.jpg.html

pourquoi utiliser le LCD en 8 bits ? ça marche très bien en data de 4bits et tu économises 4 pinoches de ta platine arduino

ma connection utilise 6 pinoches du nano qu'il soit en 16x2 ou 20x4, c'est le même cablage.

puisque c'est un 4x20, il faut l'initialiser comme tel dans ton prg donc : lcd.begin (16,4); voir: lcd.begin (20,4);

ou est le potar de contraste ?

et nous sommes bien d'accord que la patte N°1 du LCD est en bas à droite sur ta photo.

Car en 4 bits, on peut coder 2^4 ce qui fait 16 caractères si je ne me trompe pas. En 8 bits, c'est 256 car 2^8. Mais je me suis mis en 4 bits désormais.

OK

Je change ça de suite.

Je n'en est pas mis, je crois que ce n'est pas obligatoire. Je me trompe?

Oui, c'est cela à droite sur la photo, c'est la pinoche 1.

1/ heureusement, ca ne marche pas comme ça. en 8 bits, il faut comprendre chargement d'un registre en "série" sur 8 bits et un top de bascule en "parallele" en 4 bits, la manip est faite 2 fois et la donnée est reconstituée ensuite sur 8 bits.

j'ai utilisé un certain nombre de LCD 16x2 et 20x4, aucun ne fonctionnait sans potar de contraste. certains mettent un potard, effectuent le reglage de contraste puis remplacent le potar par un pont de résistances équivalentes à celles du potar.

si nous sommes ok pour la pinoche 1, il n'y a pas de risque d'inversion de câblage à ce niveau là.

Tu m'apprends quelque chose là. Le 4 bits est donc plus lent c'est le seul changement.

Tu me conseilles de l'ajouter donc?

Non, c'est ok pour le câblage.

Ça te parait bien ces branchements?

http://www.heberger-image.fr/images/46303_IMGP1418.jpg.html

http://www.heberger-image.fr/images/47598_IMGP1419.jpg.html

En tout cas ça fonctionne tjs pas (écran noir). :roll_eyes: :roll_eyes: :roll_eyes:

là pour le cablage

et cette ligne là si tu fais exactement le cablage du lien ci dessus

//RS_pin EN_pin BUS1 BUS2 BUS3 BUS4
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

si tu n’as rien sur l’afficheur lorsque tu as lancé ton prg, tourne ton potentiomètre sur toute sa plage. avant d’en déduire qu’il ne fonctionne pas

Ça fonctionne, merci beaucoup!!!

Dernière petite question concernant le lcd. J'ai vérifié plusieurs fois, j'ai bien placé mes setcursor et j'ai bien défini les dimensions du lcd (4x20). Cependant, lorsque s'affiche mes textes, c'est une véritable anarchie. A chaque coup, ça change de côté. Un bout de phrase là un autre par là etc... Enfin, j'ai les informations mais ce n'est pas du tout rangé malgrè les setcursors. Avez-vous une idée pour réparer tout ça?

Exemple: http://www.heberger-image.fr/images/53405_Photo_le_26_12_2015_a_768_11.44.jpg.html

Merci!

reposte ton code ( pour être sur que nous sommes sur le meme)

Voilà mon code:

#include “LiquidCrystal.h”

const int numRows = 4;
const int numCols = 20;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int c = 300000000;

void setup() {
lcd.begin (20,4);
delay (10);
unsigned long u = 15000;
lcd.setCursor (0,0);
lcd.print (“VITESSE OBJET =”);
delay (2000);
lcd.setCursor (0,1);
lcd.print (u);
lcd.print(" m/s");
delay (2000);
unsigned long l = 100;
lcd.clear();
lcd.setCursor (0,0);
lcd.print (“LONGUEUR OBJET =”);
delay (2000);
lcd.setCursor (0,1);
lcd.print (l);
lcd.print (" m");
delay (2000);
if(u>=300000000){;
lcd.clear();
lcd.setCursor (0,0);
lcd.print (“VITESSE SUPERIEURE OU EGALE A C”);
delay (2000);
lcd.setCursor (0,1);
lcd.print (“INTERDIT!”);
delay (2000);
}
else {;
int n = l*sqrt(1-pow(u,2)/pow(c,2));
lcd.clear();
lcd.setCursor (0,0);
lcd.print (“NOUV. L. OBJET =”);
delay (2000);
lcd.setCursor (0,1);
lcd.print (n);
lcd.print (" m");
};
}

void loop () {}

il faut que tu ailles voir là pour savoir poster tes codes entre balises car la patrouille va passer et tu vas te faire houspiller voir là

chez moi ce code fonctionne correctement avec un afficheur 16x20

certaines de tes lignes étaient trop longues et "s'affichaient hors écran" et lorsque tu fais un clear ecran, cela remets automatiquement le curseur en 0,0

remets la lignes pour tes pinoches.

#include "LiquidCrystal.h"

const int numRows = 4;
const int numCols = 20;
LiquidCrystal lcd(8,9,4,5,6,7); // pin de l'écran lcd
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int c = 300000000;            //pour int -32,768 à 32,767

void setup() 
{
lcd.begin (20,4);
delay (10);
unsigned long u = 15000;      
lcd.setCursor (0,0);          //colonne 0, ligne 0
lcd.print ("VITESSE OBJET =");
delay (2000);
lcd.setCursor (0,1);          //colonne 0, ligne 1
lcd.print (u);
lcd.print(" m/s");
delay (2000);
unsigned long l = 100;
lcd.clear();                 //efface l'ecran et place le curseur en 0,0
lcd.setCursor (0,0);         //colonne 0, ligne 0
lcd.print ("LONGUEUR OBJET..... =");
delay (2000);
lcd.setCursor (0,1);         //colonne 0, ligne 1
lcd.print (l);
lcd.print (" m");
delay (2000);
if(u>=300000000)             //pour int -32,768 à 32,767
{
lcd.clear();                 //efface l'ecran et place le curseur en 0,0
lcd.setCursor (0,0);         //colonne 0, ligne 0
lcd.print ("VIT >= C");      //cette était trop longue ( 28 caracteres )
delay (2000);
lcd.setCursor (0,1);        //colonne 0, ligne 1
lcd.print ("INTERDIT!");
delay (2000);
}
else 
{
int n = l*sqrt(1-pow(u,2)/pow(c,2));
lcd.clear();
lcd.setCursor (0,0);           //colonne 0, ligne 0
lcd.print  ("NOUV. L. OBJET =");
delay (2000);
lcd.setCursor (0,1);          //colonne 0, ligne 1
lcd.print (n);
lcd.print (" m");
}
}

void loop () {}

Oh, je n'avais pas vu qu'il y avait tant de règles... Je ferais attention à l'avenir.

Que veux-tu dire par là:

int c = 300000000;            //pour int -32,768 à 32,767

Même après modification, j'ai l'impression que les setcursors ne s’affichent pas et que le texte se place aléatoirement à chaque fois!

Je viens de changer un peu mon programme en me rendant compte que l'intervalle de mes variables étaient insuffisantes:

#include "LiquidCrystal.h"

const int numRows = 4;
const int numCols = 20;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned long c = 300 000 000;
unsigned long u = 0;
unsigned long l = 0;
unsigned long n = 0;

void setup() {
lcd.begin (20,4);
delay (10);
unsigned long u = 3 000 000;
lcd.setCursor (0,0);
lcd.print ("VITESSE OBJET =");
delay (2000);
lcd.setCursor (0,1);
lcd.print (u);
lcd.print(" m/s");
delay (2000);
unsigned long l = 100;
lcd.clear();
lcd.setCursor (0,0);
lcd.print ("LONGUEUR OBJET =");
delay (2000);
lcd.setCursor (0,1);
lcd.print (l);
lcd.print (" m");
delay (2000);
if(u>=300 000 000){;
lcd.clear();
lcd.setCursor (0,0);
lcd.print ("VIT >= C");
delay (2000);
lcd.setCursor (0,1);
lcd.print ("INTERDIT!");
delay (2000);
}
else {;
unsigned long n = l*sqrt(1-pow(u,2)/pow(c,2));
lcd.clear();
lcd.setCursor (0,0);
lcd.print  ("NOUV. L. OBJET =");
delay (2000);
lcd.setCursor (0,1);
lcd.print (n);
lcd.print (" m");
};
}

void loop () {}

Cependant, on m'indique des erreurs:

Complet:8: error: expected ',' or ';' before numeric constant Complet.ino: In function 'void setup()': Complet:16: error: expected primary-expression before 'unsigned' Complet:16: error: expected ';' before 'unsigned' Complet:33: error: expected ')' before numeric constant expected ',' or ';' before numeric constant

J'ai pourtant bien intégré mes ; ???? Je ne vois vraiment pas mon problème, cela doit être encore bête comme tout!

Salut,

un point virgule de trop ici:

else {;
unsigned long n = l*sqrt(1-pow(u,2)/pow(c,2));
lcd.clear();

et aussi après ton accolaade fermante

Salut weetoz.

Si je ne me trompe pas, tu as réécris la même ligne. Où est donc les pint virgule en trop?

Bonjour,

Le problème est que tu as mis 300 000 000 au lieu de 300000000

Le remarque de weetoz est juste il y a des ; en trop, mais ça ne génère pas d’erreur car en C tu as le droit de mettre des instructions vides (tout au plus ça pourrait générer un warning)

le begin lcd mets le cursor à 0,0 le clear lcd mets le cursor à 0,0

#include "LiquidCrystal.h"
const int numRows = 4;
const int numCols = 20;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // pin de l'écran lcd
unsigned long c = 300000000;
unsigned long u = 0;
unsigned long l = 0;
unsigned long n = 0;
void setup() {
  lcd.begin (20, 4);
  delay (10);
  unsigned long u = 3000000;
  //lcd.setCursor (0,0);               //ligne inutile, a virer
  lcd.print ("VITESSE OBJET =");
  delay (2000);
  lcd.setCursor (0, 1);
  lcd.print (u);
  lcd.print(" m/s");
  delay (2000);
  unsigned long l = 100;
  lcd.clear();
  //lcd.setCursor (0,0);                //ligne inutile, a virer
  lcd.print ("LONGUEUR OBJET =");
  delay (2000);
  lcd.setCursor (0, 1);
  lcd.print (l);
  lcd.print (" m");
  delay (2000);
  if (u >= 300000000) {
    ;
    lcd.clear();
    //lcd.setCursor (0,0);                //ligne inutile, a virer
    lcd.print ("VIT >= C");
    delay (2000);
    lcd.setCursor (0, 1);
    lcd.print ("INTERDIT!");
    delay (2000);
  }
  else {
    unsigned long n = l * sqrt(1 - pow(u, 2) / pow(c, 2));
    lcd.clear();
    //lcd.setCursor (0,0);                //ligne inutile, a virer
    lcd.print  ("NOUV. L. OBJET =");
    delay (2000);
    lcd.setCursor (0, 1);
    lcd.print (n);
    lcd.print (" m");
  }
}

void loop () {}

Merci kamill et dfgh.

Concernant la disposition du texte, c'est toujours du n'importe quoi. Est-il possible que sur ce lcd (0,0) correspond à un autre point que celui du haut à gauche?

fais un test avec le prg d’exemple “hello world” dans “LiquidCrystal”

oui “0,0” est le coin haut gauche et c’est “colonne ,ligne”

sinon avec le prg juste au dessus

edit: 2 photos ne sont pas passées pour un pb de poids
mais elles n’auraient rien montré de plus