Faire un menu contextuel !!??[debutant]

Salut à tous!

Bon alors, je suis aquariophile, et je veux réaliser une "horloge programmable".

J'ai en ma possession :

  • une carte Arduino Duemilanove 328;
  • une carte "LCD 2x16 + 5 boutons" de chez dfrobot

Salut à tous!

je reprend mon message car j’ai cliqué trop vite!!!

Bon alors, je suis aquariophile, et je veux réaliser une “horloge programmable”.

J’ai en ma possession :

Alors, dans un premier temps, pour me faire “la main!” et aussi en attendant la livraison de mon DS1307, j’utilise la librairie “time.h” pour gérer mon heure. J’ai préféré utilisé aussi la librairie “LiquidCrystal.h” car celle-ci est traduite et détaillé en français!

Donc, jusque là, ça va!!!

Je viens de lire les 54 page du forum français pour voir si je trouvais une réponse à mon soucis mais rien de bien concluant!

En effet, je cherche a créer un mode “réglage” pour l’heure (peut-être un jour, aussi les plages horaires de mes sorties pour le moment écrites “en dur” dans des int ).

Donc, voila les différentes étapes de programmation que j’ai effectué:

  • #include <LiquidCrystal.h>
    #include <Time.h>
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int adc_key_val[5] ={50, 195, 380, 555, 790 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
int compteurH = 0;
int compteurM = 0;
int compteurS = 0;
int compteurK = 0;

// Convert ADC value to key number
int get_key(unsigned int input)
{ int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{ return k; }
}
if (k >= NUM_KEYS)
k = -1; // No valid key pressed
return k;
}

void setup() {
lcd.begin(16,2);
lcd.clear();
lcd.print(“HORLOGE “);
delay(1000);
}
void loop()
{
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey) // if keypress is detected
{
delay(50); // wait for debounce time
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey)
{
oldkey = key;
if (key == 4 ){
compteurK = compteurK + 1;
if (compteurK >= 2 ){compteurK =0;}
lcd.setCursor (15,1);
lcd.print(compteurK);
}
switch (compteurK){
case 1:{
lcd.clear();
lcd.print(“REGLAGE”);
lcd.setCursor(0, 1);
//lcd.print(“00:00:00”);
switch (key){
case 1:{ // reglage HEURE
lcd.setCursor(0,1);
compteurH = compteurH + 1;
if (compteurH > 23) { compteurH = 0; }
if (compteurH < 10){lcd.print(“0”); }
lcd.print(compteurH);
break;
}
case 2:{ // reglage MINUTE
lcd.setCursor(3,1);
compteurM = compteurM + 1;
if (compteurM > 59) { compteurM = 0; }
if (compteurM < 10){lcd.print(“0”); }
lcd.print(compteurM);
break;
}
case 0:{ // reglage SECONDE
lcd.setCursor(6,1);
compteurS = compteurS + 1;
if (compteurS > 59) { compteurS = 0; }
if (compteurS < 10){lcd.print(“0”); }
lcd.print(compteurS);
break;
}
case 3:{ // validation et mise a jour de l’heure
lcd.clear();
if (compteurH < 10){lcd.print(“0”); }
lcd.print(compteurH);
lcd.print(”:”);
if (compteurM < 10){lcd.print(“0”); }
lcd.print(compteurM);
lcd.print(":");
if (compteurS < 10){lcd.print(“0”); }
lcd.print(compteurS);
setTime(compteurM,compteurM,compteurS,01,01,2010);
delay(1500);
break;
}
}
break;
}
case 0:{
lcd.clear();
lcd.setCursor(8,0);
if (hour() < 10){lcd.print(“0”);}
lcd.print(hour());
lcd.print(":");
if (minute() < 10){lcd.print(“0”);}
lcd.print(minute());
lcd.print(":");
if (second() < 10){lcd.print(“0”);}
lcd.print(second());
delay(1000);
break;
}
}
}
}
}

mais ça marche pas vraiment!!!

Au secour!!!

Ah!

Au passage, comment faire pour que les ligne de mon code soit numérotées?

Merci!

Ah je tiens à dire que mon projet s'inspire de celui-ci :

http://reefprojects.com/wiki/Main_Page

Mais la grosse différence, c'est le clavier! et c'est là que je coince!!!

Qui pourrait m'aider?

Merci!

Bonjour,

Deux points : d’une part il faut détailler un peu plus le “ça marche pas” sinon personne ne pourra te venir en aide … d’autre part ce projet à une limite (sauf erreur de ma part) : je ne connais pas la librairie Time.h mais elle doit se servir de fonctions type Millis() qui vont se remettre à zero après un certain temps. Donc après genre 55 jours ton heure va surement planté. Un petit timer pour accompagner ton arduino serait la solution.

Alors, pour les 2 points! Je dois recevoir un DS1307 qui est une RTC mais en attendant, j'utilise Time.h qui donne une horloge.

Pour le "ça marche pas", en fait, dans des essais plus simple, le réglage des compteur H,M,S ce fait bien lors d'appui sur les bouton! le reprise de ces valeurs pour régler l'horloge ce fait bien!

Le soucis que je rencontre est plutôt quand je veux passer de l'affichage courant, au mode "réglage" faire le réglage et sortir de ce mode pour retourner à l'affichage classique!

Là, je n'y arrive pas! Selon mes tentatives, soit je reste bloqué dans le mode réglage, soit je passe en mode réglage mais je n'arrive plus à régler, soit rien ne se passe!

J'ai "l'impression" qu'en fait, je doit mal codé mon menu par rapport aux action sur les touches!

Une fois que tu es rentré dans "REGLAGE" il faut que tu relises le clavier, sinon c'est toujours la key 4 qui est en cour ...

il faut que tu remettes ce code (ou faire une fonction)

adc_key_in = analogRead(0);    // read the value from the sensor
key = get_key(adc_key_in);    // convert into key press
   if (key != oldkey) // if keypress is detected
   {
   delay(50);      // wait for debounce time
   adc_key_in = analogRead(0);    // read the value from the sensor
   key = get_key(adc_key_in);    // convert into key press
   if (key != oldkey)            
   {

A+ Teiva


www.Zartronic.fr : Votre source Arduino en France

Ok je vais essayer!

Bon alors, j’ai repris mon programme !

J’ai écris celui-ci :

#include <Time.h>
#include <LiquidCrystal.h>
 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// define some values used by the panel and buttons
int key;
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

 // define compteur
int compteurH = 0;
int compteurM = 0;
 
// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return btnRIGHT; 
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;  
 return btnNONE;  // when all others fail, return this...
}
 
void setup()
{
 lcd.begin(16, 2);             
 lcd.setCursor(0,0);
 lcd.print("HORLOGE");
 delay(1500);
}
  
void loop(){
  lcd_key = read_LCD_buttons();  // read the buttons
  key = lcd_key;
   if(key == btnNONE){Normal();}
   if(key == btnSELECT){Reglage();}
}
void Reglage(){
 lcd_key = read_LCD_buttons();  // read the buttons
 key = lcd_key;
    lcd.setCursor(0,0);
    lcd.print("REGLAGE");
    if(key == btnUP)
    compteurH = compteurH + 1;
    if (compteurH > 23) { compteurH = 0;}
    delay(50);
    if(key == btnDOWN)
    compteurM = compteurM + 1;
    if (compteurH > 59) { compteurH = 0;}
    delay(50);
    lcd.setCursor(0,1); 
    if (compteurH < 10){lcd.print("0"); }
    lcd.print(compteurH);
    lcd.print(":");
    if (compteurM < 10){lcd.print("0");   }
    lcd.print(compteurM);
    lcd.print(":");
    lcd.print("00");
    setTime(compteurH,compteurM,00,01,01,2010);
}
void Normal(){
  lcd.clear();
  lcd.print("HORLOGE");
  lcd.setCursor(8,0);
  if (hour() < 10){lcd.print("0");}
  lcd.print(hour());
  lcd.print(":");
  if (minute() < 10){lcd.print("0");}
  lcd.print(minute());
  lcd.print(":");
  if (second() < 10){lcd.print("0");}
  lcd.print(second());
  delay(1000);
}

Alors, avec ce code, voila ce qui se passe:

Si je ne touche rien, j’ai bien l’affichage du mot HORLOGE et le défilement de l’heure sur la 1ère ligne.

Si j’appuie brièvement sur le bouton SELECT, rien ne se passe !

Si je maintient l’appui sur le bouton SELECT, le mot REGLAGE apparait, l’heure se fige, et sur la 2ème ligne, apparait “00:00:00”.
Mais rien ne se passe quand j’appuie sur les autre boutons.
Quand je relâche le bouton SELECT, le mot HORLOGE réapparait et l’heure redémarre à 00:00:00.
La 2ème ligne redevient vierge.

C’est mieux mais pas encore ce que je veux!!!
Un conseil est le bienvenu!

Alors, j’ai aussi essayer ce code :

#include <Time.h>
#include <LiquidCrystal.h>
 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// define some values used by the panel and buttons
int key;
int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

 // define compteur
int compteurK = 0; 
int compteurH = 0;
int compteurM = 0;
 
// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return btnRIGHT; 
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;  
 return btnNONE;  // when all others fail, return this...
}
 
void setup()
{
 lcd.begin(16, 2);             
 lcd.setCursor(0,0);
 lcd.print("HORLOGE");
 delay(1500);
}
  
void loop(){
  lcd_key = read_LCD_buttons();  // read the buttons
  key = lcd_key;
   if(key == btnNONE){Normal();}
   if(key == btnSELECT){
   compteurK = compteurK + 1;
   Reglage();}
}
void Reglage(){
  // do{
    lcd_key = read_LCD_buttons();  // read the buttons
    key = lcd_key;
    lcd.setCursor(0,0);
    lcd.print("REGLAGE");
    if(key == btnUP && compteurK == 1)
    compteurH = compteurH + 1;
    if (compteurH > 23) { compteurH = 0;}
    delay(50);
    if(key == btnDOWN && compteurK == 1)
    compteurM = compteurM + 1;
    if (compteurH > 59) { compteurH = 0;}
    delay(50);
    lcd.setCursor(0,1); 
    if (compteurH < 10){lcd.print("0"); }
    lcd.print(compteurH);
    lcd.print(":");
    if (compteurM < 10){lcd.print("0");   }
    lcd.print(compteurM);
    lcd.print(":");
    lcd.print("00");
    if (compteurK == 2){
    setTime(compteurH,compteurM,00,01,01,2010);
    compteurK = 0;
    delay(1000);
    }
//}while(key == btnLEFT);
}
    
void Normal(){
  lcd.clear();
  lcd.print("HORLOGE");
  lcd.setCursor(8,0);
  if (hour() < 10){lcd.print("0");}
  lcd.print(hour());
  lcd.print(":");
  if (minute() < 10){lcd.print("0");}
  lcd.print(minute());
  lcd.print(":");
  if (second() < 10){lcd.print("0");}
  lcd.print(second());
  delay(1000);
}

Mais j’obtiens le même résultat qu’avec celui d’avant!

Je veux bien un peu d’aide!

Merci à tous

Ah oui!
Comme on peut le voir, j’ai aussi essayer avec une boucle do / while, mais sans plus de réussite!

HOURRA!!!

Enfin presque!!!

j’ai utilise dans la fonction Reglage(), la procédure switch / case, afin de pouvoir incrémenter mes compteurs.

Ça marche!!!

Je m’explique:

  • un appui long (là je sais pas pourquoi faut appuyer longtemps!!!???) sur la touche SELECT, je passe en mode REGLAGE!

  • L’appui sur la touche LEFT me renvoie bien en affichage normal avec la mise à jour de l’heure.

  • Le soucis qu’il me reste, c’est que les compteurs s’incrémentent de manière aléatoire!
    Un coup c’est de +1 en +1, ou en +2, +5,…
    Bref du “un peu n’importe quoi!!!”

Qui pourrait me dire là ou je coince?

Merci d’avance!

Super ça progresse … :slight_smile:
Met le dernier code que tu utilises on c’est plus lequel regarder :wink:

A+ Teiva


www.Zartronic.fr : Votre source Arduino en France

Oui oups!!

C’est sur pour m’aider vaut mieux avoir le code!!!

Donc, le voici :

#include <Time.h>
#include <LiquidCrystal.h>
 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// define some values used by the panel and buttons

int key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

 // define compteur
int compteurK = 0; 
int compteurH = 0;
int compteurM = 0;
 
// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return btnRIGHT; 
 if (adc_key_in < 195)  return btnUP;
 if (adc_key_in < 380)  return btnDOWN;
 if (adc_key_in < 555)  return btnLEFT;
 if (adc_key_in < 790)  return btnSELECT;  
 return btnNONE;  // when all others fail, return this...
}
 
void setup()
{
 lcd.begin(16, 2);             
 lcd.setCursor(0,0);
 lcd.print("HORLOGE");
 delay(1500);
}
  
void loop(){
  key = read_LCD_buttons();  // read the buttons
   if(key == btnNONE){Normal();}
   if(key == btnSELECT){Reglage();}
 }
 
void Reglage(){
    key = read_LCD_buttons();  // read the buttons
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("REGLAGE");
    lcd.setCursor(0,1);
    lcd.print("00:00:00");
    while(key != btnLEFT){
       key = read_LCD_buttons();  // read the buttons
       switch(key){
          case btnUP:{
            compteurH = compteurH + 1;
            if (compteurH > 23) { compteurH = 0;}
            lcd.setCursor(0,1); 
            delay(50);
            if (compteurH < 10){lcd.print("0"); }
            lcd.print(compteurH);
            break;
          }
          case btnDOWN:{
            compteurM = compteurM + 1;
            if (compteurM > 59) { compteurM = 0;}
            lcd.setCursor(3,1);
            delay(50);
            if (compteurM < 10){lcd.print("0");   }
            lcd.print(compteurM);
            break;
          }
       }
    }
    setTime(compteurH,compteurM,00,01,01,2010);
    lcd.clear();
    lcd.setCursor(8,0);
    if (hour() < 10){lcd.print("0");}
    lcd.print(hour());
    lcd.print(":");
    if (minute() < 10){lcd.print("0");}
    lcd.print(minute());
    lcd.print(":");
    if (second() < 10){lcd.print("0");}
    lcd.print(second());
    lcd.setCursor(6,1);
    if (day() < 10){lcd.print("0");}
    lcd.print(day());
    lcd.print("/");
    if (month() < 10){lcd.print("0");}
    lcd.print(month());
    lcd.print("/");
    lcd.print(year());
    delay(1000);
}

    
void Normal(){
  lcd.clear();
  lcd.print("HORLOGE");
  lcd.setCursor(8,0);
  if (hour() < 10){lcd.print("0");}
  lcd.print(hour());
  lcd.print(":");
  if (minute() < 10){lcd.print("0");}
  lcd.print(minute());
  lcd.print(":");
  if (second() < 10){lcd.print("0");}
  lcd.print(second());
  delay(1000);
}

Voila!

C’est mieux!

Donc, les 2 bizarreries que j’ai sont :

  • L’obligation d’un appui long sur le bouton SELECT pour aller dans le mode réglage;

  • Le second, plus génant, est que les compteurs s’incrémentent pas de 1 en 1, mais un peu comme il veulent (surtout en 3 par 3)!

Si vous avez une idée, je prends!

Merci d’avance

Je pense que l'incrémentation de 3 par 3 est du à un effet de rebond du signal...

Essayes de mettre un condensateur avec une résistance. http://www.casimages.com/img/070322105630409598.jpg

Salut NotBad!

Pour l'effet rebond, je l'ai pas dans d'autre programme!

De plus, impossible de modifier la carte des boutons car c'est un produit tout fait! voir la présentation en début de post!

Non je pense que c'est effet rebond doit plutôt provenir de ma programmation!

Seul soucis, c'est que je n'y connait rien en programmation si ce n'est qu'un peu de basic et de logo qui date d'il y a plus de 20 -25 ans!!!!!

C'est d'ailleurs pour ça que je suis passé sous Arduino, car j'ai tenté de me frotter aux PIC, mais là, en plus de la programmation, il me fallait apprendre l'électronique!!!!!!

Dans les exmples d’Arduino tu as Debounce :

Tu peux t’en inspirer pour améliorer ta routine read_LCD_buttons() car elle n’a pas d’anti repeat.

A+ Teiva


www.Zartronic.fr : Votre source Arduino en France

Merci Teiva!

Avec ton lien et un peu de réflexion, j'ai rajouté un delay(100) dans ma routine de lecture de bouton, et c'est bien mieux!!!!

Merci!

Bon j'ai reçu mes échantillons de chez Maxim: un DS1307 pour l'heure, et un DS18B20 pour la température!

Maintenant, je vais chercher si je trouve un PCB "vierge" avec juste les emplacements des brochages pour réaliser ma carte fille!

Au passage, si vous savez ou je peux trouver ça, je prend!!

Merci

Salut à tous!

Bon alors, j'avance un peu sur la partie électronique en ce moment!

Donc pour piloter mes relais, je doit utiliser une interface entre mes sortie arduino et les relais!

Pour ce faire, je pense prendre un ULN2803 avec des diodes de roue libre sur les bobines, mais pour des relais en 12V, je sait que c'est ok, mais pour des relais 24V (que j'ai en stock!) je ne sais pas!

Qui pourrait me conseiller?

Merci

Damien