Voila j'ai un DS3231 que j'utilise avec cette librairie : GitHub - rodan/ds3231: arduino library for DS3231 RTC
Je test donc avec le code suivant (exemple fourni) :
#include <Wire.h>
#include "ds3231.h"
#include "rtc_ds3231.h"
#define BUFF_MAX 128
uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 5000;
void setup()
{
Serial.begin(9600);
Wire.begin();
//DS3231_init(DS3231_INTCN);
memset(recv, 0, BUFF_MAX);
//Serial.println("GET time");
//Use it to set the time
//Serial.println("Setting time");
//parse_cmd("T100512430102014",16);
}
void loop()
{
char in;
char buff[BUFF_MAX];
unsigned long now = millis();
struct ts t;
float temperature;
int
// show time once in a while
if ((now - prev > interval) && (Serial.available() <= 0)) {
DS3231_get(&t); //get time
temperature = DS3231_get_treg(); //Get temperature
// there is a compile time option in the library to include unixtime support
#ifdef CONFIG_UNIXTIME
snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d %ld", t.year,
t.mon, t.mday, t.hour, t.min, t.sec, t.unixtime);
#else
snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
t.mon, t.mday, t.hour, t.min, t.sec);
#endif
Serial.println(buff);
Serial.print(buff[11]);
Serial.print(buff[12]);
Serial.print("Temperature :");
Serial.print(temperature);
Serial.println(" C");
prev = now;
}
if (Serial.available() > 0) {
in = Serial.read();
if ((in == 10 || in == 13) && (recv_size > 0)) {
parse_cmd(recv, recv_size);
recv_size = 0;
recv[0] = 0;
} else if (in < 48 || in > 122) {; // ignore ~[0-9A-Za-z]
} else if (recv_size > BUFF_MAX - 2) { // drop lines that are too long
// drop
recv_size = 0;
recv[0] = 0;
} else if (recv_size < BUFF_MAX - 2) {
recv[recv_size] = in;
recv[recv_size + 1] = 0;
recv_size += 1;
}
}
}
void parse_cmd(char *cmd, int cmdsize)
{
uint8_t i;
uint8_t reg_val;
char buff[BUFF_MAX];
struct ts t;
//snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
//Serial.print(buff);
// TssmmhhWDDMMYYYY aka set time
if (cmd[0] == 84 && cmdsize == 16) {
//T355720619112011
t.sec = inp2toi(cmd, 1);
t.min = inp2toi(cmd, 3);
t.hour = inp2toi(cmd, 5);
t.wday = inp2toi(cmd, 7);
t.mday = inp2toi(cmd, 8);
t.mon = inp2toi(cmd, 10);
t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
DS3231_set(t);
Serial.println("OK");
} else if (cmd[0] == 49 && cmdsize == 1) { // "1" get alarm 1
DS3231_get_a1(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 50 && cmdsize == 1) { // "2" get alarm 1
DS3231_get_a2(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 51 && cmdsize == 1) { // "3" get aging register
Serial.print("aging reg is ");
Serial.println(DS3231_get_aging(), DEC);
} else if (cmd[0] == 65 && cmdsize == 9) { // "A" set alarm 1
DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
//ASSMMHHDD
for (i = 0; i < 4; i++) {
time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
}
boolean flags[5] = { 0, 0, 0, 0, 0 };
DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
DS3231_get_a1(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 66 && cmdsize == 7) { // "B" Set Alarm 2
DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
//BMMHHDD
for (i = 0; i < 4; i++) {
time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
}
boolean flags[5] = { 0, 0, 0, 0 };
DS3231_set_a2(time[0], time[1], time[2], flags);
DS3231_get_a2(&buff[0], 59);
Serial.println(buff);
} else if (cmd[0] == 67 && cmdsize == 1) { // "C" - get temperature register
Serial.print("temperature reg is ");
Serial.println(DS3231_get_treg(), DEC);
} else if (cmd[0] == 68 && cmdsize == 1) { // "D" - reset status register alarm flags
reg_val = DS3231_get_sreg();
reg_val &= B11111100;
DS3231_set_sreg(reg_val);
} else if (cmd[0] == 70 && cmdsize == 1) { // "F" - custom fct
reg_val = DS3231_get_addr(0x5);
Serial.print("orig ");
Serial.print(reg_val,DEC);
Serial.print("month is ");
Serial.println(bcdtodec(reg_val & 0x1F),DEC);
} else if (cmd[0] == 71 && cmdsize == 1) { // "G" - set aging status register
DS3231_set_aging(0);
} else if (cmd[0] == 83 && cmdsize == 1) { // "S" - get status register
Serial.print("status reg is ");
Serial.println(DS3231_get_sreg(), DEC);
} else {
Serial.print("unknown command prefix ");
Serial.println(cmd[0]);
Serial.println(cmd[0], DEC);
}
}
Je cherche à récupérer le chiffre des heures, j'ai donc fait un Serial.print(buff[11]) et Serial.print(buff[12]) ce qui me permet de récupérer les deux chiffres des heures (1 et 5 actuellement).
Maintenant je souhaiterai savoir comment faire pour utiliser ces 2 valeurs comme étant un seul entier (15 et non 1 et 5) afin de pouvoir par la suite comparer cette valeur avec des heures de fonctionnement pour des LEDs (le code ci dessous utilise une librairie ds1307 ce qui ne me permet pas d'utiliser le capteur de température du ds3231 et je souhaite m'en servir donc je dois changer ce code en adaptant la version précédente):
#include <Wire.h>
#include "RTClib.h"//Create a LED structure with all variables
struct LED {
byte first; //hours of first intensity
byte seconde; //hours of second intensity
byte intensityFirst; //first intensity
byte intensitySecond; // second intensity
int pinLED; //output pin
};//Table with 3 variable : one for each colours of LED
LED myLED[3]={{0,20,255,0,11},{0,18,255,0,9},{0,22,255,0,10}};RTC_DS1307 rtc; // variable RTC
void setup(){
Serial.begin(9600);
for(int i=0;i<3;i++) pinMode(myLED*.pinLED, OUTPUT);*
}
void loop(){
- DateTime now = rtc.now();*
- int hours = now.hour(); //get back hour*
for(int i=0;i<3;i++) {
if(myLED.first>=hours && myLED.seconde<hours) {analogWrite(myLED_.pinLED,myLED*.intensityFirst);}
else {analogWrite(myLED.pinLED,myLED.intensitySecond);}
}
}
[/quote]*
J'ai pensé faire le premier nombre *10 + le deuxième et affecter le tout à une variable heure. Peut être y a t'il plus malin ?
Merci pour vos idées !_