RTCModuleDS1302 et LCDI2C16x02 (A0, A1, A2 non soudé sans un pont) (2 / 6 étapes)

Étape 2: Bibliothèque DS1302.cpp

/*

DS1302.cpp - soutien bibliothèque Arduino pour la puce de chronométrage de courant de Charge de DS1302

Copyright (C) 2010 Henning Karlsen. Tous droits réservés

Vous pouvez trouver la dernière version de la bibliothèque à

http://www.henningkarlsen.com/Electronics

Cette bibliothèque a été déposée auprès de l’interface facilement et utiliser le RTC DS1302 avec

l’Arduino.

Si vous apportez des modifications ou des améliorations au code, je vous serais reconnaissant

que vous partagez le code avec moi afin que je pourrais inclure dans la prochaine version.

Je peux être contacté par le biais de http://www.henningkarlsen.com/electronics/contact.php

Cette bibliothèque est un logiciel libre ; vous pouvez le redistribuer et/ou

modifier selon les termes de la GNU Lesser Grand Public

License telle que publiée par la Free Software Foundation ; ou l’autre

version 2.1 de la licence, ou (à votre choix) toute version ultérieure.

Cette bibliothèque est distribuée dans l’espoir qu’il sera utile,

mais sans aucune garantie ; sans même la garantie implicite de

Qualité marchande ou ADEQUATION a un usage particulier. Voir la GNU

Lesser General Public License pour plus de détails.

Vous devriez avoir reçu une copie de la GNU Lesser Grand Public

License along with this library ; Si tel n’est pas le cas, écrivez à la Free Software

Foundation, Inc., 51 Franklin St, 5ème étage, 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

/ * Public * /

Temps:: Time()

{

This -> année = 2010 ;

This -> LUN = 1 ;

cette date-> = 1 ;

This -> heure = 0 ;

This -> min = 0 ;

This -> s = 0 ;

This -> dow = 5 ;

}

DS1302_RAM::DS1302_RAM()

{

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

cellule [i] = 0 ;

}

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

{

_ce_pin = ce_pin ;

_data_pin = data_pin ;

_sclk_pin = sclk_pin ;

pinMode (_ce_pin, sortie) ;

pinMode (_sclk_pin, sortie) ;

}

Temps DS1302::getTime()

{

Temps 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 ;

retour t ;

}

void DS1302::setTime (uint8_t heure, min uint8_t, uint8_t s)

{

Si (((h > = 0) & & (heure < 24)) & & ((min > = 0) & & (min < 60)) & & ((s > = 0) & & (s < 60)))

{

_writeRegister (REG_HOUR, _encode(hour)) ;

_writeRegister (REG_MIN, _encode(min)) ;

_writeRegister (REG_SEC, _encode(sec)) ;

}

}

void DS1302::setDate (uint8_t date, uint8_t Lun, uint16_t année)

{

Si (((date>0) & & (date < = 31)) & & ((mon>0) & & (LUN < = 12)) & & ((année > = 2000) & & (an < 3000)))

{

an-= 2000 ;

_writeRegister (REG_YEAR, _encode(year)) ;

_writeRegister (REG_MON, _encode(mon)) ;

_writeRegister (REG_DATE, _encode(date)) ;

}

}

Sub DS1302::setDOW(uint8_t dow)

{

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

_writeRegister (REG_DOW, dow) ;

}

char * DS1302::getTimeStr(uint8_t format)

{

char * sortie = « xxxxxxxx » ;

Temps t ;

t=getTime() ;

Si (t.hour < 10)

sortie [0] = 48 ;

d’autre

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

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

sortie [2] = 58 ;

Si (t.min < 10)

sortie [3] = 48 ;

d’autre

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

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

sortie [5] = 58 ;

Si (format == FORMAT_SHORT)

sortie [5] = 0 ;

d’autre

{

Si (t.sec < 10)

sortie [6] = 48 ;

d’autre

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

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

sortie [8] = 0 ;

}

retour de sortie ;

}

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

{

char * sortie = « xxxxxxxxxx » ;

int yr, offset ;

Temps t ;

t=getTime() ;

Switch (eformat)

{

affaire FORMAT_LITTLEENDIAN :

Si (t.date < 10)

sortie [0] = 48 ;

d’autre

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

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

sortie [2] = diviseur ;

Si (t.mon < 10)

sortie [3] = 48 ;

d’autre

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

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

sortie [5] = diviseur ;

Si (slformat == FORMAT_SHORT)

{

YR=t.Year-2000 ;

Si (an < 10)

sortie [6] = 48 ;

d’autre

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

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

sortie [8] = 0 ;

}

d’autre

{

YR=t.Year ;

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

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

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

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

sortie [10] = 0 ;

}

rupture ;

affaire FORMAT_BIGENDIAN :

Si (slformat == FORMAT_SHORT)

offset = 0 ;

d’autre

offset = 2 ;

Si (slformat == FORMAT_SHORT)

{

YR=t.Year-2000 ;

Si (an < 10)

sortie [0] = 48 ;

d’autre

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

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

sortie [2] = diviseur ;

}

d’autre

{

YR=t.Year ;

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

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

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

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

sortie [4] = diviseur ;

}

Si (t.mon < 10)

sortie [3 + décalage] = 48 ;

d’autre

sortie [3 + décalage] = char ((t.mon / 10) + 48) ;

sortie [4 + décalage] = char ((t.mon % 10) + 48) ;

sortie [5 + décalage] = diviseur ;

Si (t.date < 10)

sortie [offset 6 +] = 48 ;

d’autre

sortie [6 + décalage] = char ((t.date / 10) + 48) ;

sortie [7 + décalage] = char ((t.date % 10) + 48) ;

sortie [8 + décalage] = 0 ;

rupture ;

affaire FORMAT_MIDDLEENDIAN :

Si (t.mon < 10)

sortie [0] = 48 ;

d’autre

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

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

sortie [2] = diviseur ;

Si (t.date < 10)

sortie [3] = 48 ;

d’autre

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

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

sortie [5] = diviseur ;

Si (slformat == FORMAT_SHORT)

{

YR=t.Year-2000 ;

Si (an < 10)

sortie [6] = 48 ;

d’autre

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

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

sortie [8] = 0 ;

}

d’autre

{

YR=t.Year ;

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

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

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

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

sortie [10] = 0 ;

}

rupture ;

}

retour de sortie ;

}

char * DS1302::getDOWStr(uint8_t format)

{

char * sortie = « xxxxxxxxx » ;

Temps t ;

t=getTime() ;

Switch (t.dow)

{

décision lundi :

sortie = « Lundi » ;

rupture ;

décision mardi :

sortie = « Mardi » ;

rupture ;

cas mercredi :

sortie = « Mercredi » ;

rupture ;

décision jeudi :

sortie = « Jeudi » ;

rupture ;

cas vendredi :

sortie = « Vendredi » ;

rupture ;

cas de samedi :

sortie = « Samedi » ;

rupture ;

cas de dimanche :

sortie = « Dimanche » ;

rupture ;

}

Si (format == FORMAT_SHORT)

sortie [3] = 0 ;

retour de sortie ;

}

char * DS1302::getMonthStr(uint8_t format)

{

char * sortie = « xxxxxxxxx » ;

Temps t ;

t=getTime() ;

Switch (t.mon)

{

cas 1 :

sortie = « Janvier » ;

rupture ;

cas 2 :

sortie = « Février » ;

rupture ;

cas 3 :

sortie = « Mars » ;

rupture ;

cas 4 :

sortie = « Avril » ;

rupture ;

cas no 5 :

sortie = « Mai » ;

rupture ;

cas 6 :

sortie = « Juin » ;

rupture ;

cas 7 :

sortie = « Juillet » ;

rupture ;

cas 8 :

sortie = « Août » ;

rupture ;

cas 9 :

sortie = « Septembre » ;

rupture ;

cas no 10 :

sortie = « Octobre » ;

rupture ;

cas no 11 :

sortie = « Novembre » ;

rupture ;

cas 12 :

sortie = « Décembre » ;

rupture ;

}

Si (format == FORMAT_SHORT)

sortie [3] = 0 ;

retour de sortie ;

}

void DS1302::halt (Boolean enable)

{

uint8_t _reg = _readRegister(REG_SEC) ;

_reg & = ~ (1 << 7) ;

_reg | = (activez << 7) ;

_writeRegister (REG_SEC, _reg) ;

}

void DS1302::writeProtect (Boolean enable)

{

uint8_t _reg = (activez << 7) ;

_writeRegister (REG_WP, _reg) ;

}

void DS1302::setTCR (valeur uint8_t)

{

_writeRegister (REG_TCR, valeur) ;

}

/ * Privé * /

uint8_t DS1302::_readByte()

{

pinMode (_data_pin, entrée) ;

valeur d’uint8_t = 0 ;

uint8_t currentBit = 0 ;

pour (int i = 0; i < 8; ++ j’ai)

{

currentBit = digitalRead(_data_pin) ;

valeur | = (currentBit << j’ai) ;

digitalWrite (_sclk_pin, HIGH) ;

delayMicroseconds(1) ;

digitalWrite (_sclk_pin, basse) ;

}

retourne la valeur ;

}

void DS1302::_writeByte (valeur uint8_t)

{

pinMode (_data_pin, sortie) ;

shiftOut (_data_pin, _sclk_pin, LSBFIRST, valeur) ;

}

uint8_t DS1302::_readRegister (uint8_t reg)

{

uint8_t cmdByte = 129 ;

cmdByte | = (reg << 1) ;

uint8_t readValue ;

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(cmdByte) ;

readValue = _readByte() ;

digitalWrite (_ce_pin, basse) ;

retour readValue ;

}

void DS1302::_writeRegister (uint8_t reg, uint8_t value)

{

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

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(cmdByte) ;

_writeByte(value) ;

digitalWrite (_ce_pin, basse) ;

}

Sub DS1302::_burstRead()

{

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(191) ;

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

{

_burstArray [i] = _readByte() ;

}

digitalWrite (_ce_pin, basse) ;

}

uint8_t DS1302::_decode (valeur uint8_t)

{

uint8_t décodé = valeur & 127 ;

décodés = (décodé & 15) + 10 * ((décodé & (15 << 4)) >> 4) ;

retour décodé ;

}

uint8_t DS1302::_decodeH (valeur uint8_t)

{

Si (valeur & 128)

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

d’autre

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

retourne la valeur ;

}

uint8_t DS1302::_decodeY (valeur uint8_t)

{

uint8_t décodé = (valeur & 15) + 10 * ((valeur & (15 << 4)) >> 4) ;

retour décodé ;

}

uint8_t DS1302::_encode (valeur uint8_t)

{

uint8_t encodé = ((value / 10) << 4) + (10 % valeur) ;

retour codée ;

}

void DS1302::writeBuffer (DS1302_RAM r)

{

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(254) ;

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

{

_writeByte(r.Cell[i]) ;

}

digitalWrite (_ce_pin, basse) ;

}

DS1302_RAM DS1302::readBuffer()

{

DS1302_RAM r ;

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(255) ;

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

{

r.Cell[i] = _readByte() ;

}

digitalWrite (_ce_pin, basse) ;

Return r ;

}

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

{

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

{

addr = (addr * 2) + 192 ;

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(addr) ;

_writeByte(value) ;

digitalWrite (_ce_pin, basse) ;

}

}

uint8_t DS1302::peek (uint8_t addr)

{

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

{

addr = (addr * 2) + 193 ;

uint8_t readValue ;

digitalWrite (_sclk_pin, basse) ;

digitalWrite (_ce_pin, HIGH) ;

_writeByte(addr) ;

readValue = _readByte() ;

digitalWrite (_ce_pin, basse) ;

retour readValue ;

}

d’autre

return 0 ;

}

Articles Liés

Lanterne solaire non souder

Lanterne solaire non souder

Éclairage solaire extérieur est devenu extrêmement populaire au cours des dernières années, et pourtant combien de personnes connaissez vous qui peut expliquer comment ça marche ? Heureusement solaire est une source d'alimentation super simple que no
Médicamenteux Rice Krispies Treats Non OGM & sans Gluten

Médicamenteux Rice Krispies Treats Non OGM & sans Gluten

Vivant au Colorado ces jours-ci a certains avantages étonnants. Être capable de lutter contre la douleur chronique avec la chronique est un des nombreux. (Nous avons aussi des brasseries plus que tout autre État, par personne.) J'ai décidé de plonger
Comment souder - les secrets de la bonne soudure

Comment souder - les secrets de la bonne soudure

j'ai vu beaucoup de conseils donnés aux personnes sur le soudage des composants électroniques, certaines d'entre elles bien, d'autres non tout va bien. J'ai vu des gens utiliser toutes sortes de détritus et de prétendre qu'il fait le travail, les fer
Souder avancé : Rapide et facile à souder de Surface Mount composants

Souder avancé : Rapide et facile à souder de Surface Mount composants

facilement souder des composants montés en surface comme les LEDs et les SOIC moindre taille ICs. Faites vos propres petits conseils.Comme plus ICs DIP sont être déroutés sur, certains d'entre eux sont seulement disponibles en dispositifs de montage
Robot de soudure non, drôle en Minutes (Bristlebot)

Robot de soudure non, drôle en Minutes (Bristlebot)

Résumé :Construire un robot pas cher avec aucune soudure, sans aucune programmation et aucun travail mécanique. Il est construit sur une brosse à vaisselle. Pour avancer, il utilisera les vibrations transmises de façon asymétrique par le ciseau des s
Soudé clouer arbre de Noël ornement

Soudé clouer arbre de Noël ornement

cet ornement est une crèche "J'ai vu sur eBay.  Antique carré coupe ongles (2ème photo à cette étape) se prêtent à l'oeuvre de toutes sortes.  Voir aussi mon Instructable sur l'apport d'une Jérusalem croix à accrocher sur le mur.Coupe carrée béton cl
Utiliser un pistolet à souder pour électronique délicat

Utiliser un pistolet à souder pour électronique délicat

Des semi-conducteurs, comme les diodes et transistors peuvent facilement être endommagés par trop de chaleur. Fers à souder de faible puissance de 15 à 25 watts sont recommandés. J'ai utilisé ma chaleur double de presque 50 ans, 100/140 Watt souder p
Micro-torche à souder

Micro-torche à souder

j'aime souder avec un chalumeau. Il est utile pour toutes sortes d'applications, et c'est une excellente façon de rejoindre le métal qui est trop grand pour un fer à souder, mais trop petits pour une bonne lampe de poche.Il s'agit d'une initiation à
Fer à souder se démarquer de ressort trampoline

Fer à souder se démarquer de ressort trampoline

Avez-vous jamais acheté un fer à souder sans une béquille ou un très bon marché. Dans l'affirmative, voici un projet pour vous. Nous allons faire un stand de souder sur un ressort trampoline et un morceau de bois. J'ai fait le mien dans environ 20 à
Ultime 14-en-1 coup mains Station de soudage !

Ultime 14-en-1 coup mains Station de soudage !

Il s'agit d'un projet qui m'a pris environ 2 mois pour faire, non pas parce que c'est très compliqué, mais si vous regardez la liste ci-dessous, vous comprendrez sans doute pourquoi... Je ne sais pas pourquoi, mais pour une raison quelconque, il est
LED Cube 8 x 8 x 8

LED Cube 8 x 8 x 8

affichage 3-dimensionnelle de créer votre propre 8 x 8 x 8 LED Cube !Nous croyons que ce Instructable est le plus complet guide étape par étape pour construire un 8 x 8 x 8 que LED Cube jamais publié sur l'intertubes. Il vous apprendra tout de princi
Piment rouge, Jalapeno Jack fromage, Bacon semoule de maïs Muffins &

Piment rouge, Jalapeno Jack fromage, Bacon semoule de maïs Muffins &

Étant donné que j'ai eu certains d'entre le Jalapeno émincé & Habanero Jack fromage le surplus de ma recette de Poivre au gril Londres que j'ai posté récemment, j'ai décidé d'essayer de l'utiliser dans une recette de pain de maïs Jalapeno fromage que
Comment construire une catapulte

Comment construire une catapulte

il y a déjà quelques grands trébuchet Instructables là-bas, mais pour les amateurs de médiévales Low-Tech, voici la première à grande échelle catapulte Instructable !Il a été construit au cours de mon stage @ Instructables l'été dernier, avecDeranged
Paracord câble de charge

Paracord câble de charge

Câbles USB de charge, nous avons tous les avoir. Vous avez probablement, beaucoup d'entre eux assis autour de collecte de la poussière. Si vous êtes comme la plupart, le vôtre est un blanc ou noir alésage longueur de plastique et de métal. Pourquoi s