Reloj con temperatura humedad y presión LCD, y corrección invierno verano en TFT

soy principiante, no se si el código es lo mas depurado y correcto, si me funcionan...

con arduino leonardo, display de 20x4 azul, dos DHT11, los 22 van mejor pero no conseguí, y un RTC chronodot 2.1 que es mas preciso que los normales, y un BMP180 para la presión.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "Chronodot.h"
Chronodot RTC;
#define Chronodot 0x68
#include <Adafruit_BMP085.h>
#define BMP085_I2CADDR 0x77
#include "DHT.h"

#define DHTPIN 4
#define DHT_A_PIN 4
#define DHT_A_TYPE DHT11

DHT dht_A(DHT_A_PIN, DHT_A_TYPE);

#define DHTPIN 7
#define DHT_B_PIN 7
#define DHT_B_TYPE DHT11

DHT dht_B(DHT_B_PIN, DHT_B_TYPE);

Adafruit_BMP085 bmp;
LiquidCrystal_I2C lcd(0x27, 20, 4);

int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int hora = 1;
int hora1 = 0;
int minut = 4;
int minut1 = 3;
int segu = 7;
int segu1 = 6;
int dia = 11;
int mes = 14;
int dia1 = 10;
int mes1 = 13;
int pres = 0;

void setup()
{
Wire.begin();
RTC.begin();
lcd.begin();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp. i c o c");
lcd.setCursor(0,1);
lcd.print("Humedad i % o %");
lcd.setCursor(0,2);
lcd.print("Presion");
bmp.begin();
lcd.setCursor(2,3);
lcd.print(":");
lcd.setCursor(5,3);
lcd.print(":");
lcd.setCursor(15,3);
lcd.print("/");
lcd.setCursor(12,3);
lcd.print("/");
//RTC.adjust(DateTime(2014, 6, 29, 21, 24, 30));// poner fecha //
}

void loop()
{
DateTime now = RTC.now();
Serial.print(now.second());
if (now.hour() < 10) a=hora;
if (now.hour() < 10) {lcd.setCursor(hora1,3);
lcd.print("0");}
if (now.minute() < 10) b=minut;
if (now.minute() < 10) {lcd.setCursor(minut1,3);
lcd.print("0");}
if (now.second() < 10) c=segu;
if (now.second() < 10) {lcd.setCursor(segu1,3);
lcd.print("0");}
if (now.hour() >= 10) a=hora1;
if (now.minute() >= 10) b=minut1;
if (now.second() >= 10) c=segu1;
lcd.setCursor(a,3);
lcd.print(now.hour());
lcd.setCursor(b,3);
lcd.print(now.minute());
lcd.setCursor(c,3);
lcd.print(now.second());
if (now.day() < 10) d=dia;
if (now.day() < 10) {lcd.setCursor(dia1,3);
lcd.print("0");}
if (now.month() < 10) e=mes;
if (now.month() < 10) {lcd.setCursor(mes1,3);
lcd.print("0");}
if (now.day() >= 10) d=dia1;
if (now.month() >= 10) e=mes1;
lcd.setCursor(d,3);
lcd.print(now.day());
lcd.setCursor(e,3);
lcd.print(now.month());
lcd.setCursor(16,3);
lcd.print(now.year());

if(now.second() <= 0)
{
lcd.setCursor(11,1);
lcd.print(int(dht_A.readHumidity()));
lcd.setCursor(11,0);
lcd.print(int(dht_A.readTemperature()));
lcd.setCursor(17,1);
lcd.print(int(dht_B.readHumidity()));
lcd.setCursor(17,0);
lcd.print(int(dht_B.readTemperature()));
lcd.setCursor(14,2);
lcd.print(bmp.readPressure());
}
}

arduino 2560 y TFT R61581

#include <Adafruit_BMP085.h>
#include <UTFT.h>
#include <Wire.h>
#include <Time.h>
#include <Timezone.h>
Adafruit_BMP085 bmp;
#define DS1307_I2C_ADDRESS 0x68 //direccion comunicacion reloj
#define BMP085_I2CADDR 0x77 //direccion comunicacion barometro
#include "DHT.h" //cargamos la librería DHT
#define DHTPIN 12 //Seleccionamos el pin en el que se //conectará el sensor
#define DHTTYPE DHT11 //Se selecciona el DHT11 (hay //otros DHT)
DHT dht(DHTPIN, DHTTYPE); //Se inicia una variable que será usada por Arduino para comunicarse con el sensor

UTFT myGLCD(R61581,38,39,40,41);

extern uint8_t SevenSegNumFontPlus[];
extern uint8_t Inconsola[];

int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int hora = 40;
int hora1 = 10;
int minut = 130;
int minut1 = 100;
int segu = 300;
int segu1 = 270;
int dia = 220;
int mes = 297;
int dia1 = 190;
int mes1= 267;
int pres = 0;

//Central European Time (Frankfurt, Paris)
TimeChangeRule myDST = {"EDT", Last, Sun, Mar, 2, 120}; //Central European Summer Time
TimeChangeRule mySTD = {"EST", Last, Sun, Oct, 3, 60}; //Central European Standard Time
Timezone myTZ(myDST, mySTD);

TimeChangeRule *tcr; //pointer to the time change rule, use to get TZ abbrev
time_t utc, local;

//Function to return the compile date and time as a time_t value
time_t compileTime(void)
{
#define FUDGE 25 //fudge factor to allow for compile time (seconds, YMMV)

char *compDate = DATE, *compTime = TIME, *months = "JanFebMarAprMayJunJulAugSepOctNovDec";
char chMon[3], *m;
int d, y;
tmElements_t tm;
time_t t;

strncpy(chMon, compDate, 3);
chMon[3] = '\0';
m = strstr(months, chMon);
tm.Month = ((m - months) / 3 + 1);

tm.Day = atoi(compDate + 4);
tm.Year = atoi(compDate + 7) - 1970;
tm.Hour = atoi(compTime);
tm.Minute = atoi(compTime + 3);
tm.Second = atoi(compTime + 6);
t = makeTime(tm);
return t + FUDGE; //add fudge factor to allow for compile time
}

void setup()
{
setTime(myTZ.toUTC(compileTime()));
//setTime(10, 24, 30, 5, 7, 2014); // set hora UTC
pinMode(8, OUTPUT); digitalWrite(8, LOW); //ping alimentacion vcc - rtc bmp dht
pinMode(9, OUTPUT); digitalWrite(9, HIGH); //ping alimentacion vcc + rtc bmp dht
myGLCD.InitLCD(1);
myGLCD.clrScr();
myGLCD.setColor(0,0,0);
myGLCD.setBackColor(255,255,255);
myGLCD.fillScr(255,255,255);
myGLCD.setFont(Inconsola);
myGLCD.print("PRESION:",20,40);
myGLCD.print("TEMPERATURA:",20,100);
myGLCD.print("HUMEDAD:",20,160);
myGLCD.print("HP",420,40);
myGLCD.print("'C",410,100);
myGLCD.print(" %",410,160);
myGLCD.setFont(SevenSegNumFontPlus);
myGLCD.print(":",70,240);
bmp.begin();
delay(1000);
myGLCD.setFont(Inconsola);
float pres = bmp.readPressure();
myGLCD.printNumI((pres),260,40);//presion se puede corregir + - press
myGLCD.printNumI(bmp.readTemperature(),360,100);//temp
myGLCD.printNumI(dht.readHumidity(),360,160);//humedad
}

void loop(void)
{
utc = now();
//printTime(utc, "UTC");
local = myTZ.toLocal(utc, &tcr);
printTime(local, tcr -> abbrev);

}

//Function to print time with time zone
void printTime(time_t t, char *tz)
{
myGLCD.setFont(SevenSegNumFontPlus);

if (minute(t) < 10) b=minut;
if (minute(t) < 10) myGLCD.printNumI(0,minut1,240);
if (hour(t) < 10) a=hora;
if (hour(t) < 10) myGLCD.printNumI(0,hora1,240);
if (minute(t) >= 10) b=minut1;
if (hour(t) >= 10) a=hora1;
myGLCD.printNumI(hour(t),a,240);//hora//
myGLCD.printNumI(minute(t),b,240);//min//

if (day(t) < 10) d=dia;
if (day(t) < 10) myGLCD.printNumI(0,dia1,240);
if (month(t) < 10) e=mes;
if (month(t) < 10) myGLCD.printNumI(0,mes1,240);
if (day(t) >= 10) d=dia1;
if (month(t) >= 10) e=mes1;

myGLCD.printNumI(day(t),d,240);
myGLCD.printNumI(month(t),e,240);
myGLCD.printNumI(year(t),340,240);

if (second(t)<= 0) {
myGLCD.setFont(Inconsola);
float pres = bmp.readPressure();
myGLCD.print(" ",260,40);
myGLCD.printNumI((pres),260,40);//presion se puede corregir + - press
myGLCD.print(" ",360,100);
myGLCD.printNumI(bmp.readTemperature(),360,100);//temp
myGLCD.print(" ",360,160);
myGLCD.printNumI(dht.readHumidity(),360,160);//humedad
delay(500);
}
}

Genial el trabajo! gracias por compartir!

Te interesaria añadirle conectividad de red a esa estacion meteorologica? Tener una grafica de los datos? añadirle funcionalidades de forma sencilla? =) Nos vendria bien en el proyecto Souliss que (si estas interesado) añadieras tus sugerencias e ideas :slight_smile: Una que me ha gustado ha sido la de añadir un Display para mostrar los datos y el RTC con Timezone :slight_smile:

Salu2 y buen Karma :slight_smile:

que tal juan, ok, si sigo con ello, volcare mis sketch sin problemas.

si estuve pensando en el historico de presión, incluso el dibujito de lluvia o nublado.

te tira un poco para atrás ver que los chinos lo hacen por 10 euros...

he encontrado el DCF77 radio clock receiver, que envía la información de hora y fecha cada un minuto a media europa, me podría liberar de todo el código de "zone", al menos en europa....

si puedo aportar algo a proyecto Souliss, ahi estaré.

saluti.

Yo creo que competir con los chinos es complicado... xD pero si que podemos hacer cosas bastante mas personalizables obtener buenos resultados... luego producirlo barato es otra cosa... xD

En cualquier caso, si tienes una conexion a internet disponible no habria problema en coger la señal directamente desde un servidor NTP, y con una tarjeta de red de 2.5€ lo tienes hecho... ademas eso añadiria mucho potencial, ya que podrias conectar la estacion meteorologica con otros dispositivos y incluso verlo desde internet o tu movil.

Si necesitas ayuda ya sabes :stuck_out_tongue:

Salu2