RTCModuleDS1302 y LCDI2C16x02 (A0, A1, A2 no soldar sin un puente) (2 / 6 paso)

Paso 2: Biblioteca DS1302.cpp

/*

DS1302.cpp - soporte de biblioteca de Arduino para el Chip de cronometraje de carga DS1302

Copyright (C) 2010 Henning Karlsen. Todos los derechos reservados

Usted puede encontrar la versión más reciente de la biblioteca

http://www.henningkarlsen.com/Electronics

Esta biblioteca se ha hecho fácil interfaz y utilizar el DS1302 RTC con

el Arduino.

Si haces modificaciones ni mejoras en el código, te lo agradeceria

que compartes el código conmigo para que yo podría incluir en la próxima versión.

Yo puedo ser contactado a través de http://www.henningkarlsen.com/electronics/contact.php

Esta biblioteca es software libre; Usted puede redistribuirlo y/o

modificar bajo los términos de la GNU menor General pública

Licencia publicada por la Free Software Foundation; cualquiera de los dos

versión 2.1 de la licencia o (a su opción) cualquier versión posterior.

Esta biblioteca se distribuye con la esperanza de que sea útil,

pero sin ninguna garantía; ni siquiera la garantía implícita de

COMERCIABILIDAD o aptitud para un propósito PARTICULAR. Ver la GNU

Lesser General Public License para más detalles.

Usted debe han recibido una copia de la GNU menor General pública

Licencia junto con esta biblioteca; Si no, escriba a la Free Software

Foundation, Inc., 51 Franklin St, quinto piso, Boston, MA 02110-1301 USA

*/

#include "DS1302.h"

#define REG_SEC 0

#define REG_MIN 1

#define REG_HOUR 2

#define REG_DATE 3

#define REG_MON 4

#define REG_DOW 5

#define REG_YEAR 6

#define REG_WP 7

#define REG_TCR 8

/ * Público * /

Tiempo:: marca_de_tiempo

{

Esto -> año = 2010;

Esto -> mon = 1;

esta fecha de-> = 1;

Esto -> hora = 0;

Esto -> min = 0;

Esto -> seg = 0;

Esto -> dow = 5;

}

DS1302_RAM::DS1302_RAM()

{

para (int i = 0; i < 31; i ++)

Cell [i] = 0;

}

DS1302::DS1302 (ce_pin de uint8_t, uint8_t data_pin, uint8_t sclk_pin)

{

_ce_pin = ce_pin;

_data_pin = data_pin;

_sclk_pin = sclk_pin;

pinMode (_ce_pin, salida);

pinMode (_sclk_pin, salida);

}

Tiempo DS1302::getTime()

{

Tiempo t;

_burstRead();

t.sec = _decode(_burstArray[0]);

t.min = _decode(_burstArray[1]);

t.hour = _decodeH(_burstArray[2]);

t.Date = _decode(_burstArray[3]);

t.Mon = _decode(_burstArray[4]);

t.Dow = _burstArray [5];

t.Year = _decodeY (_burstArray [6]) 2000;

devolver t;

}

void DS1302::setTime (uint8_t hora, uint8_t min, uint8_t seg)

{

Si (((hora > = 0) & & (hora < 24)) & & ((min > = 0) & & (min < 60)) & & ((s > = 0) & & (sec < 60)))

{

_writeRegister (REG_HOUR, _encode(hour));

_writeRegister (REG_MIN, _encode(min));

_writeRegister (REG_SEC, _encode(sec));

}

}

void DS1302::setDate (uint8_t fecha, uint8_t el Lun, uint16_t año)

{

Si (((date>0) & & (fecha < = 31)) & & ((mon>0) & & (mon < = 12)) & & ((año > = 2000) & & (año < 3000)))

{

año-= 2000;

_writeRegister (REG_YEAR, _encode(year));

_writeRegister (REG_MON, _encode(mon));

_writeRegister (REG_DATE, _encode(date));

}

}

void DS1302::setDOW(uint8_t dow)

{

Si ((dow>0) & & (dow < 8))

_writeRegister (REG_DOW, dow);

}

char * DS1302::getTimeStr(uint8_t format)

{

char * salida = "xxxxxxxx";

Tiempo t;

t=getTime();

Si (t.hour < 10)

salida [0] = 48;

otra cosa

salida [0] = char ((t.hour / 10) + 48);

salida [1] = char ((t.hour % 10) + 48);

salida [2] = 58;

Si (t.min < 10)

de salida [3] = 48;

otra cosa

de salida [3] = char ((t.min / 10) + 48);

de salida [4] = char ((t.min % 10) + 48);

salida [5] = 58;

Si (formato == FORMAT_SHORT)

salida [5] = 0;

otra cosa

{

Si (t.sec < 10)

salida [6] = 48;

otra cosa

salida [6] = char ((t.sec / 10) + 48);

salida [7] = char ((t.sec % 10) + 48);

salida [8] = 0;

}

regreso salida;

}

char * DS1302::getDateStr(uint8_t slformat, uint8_t eformat, char divider)

{

char * salida = "xxxxxxxxxx";

int año, offset;

Tiempo t;

t=getTime();

interruptor (eformat)

{

caso FORMAT_LITTLEENDIAN:

Si (t.date < 10)

salida [0] = 48;

otra cosa

salida [0] = char ((t.date / 10) + 48);

salida [1] = char ((t.date % 10) + 48);

salida [2] = divisor;

Si (t.mon < 10)

de salida [3] = 48;

otra cosa

de salida [3] = char ((t.mon / 10) + 48);

de salida [4] = char ((t.mon % 10) + 48);

salida [5] = divisor;

Si (slformat == FORMAT_SHORT)

{

Yr=t.Year-2000;

Si (año < 10)

salida [6] = 48;

otra cosa

salida [6] = char ((yr / 10) + 48);

salida [7] = char ((yr % 10) + 48);

salida [8] = 0;

}

otra cosa

{

Yr=t.Year;

salida [6] = char ((yr / 1000) + 48);

salida [7] = char (((yr % 1000) / 100) + 48);

salida [8] = char (((yr % 100) / 10) + 48);

salida [9] = char ((yr % 10) + 48);

salida [10] = 0;

}

rotura;

caso FORMAT_BIGENDIAN:

Si (slformat == FORMAT_SHORT)

desplazamiento = 0;

otra cosa

offset = 2;

Si (slformat == FORMAT_SHORT)

{

Yr=t.Year-2000;

Si (año < 10)

salida [0] = 48;

otra cosa

salida [0] = char ((yr / 10) + 48);

salida [1] = char ((yr % 10) + 48);

salida [2] = divisor;

}

otra cosa

{

Yr=t.Year;

salida [0] = char ((yr / 1000) + 48);

salida [1] = char (((yr % 1000) / 100) + 48);

salida [2] = char (((yr % 100) / 10) + 48);

de salida [3] = char ((yr % 10) + 48);

de salida [4] = divisor;

}

Si (t.mon < 10)

salida [3 + desplazamiento] = 48;

otra cosa

salida [3 + desplazamiento] = char ((t.mon / 10) + 48);

salida [4 + offset] = char ((t.mon % 10) + 48);

salida [5 + desplazamiento] = divisor;

Si (t.date < 10)

salida [6 + desplazamiento] = 48;

otra cosa

salida [6 + desplazamiento] = char ((t.date / 10) + 48);

salida [7 + desplazamiento] = char ((t.date % 10) + 48);

salida [8 + desplazamiento] = 0;

rotura;

caso FORMAT_MIDDLEENDIAN:

Si (t.mon < 10)

salida [0] = 48;

otra cosa

salida [0] = char ((t.mon / 10) + 48);

salida [1] = char ((t.mon % 10) + 48);

salida [2] = divisor;

Si (t.date < 10)

de salida [3] = 48;

otra cosa

de salida [3] = char ((t.date / 10) + 48);

de salida [4] = char ((t.date % 10) + 48);

salida [5] = divisor;

Si (slformat == FORMAT_SHORT)

{

Yr=t.Year-2000;

Si (año < 10)

salida [6] = 48;

otra cosa

salida [6] = char ((yr / 10) + 48);

salida [7] = char ((yr % 10) + 48);

salida [8] = 0;

}

otra cosa

{

Yr=t.Year;

salida [6] = char ((yr / 1000) + 48);

salida [7] = char (((yr % 1000) / 100) + 48);

salida [8] = char (((yr % 100) / 10) + 48);

salida [9] = char ((yr % 10) + 48);

salida [10] = 0;

}

rotura;

}

regreso salida;

}

char * DS1302::getDOWStr(uint8_t format)

{

char * salida = "xxxxxxxxx";

Tiempo t;

t=getTime();

interruptor (t.dow)

{

caso el lunes:

salida = "Lunes";

rotura;

caso del martes:

salida = "Martes";

rotura;

caso del miércoles:

salida = "Miércoles";

rotura;

caso el jueves:

salida = "Jueves";

rotura;

caso del viernes:

salida = "Viernes";

rotura;

caso el sábado:

salida = "Sábado";

rotura;

caso el domingo:

salida = 'Domingo';

rotura;

}

Si (formato == FORMAT_SHORT)

de salida [3] = 0;

regreso salida;

}

char * DS1302::getMonthStr(uint8_t format)

{

char * salida = "xxxxxxxxx";

Tiempo t;

t=getTime();

interruptor (t.mon)

{

caso 1:

salida = "Enero";

rotura;

caso 2:

salida = "Febrero";

rotura;

caso 3:

salida = "Marzo";

rotura;

caso 4:

salida = "Abril";

rotura;

caso 5:

salida = "Mayo";

rotura;

caso 6:

salida = "Junio";

rotura;

caso 7:

salida = "Julio";

rotura;

caso 8:

salida = "Agosto";

rotura;

caso 9:

salida = "Septiembre";

rotura;

caso 10:

salida = "Octubre";

rotura;

caso 11:

salida = "Noviembre";

rotura;

caso 12:

salida = "Diciembre";

rotura;

}

Si (formato == FORMAT_SHORT)

de salida [3] = 0;

regreso salida;

}

void DS1302::halt (bool habilitar)

{

uint8_t _reg = _readRegister(REG_SEC);

_reg & = ~ (1 << 7);

_reg | = (activar << 7);

_writeRegister (REG_SEC, _reg);

}

void DS1302::writeProtect (bool habilitar)

{

uint8_t _reg = (activar << 7);

_writeRegister (REG_WP, _reg);

}

void DS1302::setTCR (uint8_t valor)

{

_writeRegister (REG_TCR, valor);

}

/ * Privada * /

DS1302::_readByte() de uint8_t

{

pinMode (_data_pin, entrada);

valor de uint8_t = 0;

uint8_t currentBit = 0;

para (int i = 0; i < 8; ++ i)

{

currentBit = digitalRead(_data_pin);

valor | = (currentBit << i);

digitalWrite (_sclk_pin, HIGH);

delayMicroseconds(1);

digitalWrite (_sclk_pin, bajo);

}

devolver valor;

}

void DS1302::_writeByte (uint8_t valor)

{

pinMode (_data_pin, salida);

shiftOut (_data_pin, _sclk_pin, LSBFIRST, valor);

}

DS1302::_readRegister de uint8_t (uint8_t reg)

{

cmdByte de uint8_t = 129;

cmdByte | = (reg << 1);

readValue de uint8_t;

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(cmdByte);

readValue = _readByte();

digitalWrite (_ce_pin, bajo);

volver readValue;

}

void DS1302::_writeRegister (reg de uint8_t, uint8_t valor)

{

cmdByte de uint8_t = (128 | (reg << 1));

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(cmdByte);

_writeByte(Value);

digitalWrite (_ce_pin, bajo);

}

void DS1302::_burstRead()

{

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(191);

para (int i = 0; i < 8; i ++)

{

_burstArray [i] = _readByte();

}

digitalWrite (_ce_pin, bajo);

}

DS1302::_decode de uint8_t (uint8_t valor)

{

uint8_t decodificados = valor & 127;

descifrada = (decodificado y 15) + 10 * ((decodificada & (15 << 4)) >> 4);

volver decodificado;

}

DS1302::_decodeH de uint8_t (uint8_t valor)

{

Si (valor y 128)

valor = (valor & 15) + (12 * ((value & 32) >> 5));

otra cosa

valor = (valor & 15) + (10 * ((value & 48) >> 4));

devolver valor;

}

DS1302::_decodeY de uint8_t (uint8_t valor)

{

uint8_t decodificados = (valor & 15) + 10 * ((valor & (15 << 4)) >> 4);

volver decodificado;

}

DS1302::_encode de uint8_t (uint8_t valor)

{

uint8_t codificado = ((value / 10) << 4) + (valor % 10);

retorno codificado;

}

void DS1302::writeBuffer (DS1302_RAM r)

{

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(254);

para (int i = 0; i < 31; i ++)

{

_writeByte(r.Cell[i]);

}

digitalWrite (_ce_pin, bajo);

}

DS1302_RAM DS1302::readBuffer()

{

DS1302_RAM r;

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(255);

para (int i = 0; i < 31; i ++)

{

r.Cell[i] = _readByte();

}

digitalWrite (_ce_pin, bajo);

devolver r;

}

void DS1302::poke (uint8_t addr, uint8_t valor)

{

Si ((addr > = 0) & & (addr < = 30))

{

addr = (addr * 2) + 192;

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(ADDR);

_writeByte(Value);

digitalWrite (_ce_pin, bajo);

}

}

DS1302::peek de uint8_t (uint8_t addr)

{

Si ((addr > = 0) & & (addr < = 30))

{

addr = (addr * 2) + 193;

readValue de uint8_t;

digitalWrite (_sclk_pin, bajo);

digitalWrite (_ce_pin, HIGH);

_writeByte(ADDR);

readValue = _readByte();

digitalWrite (_ce_pin, bajo);

volver readValue;

}

otra cosa

return 0;

}

Artículos Relacionados

Cómo para "Soldar" sin un soldador de aluminio

Cómo para "Soldar" sin un soldador de aluminio

Usando un soplete de propano y algunas barras de soldadura de aluminio es una manera rápida de aluminio de Unión sin necesidad de utilizar un soldador. Es un vínculo muy fuerte y con un poco de práctica se puede hacer rápidamente con grandes resultad
Otro tutorial sobre cómo soldar

Otro tutorial sobre cómo soldar

En este tutorial vamos a ver como soldar una cabecera de 16 pines a la pantalla de LCD 1602A.Lo que necesitamos para la soldadura es:1) un soldador o una estación de soldadura con una punta muy fina2) tin, para nuestro propósito con un 0.8-1.0 mm de
Cómo soldar - los secretos de la buena soldadura

Cómo soldar - los secretos de la buena soldadura

he visto montón de asesoramiento a personas para soldar componentes electrónicos, algunas buenas, otras no tan bueno. He visto personas utilizar a todo tipo de basura y dicen que hace el trabajo, $2 soldadores y otras cosas locas. sí puede derretir l
Final 14-en-1 ayuda manos estación de soldadura!

Final 14-en-1 ayuda manos estación de soldadura!

Este es un proyecto que me tomó aproximadamente 2 meses para hacer, no porque sea muy complicado, pero si te fijas en la lista siguiente, probablemente a entender por qué... No sé por qué, pero por alguna razón, algo es adictivo para pensar en más fu
Presupuesto de luces bicicleta

Presupuesto de luces bicicleta

Conseguir un impulso de la seguridad y reciclar plástico viejo! Estas luces de advertencia direccional de omni aumentar la visibilidad, pueden como señales de la vuelta y fijar a los extremos del manillar. Costo puede ser bajo $5, con muchas piezas s
Esquí-bicicleta (suspensión completa)

Esquí-bicicleta (suspensión completa)

Esta moto Ski fue inspirada por varias bicicletas disponibles comercialmente que deseo después, pero no podía permitirse.Es el segundo que has hecho y que sólo ha visto tres días en la nieve hasta ahora.Tomé la primera de ellas que hice a Les Arcs en
Kit Detector de error de FM

Kit Detector de error de FM

Esto es para todos los espías/paranoico por ahí. Un pedazo esencial de equipo para cualquier spy es un Detector de fallos electrónicos. Nunca se sabe qué gobierno Agencia puede estar intentando escuchar sus conversaciones o tratando de secreto video
Libre servidor DNS dinámico con Esp8266 y OSD interfaz de Webcam FOSCAM

Libre servidor DNS dinámico con Esp8266 y OSD interfaz de Webcam FOSCAM

Hacer tu propio servidor de DDNS para acceder a sus casa dispositivos de internet, ningún servicio de pago es necesario!Control de cámaras Foscam desde su teléfono, con pantalla controles. Votar si te gusta!Esta configuración viene debajo de $10, y e
Cable de carga de paracord

Cable de carga de paracord

Cables carga por USB, que todos tienen. Probablemente, usted tiene muchos de ellos sentados alrededor de recoger el polvo. Si eres como la mayoría, tuyo es blanco o negro taladro longitud de plástico y metal. ¿Por qué conformarse con bla, cuando uste
Cómo hacer una nube de rayos

Cómo hacer una nube de rayos

Quería hacer una pequeña nube que se ilumina como si se llenó de relámpagos. Después de googlear un poco, me topé con "la nube" de Richard Clarkson. Es un concepto muy bien ejecutado y quería ver si podía hacer uno también. Hay un montóndeejempl
Un marco para la fabricación de reguladores modulares asequible y con estilo (USB a MIDI, HID, o serie)

Un marco para la fabricación de reguladores modulares asequible y con estilo (USB a MIDI, HID, o serie)

***HE CREADO UN NUEVO INSTRUCTIVO PARA CONTROLADORES DE DIY:**********************************************************************************************************************************************************************************************
Vibrante cronometrador

Vibrante cronometrador

hice un reloj sin rostro. En cambio, el tiempo es dado cada cuarto de hora a través de una serie de pulsos de un motor de vibración, en el mismo formato que un reloj de abuelo. Por lo tanto, si es 3:15, el motor hará tres vibraciones largo seguidas d
Falso TV - elemento disuasivo antirrobo

Falso TV - elemento disuasivo antirrobo

Me fue ir de compras alrededor en Amazon el otro día y encontré un producto que era genio. Se llama TV falsos y actúa como un disuasivo antirrobo mientras estás lejos de la casa. Por la noche, la TV falsos enciende y utiliza una serie de LEDs de colo
TallChop, Tallbike y una Chopper

TallChop, Tallbike y una Chopper

TallChop: Se trata de una TallBike transformador Chopper o al revés.Realmente no sé por qué lo hice pero vi algo que despertó la idea por lo que he construido.Paso 1: Encuentre algunos 26 pulgadas bicicletas de suspensión completa de Junker1. encontr