#include <Wire.h>
#include <SPI.h> //para el modulo de la tarjeta SD
#include <SD.h> // para la tarjeta SD
#include "RTClib.h"
RTC_DS3231 rtc;
int hora=0;
int minutos=0;
int segundos=0;
#include <LiquidCrystal_I2C.h> // libreria para LCD por I2C
LiquidCrystal_I2C lcd (0x3f, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7
#include <LCD.h> // Incluimos la librería para el uso del display
/////////////////////////////////////////////
#include <Wire.h>
#include <DHT.h> // importa la Librerias DHT
#include <DHT_U.h>
int SENSOR1 = 31; // pin DATA de DHT22 un pin digital 4
int TEMPERATURA1;
int HUMEDAD1;
DHT dht1 (SENSOR1, DHT22); // creación del objeto, cambiar segundo parámetro
// por DHT11 si se utiliza en lugar del DHT22
int SENSOR2 = 33; // pin DATA de DHT22 un pin digital 2
int TEMPERATURA2;
int HUMEDAD2;
DHT dht2 (SENSOR2, DHT22); // creación del objeto, cambiar segundo parámetro
// por DHT11 si se utiliza en lugar del DHT22
//////////////////////////////////////////////////////////////
#include "max6675.h"
int soPin = 6;// SO=Serial Out
int csPin = 3;// CS = chip select CS pin
int sckPin = 13;// SCK = Serial Clock pin
MAX6675 thermocouple(sckPin, csPin, soPin);
///////////////////////////////////////////////////////////////
#include <SD.h>
int UVOUT = A5; //Output from the sensor
int REF_3V3 = A4; //3.3V power on the Arduino board
////////////////////////////////
File myFile; //creando el archivo del data
void setup(){
Serial.begin(9600);// inicializacion de monitor serial
lcd.begin (16,2); // Inicializar el display con 16 caracteres 2 lineas
lcd.setBacklightPin(3,POSITIVE); // puerto P3 de PCF8574 como positivo
lcd.setBacklight(HIGH);
dht1.begin (); // inicializacion de sensor
dht2.begin (); // inicializacion de sensor
lcd.print("MAX6675");
lcd.setCursor(0,1);
lcd.print("Thermocouple");
Serial.begin(9600);// initialize serial monitor with 9600 baud
Serial.println(" MAX6675");
delay(3000);// give time to user to read the display at the beginning
pinMode(UVOUT, INPUT);
pinMode(REF_3V3, INPUT);
// Serial.println("radiacion uv");
Serial.begin (9600); // inicializacion de monitor serial
lcd.begin(16,2);// Indicamos medidas de LCD
Wire.begin();
rtc.begin();
//Si quitamos el comentario de la linea siguiente, se ajusta la hora y la fecha con la del ordenador
//RTC.adjust(DateTime(_DATE, _TIME));
SD.begin(chipSelect);
myFile=SD.open("DATA.txt", FILE_WRITE);
myFile.println("FECHA, HORA, TEMPERATURA1ºC, HUMEDAD1 %, TEMPERATURA2ºC, HUMEDAD2 %, TEMPERATURA3°C, LONG ONDλ UV, INTENSIDAD UV");
myFile.close();
}
void loop() {
DateTime now = rtc.now();
hora=(now.hour(),DEC);
minutos=(now.minute(),DEC);
segundos=(now.second(),DEC);
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
/////////////////////////////////////////////////////////////////////////////
TEMPERATURA1 = dht1.readTemperature (); // obtencion de valor de temperatura
HUMEDAD1 = dht1.readHumidity (); // obtencion de valor de humedad
Serial.print ("T1: "); // escritura en monitor serial de los valores
Serial.print (TEMPERATURA1);
Serial.print (" H1: ");
Serial.println (HUMEDAD1);
///////////////////////////////////////////////////
lcd.setCursor(0,0);
lcd.print("T1:");
lcd.print(TEMPERATURA1);//Escribe la temperatura
lcd.print("C");
lcd.setCursor(0,1);//Posiciona la primera letra despues del segmento 5 en linea 1
lcd.print("H1: ");
lcd.print(HUMEDAD1);//Escribe la humedad
lcd.print("%");
delay (2000);
////////////////////////////////////////////
TEMPERATURA2 = dht2.readTemperature (); // obtencion de valor de temperatura
HUMEDAD2 = dht2.readHumidity (); // obtencion de valor de humedad
Serial.print (" T2: "); // escritura en monitor serial de los valores
Serial.print (TEMPERATURA2);
Serial.print (" H2: ");
Serial.println (HUMEDAD2);
///////////////////////////////////////////////////
lcd.setCursor(0,0);
lcd.print("T2:");
lcd.print(TEMPERATURA2);//Escribe la temperatura
lcd.print("C");
lcd.setCursor(0,1);//Posiciona la primera letra despues del segmento 5 en linea 1
lcd.print("H2: ");
lcd.print(HUMEDAD2);//Escribe la humedad
lcd.print("%");
delay (2000);
////////////////////////////////////////////
//visualizacion de valores de termocuple en monitor serie y pantalla LCD
//////// thermocouple/////
lcd.setCursor(0,0);
Serial.print("T3 = ");
Serial.println(thermocouple.readCelsius());
//Serial.print("F = ");
// Serial.println(thermocouple.readFahrenheit());
lcd.clear();// clear previous values from screen
lcd.setCursor(0,0);// set cursor at character 0, line 0
lcd.print("Temperature 3");
lcd.setCursor(0,1);// set cursor at character 0, line 1
lcd.print(thermocouple.readCelsius());
lcd.setCursor(5,1);// set cursor at character 9, line 1
lcd.print((char)223);
lcd.setCursor(6,1);// set cursor at character 9, line 1
lcd.print("C");
//lcd.setCursor(7,1);// set cursor at character 9, line 1
//lcd.print(" ");
//lcd.setCursor(8,1);// set cursor at character 9, line 1
//lcd.print(thermocouple.readFahrenheit()); // print temperature in ahrenheit
//lcd.setCursor(14,1);// set cursor at character 9, line 1
//lcd.print((char)223);
//lcd.setCursor(15,1);// set cursor at character 9, line 1
//lcd.print("F");
delay(2000);
///////////////////////////////////////////////////
//////////////////////////////////
lcd.clear();// clear previous values from screen
int uvLevel = averageAnalogRead(UVOUT);
int refLevel = averageAnalogRead(REF_3V3);
//Use the 3.3V power pin as a reference to get a very accurate output value from sensor
float outputVoltage = 3.3 / refLevel * uvLevel;
float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level
Serial.print("output: ");
Serial.print(refLevel);
Serial.print("ML8511output: ");
Serial.print(uvLevel);
Serial.print(" / ML8511 voltage: ");
Serial.print(outputVoltage);
Serial.print(" / UVIntensity (mW/cm^2): ");
Serial.print(uvIntensity);
lcd.setCursor(0, 0);
lcd.print("UV Ray Intensity");
lcd.setCursor(0, 1);
lcd.print(uvIntensity);
lcd.print(" mW/cm^2");
Serial.println();
delay (2000);
lcd.clear();
myFile = SD.open("DATA.txt", FILE_WRITE);
//Serial.println("abierto sin errores");
if ( (millis() - tiempo) > INTERVALO ) {
// Entonces lees la hora y grabas datos
tiempo = millis();
myFile.print(now.year(), DEC);
myFile.print('/');
myFile.print(now.month(), DEC);
myFile.print('/');
myFile.print(now.day(), DEC);
myFile.print(',');
myFile.print(now.hour(), DEC);
myFile.print(':');
myFile.print(now.minute(), DEC);
myFile.print(':');
myFile.print(now.second(), DEC);
myFile.print(",");
myFile.print(TEMPERATURA1);
myFile.print(",");
myFile.print(HUMEDAD1);
myFile.print(",");
myFile.print(TEMPERATURA2);
myFile.print(",");
myFile.print(HUMEDAD2);
myFile.print(",");
myFile.print("C = ");
myFile.print(thermocouple.readCelsius());
myFile.print(",");
myFile.print("nm: ");
myFile.print(uvLevel);
myFile.print(",");
// myFile.print(",ML8511 voltage: ");
//myFile.print(outputVoltage);
myFile.print("(mW/cm^2): ");
myFile.println(uvIntensity);
myFile.close();
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" ElectroUNI");
delay (2000);
lcd.clear();
}
// Toma un promedio de lecturas en un pin dado
// Devuelve el promedio
int averageAnalogRead(int pinToRead)
{
byte numberOfReadings = 8;
unsigned int runningValue = 0;
for(int x = 0 ; x < numberOfReadings ; x++)
runningValue += analogRead(pinToRead);
runningValue /= numberOfReadings;
return(runningValue);
}
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}