Programme avec algorithme et afficheur lcd

Bonjour à tous!
Je suis tout nouveau ici, et j'ai un petit problème sur mon programme.
Notamment avec la programmation de mon afficheur lcd.
Lorsque je vérifie celui-ci, on m'indique le set n'est pas déclaré ou:

"Complet.ino: In function 'void setup()':
Complet:17: error: 'set' was not declared in this scope
'set' was not declared in this scope"

Voici mon programme:

#include "LiquidCrystal.h"

const int numRows = 2;
const int numCols = 16;

LiquidCrystal lcd(4, 6, 7, 8, 9, 10, 11, 12, 13, 14);

int l = 0;
int u = 0;
int c = 300000000;
int n = 0;

void setup() {;
lcd.begin (16,2);
delay (10);
unsigned long u = random (0, 4294967296);
set.cursor (0.0);
lcd.print ("VITESSE OBJET =");
delay (2000);
set.cursor (0.1);
lcd.print (u);
lcd.print(" m/s");
delay (2000);
unsigned long l = random (0, 4294967296);
lcd.clear();
set.cursor (0.0);
lcd.print ("LONGUEUR OBJET =");
delay (2000);
set.cursor (0.1);
lcd.print (l);
lcd.print (" m");
delay (2000);
if(u>=c){;
lcd.clear();
set.cursor (0.0);
lcd.print ("c > v");
delay (2000);
set.cursor (0.1);
lcd.print ("INTERDIT!");
delay (2000);
}
else {;
int n = l*sqrt(1-pow(u,2)/pow(c,2));
lcd.clear();
set.cursor (0.0);
lcd.print ("NOUV. L. OBJET =");
delay (2000);
set.cursor (0.1);
}
}

En passant, pouvez-vus m'indiquer ce que vous pensez de mon programme et ses éventuelles erreurs car il doit y en avoir.
C'est mon tout premier programme sur arduino et j'ai très peu d'aide à part ici, enfin je l'espère! :wink:

Merci beaucoup!

Bonsoir,

lcd.setcursor(0.0);

Première remarque, mets des commentaires et un peu de mise en forme ( indentation ).

weetoz:
Bonsoir,

lcd.setcursor(0.0);

Première remarque, mets des commentaires et un peu de mise en forme ( indentation ).

bonsoir
il y a 2 erreurs par ligne "setcursor" c'est lcd.setCursor(col, lig) (arguments séparés par une virgule et pas par un point)

Merci de vos réponses très rapides!

Je vais essayer ces petits tuyaux.

Concernant les commentaires, je comprends mais j'ai l'impression que ça surcharge, je me trompe? J'ai l'habitude de programmer sans commentaires sous d'autres "langages".
Pour la mise en forme, je ne vois à quoi cela correspond? Peut-on faire de la mise en forme?

AntoineEiffel:
Merci de vos réponses très rapides!

Je vais essayer ces petits tuyaux.

Concernant les commentaires, je comprends mais j'ai l'impression que ça surcharge, je me trompe? J'ai l'habitude de programmer sans commentaires sous d'autres "langages".
Pour la mise en forme, je ne vois à quoi cela correspond? Peut-on faire de la mise en forme?

Les commentaires ne surchargent jamais , leur nombre n'influe pas sur la taille du code "injecté" dans l'arduino

pour la mise en forme, pas de souci, voici un extrait de code sur lequel je suis en train de travailler:

	ISR(TIMER2_OVF_vect) {
			// TIMER 2 pour lecture des entrées
		/*
			Création d'un compteur pour créer une interruption qui lance une fonction de la lecture
			 des broches de l' encodeur
		*/
			/*----------------------------------------
			// Routine executee tous les 2ms
			// par overflow sur le compteur du timer 2
			//----------------------------------------*/
		int MSB;
		int LSB;
		int encoded;
		int sum;
		byte i;
		TCNT2 = tcnt2;      // Reload du timer
		// Lecture des 4 encodeurs
		for (i=0;i<1;i++) {
			MSB = digitalRead(pinA[i]); // MSB = most significant bit
			LSB = digitalRead(pinB[i]); // LSB = least significant bit
			encoded = (MSB << 1) |LSB; // conversion
			sum  = (lastEncoded[i] << 2) | encoded; // Ajout a la valeur precedent
			// Test si on avance
			if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
				counter[i]++;
			// Test si on recule
			if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
				counter[i]--;
				lastEncoded[i] = encoded;   // On memorise la valeur pour la prochaine fois
				bcounter[i]=counter[i]>>1;  // Compteur utilisateur divise par 4
		}

	}
		byte readEncodeurs   (void){
			/*--------------------------------------------
			// Routine principale de lecture des encodeurs
			//--------------------------------------------*/
		byte i,val;
		val=0;
			// Lire les 4 encodeurs
			for (i=0;i<2;i++) {
			// si la valeur a variee pour un des encodeurs
				if (lcounter[i]!=bcounter[i]) {
				// Si UP valeur de 11 a 14
					if (bcounter[i]>lcounter[i])
					val=i+111;
					// Si down valeur de 1 a 4
					else
					val=i+21;
					lcounter[i]=bcounter[i];
					Serial.println("on est dans l' ISR");
					Serial.println(val,DEC);
					Serial.println(lcounter[i],DEC);
				       Serial.println("Fin de l' ISR");	
				       return val;				
				}
			}
			//Serial.println("Fin de l' ISR");
		return 0;	
		}

Dans cette partie les commentaires sont peu nombreux, mais avec l' indentation on voit vite où on en est.
Les commentaires, c' est aussi pour les autres, lorsque tu post ton code, il est ainsi plus facile de le comprendre.

pour t'aider à mettre le pied à l'étrier
:slight_smile:
voici ton code avec la compilation possible.
fait il ce que tu veux, je ne le sais pas...

attention au paramettrage de l'ecran LCD, j'ai testé avec le mien

#include "LiquidCrystal.h"

const int numRows = 2;
const int numCols = 16;

//LiquidCrystal lcd(4, 6, 7, 8, 9, 10, 11, 12, 13, 14);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int l = 0;
int u = 0;
int c = 300000000;
int n = 0;

void setup()
{
  lcd.begin (16, 2);
}


void loop()
{
  lcd.setCursor(0,0);
  unsigned long u = random (0, 4294967296);
  lcd.print ("VITESSE OBJET = ");
  delay (2000);
  lcd.setCursor(0,1);
  lcd.print (u);
  lcd.print(" m/s");
  delay (2000);

  lcd.clear();
  unsigned long l = random (0, 4294967296);
  lcd.print ("LONGUEUR OBJET = ");
  delay (2000);
  lcd.setCursor(0,1);
  lcd.print (l);
  lcd.print (" m");
  delay (2000);
  if (u >= c)
  {
    lcd.clear();
    lcd.print ("c > v");
    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.print  ("NOUV. L. OBJET = ");
    delay (2000);
    lcd.setCursor(0,1);
    lcd.print (n);
    delay (2000);
  }
}

mais le void loop répète sans cesse les commandes alors que moi je souhaite l’exécuter qu'une seule fois. non?

merci pour les exemples de mise en forme, j'y ferais plus attention à l'avenir!

après avoir fait les modifications nécessaires, la vérification me sort:
core.a(main.cpp.o): In function main': /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/main.cpp:43: undefined reference to loop'
collect2: error: ld returned 1 exit status
Erreur lors de la compilation.

kesako????

J' imagine que tu as enlevé:

void loop(){}

après ton setup.

Ah, quel bêta!
Merci beaucoup.
Ça m'a l'air bon maintenant.

Je reviendrais peut-être ici pour des questions, car le prgm n'est pas fini.
Je dois maintenant remplacer les valeurs random par des valeurs entrée via un clavier connecté sur la carte.
Le plus dur quoi.

Pour ceux qui sont intéressés, ce programme réalise l'algorithme permettant de calculer la longueur contractée d'un objet qui va à une certaine vitesse, grâce à la relativité d'einstein et les équations de lorentz!

A+

Salut, voici venue le grand moment où l'on téléverse le programme, mais on m'affiche un problème de téléversement:

Le croquis utilise 3 404 octets (10%) de l'espace de stockage de programmes. Le maximum est de 32 256 octets.
Les variables globales utilisent 121 octets (5%) de mémoire dynamique, ce qui laisse 1 927 octets pour les variables locales. Le maximum est de 2 048 octets.
avrdude: ser_open(): can't open device "COM1": No such file or directory
ioctl("TIOCMGET"): Inappropriate ioctl for device
Problème de téléversement vers la carte. Voir http://www.arduino.cc/en/Guide/Troubleshooting#upload pour suggestions.

QUE FAIRE?

Bon j'ai réglé le problème.
Mais je suis face à un nouveau problème.

Je téléverse mon programme sans problème citer dans mon premier message avec les modifications que vous m'aviez indiquées, mais là problème! Une fois téléverser, rien ne se passe sur l'écran lcd notamment.
La seule chose: une led orange clignote sur le pin 13 (je travaille sur arduino mega).
Je suis un peu perdu.
Est-ce un problème de connexion, de programmation ou autre???

Je suis ouvert à toutes vos aides, même les plus minimes!

Pour les connexions, j'ai suivi ceci: http://unicarlos.com/pezverde/articulos/imagenes/lcd_paralelo_1.png

Voilà, j'attends, car je suis complètement bloqué, je ne sais que faire!

PS: Voici mon programme corrigé.

#include "LiquidCrystal.h"

const int numRows = 4;
const int numCols = 16;

LiquidCrystal lcd(4, 6, 7, 8, 9, 10, 11, 12, 13, 14);

int l = 0;
int u = 0;
int c = 300000000;
int n = 0;

void setup() {
lcd.begin (16,2);
delay (10);
unsigned long u = random (0, 4294967296);
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 = random (0, 4294967296);
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>=c){;
lcd.clear();
lcd.setCursor (0,0);
lcd.print ("c > v");
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);
};
}

void loop () {}

j'ai téléversé ton nouveau prg sur Nano
l'écran LCD affiche tes textes et tes variables (égales à 0)
j'ai donc vitesse objet = 0m/s
longueur objet = 0m
nouv. l. objet =
j'ai seulement changé les affectations des pinoches du LCD
je suis d'ailleurs surpris de voir que tu déclares autant de pinoches pour un LCD 16x2
voici nos lignes pour comparaison

//LiquidCrystal lcd(4, 6, 7, 8, 9, 10, 11, 12, 13, 14);

LiquidCrystal lcd(8,9,4,5,6,7);

Salut dfgh.

Ceci est donc rassurant.

Mais mon lcd est particulier car c'est un 16x4 et si je déclares autant de pinoches, c'est dû au fait que je code en 8 bits.

Pourrais tu m'envoyer une photo du montage soit par message ou par mail, que je peux te transmettre via la messagerie du forum.
Où alors donne moi le lien d'un site au montage similaire au tien.

Salut, aurais-tu une photo de ton montage, s' il te plais.

Je viens de réessayer avec ces branchements:


Je n'ai toujours rien sur le LCD après téléchargement.
Mais la LED orange ne clignote plus, elle reste allumé.
Pensez-vous que mon écran LCD a rendu l'âme??

Tu as modifié cette ligne en conséquence?

LiquidCrystal lcd(4, 6, 7, 8, 9, 10, 11, 12, 13, 14);

de plus, je ne vois pas comment le contraste est géré. ( potars ).

J'ai trouvé, je l'avais sur 3.3V alors qu'il fallait du 5V.

Mais je n'obtiens pas ce que je voulais, que des caractères inconnus! Voyez par vous même.

http://www.heberger-image.fr/images/96411_IMGP1413.jpg.html

voici mon écran avec les caractères inconnus.

Ok, vérifie ton câblage à nouveau.