Go Down

Topic: DS1307 problems (Read 3093 times) previous topic - next topic

obel38

Hi,
i'm neewby on arduino, so please i need help,
It is a datalogger with Analog senders, RTC DS1307 on SPI bus and SD Card
--> I can't make the Date/time functionning when building the String for SD File
--> I can't make the caracters sended to Serial being "A" and not 65, i feel that's is ASCII form, but i don't know how to convert it !

If someone have ideas, please, let me know !


Thanks

Code: [Select]


#include <SD.h>
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68  // This is the I2C address
#include <LiquidCrystal.h>
/*
The circuit:
* LCD RS pin to digital pin 8
* LCD Enable pin to digital pin 3
* LCD D4 pin  to digital pin 4
* LCD D5 pin  to digital pin 5
* LCD D6 pin  to digital pin 6
* LCD D7 pin  to digital pin 7
* SD  MISO    to digital pin 50
* SD  MOSI    to digital pin 51
* SD  SCK     to digital pin 52
* SD  SS      to digital pin 53
* Led         to digital pin 32
* Bouton      to digital pin 30
*/
int command = 0;                                                // Déclaration de la variable de stockage de la commande envoyée par le port série     
int i;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  // déclaration des variables de stockage de la date et heure
const int buttonPin = 30;                                       // Declaration du port E/S du bouton
const int ledPin =  32;                                         // Declaration du port E/S de la led de statut
int buttonState = 0;                                            // variable de stockage du statut du bouton

byte decToBcd(byte val)                                         // Conerti les nombres décimaux en nombres binaires codés en décimal
{
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)                                          // Converti les nombres binaires codés decimal en nombres décimaux normaux
{
  return ( (val/16*10) + (val%16) );
}

void Print2Digit(byte Val)
{
  if (Val < 10)
  {
    Serial.print("0");
  } 
  Serial.print(Val, DEC);
}

// Gets the date and time from the ds1307 and prints result
void getDateDs1307()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0x00);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  second     = bcdToDec(Wire.receive() & 0x7F);
  minute     = bcdToDec(Wire.receive());
  hour       = bcdToDec(Wire.receive() & 0x3F);  // Need to change this if 12 hour am/pm
  dayOfWeek  = bcdToDec(Wire.receive());
  dayOfMonth = bcdToDec(Wire.receive());
  month      = bcdToDec(Wire.receive());
  year       = bcdToDec(Wire.receive());
 
  Serial.print ("flag");
  Serial.println (second);
 
  Print2Digit(hour);
  Serial.print(":");
  Print2Digit(minute);
  Serial.print(":");
  Print2Digit(second);
  Serial.print("  ");
  PrintDayName(bcdToDec(dayOfWeek));
  Serial.print(" ");
  Print2Digit(dayOfMonth);
  Serial.print("-");
  PrintMonthName(bcdToDec(month));
  Serial.print("-20");
  Serial.print(year, DEC);
  Serial.println();
}

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8,3, 4,5,6,7);
int sensorcorr = 0;
int Val7 = 0;
int analogPin = 0;
int sensor = 0;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  Serial.begin(9600);
  const int chipSelect = 53;
  Serial.print("Init. SD Card...");
  pinMode(53, OUTPUT);
 
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Carte muette ou absente");
    // don't do anything more:
    return;
  }
  Serial.println("carte initialisee.");
   pinMode(ledPin, OUTPUT);     
  // initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);     
}

void loop() {
  buttonState = digitalRead(buttonPin);          // Vérifie l'état du bouton 30 est appuyé
 
  if (buttonState == HIGH) {                     // Si le bouton est appuyé
    // turn LED on:   
    digitalWrite(ledPin, HIGH);                  // Allumage de la Led 32
    Logging();
  }
  else {
    digitalWrite(ledPin, LOW);                   // Extinction de la led 32

  int commentaire = 0;
   if (Serial.available())                        // Vérifie si la connexion Série est disponible
    {     
      command = Serial.read();                    // lecture de la commande série
      if (command == 'T')                         // Si le caractère T est envoyé alors
        {     
          setDateDs1307();                        // Lance la fonction SetDateDs1307()
          Serial.println("Set time OK");          // Envoi sur le porte série
          Serial.println();                       // Envoi saut de ligne sur le port Série
          getDateDs1307();                        // Envoi la date et l'heure courante sur le port série
        }
       if (command == 'C')                        // Si le caractère C est envoyé
          {
        int chrserial = 0;
        String dataString = "";
        String commentaire = "";
            for (int i=0 ; i<10 ; i++){
        chrserial = Serial.read ();             // Lecture du commentaire sur le port série
        commentaire += chrserial;
            }
           
        dataString = "*** ";                      // *** sur la chaine de caractères
        dataString += (commentaire);              // Ajout de la chaine commentaire dans la chaine de caractères
        dataString += "***";                      // *** sur la chaine de caracteres
        File dataFile = SD.open("data00.csv", FILE_WRITE);   // Ouverture du fichier Data00/csv sur la carte SD
            if (dataFile) {                                  // Si le fichier existe
            dataFile.println(dataString);                    // Ecriture de la chaine de caractères
            dataFile.close();                                // Fermeture du fichier dans la carte SD
            Serial.println ("Commentaire ajouté :");         // Envoi sur le porte série du résultat
            Serial.print (commentaire);                 // Envoi sur le porte série du commentaire ajouté
            }
        }
    }
}
 

lcd.clear();                                        // Effacement afficheur
Val7 = analogRead(A7);                              // lecture voie analogique 7A7

lcd.setCursor(0,0);                                  // Positionnement curseur à ligne 0, colonne 0
lcd.print("Maison:");                                // Affichage sur le LCD "Maison"
Val7 = Val7/2;                                       // Conversion de la valeur Maison
lcd.setCursor (7,0);                                 // Positionnement curseur à la ligne 0, colonne 7
lcd.print(Val7);                                     // Affichage de la valeur de A7
}

void Logging(){                                             // Sub routine Logging
  getDateDs1307();                                          // Affichage de la date et heure courant
  delay(1000);
 
  String dataString = "" ;                                  // Confection du String pour enregistrement dans le fichier
  dataString +=" ";
  dataString +=";";
  dataString += (hour,DEC);
  dataString += ":";
  dataString += (minute,DEC);
  dataString += ":";
  dataString += (second,DEC);
  dataString += ";";
  dataString += (dayOfMonth,DEC);
  dataString += "/";
  dataString += (month,DEC);
  dataString += "/";
  dataString += (year,DEC);
  dataString += ";";
  dataString += Val7;
   
  File dataFile = SD.open("data00.csv", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  } 
  // if the file isn't open, pop up an error:
  else {
    Serial.println("impossible d'ouvrir data00.csv");
  }
}


cmiyc

The DS1307 uses I2C, not SPI.  Have you connected it using analog pins 4 and 5 (the i2c pins)?
Capacitor Expert By Day, Enginerd by night.  ||  Personal Blog: www.baldengineer.com  || Electronics Tutorials for Beginners:  www.addohms.com

PaulS

Quote
I can't make the caracters sended to Serial being "A" and not 65

Gee, I wonder why?
  Serial.print(Val, DEC);


The art of getting good answers lies in asking good questions.

obel38

Sorry,

i forgot to tell you, that i'm using Arduino Mega 2560, I2C connected to 20 et 21 (I2C SDA/SCL).
I'm sure it is a syntax problem, because when using DS1307 demo program, all is functionning ok !

For ASCII, i tried what you tell Serial.print(Val,DEC), but it continue giving a A as 65.

Please let me know

Olivier

PaulS

Quote
For ASCII, i tried what you tell Serial.print(Val,DEC), but it continue giving a A as 65.

The function that you are using to print to the serial port is:

Quote
void Print2Digit(byte Val)
{
  if (Val < 10)
  {
    Serial.print("0");
  } 
  Serial.print(Val, DEC);
}

Why would you be calling this function with a 'A'?

What are you trying to do?
The art of getting good answers lies in asking good questions.

obel38

Hi PaulS, thanks for helping me,

my problem is with this part of code.

First, during serial connection, i write C with text after and sending to Arduino.
Arduino needs to read each character, adding the current date/time and write them inside SD file AND send the String to the serial.
The string sended to Arduino by Serial is for example: CAAA, but when arduino send it back to Serial, it sends 656565.

So i would him to send AAA.

Please help me,

Regards


Code: [Select]

if (command == 'C')                        // Si le caractère C est envoyé
          {
        int chrserial = 0;
        String dataString = "";
        String commentaire = "";
            for (int i=0 ; i<10 ; i++){
        chrserial = Serial.read ();             // Lecture du commentaire sur le port série
        commentaire += chrserial;
            }
           
        dataString = "*** ";                      // *** sur la chaine de caractères
        dataString += (commentaire);              // Ajout de la chaine commentaire dans la chaine de caractères
        dataString += "***";                      // *** sur la chaine de caracteres
        File dataFile = SD.open("data00.csv", FILE_WRITE);   // Ouverture du fichier Data00/csv sur la carte SD
            if (dataFile) {                                  // Si le fichier existe
            dataFile.println(dataString);                    // Ecriture de la chaine de caractères
            dataFile.close();                                // Fermeture du fichier dans la carte SD
            Serial.println ("Commentaire ajouté :");         // Envoi sur le porte série du résultat
            Serial.print (commentaire);                 // Envoi sur le porte série du commentaire ajouté
            }

PaulS

Code: [Select]
            for (int i=0 ; i<10 ; i++){
        chrserial = Serial.read ();             // Lecture du commentaire sur le port série
        commentaire += chrserial;
            }

Serial.read() is not a blocking function. It does not wait for data to be available to read. It simply returns -1 if there is no data to read. Stuffing -1 in a String is really not a good idea.

Appending an int onto the end of a String is not going to produce the results you expect, either.

You need to check that there is data available to read, before reading. If you do that, you can change the type of chrserial to char, so that it will be appended to the String object AS A CHARACTER, not as an integer value.
The art of getting good answers lies in asking good questions.

obel38

Thank you PaulS, it works fine ! You tips was the right one !

Following, i found why my DS1307 was not working, i was missing Wire.begin() inside setup !

Now i still have a last problem before running my Arduino on heater:

On the first code, it is a function to acquire date on RTC DS1307 (date and time variables are declared as byte)

On the second part of code, it a a string arrangement to send it to SD CARD file.
The data sent to the file are always "10", i can't have the real date and time values, i'm sure that the DS1307 is giving good informations.

I feel that the problem is in string arrangement with date/time variable format.

Please can you help me ?


Thanks

Code: [Select]

void getDateDs1307()
{
  // Reset the register pointer
  Wire.beginTransmission(0x68);
  Wire.send(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 7);

  second     = bcdToDec(Wire.receive() & 0x7F);
  minute     = bcdToDec(Wire.receive());
  hour       = bcdToDec(Wire.receive() & 0x3F);  // Need to change this if 12 hour am/pm
  dayOfWeek  = bcdToDec(Wire.receive());
  dayOfMonth = bcdToDec(Wire.receive());
  month      = bcdToDec(Wire.receive());
  year       = bcdToDec(Wire.receive());
 
  Serial.print(hour,DEC);
  Serial.print(":");
  Serial.print(minute,DEC);
  Serial.print(":");
  Serial.print(second,DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth,DEC);
  Serial.print("/");
  Serial.print(month,DEC);
  Serial.print("/20");
  Serial.print(year, DEC);
  Serial.println();
}











Code: [Select]

getDateDs1307(); 

dataString = "*** ";                      // *** sur la chaine de caractères
        dataString += commentaire;                // Ajout de la chaine commentaire dans la chaine de caractères
        dataString += "***";                      // *** sur la chaine de caracteres
        dataString += ";";
        dataString += hour;
        dataString += ":";
        dataString += minute;
        dataString += ":";
        dataString += (second,DEC);
        dataString += ";";
        dataString += (dayOfMonth,DEC);
        dataString += "/";
        dataString += (month,DEC);
        dataString += "/20";
        dataString += (year,DEC);
       

PaulS

Just because you can do this:
Code: [Select]
  Serial.print(dayOfMonth,DEC);
does not mean that you can do this:
Code: [Select]
        dataString += (dayOfMonth,DEC);
The art of getting good answers lies in asking good questions.

nickgammon

Read up on the sprintf function (or snprintf).
Please post technical questions on the forum, not by personal message. Thanks!

More info: http://www.gammon.com.au/electronics

Go Up