Conversion ana-num

Bonjour,

J'ai trouvé sur le net un programme permettant de modifier la date/Heure DS1307.

Dans mon cas, j'ai 3 boutons connecté à l'état BAS sur les ports 23-24-25 que j'utilise pour d'autre fonction et aussi pour modifié la date/heure.
Le souci s'est que le reglage s'effectue avec des boutons sur une entrée analogique A0. J'ai pas beaucoups de connaissance et j'ai essayé d'associé une valeur lors de l'appui sur un bouton Essai non concluant.

[
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#include <Wire.h>      
#include <DS1307new.h>

uint16_t startAddr = 0x0000;       // Adresse de démarrage Start dans  NV-RAM
uint16_t lastAddr;                 // Nelle addresse des stockage NV-RAM
uint16_t TimeIsSet = 0xaa55;       // Prévient qu'il n'y a pas de remise à l'heure

#define DDS_LOAD  12  //FQ_UD
#define DDS_CLOCK 3
#define DDS_DATA  2
#define Touche_PIN  A0    // Entrée des infos boutons

int sensorPin = A0;
int sensorValue = 0; 
int val_key;
int Select;
int Heure;
int Minute;
int Seconde;
int Jour;
int Mois;
int Annee;
int Modif = 0;
char LeMois;

const int  btn_u = 23;    // the pin that the Up pushbutton is attached to
const int  btn_d = 24;
const int  btn_s = 25;   

int val_ana_btn_u = 300;
int val_ana_btn_d = 100;
int val_ana_btn_s = 700;

int  ibtn_u = 0;    
int  ibtn_d = 0;
int  ibtn_s = 0; 
////////////////////////

////// Sorties tensions alternées + avance rapide //////
int Altern1 = 11; // pin 11 tension alternée 
int Altern2 = 12; // pin 12 tension alternée inverse

void setup () {

  pinMode(2, INPUT);                    // Test  SQW pin, D2 = INPUT
  digitalWrite(2, HIGH);                // Test  SQW pin, D2 = Pullup on
  pinMode(btn_u, INPUT);
   pinMode(btn_d, INPUT);
   pinMode(btn_s, INPUT);
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Entree startAddr in NV-RAM address 0x08 
  TimeIsSet = 0xffff;
  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));  
  RTC.ctrl = 0x00;     // 0x00=disable SQW pin, 0x10=1Hz,
                       // 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
  RTC.setCTRL();

    pinMode( Touche_PIN, INPUT );         //ensure A0 is an input
    digitalWrite( Touche_PIN, LOW );      //ensure pullup is off on A0
  
    lcd.begin(16, 2); 
    lcd.setCursor(0, 0);
    
    pinMode(Altern1, OUTPUT);
    pinMode(Altern2, OUTPUT);
}
////////////////////////////
void Bouton ()
{
  
  delay(100);
 
  if ((Select > 0) and (Select < 4))
  {
  lcd.setCursor( 0, 0 );
  lcd.print("                ");
  lcd.setCursor( 4, 0 );
  if (Jour < 10) { lcd.print ("0");}
  lcd.print( Jour );
  lcd.print( ":");
  if (Mois < 10) { lcd.print ("0");}
  lcd.print( Mois );
  lcd.print( ":" );
  lcd.print( Annee );
  
 }
  if ((Select > 3) and (Select < 7))
  {
  lcd.setCursor( 0, 0 );
  lcd.print("               "); 
  lcd.setCursor(4, 0 );
  if (Heure < 10) { lcd.print ("0");}  
  lcd.print(Heure );
  lcd.print( ":");
  if (Minute < 10) { lcd.print ("0");}
  lcd.print( Minute );
  lcd.print( ":" );
    if (Seconde < 10) { lcd.print ("0");}
  lcd.print( Seconde );;
  } 
     
  val_key = 0;   // RAZ valeur de la touche 
/*  ibtn_u=digitalRead(btn_u);
  ibtn_d=digitalRead(btn_d);
  ibtn_s=digitalRead(btn_s);
  
  if (ibtn_u == LOW)
  {sensorValue = val_ana_btn_u;}
  else {sensorValue = 0;}
  delay (100);
  if (ibtn_d == LOW)
  {sensorValue = val_ana_btn_d;}
  else {sensorValue = 0;}
  delay (100);
  if (ibtn_s == LOW)
  {sensorValue = val_ana_btn_s;}
  else {sensorValue = 0;}
  delay (100);
 */ 
  sensorValue = analogRead(sensorPin); // lecture de la touche
  val_key = int(sensorValue/100);       // valeur entière de la touche / 10

  
  switch (val_key) 
       {
        case 7 : //Select
       { 
        lcd.setCursor( 5, 1 );
        lcd.print( "Select " );
        Select = (Select + 1);
    
        if (Select == 1) {
            lcd.setCursor( 0, 1 );
            lcd.print ("  Reglage jour  ");}
        if (Select == 2) {
            lcd.setCursor( 0, 1 );
            lcd.print ("  Reglage mois  ");}
        if (Select == 3) {
            lcd.setCursor( 0, 1 );
            lcd.print (" Reglage annee  ");}
        if (Select == 4) {
            lcd.setCursor( 0, 1 );
            lcd.print (" Reglage heure  ");}    
        if (Select == 5) {
            lcd.setCursor( 0, 1 );
            lcd.print (" Reglage minute ");} 
        if (Select == 6) {
            lcd.setCursor( 0, 1 );
            lcd.print (" Reglage seconde");}    
        if (Select == 7){
            lcd.setCursor( 0, 1 );
            lcd.print ("      Top !     ");}
        if (Select == 8){
            lcd.setCursor (0,1);
            lcd.print ("                ");
            (Select = 0);
          if (Modif == 1) {  //Remise à l'heure
          RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Entrée startAddr dans NV-RAM address 0x08 
          TimeIsSet = 0xffff;
          RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));         
            if (TimeIsSet != 0xaa55)
            {
             RTC.stopClock();        
             RTC.fillByYMD(Annee,Mois,Jour);
             RTC.fillByHMS(Heure,Minute,Seconde);
    
             RTC.setTime();
             TimeIsSet = 0xaa55;
             RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
             RTC.startClock();
            }
            else
            {
            RTC.getTime();
            Modif = 0;
            lcd.clear();
          }
        }         
      }  
    }
         break;
         
   case 3: //Down
        {
        Modif = 1;  
           
        if (Select == 1) {Jour = (Jour - 1);}  
        if (Jour < 1) {(Jour = 31);}
        if (Select == 2){ Mois = (Mois - 1);}
        if (Mois < 1) {(Mois = 12);} 
        if (Select == 3){Annee = (Annee - 1);}
       
        if (Select == 4) {Heure = (Heure - 1);}  
        if (Heure < 1) {(Heure = 23);}
        if (Select == 5){ Minute = (Minute - 1);}
        if (Minute < 1) {(Minute = 59);} 
        if (Select == 6){Seconde = (Seconde - 1);}
        if (Seconde < 1) {(Seconde = 59);}
        }
        break;
        
  case 1: //UP
        { 
        Modif = 1; 
        if (Select == 1) {Jour = (Jour + 1);}  
        if (Jour > 31) {(Jour = 1);}
        if (Select == 2){ Mois = (Mois + 1);}
        if (Mois > 12) {(Mois = 1);} 
        if (Select == 3){Annee = (Annee + 1);}
       
        if (Select == 4) {Heure = (Heure + 1);}  
        if (Heure > 23) {(Heure = 0);}
        if (Select == 5){ Minute = (Minute + 1);}
        if (Minute > 59 ) {(Minute = 0);} 
        if (Select == 6){Seconde = (Seconde + 1);}
        if (Seconde > 59) {(Seconde = 0);}
        }
        break;
   }
 }
   
/////////////////////////////////////////////////    
 void loop ()
 {
 if (Select == 0)
 {   

 RTC.getTime();
 Heure = RTC.hour;
 Minute = RTC.minute;
 Seconde = RTC.second;
 Jour = RTC.day;
 Mois = RTC.month;
 Annee = RTC.year;  

  if ((RTC.second == 00) and (RTC.second != 30)) {
  digitalWrite(Altern1, HIGH);
  digitalWrite(Altern2, LOW);}

  if ((RTC.second == 30)and (RTC.second != 00)) {
  digitalWrite(Altern1, LOW);
  digitalWrite(Altern2, HIGH);}

   if ((RTC.second != 30) and (RTC.second != 00)) {
   digitalWrite(Altern1, LOW);
   digitalWrite(Altern2, LOW);}
 
  lcd.setCursor( 4, 0 );
  if (Heure < 10) {lcd.print ("0");} 
  lcd.print (Heure);
  lcd.print( ":");
  if (Minute < 10) { lcd.print ("0");}
  lcd.print( Minute );
  lcd.print( ":" );
  if (Seconde < 10) { lcd.print ("0");}
  lcd.print( Seconde );
  lcd.print("  ");
  
  lcd.setCursor( 0, 1 );
  if (Jour < 10) { lcd.print ("0");}
  lcd.print(Jour );
  lcd.print( " ");
  //if (Mois < 10) { lcd.print ("0");}
   switch (RTC.month){
    case 1:
       lcd.print  ("Janvier");
     break;
    case 2:
.....
     case 12:
        lcd.print ("decemb.");
    break;
    }
        lcd.print( " " );
        lcd.print( Annee );
    }  
   // RAZ valeur de la touche 
  
  sensorValue = analogRead(sensorPin); // lecture de la touche
/*ibtn_u=digitalRead(btn_u);
  ibtn_d=digitalRead(btn_d);
  ibtn_s=digitalRead(btn_s);
  
  if (ibtn_u == LOW)
  {sensorValue = val_ana_btn_u;}
  
  else {sensorValue = 0;}
  
  if (ibtn_d == LOW)
  {sensorValue = val_ana_btn_d;}
  
  else {sensorValue = 0;}
  if (ibtn_s == LOW)
  
  {sensorValue = val_ana_btn_s;}
  else {sensorValue = 0;}
  
  val_key = int(sensorValue/100);       // valeur entière de la touche / 10
 //   lcd.setCursor( 0, 0 );
 //   lcd.print (sensorValue);
    if (val_key < 10)  { Bouton();}
 
   //Avance rapide
    if (val_key == 0)
     {
       digitalWrite (Altern1, HIGH);
       digitalWrite (Altern2, LOW);
         delay(250);
       digitalWrite (Altern1, LOW);
       digitalWrite (Altern2, HIGH);
         delay(250);
      }
      
    }
]

Est ce que vous pouvez m'aider. J'ai cherché pendant des semaines je commence à désespérer. lol

Merci

Le souci s'est que le reglage s'effectue avec des boutons sur une entrée analogique A0

Ce ne peut être la cause de ton "soucis".
Les "entrées analogiques" A0 à A5 s'appellent aussi en langage arduino 14,15,16,17,18,19 quand elles sont en mode numérique.

Pour faire simple derrière la broche d'entrée il y a un inverseur qui dirige soit vers la partie numérique soit vers le convertisseur analogique digital.
C'est automatique pour toi : si tu utilises digitalWrite ou digitalRead l'inverseur sera automatiquement dirigé vers le port numérique, si tu utilises analogRead l'inverseur sera automatiquement dirigé vers le convertisseur A/D.

Si ton programme ne fonctionne pas cela vient d'ailleurs.

J'ai trouvé sur le net un programme permettant de modifier la date/Heure DS1307.

ou? lien svp.

je ne comprend pas non plus ou est la cause de ton soucis.
en survolant le programe (qui ne compil pas tel que), on comprend que 3 bouttons sont rattachés a une entrée ana.
ils devraient logiquement etre cablés en série avec une valeur de resistances spécifique, et interprété par ton programe en dur avec suffisement d'ecart pour eviter une mauvaise interprétation.

...
  sensorValue = analogRead(sensorPin); // lecture de la touche
  val_key = int(sensorValue/100);       // valeur entière de la touche / 10  
  switch (val_key) 
...
        case 7 :
...
        case 3 :
...
        case 1 :
...

si tu as suivi le schema avec les bonnes valeurs, ca devrai fonctionner.
tu devrai mesurer tes resistances.

[ @68tjs, mes felicitations pour ta participation a l'amelioration de la lib DTH ]

Le lien http://f5mna.free.fr/ArduiHor4060.htm

Le problème rencontré, c'est que cela ne s'arrête pas en pas à pas. Le reglage défile tout le temps quand j'appui sur un bouton.
J'ai suivi les valeurs analogique (Arduino shield LCD). Le bouton select à pour valeur ana de 724, up valeur 354 et down valeur 120.

[sensorValue = analogRead(sensorPin); // lecture de la touche
  val_key = int(sensorValue/100); ]

Je n'utilse pas l'arduino shield lcd.

Sur mon circuit, j'ai trois boutons poussoirs relier sur 23-24-25. J'ai simuler la valeur "sensorValue" à 700,300 et 100 sur l'appui du bouton associé.

Merci pour tes félicitations mais je n'ai pas participé car j'ai peu de connaissance. S'aurait été avec plaisir. Bonne continuation

mes felicitation s'adressaient à 68tjs.

Sur mon circuit, j'ai trois boutons poussoirs relier sur 23-24-25. J'ai simuler la valeur "sensorValue" à 700,300 et 100 sur l'appui du bouton associé.

je ne comprend pas ce que tu as fait (en fait, je soupcone que c'est en cause). schema, svp.

si tu as 3 boutons sur 3 entrées distinct, tu n'as aucune raison d'y lire une valeur analogique pour une fonction ON/OFF.

jean-I:
si tu as 3 boutons sur 3 entrées distinct, tu n'as aucune raison d'y lire une valeur analogique pour une fonction ON/OFF.

Mais un appui sur un bouton peut mettre une valeur numérique dans une variable :wink:

Il faut aussi savoir sur quelle carte on travaille, car sur la méga, les pins 23, 24 et 25 existent...

Je travaille avec la méga ADK. Mon but c'est d'afficher la date heure sur un écran LCD puis pouvoir la modifier avec 3 boutons poussoir en entrée numérique. "UP,DOWN,SELECT".

Ces boutons sont réliés sur les bornes 23-24-25 et sont actives à l'état bas.

Bien que je suis nul dans ce domaine de programmation, j'ai cherché sur le net un code pour modifier/lire le DS1307 et celui-ci fonctionne avec une entrée analogique A0 dont je ne veux pas utiliser aucune d'entrée analogique.

Le problème rencontré, c'est que cela ne s'arrête pas en pas à pas.

oui, c'est fait comme ca. si tu veux arreter la repetition de touche, il faut detecter un front, et donc memoriser l'ancien état de la touche, analogique ou pas.

un bout de solution en ana:

int oldval_key = 0; // avant setup

...
  sensorValue = analogRead(sensorPin); // lecture de la touche
  val_key = int(sensorValue/100);       // valeur entière de la touche / 10  
  if ( oldval_key != val_key ) {  // ne sera executé que sur changement
    switch (val_key) 
...
        case 7 :
...
        case 3 :
...
        case 1 :
...

    oldval_key = val_key;  //rafaichissement dans ce bloc et pas ailleurs
  }