arduino+reloj--->serie--->arduino+lcd

//
// Maurice Ribble
// 4-17-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code tests the DS1307 Real Time clock on the Arduino board.
// The ds1307 works in binary coded decimal or BCD.  You can look up
// bcd in google if you aren't familior with it.  There can output
// a square wave, but I don't expose that in this code.  See the
// ds1307 for it's full capabilities.

#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.send(0);
  Wire.send(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.send(0);
   Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock
   Wire.send(decToBcd(minute));
   Wire.send(decToBcd(hour));      // If you want 12 hour am/pm you need to set
                                   // bit 6 (also need to change readDateDs1307)
   Wire.send(decToBcd(dayOfWeek));
   Wire.send(decToBcd(dayOfMonth));
   Wire.send(decToBcd(month));
   Wire.send(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.send(0);
  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());
}

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

  // Change these values to what you want to set your clock to.
  // You probably only want to set your clock once and then remove
  // the setDateDs1307 call.
  second = 45;
  minute = 3;
  hour = 7;
  dayOfWeek = 5;
  dayOfMonth = 17;
  month = 4;
  year = 8;
  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}

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);
}

Simple código para un reloj con Arduino.

(1)ARDUINO CON RELOJ----->---datos serie--------->-----(2)ARDUINO CON LCD

Siguiendo este esquema, quiero que el Arduino 1 mande como datos serie la hora, para que el Arduino 2 SÓLO interprete éstos y los muestre en un lcd.
Con este código mando por serie la hora, entonces, ¿como la recibo en el lcd para ponerla donde yo quiera?(es decir, en la línea 2 por ejemplo)
Gracias

Ese código ya está mandando la hora por puerto serie. Lo manda en formato "12:50 15/06/12 Day_of_week:5/r".(Primera parte, Tx, hecha)

Para la segunda parte (Rx), supongo que antes de todo ya habrás probado el código del Arduino para que pinte en el LCD, ¿No? ¿Has hecho algún código en el que te ponga información que le envías desde el PC? Si no es así, deberías empezar con estos dos ejercicios. Y si es así...ya casi lo tienes hecho :slight_smile:

Con el ejemplo que pones, en el código del arduino con LCD, cuando recibas por puerto serie datos sabrás que tienen el formato "12:50 15/06/2012 Day_of_week:5/r", solo tienes que ir sacando cada uno de los datos de la cadena de texto.

También puedes mejorar (simplificar) el algoritmo, enviando los datos directamente como números (byte o int), de manera que sea más fácil codificarlos/decodificarlos. Algo del estilo 0xFF/minuto/hora/dia/mes/0x00, donde 0xFF indica comienzo de los datos, luego vienen cada uno en formato entero y 0x00 indica final de datos. p.ej.:

{0xFF, 50, 12, 15, 6, 12, 0x00}

  Serial.write(255);
  Serial.write(hour);
  Serial.write(minute);
  Serial.write(second);
  Serial.write(month);
  Serial.write(year);
  Serial.write(0);

En el receptor, esperarás un 0xFF y después cada uno de los datos hasta recibir un 0x00. El como pintarlo en el LCD, ya es cosa tuya (depende de qué LCD utilices y de cómo lo quieras poner)

Claro, ese código envía por serie ya la hora (por eso lo he puesto).
Como dices no me he puesto a experimentar aún, pero no voy a ponerme a probar esos ejemplos porque los controlo jejej.
Lo único que necesito saber, es como coger los datos serie de la hora e interpretarlos en una línea del lcd.

lcd.setCursor(16, 2);
lcd.write(Serial.read());

Creo que ésto sería pero,¿se me van a mostrar todos los datos que corran por serie?
Gracias por su atención.

PascuaL:
Como dices no me he puesto a experimentar aún, pero no voy a ponerme a probar esos ejemplos porque los controlo jejej.

No los controlarás tanto cuando estás preguntando precisamente lo que hacen esos ejemplos.

Haz un código que te muestre por la pantalla del LCD el texto que escribas en el monitor serie del IDE. Una vez que lo tengas, pasar a mostrar la hora del otro arduino es más sencillo. Y si lo pones aquí, te podemos echar una mano para lo de la hora.

Que ya lo he hecho. Lo que quiero es que no me salgan todos los datos serie que corren entre los arduinos(que son mas que los del reloj).

Creo sinceramente que te lo han contestado

  • el arduino com el rtc enviaría por el serial la fecha com alguna marca p.e fecha 12:12:12-11/12/12
  • el arduino con LCD identifica la marca y lo muestra por pantalla

Si sabes mostrar por el LCD y sabes leer por i2c y enviar y recibir por serial no veo tu duda...

Como entreno ejercicio lo veo perfecto pero no veo lógico. Que lógica tiene meter un arduino a leer y envíar la hora y otro a leer el arduino para mostrarla?

PascuaL:
Que ya lo he hecho. Lo que quiero es que no me salgan todos los datos serie que corren entre los arduinos(que son mas que los del reloj).

Entonces pon el código del programa (tanto del que transmite como del que recibe) para ver que estás recibiendo, leyendo y pasando al display para que te podamos decir como mostrar solo la hora

miniduino:
Creo sinceramente que te lo han contestado

  • el arduino com el rtc enviaría por el serial la fecha com alguna marca p.e fecha 12:12:12-11/12/12
  • el arduino con LCD identifica la marca y lo muestra por pantalla

Si sabes mostrar por el LCD y sabes leer por i2c y enviar y recibir por serial no veo tu duda...

Como entreno ejercicio lo veo perfecto pero no veo lógico. Que lógica tiene meter un arduino a leer y envíar la hora y otro a leer el arduino para mostrarla?

Pues muy fácil:
Acabo de terminar una central de alarma y ahora me dispongo a realizar mandos para activación,desactivación,configuración..etc. El caso es que cada mando, obtenga de la central la hora y fecha. De esta manera me ahorro rtcs en todos los mandos, y además, todas las menorías de eventos se basan solo en un RTC, el de la central.

PascuaL:

miniduino:
Creo sinceramente que te lo han contestado

  • el arduino com el rtc enviaría por el serial la fecha com alguna marca p.e fecha 12:12:12-11/12/12
  • el arduino con LCD identifica la marca y lo muestra por pantalla

Si sabes mostrar por el LCD y sabes leer por i2c y enviar y recibir por serial no veo tu duda...

Como entreno ejercicio lo veo perfecto pero no veo lógico. Que lógica tiene meter un arduino a leer y envíar la hora y otro a leer el arduino para mostrarla?

Pues muy fácil:
Acabo de terminar una central de alarma y ahora me dispongo a realizar mandos para activación,desactivación,configuración..etc. El caso es que cada mando, obtenga de la central la hora y fecha. De esta manera me ahorro rtcs en todos los mandos, y además, todas las menorías de eventos se basan solo en un RTC, el de la central.
[/quotee]

ok