Go Down

Topic: Faire un menu contextuel !!??[debutant] (Read 2479 times) previous topic - next topic

toufous35

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

toufous35

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 :

- une carte Arduino Duemilanove 328;
- une carte "LCD 2x16 + 5 boutons" de chez dfrobot, lien : http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD%26KeyPad_Shield_%28SKU:_DFR0009%29

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!!!

toufous35

Ah!

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

Merci!

toufous35

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!

B@tto

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.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

toufous35

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!

Teiva

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)
Code: [Select]
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


www.Zartronic.fr : Arduino & Robotique


toufous35

Bon alors, j'ai repris mon programme !

J'ai écris celui-ci :
Code: [Select]
#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!

toufous35

Alors, j'ai aussi essayer ce code :

Code: [Select]
#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

toufous35

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

toufous35

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!

Teiva

Super ça progresse ...  :)
Met le dernier code que tu utilises on c'est plus lequel regarder  ;)

A+ Teiva


www.Zartronic.fr : Votre source Arduino en France


www.Zartronic.fr : Arduino & Robotique

toufous35

Oui oups!!

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

Donc, le voici :
Code: [Select]
#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

NotBad

#14
Nov 13, 2010, 05:40 pm Last Edit: Nov 13, 2010, 05:40 pm by NotBad Reason: 1
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

Go Up