Buen día para todos.
Estoy trabajando en un proyecto para crear una estación meteorológica con la placa Arduino UNO, compuesta por un Display LCD 16x2 para visualizar de los datos y un shiel de ethernet W5100 con el fin de recibirlos a través de Internet. Los sensores que estoy utilizando son los siguientes:
- DTH22 (Humedad y temperatura)
- BMP180 (Barómetro)
- BH1750 (Luminosidad)
Los datos de fecha y hora los proporciona un reloj DS1302
El problema es cuando compilo el código me salta el error "'rtc' was not declared in this scope". Cabe resaltar que soy nuevo en el tema de programación en Arduino y llevo mas de una semana tratando de solucionarlo por mis propios medios a través de tutoriales, vídeos, guías, etc, pero no me ha sido posible.
A continuación les muestro el código:
#include <DHT.h> //cargamos la librería DHT (sensor de humedad y temperatura)
#include <SD.h> //añadimos la libreria para poder utilizar la tarjeta microSD
#include <Wire.h> //se carga la librería de la comunicación I2C, la cual usa el reloj, la pantalla LCD, el sensor de presión y el sensor de luz
#include <DS1302.h> //se inlcuye la librería del módulo del reloj
#include <LiquidCrystal_I2C.h>
#include <SFE_BMP180.h>//librería necesaria para el sensor de presión
#include <SPI.h> // incluimos las librerías SPI y ethernet, necesarias para la comunicación con internet mediante el cable ethernet
#include <Ethernet.h>
#include <BH1750.h> //incluimos la librería que hace falta para utilizar el sensor de luz
#define DHTPIN 2 //Seleccionamos el pin en el que se conectará el sensor, en nuestro caso el pin Digital 2
#define DHTTYPE DHT22 //Se selecciona el DHT22(hay otros DHT)
DHT dht(DHTPIN, DHTTYPE); //se inician los sensores
SFE_BMP180 myBarometer;
BH1750 lightMeter;
LiquidCrystal_I2C lcd(0x27,16,2); //especificamos los pines de la LCD
byte customChar[8] = {B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 }; //creamos un array para poder escribir ºC en la pantalla LCD
File myFile; //se declara el nombre que vamos a usar para señalar el archivo de la SD
float temp, h, P, Pm;//definimos las variables temperatura, humedad, presión en pascales y presión en milibares
float tmin=100;
float tmax=0;//definimos las variables de temperatura mínima, temperatura máxima y suponemos unos valores iniciales para empezar las comparaciones a partir de ahi
Time t; //definimos una variable de datos donde se almacenará la fecha y hora obtenidas por el reloj
uint16_t lux; //definimos una variable unsigned short de nombre lux para guardar los datos de la luz
char valor[10]; //definimos una cadena de 10 caracteres para guardar en ella los valores que tomamos de los sensores
byte mac[] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 }; //definimos la dirección MAC del Arduino. No puede coincidir con ningun otro dispositivo que se conecte a la misma red
IPAddress ip(192,168,1,78); //definimos la IP que queremos para nuestro Arduino. Tampoco puede coincidir con la de ningún otro dispositivo
EthernetServer servidorArduino(3200); // Inicia la libreria Ethernet server con el puerto 3200
void setup()
{
Serial.begin(9600); //Se inicia la comunicación serial
Ethernet.begin(mac, ip); //inicia la conexión ethernet y el servidor
servidorArduino.begin();
lcd.init(); //iniciamos la pantalla LCD
lcd.backlight(); //activamos la retroiluminación del LCD
lcd.createChar(0, customChar); //registramos el caracter especial
dht.begin(); //Se inicia el sensor de humedad y temperatura
myBarometer.begin(); //iniciamos el sensor de presion
lightMeter.begin();
pinMode(4, OUTPUT); //Seleccionamos el pin donde está la SD. Por ser el shield ethernet es el 4
SD.begin(4); //iniciamos la SD
File myFile = SD.open("Datos.txt", FILE_WRITE); //seleccionamos la opcion de escritura en el archivo Datos.txt, que es donde se guardarán los datos en la SD
myFile.println("Fecha Hora Temperatura Humedad Presion Luz"); //Escribimos una primera columna en el archivo de texto para que las variables se vayan imprimiendo en columnas
myFile.close(); //Es necesario cerrar el fichero cada vez que queramos que se guarde lo que se ha escrito
}
void loop()
{
h = dht.readHumidity(); //se guarda el valor de la humedad en la variable h
temp = dht.readTemperature(); //se guarda la temperatura en la variable temp
if (temp<tmin) { tmin = temp; } //Se comprueba si hay un máximo o un mínimo de temperatura, y en caso afirmativo, se guarda el valor de esa temperatura en tmin o tmax
if (temp>tmax) { tmax=temp; }
t = rtc.getTimeStr(); //obtenemos la fecha y tiempo del reloj y lo almacenamos en d
P = myBarometer.bmp085GetPressure(myBarometer.bmp085ReadUP());
Pm = P / 100; //convertimos la presión en Pascales a milibares. Para convertir a atmósferas habria que dividir P entre 101325
lux = lightMeter.readLightLevel(); //guardamos en la variable lux el valor de la iluminacion en lux
File myFile = SD.open("Datos.txt", FILE_WRITE); //seleccionamos la opcion de escritura en el archivo Datos.txt
//Mandamos escribir la temperatura, humedad, hora etc. Para leer las variables del reloj hay que especificar el dato que queremos obtener de "d"
myFile.print( d.day );
myFile.print( "/" );
myFile.print( d.month );
myFile.print( "/" );
myFile.print( d.year );
myFile.print( " " );
myFile.print( d.hour24h );
myFile.print( ":" );
myFile.print( d.minutes );
myFile.print( ":" );
myFile.print( d.seconds );
myFile.print( " " );
myFile.print( t );
myFile.print( " " );
myFile.print( h );
myFile.print( " " );
myFile.print( Pm );
myFile.print(" ");
myFile.println( lux );
myFile.close();
lcd.clear(); //se elimina lo que hubiese escrito en la LCD
lcd.setCursor(0,0); //nos situamos al principio de la pantalla LCD para comenzar a escribir datos
lcd.print(temp); //imprimimos la temperatura
lcd.write(byte(0)); //escribimos el caracter especial º en la pantalla y el después el resto de variables, situandonos convenientemente por la pantalla
lcd.print("C ");
lcd.print( h);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print(Pm);
lcd.print("mba ");
lcd.print(lux);
delay(500); //Se espera medio segundo para volver a realizar el proceso
}
De antemano les agradezco mucho por tomarsen el tiempo de leer mi post y la ayuda que me puedan brindar.
Pdta: Cada sensor cuenta con su respectiva librería y fue probado de forma individual.