Conseil convertisseur d'heur pour module rtc

bonjour sur un projet dans la librairie j'ai sa comme exemple qui permet de mètre les forma 24h en 12h

if (hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11

 //hourval = (hourval * 60 + secondval) / 12;

c'est pas plus simple de faire sa ??

 if (hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
  hourval = hourval%12;

pour le 2 eme j'e lais trouver seule mes celon vous (je peux pas tester tous de suite) sa marche ??
si non pour quoi sa ne marche pas

et si sa ne marche pas on peux m'expliquer comment marche le numéros 1 car je ne comprend pas :upside_down_face:

Un modulo c’est plus coûteux en calcul qu’une soustraction

ok mes après le résulta seras le meme en sortis ??

il suffit de faire un petit code de test pour s'en rendre compte...

void setup() {
  Serial.begin(115200);
  Serial.println(F("H\tif\tmodulo"));
  for (int heure = 0; heure < 24; heure++) {
    int hourval1 = heure;
    if (hourval1 > 11) hourval1 -= 12;
    int hourval2 = heure % 12;
    Serial.print(heure); Serial.write('\t'); Serial.print(hourval1); Serial.write('\t'); Serial.println(hourval2);;
  }
}
void loop() {}

le moniteur série (à 115200 bauds) affichera

H if modulo
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
10 10 10
11 11 11
12 0 0
13 1 1
14 2 2
15 3 3
16 4 4
17 5 5
18 6 6
19 7 7
20 8 8
21 9 9
22 10 10
23 11 11

donc oui, ce sont les mêmes valeurs, mais généralement pour 12h on garde le 12...
si on modifie comme cela le code

void setup() {
  Serial.begin(115200);
  Serial.println(F("H\tif\tmodulo"));
  for (int heure = 0; heure < 24; heure++) {
    int hourval1 = heure;
    if (hourval1 > 12) hourval1 -= 12;
    int hourval2 = heure % 13;
    Serial.print(heure); Serial.write('\t'); Serial.print(hourval1); Serial.write('\t'); Serial.println(hourval2);;
  }
}
void loop() {}

la console série dit

H if modulo
0 0 0
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
9 9 9
10 10 10
11 11 11
12 12 12
13 1 0
14 2 1
15 3 2
16 4 3
17 5 4
18 6 5
19 7 6
20 8 7
21 9 8
22 10 9
23 11 10

➜ le modulo ne fonctionne pas après midi, il faudrait faire un test pour corriger et ajouter 1

donc la méthode avec le if est la plus efficace de loin.

bon avec

hourval = (hourval * 60 + minuteval) / 12;

sur le moniteur serie
18:04:45.149 -> 30:4:31

mes sur mon horloge (projet)

18:04:31 donc la c'est bon

mes quand je fait

hourval = hourval% 12;

jai

6:04:30

mes sur mon horloge jai 2h04 ;(

pas de snippets (Snippets R Us!)

c'et quoi hourval ? pourquoi vous faites
hourval = (hourval * 60 + minuteval) / 12

cetais dans l'exemple de bases

de quelle base... ? soyez plus précis... On ne sait pas de quelle bibliothèque vous parlez... on ne connait pas le type de hourval etc...

(un petit tour sur "Les bonnes pratiques du Forum Francophone” pour vous remettre à jour sur ce qui est attendu serait pas mal :wink: ?).

en gros voici le tous première version (je connais plus la source sa dois faire 1 ans que je lais commancer

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>

#define PIN 13
#define PIXEL 60


Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);

RTC_DS1307 RTC; // Establish clock object
DateTime Clock; // Holds current clock time

byte hourval, minuteval, secondval;


void setup() {
 Serial.begin(9600);
  Wire.begin();          // Begin I2C
  RTC.begin();   // begin clock
 
    if (! RTC.isrunning()) {
//  Serial.println("RTC is NOT running!");
  // following line sets the RTC to the date & time this sketch was compiled

  }
 
  RTC.adjust(DateTime(__DATE__, __TIME__));
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  strip.setBrightness(10);

}


void loop() {

   
    Clock = RTC.now(); // get the RTC time
   
    secondval = Clock.second();  // get seconds
    minuteval = Clock.minute();  // get minutes
    hourval = Clock.hour();   // get hours


    if(hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
    hourval = (hourval*60 + minuteval) / 12;   
   
    strip.setPixelColor(hourval, 0x008080);strip.setPixelColor(hourval-1, 0x004040);strip.setPixelColor(hourval+1, 0x004040);
    strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
    strip.setPixelColor(minuteval, 0x800080);
    strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
    strip.setPixelColor(secondval, 0x808000);strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
    strip.show();
   
     strip.setPixelColor(hourval, 0x000000);strip.setPixelColor(hourval-1, 0x000000);strip.setPixelColor(hourval+1, 0x000000);
    strip.setPixelColor(hourval-2, 0x000000);strip.setPixelColor(hourval+2, 0x000000);
    strip.setPixelColor(minuteval, 0x000000);strip.setPixelColor(minuteval-1, 0x000000);strip.setPixelColor(minuteval+1, 0x000000);
    strip.setPixelColor(secondval, 0x000000);strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);
 
  delay(25);



   Serial.print(hourval, DEC);
   Serial.print(':');
  Serial.print(minuteval, DEC);
   Serial.print(':');
   Serial.println(secondval, DEC);




}

ne réutilisez pas hourval pour calculer la position des pixels dans la strip si ensuite vous en avez besoin comme une heure.. soit vous imprimez avant la modification, soit vous utilisez une autre variable pour le calcul du pixel

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>

#define PIN 13
#define PIXEL 60


Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);

RTC_DS1307 RTC; // Establish clock object
DateTime Clock; // Holds current clock time

byte hourval, minuteval, secondval;


void setup() {
  Serial.begin(9600);
  Wire.begin();          // Begin I2C
  RTC.begin();   // begin clock

  if (! RTC.isrunning()) {
    //  Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled

  }

  RTC.adjust(DateTime(__DATE__, __TIME__));
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  strip.setBrightness(10);

}


void loop() {


  Clock = RTC.now(); // get the RTC time

  secondval = Clock.second();  // get seconds
  minuteval = Clock.minute();  // get minutes
  hourval = Clock.hour();   // get hours


  if (hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
  uint16_t pixelPos  = (hourval * 60 + minuteval) / 12;

  strip.setPixelColor(pixelPos, 0x008080); strip.setPixelColor(pixelPos - 1, 0x004040); strip.setPixelColor(pixelPos + 1, 0x004040);
  strip.setPixelColor(pixelPos - 2, 0x001010); strip.setPixelColor(pixelPos + 2, 0x001010);
  strip.setPixelColor(minuteval, 0x800080);
  strip.setPixelColor(minuteval - 1, 0x200020); strip.setPixelColor(minuteval + 1, 0x200020);
  strip.setPixelColor(secondval, 0x808000); strip.setPixelColor(secondval - 1, 0x002F00); strip.setPixelColor(secondval + 1, 0x002F00);
  strip.show();

  strip.setPixelColor(pixelPos, 0x000000); strip.setPixelColor(pixelPos - 1, 0x000000); strip.setPixelColor(pixelPos + 1, 0x000000);
  strip.setPixelColor(pixelPos - 2, 0x000000); strip.setPixelColor(pixelPos + 2, 0x000000);
  strip.setPixelColor(minuteval, 0x000000); strip.setPixelColor(minuteval - 1, 0x000000); strip.setPixelColor(minuteval + 1, 0x000000);
  strip.setPixelColor(secondval, 0x000000); strip.setPixelColor(secondval - 1, 0x000000); strip.setPixelColor(secondval + 1, 0x000000);

  delay(25);

  Serial.print(hourval, DEC);
  Serial.print(':');
  Serial.print(minuteval, DEC);
  Serial.print(':');
  Serial.println(secondval, DEC);
}

je vais faire de façon que tous marche et je reviens sur ce problème après