Aventuras y Desventuras de un hobbyist

Aventuras y Desventuras de un hobbyist....

Real Time clock para Arduino(DS1307)

El uso de un reloj es fundamental en algunos procesos con nuestro arduino especialmente cuando queremos enviar datos usando cualquier protocolo.
El reloj nos servira  para no tener simplemente datos sino saber cuando se han relalizado dichos cambios en los inputs.
Para este proyecto necesitaremos lo siguiente:
  • Arduino
  • Cristal de quarzo de 32.768 kHz
  • MAXIM DS1307
  • Socket de 8 pines
  • CR2032 3v bateria
  • CR2032 PCB socket
  • 2* resistencias de 2.2K.
  • Perfboard.
El diagrama es el siguiente:

    Luego de soldar el resultado es este:



    El código al final del post.

    Mas datos:

    El DS1307 es un reloj/calendario de bajo consumo con 56 bytes SRAM. El reloj/calendario nos da segundos, minutos, horas, dias y años. La fecha al finla del mes is automaticamente ajustada para meses con menos de 31 dias. El DS1307 funciona como esclavo en el us I2C . Se obtine acceso implementando una condición START y dando un codigo de identificación (0x68) seguido por una dirección registrada asi registros subsecuentes puenden ser accedidos secuencialmente. El DS1307 vienen en un 8-pin dip package. 

    Bit 7 del registro 0 es el clock halt (CH) bit. Cuando este bit  se cambia a 1, el oscilador se deshabilitathe y si vuelve a 0, el oscilador se habilita. Si no se cambia a 0 el reloj no funcionara.

    Ds1307 pin out
    Solo los primeros 8 bytes (0x00 - 0x07) son usados por el reloj y los otros 56 se usan com RAM adicional.
    DESCRIPCIÓN DE PINES
    Pins 1, 2 para el cristal de quarzo 32.768kHz no se necesita capacitor.
    Pin 3 VBAT Bateria de backup de 3v.
    Pin 4 GND Ground
    Pin 5 SDA Serial Data Input/Output. SDA es el data input/output para la interface I2C y requiere una resistencia pull-up Arduino pin 4.
    Pin 6 SCL Serial Clock Input. SCL  es el input del reloj para el  I2C y es usado para sincronizar el movimiento de datos en el puerto serie . Arduino pin 5.
    7 SWQ/OUT Square Wave/Output Driver. cuando esta habilitado el  SQWE bit  con valor 1,  SQW/OUT pin outputs uno de cuatro square-wave frecuencias (1Hz, 4kHz, 8kHz, 32kHz). El SQW/OUT pin requiere una resistencia pull-up. SQW/OUT Funciona con  VCC o VBAT . Un LED y 220 ohm resistencia en series conectada a VCC produce 1 HZ blink.  Esta es una buena forma de saber si el reloj esta funcionando.
    8 VCC (5 volts)


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

    Arduino RS232 Shield

    Me pareció interesante la idea de interconectar Arduinos y así formar redes, para ello tenemos diferentes formas de hacerlo: RS232, I2C,RS485 y BusCAN.
    Iré investigando estos 4 protocolos en el orden citado arriba.
    En esta ocasión toca ver el RS232 que también sirve para conectar nuestro ***duino al ordenador.
    Para comunicar RS232 y Arduino que utiliza TTL necesitaremos convertir la señal, se lo puede hacer a través de un sistema simple con transistores y resistencias pero también se puede utilizar un IC dedicado a ello, hablamos del MAX232 de Maxim.
    Existe diferentes tipos de configuraciones, yo he seguido la que se nos presenta en la web de Arduino pero no tuve éxito. Link
    La mayoría de mis proyectos los hago sobre Paperduino en sus diferentes versiones, luego de buscar mucho y probar  encontré un shield para easyduino que  me funciono y sirvió de base este shield.
    El esquema (sch)se muestra en la imagen de abajo.


     
      La plantilla para el lado del cobre de una Stripboard de 11*11 huecos.
    Imagenes del proceso de soldado.



    Y el resultado final luego de soldar es el siguiente:


    Los pines de la derecha en la imagen de arriba sirven para conectarse a **duino:


    Abajo fotos del shield conectado al Papeduino Stripboard y  Paperduino PCB

    Por si alguien esta interesado descargarse el archivo eagle(sch):

    Moisture sensor para el huerto

    Ahhh la primavera!!!
    Los arboles florecen, los pajarillos cantan y también es hora de iniciar los trabajos en el huerto.
    Buen momento para integrar micros en el huerto, recuerdo que hace mucho leí el blog de Garduino en el que se incorporaba un sensor de humedad de la tierra, sensor de temperatura, sensor de luminosidad y creo que también se contralaba una electroválvula.
    En mi caso no quiero automatizar el huerto sino más bien hacer uso de herramientas de precisión como un sensor de humedad de la tierra. Para saber si los vegetales necesitan agua o no.
    El sensor de temperatura es muy sencillo, se necesita lo siguiente:
    • Arduino
    • Resistencia 10K
    • Dos alambres de hierro galvanizada (aprox. 6cm. 3 inch.)
    • Cables
    Para contener el sensor he usado la carcasa de un conector usb de una Palm TREO 750.

    Mi objetivo es medir la humedad y que el valor pueda ser observado en mi pequeña pantalla LCD.


     He realizado la calibración con tierra mojada y seca pero tengo unos valores bastante raros, la tierra totalmente mojada presenta un valor de 870 y la tierra seca 830 no se esto sera normal. Puede que el material de los pinchos que tengo no sea muy bueno por lo que procederé cambiarlos por clavos de acero inoxidable........