Bonjour, j'ai un "bug",je sais pas si on peut appeler ça comme ça, dans mon programme. Quand je veux afficher des chiffres via une télécommande et un capteur IR sur mon LCD ça marche pas toujours. Le capteur IR montre qu'il a bien reçu le message avec un petit clignotement mais l'afficheur n'affiche pas le chiffre qui correspond à mon signal envoyé. Je dois appuyer plusieurs fois pour que ça fonctionne. J'ai un code qui fait que si il ne capte pas de "chiffre",l'afficheur affiche un message en continu mais s'il capte un chiffre alors il affiche ce chiffre.
C'est peut-être une mauvaise disposition dans mon code au niveau des if. Je devrais mettre le "si il ne capte rien" avant le "si il capte"? Je précise que ma boucle a pour délais 1ms.
Merci d'avance
#include <IRremote.h>
#include <LiquidCrystal.h>
int pinIR = 9;
int index =0;
int nombre;
int nombrealeatoire;
char str1[5]={'.','.','.','.'};// On met des points parce que si on met des zéros ça pose problèm, ça crée beaucoup plus de ligne de code.
LiquidCrystal lcd(12,11,5,4,3,2);
IRrecv irrecv(pinIR);
decode_results results;
void setup() {
lcd.begin(16,2);
lcd.clear();
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)){
if(index !=4) {// Si index est différent de 4 ( c'est à dire qu'on est pas encore au dernier des 4 chiffres ) alors on peut rajouter les prochains chiffres. Si il est égal à 4 on ne rajoute pas de chiffre (ça fait bugger). Et on n'intègre pas la fonction effacer dans ce if.
if (results.value == 0xff6897){
str1[index]='0';
str1[++index];
}
if (results.value == 0xff30cf){
str1[index]='1';
str1[++index];
}
if (results.value == 0xff18e7){
str1[index]='2';
str1[++index];
}
if (results.value == 0xff7a85){
str1[index]='3';
str1[++index];
}
if (results.value == 0xff10ef){
str1[index]='4';
str1[++index];
}
if (results.value == 0xff38c7){
str1[index]='5';
str1[++index];
}
if (results.value == 0xff5aa5){
str1[index]='6';
str1[++index];
}
if (results.value == 0xff42bd){
str1[index]='7';
str1[++index];
}
if (results.value == 0xff4ab5){
str1[index]='8';
str1[++index];
}
if (results.value == 0xff52ad){
str1[index]='9';
str1[++index];
}
if(results.value == 0xff9867){
nombrealeatoire = random(0,10000);// La variable nombre aléatoire devient une valeur entre 0 et 10000 =.(10000 non inclu car c'est un nombre à 5 chiffres)
lcd.clear();
lcd.setCursor(5,0);
lcd.print(nombrealeatoire);
delay(5000);
}
}
if (index != 0){
if (results.value == 0xff22dd) {// Si on capte le signal correspond à la touche effacer alors on efface le chiffre et on revient au précédent. ( Pour pas effacer le premier chiffre et que ça fasse bugger on met if( index!=0)
str1[--index]='.';
}
}
if( index ==4 ){//si l'utilisateur appuie sur entrer alors qu'il a entré 4 chiffres alors on remet à 0 le tableau de valeur et on transforme son "nombre" en un nombre.
if (results.value == 0xff02fd){// valeur correspond à entrer
nombre = atoi(str1);// on transforme le tableau str1 en un nombre
str1[--index]='.';
str1[--index]='.';
str1[--index]='.';
str1[--index]='.';
if( nombre == nombrealeatoire){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Votre voiture");
lcd.setCursor(0,1);
lcd.print("arrive");
delay(6000);
}
}
}
if (index ==0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bienvenue au");
lcd.setCursor(0,1);
lcd.print("parking automat");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ique");
}
if(index!=0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Entrez votre");
lcd.setCursor(0,1);
lcd.print("code :");
lcd.setCursor(7,1);
lcd.print(str1);
}
irrecv.resume();
}
if (index == 0){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bienvenue au");
lcd.setCursor(0,1);
lcd.print("parking automat");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ique");
}
delay(1);
}
Oui oui ça compilait aussi , avec vôtre technique ça semble marcher mieux mais ça clignote énormément pour l'affichage des nombres, y'aurait pas moyen d'éviter ça ?
Regardez si votre nombre à afficher diffère du nombre précédent;
si c'est le cas, affichez; mettez à jour nombre précédent
sinon, passez votre tour...
Cela implique de stocker le nombreprecedent... et evitera les clignotements...
Ce qui fait clignoter l'afficheur c'est le fait de l'effacer constamment pour ré écrire ensuite. Pour éviter ça, tu peux afficher uniquement ce qui change. Si tu dois effacer un caractère, tu peux afficher un espace à sa place puis ré écrire le nouveau caractère au même endroit
Ouai ça marche beaucoup mieux avec vôtre technique je viens de le mettre dans mon code, je l'avais mis dans un code plus court avant pour essayer. Merci
Euh, aussi j'aimerais afficher "Bienvenue dans nôtre parking automatique" quand index==0 ducoup. Sauf que ça tiens pas dans les 2*16 cases. Ducoup je me suis dit que j'allais faire une fonction scroll displayleft...etc mais ducoup ça va bloquer la réception du signal car le délais de la boucle et de 1 ms seconde et que la fonction for associer à la fonction scroll display mettre 4 secondes( je sais pas vraiment). Ducoup ce sera très compliqué de capter le signal en 1ms toutes les 4s. Ce serait possible de faire des boucles de 1ms pour capter les signaux tout en si index == 0 faire la boucle for et afficher "bienvenue dans nôtre parking" avec la fonction scrolldisplay left et dés que le capteur capte un chiffre ça remplace le "bienvenue dans nôtre parking" sans attendre la fin de la boucle for ? C'est juste un truc décoratif mais voila :)...
J'ai une autre question aussi
Je voudrais afficher un nombre aléatoire quand quelqu'un envoie un signal correspondant à une touche de ma télécommande(touche vol+). Sauf que j'aimerais que le nombre aléatoire soit gardé en mémoire, car c'est un moyen de vérification,un code secret dans mon projet. Le but de mon projet en général est que dés qu'une voiture arrive ( C'est un garage automatique ), la personne appuie sur le bouton (vol+). L'afficheur lui affiche un code aléatoire entre 0 et 9999 inclue. La personne retiens son code et dés qu'elle veut récupérer ça voiture elle tape son code avec la télécommande puis appuie sur entrer et ça lui valide ou non le numéro ( Si c'est un numéro qui est parmi les 15 codes maximum) et ensuite ça lui rend ça voiture ( On s'en fout mais c'est juste pour mieux comprendre...)et bien sûr si le numéro est bon on enlève de la mémoire le nombre aléatoire validé.
Ducoup je sais pas comment faire pour qu'il n'y ait pas plus de 15 nombres aléatoires en mémoire à tout moment, que ces nombres aléatoires soit donné "à la suite", enfin logiquement quoi.
Il faut repenser l'architecture du code en profondeur
Ah bon bah je vais juste raccourcir ma phrase alors
Vous voulez dire qu'il faudrait remplacer le principe du code,c'est à dire ne plus faire "si le capteur ir capte un signal toute les 1ms" (qui est chiant à manier) mais quelque chose comme dés que le capteur capte un signal ?
Non il faut tout organiser l'ensemble du code selon ton timing
Si tu veux une lecture toutes les millisecondes, tu mesures le temps qu'il passe et à chaque milliseconde tu fais cette lecture.
lesept:
Non il faut tout organiser l'ensemble du code selon ton timing
Si tu veux une lecture toutes les millisecondes, tu mesures le temps qu'il passe et à chaque milliseconde tu fais cette lecture.
D'accord et pour mon poste sur les nombres aléatoires tu aurais une idée ?
Je ne suis pas sûr d'avoir bien compris. Je pense que tu dois générer un tableau de quinze nombres aléatoires et les donner au fur et à mesure des arrivées de clients. Tu assignes un nombre à chaque client, et tu en génères un autre pour le remplacer.
Ceci dit, je pense que tu n'as pas besoin de générer tes nombres à l'avance. Il te suffit de générer un nombre au moment où tu en as besoin et le conserver en mémoire pour vérifier que c'est bien celui qu'on te donne à la sortie.
Tu devrais t'intéresser aux struct. Tu mets dans une structure toutes les informations liées à chaque client, le nombre aléatoire y compris. Et tu crées un tableau de ces struct, avec un élément pour chaque client.
Il te faut définir l'ensemble des paramètres de chaque client. Supposons que la structure s'appelle Client, et ton tableau de structures s'appelle client. Chaque élément sera un client [i ]. Si tu as comme paramètres l'heure d'arrivée, les minutes d'arrivée, le numéro de place de parking, le nombre aléatoire, etc, tu pourras les définir dans ta struct et les consulter comme ceci
client[ i].heure_arrivee
client[ i].minute_arrivee
client[I ].place_parking
client[I ].nombre_aleatoire
Etc.