Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: [1] 2   Go Down
Author Topic: Faire un menu contextuel !!??[debutant]  (Read 2387 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;
             }
  }
    }
    }
}

[/list]

mais ça marche pas vraiment!!!

Au secour!!!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah!

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

Merci!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ales
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3917
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
Logged


www.Zartronic.fr : Arduino & Robotique

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok je vais essayer!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon alors, j'ai repris mon programme !

J'ai écris celui-ci :
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 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!
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alors, j'ai aussi essayer ce code :

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France, Nice
Offline Offline
Full Member
***
Karma: 3
Posts: 194
www.Zartronic.fr
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Super ça progresse ...  smiley
Met le dernier code que tu utilises on c'est plus lequel regarder  smiley-wink

A+ Teiva

www.Zartronic.fr : Votre source Arduino en France
Logged


www.Zartronic.fr : Arduino & Robotique

0
Offline Offline
Newbie
*
Karma: 0
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui oups!!

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

Donc, le voici :
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     = 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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: November 13, 2010, 11:40:53 am by NotBad » Logged

Pages: [1] 2   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: