Estación Meteorológica con Arduino UNO error 'rtc' was not [SOLUCIONADO]

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. :cry:

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. :smiley:

Pdta: Cada sensor cuenta con su respectiva librería y fue probado de forma individual.

Mira en los ejemplos de tu librería, te faltara declarar esto o algo parecido.

DS1302 rtc;

Hola krnlpanic, muchas gracias por tu colaboración. Tenias razón, no había declarado bien desde un principio el ds1302. Quedo de la siguiente manera:

DS1302 rtc(2, 3, 4);

Luego de esto complile y le hice algunas correcciones al código. Pero ahora me surgió otro problema :sob: . Este es el fragmento del código:

P = myBarometer.getPressure();

Y este el error:

no matching function for call to 'SFE_BMP180::getPressure()'

Pongo mi código de nuevo por si le quieres hechar un vistaso:

#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;
DS1302 rtc(2, 3, 4);

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 h, temp, P;//definimos las variables temperatura, humedad, presión  
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
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; } 
  rtc.getTimeStr(); //obtenemos la fecha y tiempo del reloj
  P = myBarometer.getPressure();
  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
}

Muchas gracias amigo.

MODERADOR:
Aunque solo sea una línea siempre usar etiquetas para códigos.
Los errores tmb se postean con etiquetas para códigos.

Nunca he usado este tipo de sensor pero buscando un poco he encontrado el ejemplo de la propia librería y para obtener la presión primero se le ha de pedir la medición y esperar la respuesta, deberías mirar los ejemplos de tus librerías para saber como usarlas.

Esto es un fragmento del ejemplo

 status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);

        // Retrieve the completed pressure measurement:
        // Note that the measurement is stored in the variable P.
        // Note also that the function requires the previous temperature measurement (T).
        // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
        // Function returns 1 if successful, 0 if failure.

        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
          Serial.print("absolute pressure: ");
          Serial.print(P,2);
          Serial.print(" mb, ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");

          // The pressure sensor returns abolute pressure, which varies with altitude.
          // To remove the effects of altitude, use the sealevel function and your current altitude.
          // This number is commonly used in weather reports.
          // Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
          // Result: p0 = sea-level compensated pressure in mb

          p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
          Serial.print("relative (sea-level) pressure: ");
          Serial.print(p0,2);
          Serial.print(" mb, ");
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");

          // On the other hand, if you want to determine your altitude from the pressure reading,
          // use the altitude function along with a baseline pressure (sea-level or other).
          // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
          // Result: a = altitude in m.

          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          Serial.print(a,0);
          Serial.print(" meters, ");
          Serial.print(a*3.28084,0);
          Serial.println(" feet");
        }

Aquí es donde se pide la medición, en este ejemplo donde pone "pressure." seria el equivalente en el tuyo a "myBarometer." y esto no aparece en tu código.

status = pressure.startPressure(3);

Hola krnlpanic, efectivamente no estaba usando las instrucciones correctas para que el barometro tomara las mediciones. Lo que hice fue cambiar la librería por una que encontré con instrucciónes mas sencillas a las que estaba usando, actualice el código y ahora por fin esta funcionando mi estación meteorológica! Muchas gracias por tu gran ayuda amigo.

Me alegro de que ya te funcione, ahora puedes editar el titulo añadiendo "[SOLUCIONADO]".