Bonsoir à tous
J'utilise une carte Uno V2, avec le shield SD+ (carte SD + horloge à DS1307+EEPROM) avec laquelle je rencontre le soucis suivant. Bon, pour bien comprendre, je précise le but du projet : je dois faire un data logger sur carte SD pour enregistrer des températures dans un bâtiment. Je vais pour cela utiliser des capteurs OneWire DS1820, cette partie fonctionne correctement pour le moment.
En fait j'ai eu un soucis pour l'utilisation de l'horloge, au moment de la paramétrer pour la mettre à l'heure.
J'ai voulu pour cela utiliser le code suivant :
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by mattt on the Arduino forum and modified by D. Sjunnesson
void setup() {
Serial.begin(9600); }
int valeur=0;
int commande=0;
void loop() {
if (Serial.available()) {
commande = Serial.read();
valeur = (byte) ((Serial.read()-48)*10 + (Serial.read()-48)); //-48 car la valeur ascii des chiffres =48 pour zero
switch (commande) {
case 'h' :
RTC.set(DS1307_HR,valeur);
Serial.print("champ heures regle sur ");
Serial.print(valeur,DEC);
Serial.println("");
break;
case 'm' :
(...) etc etc etc
ce programme étant inspiré d'un exemple d'utilisation du DS1307 qui utilisait également un système de lecture de commande sur le port série pour mettre l'horloge à l'heure.
Et bien entendu, ça n'a pas marché. Impossible de lire correctement la commande et la valeur qui la suit, en l'occurence par exemple h21 pour régler l'heure sur 21h, m30 les minutes sur 30, etc etc.
Après plusieurs heures du prise de tête à rajouter des Serial.print() un peu partout pour comprendre où ça bloquait, j'ai fini par me rendre compte que pour que ça fonctionne, je suis obligé d'écrire sur le port série entre chaque lecture, et là, la lecture est correcte et ça marche.
le code est donc devenu le suivant :
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by mattt on the Arduino forum and modified by D. Sjunnesson
void setup() {
Serial.begin(9600); }
int valeur=0;
int commande=0;
char truc[10];
int i=0;
void loop() {
if (Serial.available()) // Look for char in serial que and process if found
{
commande = Serial.read();
Serial.println(commande);
for (i=0;i<2;i++) {
truc[i]=Serial.read();
Serial.print("truc[");
Serial.print(i,DEC);
Serial.print("] = ");
Serial.println(truc[i],DEC);
}
Serial.print(" i = ");
Serial.println(i,DEC);
Serial.print(" truc = ");
Serial.println(truc);
valeur = (byte) ((truc[0]-48)*10 + (truc[1]-48)); //-48 car la valeur ascii des chiffres =48 pour zero
switch (commande) {
case 'h' :
RTC.set(DS1307_HR,valeur);
Serial.print("champ heures regle sur ");
Serial.print(valeur,DEC);
Serial.println("");
break;
case 'm' :
RTC.set(DS1307_MIN,valeur);
Serial.print("champ minutes regle sur ");
Serial.print(valeur,DEC);
(...) etc
Donc j'avoue ne pas comprendre. D'autant qu'au départ j'ai utilisé un exemple fourni par seedstudio avec leur carte à ds1703 qui utilise le code suivant :
void setDateDs1307()
{
hour = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.
minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
second = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
dayOfWeek = (byte) (Serial.rea(...)
Où on voit que les lectures sont parfaitement identiques à ce que j'avais fait en premier... sauf que dans leur cas, ça marche !!
Alors voila, je suis pas vraiment familier des ports série, il y a manifestement une subtilité qui m'échappe... mon bidouillage fonctionne, mais j'aimerai vraiment comprendre pourquoi en faisant la même chose en version simple ça ne marche pas...