Arduino mega 2560 + Shield DS 1307 RTC real time clock + memoria I2C

save a tutti, finalmente mi è arrivata la scheda che tanto attendevo ora chiedo a qualcuno di buona volontà i collegamenti per far funzionare il real time, il display 16x2 e come settarlo grazie in anticipo

Il RTC e la memoria hanno un interfaccia I2C.
http://arduino.cc/de/Reference/Wire
Del display non so dire niente perché la dimensione in carateri visualizzati non specifica nessun modello.
Ciao Uwe

Se cerchi con SanGoogle collegamenti Arduino Display 16x2 di schemi ne trovi a quintali. Sperando tu ne abbia preso uno con il controller standard più diffuso HD44780 e piedinatura standard. Esempio: http://www.maffucci.it/2012/02/17/appunti-su-arduino-pilotare-un-display-lcd/

Qui tutorial su RTC, ma non come shield, come board (per shield si intende una board che si incastra sopra Arduino): http://www.mauroalfieri.it/elettronica/rtc-ds1307.html Quella shield, il venditore non ti ha dato un link con i dettagli, datasheet, documentazione? Hai un link?

allora sono riuscito a comunicare con il real time clock ma ho notato che l’orologio corre troppo in pratica la riga che vedo nel monitor seriale viene stampata ogni secondo ma in realtà arduino ne conta due, vedi foto sotto

come faccio a ripristinare il tempo esetto?
vi riporto il programma che ho inserito:

#include “Wire.h”
#define DS1307_I2C_ADDRESS 0x68

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/void stopDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(0x80);
Wire.endTransmission();
}
/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you’re passing in valid numbers
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void setup()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
Serial.begin(9600);

// Modificare i seguenti valori per impostare il vostro orologio ad ogni avvio del programma.
// Probabilmente si desidera impostare solo l’orologio una volta e quindi rimuovere
// la chiamata setDateDs1307 .
second = 50;
minute = 49;
hour = 11;
dayOfWeek = 6;
dayOfMonth = 12;
month = 1;
year = 13;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);// chiamata per settare l’orologio

}

void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.print(second, DEC);
Serial.print(" “);
Serial.print(month, DEC);
Serial.print(”/");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" Day_of_week:");
Serial.println(dayOfWeek, DEC);

delay(1000);

ho risolto il problema dei secondi, erano dei pin saldati male ma oggi ricollegando arduino mi sono accorto che non continua a conteggiare nonostante abbia rimosso la chiamata setDateDs1307, voi che dite sarà la batteria scarica

Il codice deve essere recchiuso nei tag code, vedi regolamento, sezione 7, spiega bene come fare. Altrimenti parte del codice può essere interpretato come attributo del testo stesso e quindi una parte del codice viene mal visualizzato (o anche non visualizzato)

Dalla mia piccola esperienza, penso sia la batteria tampone scarica.

Mauro Alfieri www.mauroalfieri.it