Dificultades en proyecto con algunos sensores y LCD

Hola compañeros, soy nuevo en esto y necesito realizar un programa en el que funcionen varios tipos de sensores, (DHT11, DS3231, ACS712, GL55 y un potenciometro) y mostrar los datos por una pantalla LCD. Tengo los programas por separado y me funcionan, pero no consigo hacerlos funcionar juntos, creo que por que no estan bien definidos los loops. Os adjunto mi codigo para que le echeis un ojo y podais ayudarme en los fallos que veais, muchisimas gracias.

#include <Wire.h>
#include "RTClib.h" //SCL(A5), SDA(A4), Vcc 5V, 
#include <LiquidCrystal.h>
#include <DHT.h>

// Definimos el pin digital donde se conecta el sensor y el tipo de sensor
#define DHTPIN 6
#define DHTTYPE DHT11

LiquidCrystal lcd(12,11,5,4,3,2); // pines donde se conecta el lcd
RTC_DS3231 rtc;
DHT dht(DHTPIN, DHTTYPE); // Inicializamos el sensor DHT11

//se definen distintos tipos de variables del programa
String daysOfTheWeek[7] = { "Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };

float sensibilidad = 0.185;   // Sensibilidad del ACS712 en V/A, modelo 5A
float humedad;
float celsius;
float voltaje;
float intensidad;
float luz;
unsigned char seg=0;
unsigned char min=0;
unsigned char hor=0;
unsigned char date=0;
unsigned char month=0;
float year=0;

void setup() {
   Serial.begin(9600);
   lcd.begin(16, 2); // Configuramos las columnas y filas del LCD 16x2
   delay(1000); 
   dht.begin(); // Comenzamos el sensor DHT
   lcd.setCursor(0, 0);
   lcd.print("¡Hola!");
   delay(5000);
   lcd.clear();
   }

void loop() {
 loop Reloj(); 
 loop Voltaje();
 loop Intensidad();
 loop Luz();
 loop Temperatura();
 loop LCD();
 } 

void loop LCD() {
  
   {//Escribimos la linea superior, la temperatura
   lcd.setCursor(0,0);
   lcd.print("Temperatura");
   lcd.setCursor(13,0);
   lcd.print(celsius);
   lcd.setCursor(15,0);
   lcd.print("ºC");
   //Escribimos la linea inferior, la humedad
   lcd.setCursor(0,1);
   lcd.print("Humedad");
   lcd.setCursor(9,0);
   lcd.print(celsius);
   lcd.setCursor(12,0);
   lcd.print("%\t");
   delay(2000); // 2 segundos hasta la siguiente medida.
   lcd.clear(); //limpiamos la pantalla del LCD
   }
   
   {//Escribimos la linea superior de la siguiente medida, el voltaje
   lcd.setCursor(0,0);
   lcd.print("Voltaje");
   lcd.setCursor(9,0);
   lcd.print(voltaje, 2);
   lcd.setCursor(13,0);
   lcd.print("V");
   //Escribimos la linea inferior, la intensidad
   lcd.setCursor(0,1);
   lcd.print("Intensidad");
   lcd.setCursor(12,0);
   lcd.print(intensidad, 2);
   lcd.setCursor(16,0);
   lcd.print("I");
   delay(2000); // 2 segundos hasta la siguiente medida.
   lcd.clear(); //limpiamos la pantalla del LCD
   }
   
   {//Escribimos la linea superior, el nivel de luz
   lcd.setCursor(0,0);
   lcd.print("Nivel Luz");
   lcd.setCursor(11,0);
   lcd.print(luz);
   lcd.setCursor(13,0);
   lcd.print("%");
   delay(2000); // 2 segundos hasta la siguiente medida.
   lcd.clear(); //limpiamos la pantalla del LCD
   }
  /* 
   {//Escribimos la linea superior, el dia de la semana
   lcd.setCursor(0,0);
   lcd.print(date.year(), DEC);
   lcd.setCursor(5,0);
   lcd.print('/');
   lcd.setCursor(6,0);
   lcd.print(date.month(), DEC);
   lcd.setCursor(8,0);
   lcd.print('/');
   lcd.setCursor(9,0);
   lcd.print(date.day(), DEC);
   lcd.setCursor(13,0);
   lcd.print(daysOfTheWeek[date.dayOfTheWeek()]);
   //Escribimos la linea inferior, la hora
   lcd.setCursor(0,1);
   lcd.print(date.hour(), DEC);
   lcd.setCursor(3,0);
   lcd.print(':');
   lcd.setCursor(4,0);
   lcd.print(date.minute(), DEC);
   lcd.setCursor(6,0);
   lcd.print(':');
   lcd.setCursor(7,0);
   lcd.print(date.second(), DEC);
   delay(2000); // 2 segundos hasta la siguiente medida.
   lcd.clear(); //limpiamos la pantalla del LCD
   } 
}

void loopReloj() {
   // Obtener fecha actual
   DateTime now = rtc.now();
   printDate(now);
   delay(2000);
}   */

loop Voltaje() {

  float sensorValue = analogRead(A1); // lee el input del sensor
  float voltaje = sensorValue*5/1023; // convierte el valor a voltaje decimal
  
  delay(2000);
  }

loop Intensidad() {
  
  float intensidad=get_corriente(200);//obtenemos la corriente promedio de 200 muestras 
  delay(2000);
   
}

float get_corriente(int n_muestras)
{
  float voltajeSensor;
  float corriente=0;
  for(int i=0;i<n_muestras;i++)
  {
    voltajeSensor = analogRead(A2) * (5.0 / 1023.0);////lectura del sensor
    corriente=corriente+(voltajeSensor-2.5)/sensibilidad; //Ecuación  para obtener la corriente
  }
  corriente=corriente/n_muestras;
  return(corriente);     
}

loop Luz() {

  int luz = map(analogRead(A0), 1023 ,0, 100 ,0); 
  // leemos el valor de la entrada analogica donde tenemos el LDR y lo guardamos en la variable luz

   delay(2000);
  }

loop Temperatura() {
 
  float humedad = dht.readHumidity(); // Leemos la humedad relativa
  float celsius = dht.readTemperature(); // Leemos la temperatura en grados celsius (por defecto)

  delay(2000);// Esperamos 2 segundos entre medidas
  }


Tu sketch tiene varias áreas de oportunidad.

"loop" es una palabra se asigna a la función

void loop()

y no puedes volverla a usar.

En los casos que siguen, basta simplemente con omitirla


Esta función no ha sido declarada ni definida:

Puedes "comentarla" mientras decides cómo la codificas:

// Reloj();

En estas definiciones debes utilizar "void" en lugar de "loop". Esto simplemente le dice al compilador que la función no devuelve ningún valor.

También en este caso (y en los demás también), las variables "humedad" y "celsius" han sido declaradas al principio del sketch, antes de "setup()". Esto hace que esas variables sean globales, es decir, accesibles desde cualquier punto del programa.

Si declaras variables con esos mismos nombres dentro de una función (dentro de un bloque, para decirlo de forma más precisa), estarás declarando variables locales a esa función, y como tienen los mismos nombres, las variables globales ya no son accesibles desde ahí.

Utiliza algo así para cambiar el valor de las variables y poder utilizar esos valores desde otra función:


En esta sección y en las dos que le siguen las llaves son redundantes. Las puedes dejar, pero solamente causan confusión. Omítelas. Y ya que estamos hablando de llaves, falta incluir la llave que cierra la función loop() antes de la función voltaje().


Con esto tu programa ya se puede compilar.

Ahora solamente falta eliminar TODAS las instrucciones que contienen "delay(2000);" y controlar los tiempos con la lógica de millis().

La regla es que solamente se recomienda el uso de delay() dentro de setup(), porque cada vez que se ejecuta la instrucción delay(2000) se impide que el programa haga cualquier cosa útil hasta que se terminan esos 2000 milisegundos.

Puedes empezar con este tema estudiando y comparando los programas de ejemplo Blink y BlinkWithoutDelay

Moderador:
Por favor, lee las Normas del foro y edita tu título de acuerdo al punto 5 de las normas.
Retira el : "Necesito ayuda..."
El foro solo brinda ayuda.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.