#include "DHT.h"
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <glcd.h>
#include "fonts/Arial14.h" // proportional font
#include "fonts/SystemFont5x7.h" // system font
#if DISPLAY_HEIGHT < 64
#error ks0108 example requires a display at least 64 pixels tall
#endif
#if DISPLAY_WIDTH < 128
#error ks0108 example requires a display at least 128 pixels wide
#endif
#define DS1307_I2C_ADDRESS 0x68
#define DHTPIN 14 //Pin 50
#define DHTTYPE DHT11
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10,0,0,5 };
Server server(80);
int val = 0;
int ActivarHum = 51;
int DesactivarHum = 49;
int Menu = 47;
int Trig = 38, Eco = 39;
float Temp = 0, Hum = 0;
long Distancia, Dist;
byte segundos, minutos, hora, diaDeLaSemana, diaDelMes, mes, anio;
struct Datos
{
byte Segundos, Minutos, Hora, DiaDeLaSemana, DiaDelMes, Mes, Anio;
}Tiempo;
File Archi;
DHT dht(DHTPIN, DHTTYPE);
// De Decimal a BCD
byte decToBcd(byte val){
return ( (val/10*16) + (val%10) );
};
// De BCD a Decimal
byte bcdToDec(byte val){
return ( (val/16*10) + (val%16) );
};
// La siguiente función al ser llamada recoge los datos del DS1307.
void getDateDs1307( byte *segundos, byte *minutos, byte *hora, byte *diaDeLaSemana, byte *diaDelMes, byte *mes, byte *anio ){
// Se inicia la comunicación con el reloj, se preparan los bytes a transmitir, se transmiten además de cerrarse la conexión, y se recogen los 7 primero bytes.
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(val);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
//Ahora de forma consecutiva se guardan los datos recogidos y se almacenan en sus variables correspondientes.
// Algunas de las variables se necesitan enmascarar porque ciertos bits son bits de control.
*segundos = bcdToDec(Wire.receive() & 0x7f);
*minutos = bcdToDec(Wire.receive());
*hora = bcdToDec(Wire.receive() & 0x3f);
*diaDeLaSemana = bcdToDec(Wire.receive());
*diaDelMes = bcdToDec(Wire.receive());
*mes = bcdToDec(Wire.receive());
*anio = bcdToDec(Wire.receive());
};
// Esta otra función pone el reloj en hora con los datos que le hayamos pasado a mano desde el VOID SETUP()
void setDateDs1307( byte segundos, byte minutos, byte hora, byte diaDeLaSemana, byte diaDelMes, byte mes, byte anio ){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(val);
Wire.send(decToBcd(segundos));
Wire.send(decToBcd(minutos));
Wire.send(decToBcd(hora));
Wire.send(decToBcd(diaDeLaSemana));
Wire.send(decToBcd(diaDelMes));
Wire.send(decToBcd(mes));
Wire.send(decToBcd(anio));
Wire.endTransmission();
};
//*********************************************************************************FUNCIÓN SETUP*************************************************************************************
void setup()
{
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
//Defino cuales pines son de entrada y cuales son de salida.
pinMode(ActivarHum,INPUT);
pinMode(DesactivarHum,INPUT);
pinMode(Menu,INPUT);
GLCD.Init(NON_INVERTED); // initialise the library, non inverted writes pixels onto a clear screen
GLCD.SelectFont(System5x7); // switch to fixed width system font
GLCD.ClearScreen();
Wire.begin();
dht.begin();
InicializarHCSR04(Trig,Eco);
pinMode(10,OUTPUT);
if (!SD.begin(4)) {
return;
}
Archi = SD.open("DATOS.txt", FILE_WRITE);
}
//**************************************************************************************FUNCIÓN LOOP********************************************************************************
void loop()
{
//IngFecha();
do{
Hum = dht.readHumidity();
Temp = dht.readTemperature();
Distancia = DistanciaSensor(Trig, Eco);
if(Distancia){
Dist = Distancia;
}else{
Distancia = Dist;
}
Cartel();
LaburoInternet();
}while(1);
}
//***********************************************************************************FUNCIÓN INGRESAR FECHA************************************************************************
void IngFecha()
{
//GLCD.ClearScreen();
//GLCD.CursorTo(0,0);
//GLCD.Puts("A CONTINUACION");
//GLCD.CursorTo(0,1);
//GLCD.Puts("INGRESE LA FECHA");
//GLCD.CursorTo(0,2);
//GLCD.Puts("FECHA:");
Etiqueta:
delay(2000);
//Hora
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE LA HORA:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
hora++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)hora);
}else if(digitalRead(DesactivarHum))
{
hora--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)hora);
}
}
//Minutos
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE MINUTO:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
minutos++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)minutos);
}else if(digitalRead(DesactivarHum))
{
minutos--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)minutos);
}
}
//Segundos
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE SEGUNDO:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
segundos++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)segundos);
}else if(digitalRead(DesactivarHum))
{
segundos--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)segundos);
}
}
//Día del mes
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE DIA:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
diaDelMes++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)diaDelMes);
}else if(digitalRead(DesactivarHum))
{
diaDelMes--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)diaDelMes);
}
}
//Mes
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE MES:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
mes++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)mes);
}else if(digitalRead(DesactivarHum))
{
mes--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)mes);
}
}
//Año
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.Puts("INGRESE ANIO:");
GLCD.CursorTo(0,1);
while(!digitalRead(Menu))
{
delay(400);
if(digitalRead(ActivarHum))
{
anio++;
GLCD.CursorTo(0,1);
GLCD.Puts((int)anio);
}else if(digitalRead(DesactivarHum))
{
anio--;
GLCD.CursorTo(0,1);
GLCD.Puts((int)anio);
}
}
//Pregunta
delay(1500);
GLCD.ClearScreen();
GLCD.CursorTo(6,2);
GLCD.Puts("¿LOS DATOS");
GLCD.CursorTo(6,3);
GLCD.Puts("SON CORRECTOS? (S/N)");
while(1)
{
delay(100);
if(digitalRead(ActivarHum))
{
Tiempo.Segundos = segundos;
Tiempo.Minutos = minutos;
Tiempo.Hora = hora;
Tiempo.DiaDeLaSemana = diaDeLaSemana;
Tiempo.DiaDelMes = diaDelMes;
Tiempo.Mes = mes;
Tiempo.Anio = anio;
setDateDs1307(segundos, minutos, hora, diaDeLaSemana, diaDelMes, mes, anio);
break;
}
else if(digitalRead(DesactivarHum))
{
hora = 0; minutos = 0; segundos = 0; diaDelMes = 1; mes = 1; anio = 0;
goto Etiqueta;
}
}
}
//***************************************************************************FUNCIÓN CARTEL************************************************************************************
void Cartel(void)
{
getDateDs1307(&segundos, &minutos, &hora, &diaDeLaSemana, &diaDelMes, &mes, &anio);
if((anio > 0) && (anio < 100))
{
Tiempo.Segundos = segundos;
Tiempo.Minutos = minutos;
Tiempo.Hora = hora;
Tiempo.DiaDeLaSemana = diaDeLaSemana;
Tiempo.DiaDelMes = diaDelMes;
Tiempo.Mes = mes;
Tiempo.Anio = anio;
}else{
segundos = Tiempo.Segundos;
minutos = Tiempo.Minutos;
hora = Tiempo.Hora;
diaDeLaSemana = Tiempo.DiaDeLaSemana;
diaDelMes = Tiempo.DiaDelMes;
mes = Tiempo.Mes;
anio = Tiempo.Anio;
}
GLCD.ClearScreen();
GLCD.DrawRoundRect(0,0,127,63, 5, BLACK);
GLCD.CursorTo(1,1);
GLCD.Puts("Temperatura[°C] = ");
GLCD.PrintNumber(Temp);
GLCD.CursorTo(1,2);
GLCD.Puts("Humedad[%] = ");
GLCD.PrintNumber(Hum);
GLCD.CursorTo(1,3);
GLCD.Puts("Distancia[Cm] = ");
if(Distancia){
GLCD.PrintNumber(Distancia);
Dist = Distancia;
}else{
Distancia = Dist;
GLCD.PrintNumber(Distancia);
}
GLCD.CursorTo(1,5);
if(hora >= 10){
GLCD.Puts((int)hora);
}else
{
GLCD.Puts("0");
GLCD.CursorTo(2,5);
GLCD.Puts((int)hora);
}
GLCD.CursorTo(3,5);
GLCD.Puts(":");
GLCD.CursorTo(4,5);
if(minutos >= 10){
GLCD.Puts((int)minutos);
}else
{
GLCD.Puts("0");
GLCD.CursorTo(5,5);
GLCD.Puts((int)minutos);
}
GLCD.CursorTo(10,5);
if(diaDelMes >= 10){
GLCD.Puts((int)diaDelMes);
}else{
GLCD.Puts("0");
GLCD.CursorTo(11,5);
GLCD.Puts((int)diaDelMes);
}
GLCD.CursorTo(12,5);
GLCD.Puts("/");
GLCD.CursorTo(13,5);
if(mes >= 10)
{
GLCD.Puts((int)mes);
}else
{
GLCD.Puts("0");
GLCD.Puts((int)mes);
}
GLCD.CursorTo(15,5);
GLCD.Puts("/");
GLCD.CursorTo(16,5);
GLCD.Puts((int)anio);
}
//*************************************************************************************FUNCIÓN LABUROETHERNET***********************************************************************
void LaburoInternet()
{
Client client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<html>");
client.println("<head>");
client.println("<title>TEMPERATURA, HUMEDAD Y DISTANCIA</title>");
client.println("<body>");
client.println("<P>LOS DATOS SON:</P>");
client.println("</body>");
client.println("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"3;URL=refrescar.html\">");
client.println("</head>");
client.println("</html>");
client.print(" Temperatura = ");
client.print(Temp);
client.print(" (C)");
client.println("<br />");
client.print(" Humedad = ");
client.print(Hum);
client.print(" (%)");
client.println("<br />");
client.print(" Distancia = ");
client.print(Distancia);
client.print(" (Cm)");
client.println("<br />");
break;
}
if (c == '\n')
{
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
//*************************************************************************FUNCIÓN LABUROMSD*****************************************************************************************
void LaburoMSD()
{
//Archi = SD.open("DATOS.txt", FILE_WRITE);
if (Archi) {
getDateDs1307(&segundos, &minutos, &hora, &diaDeLaSemana, &diaDelMes, &mes, &anio);
EscribirMSD();
//Archi.close();
//delay (5000);
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
//************************************************************************FUNCIÓN ESCRIBIR MSD***************************************************************************************
void EscribirMSD()
{
Archi.print(hora, DEC);
Archi.print(":");
if (minutos < 10) {Archi.print("0");}
Archi.print(minutos, DEC);
Archi.print(":");
if (segundos < 10) {Archi.print("0");}
Archi.print(segundos, DEC);
Archi.print(" - ");
if (diaDelMes < 10) {Archi.print("0");}
Archi.print(diaDelMes, DEC);
Archi.print(" del ");
Archi.print("20");
if (anio < 10) {Archi.print("0");}
Archi.println(anio, DEC);
Archi.print("Temperatura = ");
Archi.print(Temp);
Archi.println(" °C ");
Archi.print("Humedad = ");
Archi.print(Hum);
Archi.println(" % ");
}
//*********************************************************************FUNCIÓN QUE INICIALIZA EL SENSOR DE PROXIMIDAD**************************************************************
void InicializarHCSR04(int trigPin, int echoPin)
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
//*********************************************************************FUNCIÓN QUE DEVUELVE LA DISTANCIA DEL SENSOR DE PROXIMIDAD**************************************************
long DistanciaSensor(int trigPin, int echoPin)
{
long duracion, distancia; //http://arduino.cc/en/Reference/Long
digitalWrite(trigPin, LOW); //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
delayMicroseconds(2); // delay de 2 microssegundos
digitalWrite(trigPin, HIGH); //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
delayMicroseconds(10); //delay de 10 microssegundos
digitalWrite(trigPin, LOW); //seta o pino 12 com pulso baixo novamente
duracion = pulseIn(echoPin, HIGH); //pulseIn lê o tempo entre a chamada e o pino entrar em high
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado
//porque é o tempo de ida e volta do ultrassom
distancia = (duracion/2) / 29.1;
return distancia;
}