Orologio con Arduino


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



Articolo tratto da: Filodrammatica ViVa di Vigolo Vattaro - http://www.filoviva.it/
URL di riferimento: http://www.filoviva.it//index.php?mod=08_guide/05_arduino1/00_orologio_con_arduino