Orologio con Arduino
Per realizzare l'orologio, oltre ad un Arduino Leonardo (ma può essere usato qualsiasi altro modello l'unica variante riguarda i pin SDA e SCL da verificare), ho usato un modulo DS1307 (real time clock) contenente una batteria 2032 da 3V che permette di tenere traccia del tempo e della data anche se viene a mancare l'alimentazione all'Arduino, un modulo DHT11 sensore di temperatura e umidità, e un pannello LCD1602 in grado di visualizzare 16 caratteri per riga su 2 righe.
Per scrivere lo schetch ho mescolato il codice da tre esempi, il primo contenuto nei file della libreria DS1307 di Mirko Prosseda, il secondo, quello che visualizza i dati sul display di Mauri Alfieri (http://www.mauroalfieri.it/elettronica/rtc-arduino-come-orologio.html) e il terzo il mio Termometro/igrometro digitale con Arduino con invio dei dati su connessione Bluetooth preso dalla sezione Miei progetti.
Ho deciso di visualizzare i dati sul display in modo ordinato. Sulla prima riga la data con il seguente formato "ggg gg mmm aaaa", esempio "lun 13 apr 2015". Sulla seconda riga l'ora "hh:mm:ss", esempio "08:23:12", la temperatura e l'umidità.
Ecco il codice non ancora commentato:
/*####################################################################
DS1307 connections:
* BOARD -> ARDUINO Leonardo
* Vcc -> 5V
* GND -> GND
* SDA -> SDA
* SCL -> SCL
LCD1602 connection:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 7
* LCD D5 pin to digital pin 6
* LCD D6 pin to digital pin 5
* LCD D7 pin to digital pin 4
DHT11 connection:
* 1 -> 5V
* 2 -> pin 8
* 4 -> GND
Giuseppe Tamanini 04/2015
Questo codice è di pubblico dominio
#######################################################################*/
#include <ds1307.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <dht11.h>
#define DHT11_PIN 8
#define BACKLIGHT 2
#define CONTRAST 3
dht11 DHT;
char bufferdate[8];
char* StringS[]={"lun","mar","mer","gio","ven","sab","dom"};
char* StringM[]={"gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"};
int ultimo;
int chk;
int i=1;
ds1307 DS1307;
uint8_t buffer[7]; // receiving buffer
LiquidCrystal lcd(12,11,7,6,5,4);
byte newChar1[8] = {
B01100,
B10010,
B10010,
B01100,
B00000,
B00000,
B00000,
B00000
};
void setup() {
pinMode(BACKLIGHT,OUTPUT);
pinMode(CONTRAST,OUTPUT);
digitalWrite(BACKLIGHT,HIGH);
analogWrite(CONTRAST,40);
Wire.begin();
lcd.createChar(1,newChar1);
lcd.begin(16,2);
//lcd.setCursor(0,0);
//lcd.print("Data:");
//lcd.setCursor(0,1);
//lcd.print("Ora:");
DS1307.resume();
DS1307.getDate(buffer);
ultimo==buffer[0];
}
void loop() {
DS1307.getDate(buffer);
if (ultimo!=buffer[0]) {
lcd.setCursor(0,0);
lcd.print(StringS[buffer[3]-1]);
sprintf(bufferdate,"%02d",buffer[4]);
lcd.setCursor(5,0);
lcd.print(bufferdate);
lcd.setCursor(8,0);
lcd.print(StringM[buffer[5]-1]);
sprintf(bufferdate,"%04d",buffer[6]+2000);
lcd.setCursor(12,0);
lcd.print(bufferdate);
sprintf(bufferdate,"%02d:%02d:%02d",buffer[2],buffer[1],buffer[0]);
lcd.setCursor(0,1);
lcd.print(bufferdate);
chk=DHT.read(DHT11_PIN);
lcd.setCursor(9,1);
lcd.print(DHT.temperature,1);
lcd.write(i);
lcd.setCursor(13,1);
lcd.print(DHT.humidity,1);
lcd.print("%");
}
delay(100);
}
Giuseppe Tamanini - CC BY-SA
|