/*
28.DEC.2023. Medidor de Temperatura/Humedad y Reloj, empleando el RTC y el Modulo DHT11 de Humedad.
Adedmas estoy empleando el Seeeduino XIAO SAMD21.
Y estoy empleando la pantalla OLED 128 x 64 de alta resolucion
En este programa, empleo el I2C, para transmitir y recibir informacion entre dispositivos.
*/
//--------------------incluimos las librerias correspondientes------------------------------
#include <DHT.h> // carga las Librerias DHT y de los otros recursos que necesito para activar el software
//#include <DHT_U.h>
#include <Wire.h> // carga la librerias para el manejo del protocolo de comunicacion I2C
#include <Adafruit_GFX.h> // carga la libreria para el manejo de la pantalla grafica
#include <Adafruit_SSD1306.h> // carga la libreria grafica
#include <RTClib.h> // Carga la libreria para el Reloj RTC
// ----------------- Se definen alguans de las variables a utilizar ------------------------
int SENSOR = 10; // pin DATA de DHT22 a pin digital 10 del arduino
int TEMPERATURA; // Crea una variable que usaremos luego para almacenar el valor de la Temp
int HUMEDAD; // Crea una variable que usaremos luego para almacenar el valor de la Humedad
#define Largo 128 // Largo de la pantalla
#define Ancho 64 // Ancho de la pantalla
#define OLED_RESET A2 // esto es unrequisito estandard de la pantalla OLED
int LED = 2;
// ------------------ creamos los objetos y las variables ---------------------------------
Adafruit_SSD1306 oled(Largo, Ancho, &Wire, OLED_RESET); // crea objeto de la pantalla SSD1306
RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231 en el Arduino
DHT dht(SENSOR, DHT22); // creacion del objeto, cambiar por DHT11 si se utiliza en lugar del DHT22
//----------------------------
String monthsNames[] = {
"-",
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
};
void setup(){
Wire.begin(); // inicializa bus de datos del I2C
rtc.begin(); // inicializa el Reloj RTC
dht.begin(); // inicializacion de sensor de Humedad & Temperatura
pinMode (LED, OUTPUT);
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
//rtc.adjust(DateTime(__DATE__, __TIME__)); // elimina los // en caso de volver a activar.
//Activar solamente una vez. Luego desactivar y volver a cargar el programa.
//de esta manera el software usara siempre la ultima informacion de hora al momento de la compilacion
oled.clearDisplay(); //Borre toda occurencia del display.
//if (! rtc.begin()) {
// oled.println("Couldn't find RTC");
// oled.flush();
// while (1) delay(10);
// }
}
void loop(){
analogWrite(LED, 5);
oled.clearDisplay(); // limpia pantalla
//float TEMPERATURA = dht.readTemperature(); // obtencion de valor de temperatura con decimales
//float HUMEDAD = dht.readHumidity(); // obtencion de valor de humedad con decimales
TEMPERATURA = dht.readTemperature(); // obtencion de valor de temperatura valor entero
HUMEDAD = dht.readHumidity(); // obtencion de valor de humedad valor entero
oled.setTextColor(WHITE);
oled.setCursor(1, 32); //pone el cursor en columna 1, fila 30
oled.setTextSize(4); // tamano de la letra 4.
//oled.print("Temp: ");
oled.print(TEMPERATURA);// imprime el valor de temp.
// oled.print("C");
oled.setCursor(63, 30);
oled.setTextSize(2);
oled.print("C");
oled.setCursor(56, 30);
oled.setTextSize(1);
oled.print("O");
oled.setCursor(92, 30);
oled.setTextSize(2);
//oled.print("Hume: ");
oled.print(HUMEDAD);
oled.print("%");
oled.setCursor(95, 50);
oled.setTextSize(2);
oled.print("HR");
//oled.setCursor(0, 50);
// oled.setTextSize(2);
DateTime fecha = rtc.now(); // funcion que devuelve fecha y horario en formato
// DateTime y asigna a variable fecha
//oled.print(fecha.day()); // funcion que obtiene el dia de la fecha completa
//oled.print("."); // caracter barra como separador
//oled.print(monthsNames[fecha.month()]); // funcion que obtiene el mes de la fecha completa
// lcd.print("."); // caracter barra como separador
// lcd.print(fecha.year()); // funcion que obtiene el año de la fecha completa
//lcd.print(""); // caracter espacio en blanco como separador
oled.setCursor(1,0);
oled.setTextSize(2);
oled.print(fecha.twelveHour(), DEC); // funcion que obtiene la hora de la fecha completa
oled.print(":"); // caracter dos puntos como separador
oled.print(fecha.minute(), DEC); // funcion que obtiene los minutos de la fecha completa
oled.print(":"); // caracter dos puntos como separador
//oled.setTextSize(2);
oled.print(fecha.second()); // funcion que obtiene los segundos de la fecha completa
oled.setCursor(90, 0);
oled.setTextSize(2);
if (fecha.isPM() >= 1)
oled.print(" pm");
else oled.print(" am");
oled.setCursor(0,15);
oled.setTextSize(1);
oled.print("---------------------"); // caracter dos puntos como separador
oled.display(); // muestra en pantalla todo lo establecido anteriormente
delay(1000);
}