Une horloge ? Pourquoi faire ? Il y en a dans toutes les pièces de la maison.
Oui mais celle-ci marche avec mon Arduino Uno et Internet.
C'est dire si ça m'a permis d'approfondir certaines connaissances.
Le langage Arduino comprend des fonctions date et heure mais il faut lui donner une référence d'heure réelle.
Sinon elle démarre au 1 janvier 1970 0h.
L'heure réelle peut provenir de l'ordinateur par une requête Ajax :
function obtainDate(){
var now = new Date();
dateString = now.getDate()+'/';
dateString += now.getMonth()+1+'/';
dateString += now.getFullYear()+' ';
dateString += now.getHours()+':';
dateString += now.getMinutes()+':';
dateString += now.getSeconds();
$("#date").text(dateString);
sendDateToArduino(dateString);
}
function sendDateToArduino(arg){
$.ajax({
url: "http://"+adrIP+":"+port,
dataType: 'text',
data: { cmd: 'DATE'+arg },
success: function(data) { console.log(data); },
error:function (xhr, ajaxOptions, thrownError) { alert(xhr.status); alert(thrownError); }
});
}
ou bien d'un circuit additionnel : horloge temps réel (DS1307) ou module radio-piloté (DCF-77)
ou encore d'Internet via un serveur de temps.
C'est cette solution que nous avons choisie en adaptant l'exemple UdpNtpClient de la bibliothèque Arduino.
Ce temps étant donné en UTC, il reste à obtenir le décalage (heure locale).
Celle-ci est fournie ici par PHP
<?php
et récupérée par un HTTP GET.
date_default_timezone_set('UTC');
$localtime = localtime();
$h1 = $localtime[2];
date_default_timezone_set('Europe/Paris');
$localtime = localtime();
$h2 = $localtime[2];
$offset = $h1 - $h2;
if ($offset > 0) $offset -= 24;
echo 3600*$offset;
?>
Afin de ne pas rater le passage été/hiver mais pour ne pas multiplier les accès réseau, la mise à l'heure est effectuée toutes les quinze minutes.
Pour l'affichage de la date et l'heure, l'afficheur LCD deux lignes de 16 caractères est tout à fait adapté.
Cependant le brochage standard Arduino interfère avec celui du shield Ethernet, nous avons donc refait le câblage :
LiquidCrystal lcd(9, 8, 7, 6, 5, 3);
au lieu de
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Une petite vidéo du résultat