Fallo en la impresión de datos obtenidos

Buenas, estoy haciendo un código para el sensor DHT11, en el que se imprima en una pantalla, los datos que obtengamos, para ello el valor se va midiendo cada dos segundos y medio para que aparezca una flecha alado si el valor ha incrementado, se ha mantenido o ha decrecido. Lo que pasa es que cuando imprimo por separado la H y la T va perfecto, pero cuando lo imprimo en el mismo código, solo aparece la Humedad.


// Incluimos la librería de control del sensor DHT11
#include "DHT.h"
#include <Keypad.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

byte const ANCHO_PANTALLA = 128; // ancho pantalla OLED
byte const ALTO_PANTALLA = 64;   // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
// Definimos el pin en el que está conectado el sensor.
const int DHT_Pin = 2;

// Creamos un objeto tipo DHT que denominaremos Sensor: 
//   - Indicando que está conectado al pin DHT_Pin
//   - Y que es un sensor tipo DHT11
DHT Sensor(DHT_Pin, DHT11);

// Variables donde almacenaremos los valores previos
// de la Humedad y la Tempeatura.
float P_H = 0;
float P_T = 0;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Activamos el puerto Serial y el objeto Sensor.
  Serial.begin(9600);
  Sensor.begin();
  delay(2500); // damos tiempo para la activación del sensor.
      display.clearDisplay();

}

void loop() {  
  float H = Sensor.readHumidity();      // Lee la Humedad
  float T = Sensor.readTemperature();   // Lee la Temperatura

  // Si los nuevos valores son distintos a los anteriores
  // mostramos los nuevos y los almacenamos como previos.
    if(H>P_H){
        display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 0);
       // Escribir texto
       display.println("Humedad....");   // imprimir en pantalla un texto
       display.setCursor(10, 10);
       display.setTextSize(2);
       display.println(H);    //imprimir en pantalla valor
       display.setCursor(75, 10);
       display.println("%");   // imprimir en pantalla un texto
       display.setCursor(85, 10);
       display.print((char) 24);
       display.display();

}
   else if(H<P_H){
        display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 0);
       // Escribir texto
       display.println("Humedad....");   // imprimir en pantalla un texto
       display.setCursor(10, 10);
       display.setTextSize(2);
       display.println(H);    //imprimir en pantalla valor
       display.setCursor(75, 10);
       display.println("%");   // imprimir en pantalla un texto
       display.setCursor(85, 10);
       display.print((char) 25);
}
   else if(H==P_H){
        display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 0);
       // Escribir texto
       display.println("Humedad....");   // imprimir en pantalla un texto
       display.setCursor(10, 10);
       display.setTextSize(2);
       display.println(H);    //imprimir en pantalla valor
       display.setCursor(75, 10);
       display.println("%");   // imprimir en pantalla un texto
       display.setCursor(85, 10);
       display.println("-");
       display.display();

}
   else if(T>P_T){
        display.clearDisplay();

    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 30);
       // Escribir texto
       display.println("Temperatura....");   // imprimir en pantalla un texto
       display.setCursor(10, 40);
       display.setTextSize(2);
       display.println(T);    //imprimir en pantalla valor
       display.setCursor(80, 40);
       display.setTextSize(2);
       display.println("C");   // imprimir en pantalla un texto
       display.setCursor(90, 40);
       display.setTextSize(2);
       display.print((char) 24);
       display.display();

}
   else if(T<P_T){
    //Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 30);
       // Escribir texto
       display.println("Temperatura....");   // imprimir en pantalla un texto
       display.setCursor(10, 40);
       display.setTextSize(2);
       display.println(T);    //imprimir en pantalla valor
       display.setCursor(80, 40);
       display.setTextSize(2);
       display.println("C");   // imprimir en pantalla un texto
       display.setCursor(90, 40);
       display.setTextSize(2);
       display.print((char) 25);
       display.display();

}
   else if(T==P_T){
    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 30);
       // Escribir texto
       display.println("Temperatura....");   // imprimir en pantalla un texto
       display.setCursor(10, 40);
       display.setTextSize(2);
       display.println(T);    //imprimir en pantalla valor
       display.setCursor(80, 40);
       display.setTextSize(2);
       display.println("C");   // imprimir en pantalla un texto
       display.setCursor(90, 40);
       display.setTextSize(2);
       display.println("-");
       display.display();

}

    P_H = H;
    P_T = T;

  // Esperamos antes de hacer la siguiente lectura.
  delay (2500);

}

Saludos

Lo primero que veo son códigos donde repites muchas secuencias.
Será que para nosotros es fácil visualizarlo y no para ti. Esto que te menciono te ahorra mucho a lahora de detectar problemas porque tienes un código muy grande que en realidad es el mismo con pocos cambios.
Observa esto

if(H>P_H){
        display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 0);
       // Escribir texto
       display.println("Humedad....");   // imprimir en pantalla un texto
       display.setCursor(10, 10);
       display.setTextSize(2);
       display.println(H);    //imprimir en pantalla valor
       display.setCursor(75, 10);
       display.println("%");   // imprimir en pantalla un texto
       display.setCursor(85, 10);
       display.print((char) 24);
       display.display();

en que difiere de esto

else if(H<P_H){
        display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 0);
       // Escribir texto
       display.println("Humedad....");   // imprimir en pantalla un texto
       display.setCursor(10, 10);
       display.setTextSize(2);
       display.println(H);    //imprimir en pantalla valor
       display.setCursor(75, 10);
       display.println("%");   // imprimir en pantalla un texto
       display.setCursor(85, 10);
       display.print((char) 25);
}

el único cambio que haces es

display.print((char) 24);
// o 
display.print((char) 25);

Error detectado
En este if

   else if(H<P_H){

al final no has puesto

display.display();

De todos modos termino la idea de simplificar el código
Esta es la versión resumida.
Ahora sobre esta versión podemos trabajar mejor y ya se que el problema es la indicación. Prueba a ver si se visualiza el problema. Primero si mi código compila porque con tanta librería no lo he probado.

// Incluimos la librería de control del sensor DHT11
#include "DHT.h"
#include <Keypad.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

byte const ANCHO_PANTALLA = 128; // ancho pantalla OLED
byte const ALTO_PANTALLA = 64;   // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
// Definimos el pin en el que está conectado el sensor.
const int DHT_Pin = 2;

// Creamos un objeto tipo DHT que denominaremos Sensor: 
//   - Indicando que está conectado al pin DHT_Pin
//   - Y que es un sensor tipo DHT11
DHT Sensor(DHT_Pin, DHT11);

// Variables donde almacenaremos los valores previos
// de la Humedad y la Tempeatura.
float P_H = 0;
float P_T = 0;

void presentoTFT(String texto, float tmp, char t1, char t2) {
    display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
    display.setTextSize(1);
    // Color del texto
    display.setTextColor(SSD1306_WHITE);
    // Posición del texto
    display.setCursor(16, 0);
    // Escribir texto
    display.println(texto);   // imprimir en pantalla un texto
    display.setCursor(10, 10);
    display.setTextSize(2);
    display.println(tmp);    //imprimir en pantalla valor
    display.setCursor(75, 10);
    display.println(t1);   // imprimir en pantalla un texto
    display.setCursor(85, 10);
    display.println(t2);
    display.display();
}

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Activamos el puerto Serial y el objeto Sensor.
  Serial.begin(9600);
  Sensor.begin();
  delay(2500); // damos tiempo para la activación del sensor.
      display.clearDisplay();

}

void loop() {  
  float H = Sensor.readHumidity();      // Lee la Humedad
  float T = Sensor.readTemperature();   // Lee la Temperatura

  // Si los nuevos valores son distintos a los anteriores
  // mostramos los nuevos y los almacenamos como previos.

  if (H>P_H) {
      presentoTFT("Humedad....",      H, "%", (char) 24, 75, 85, 10);
  }
  else if (H<P_H){
      presentoTFT("Humedad....",      H, "%", (char) 25, 75, 85, 10);
  }
  else if (H==P_H){
      presentoTFT("Humedad....",      H, "%",       "-", 75, 85, 10);
  }
  else if (T>P_T) {
      presentoTFT("Temperatura....",  T, "C", (char) 24, 80, 90, 40);
  }
  else if (T<P_T){
      presentoTFT("Temperatura....",  T, "C", (char) 25, 80, 90, 40);
  }
  else if (T==P_T){
      presentoTFT("Temperatura....",  T, "C",       "-", 80, 90, 40);
  }

  P_H = H;
  P_T = T;

  // Esperamos antes de hacer la siguiente lectura.
  delay (2500);
}

void presentoTFT(String texto, float tmp, char t1, char t2, byte posx1, byte posx2, byte posy) {
    display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
    display.setTextSize(1);
    // Color del texto
    display.setTextColor(SSD1306_WHITE);
    // Posición del texto
    display.setCursor(16, 0);
    // Escribir texto
    display.println(texto);   // imprimir en pantalla un texto
    display.setCursor(10, 10);
    display.setTextSize(2);
    display.println(tmp);    //imprimir en pantalla valor
    display.setCursor(posx1, posy);
    display.println(t1);   // imprimir en pantalla un texto
    display.setCursor(posx2, posy);
    display.println(t2);
    display.display();
}

Con tanto if anidado es muy fácil confundirse.

La instrucción

   else if(T>P_T){

Se ejecuta solamente cuando no se cumpla ninguna de las anteriores de ese larguísimo y anidadísimo if:
a) H > P_H
b) H < P_H
c) H == P_H

Ya que siempre se va a cumplir una de las condiciones anteriores (Ley de la Tricotomía), la rama else que controla la impresión de la temperatura nunca se ejecuta.

Prueba a eliminar la palabra else de la línea 100 a ver qué pasa...

Conviene que elimines tanto código repetido, como dice @Surbyte. Puedes escribir los valores de Humedad y Temperatura y dejar a los if solamente la impresión de la flecha

// Incluimos la librería de control del sensor DHT11
#include "DHT.h"
#include <Keypad.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

byte const ANCHO_PANTALLA = 128; // ancho pantalla OLED
byte const ALTO_PANTALLA = 64;   // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
// Definimos el pin en el que está conectado el sensor.
const int DHT_Pin = 2;

// Creamos un objeto tipo DHT que denominaremos Sensor: 
//   - Indicando que está conectado al pin DHT_Pin
//   - Y que es un sensor tipo DHT11
DHT Sensor(DHT_Pin, DHT11);

// Variables donde almacenaremos los valores previos
// de la Humedad y la Tempeatura.
float P_H = 0;
float P_T = 0;

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Activamos el puerto Serial y el objeto Sensor.
  Serial.begin(9600);
  Sensor.begin();
  delay(2500); // damos tiempo para la activación del sensor.
      display.clearDisplay();

}

void loop() {  
  float H = Sensor.readHumidity();      // Lee la Humedad
  float T = Sensor.readTemperature();   // Lee la Temperatura
  // Si los nuevos valores son distintos a los anteriores
  // mostramos los nuevos y los almacenamos como previos.
  if (H != P_H || T != P_T){
    // Mostramos la Humedad en el monitor Serial
        display.clearDisplay();
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 0);
       // Escribir texto
       display.println("Humedad....");   // imprimir en pantalla un texto
       display.setTextSize(2);
       display.setCursor(16, 10);
       display.println(H);    //imprimir en pantalla valor
       display.setCursor(76, 10);
       display.println("%");   // imprimir en pantalla un texto
       display.display();
    // Mostramos la Temperatura en el monitor Serial       
        display.setTextSize(1);
        // Color del texto
       display.setTextColor(SSD1306_WHITE);
       // Posición del texto
       display.setCursor(16, 30);
       // Escribir texto
       display.println("Temperatura....");   // imprimir en pantalla un texto
       display.setTextSize(2);
       display.setCursor(16, 40);
       display.println(T);    //imprimir en pantalla valor
       display.setCursor(76, 40);
       display.println("C");   // imprimir en pantalla un texto
       display.display();


    // Almacenamos los valores leídos para la siguiente comparación
    P_H = H;
    P_T = T;
}

if(H!=P_H){
    if(H>P_H){
       display.setCursor(85, 10);
       display.print((char) 24);
       display.display();

}
   else if(H<P_H){
       display.setCursor(85, 10);
       display.print((char) 25);
       display.display();

}
   else if(H==P_H){
       display.setCursor(85, 10);
       display.println("-");
       display.display();
}
}
if(T!=P_T){
    if(T>P_T){
       display.setCursor(85, 10);
       display.print((char) 24);
       display.display();

}
   else if(T<P_T){
       display.setCursor(85, 10);
       display.print((char) 25);
       display.display();

}
   else if(T==P_T){
       display.setCursor(85, 10);
       display.println("-");
       display.display();

}
}
  // Esperamos antes de hacer la siguiente lectura.
  delay (2500);
}

He hecho lo que tu me has dicho pero por la Ley de la Tricotomía no se imprimen los siguientes if

Si que compila, pero sólo se imprime en la pantalla el valor Humedad

Si se cumple esto

if(H!=P_H){

jamás se va a cumplir esto

else if(H==P_H){

porque está dentro del if()

Lo mismo para la temperatura.

Saludos

Creo que no has leído lo que te puse si lo hiciste no entendiste que la idea era ayudarte a VER el problema quitando tanto código.

Esta simpleza resuelve en parte tu problema

// Incluimos la librería de control del sensor DHT11
#include "DHT.h"
#include <Keypad.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

byte const ANCHO_PANTALLA = 128; // ancho pantalla OLED
byte const ALTO_PANTALLA = 64;   // alto pantalla OLED
// Objeto de la clase Adafruit_SSD1306
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);
// Definimos el pin en el que está conectado el sensor.
const int DHT_Pin = 2;

// Creamos un objeto tipo DHT que denominaremos Sensor: 
//   - Indicando que está conectado al pin DHT_Pin
//   - Y que es un sensor tipo DHT11
DHT Sensor(DHT_Pin, DHT11);

// Variables donde almacenaremos los valores previos
// de la Humedad y la Tempeatura.
float P_H = 0;
float P_T = 0;

void presentoTFT(String texto, float tmp, char t1, char t2) {
    display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
    display.setTextSize(1);
    // Color del texto
    display.setTextColor(SSD1306_WHITE);
    // Posición del texto
    display.setCursor(16, 0);
    // Escribir texto
    display.println(texto);   // imprimir en pantalla un texto
    display.setCursor(10, 10);
    display.setTextSize(2);
    display.println(tmp);    //imprimir en pantalla valor
    display.setCursor(75, 10);
    display.println(t1);   // imprimir en pantalla un texto
    display.setCursor(85, 10);
    display.println(t2);
    display.display();
}

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Activamos el puerto Serial y el objeto Sensor.
  Serial.begin(9600);
  Sensor.begin();
  delay(2500); // damos tiempo para la activación del sensor.
      display.clearDisplay();

}

void loop() {  
  float H = Sensor.readHumidity();      // Lee la Humedad
  float T = Sensor.readTemperature();   // Lee la Temperatura

  // Si los nuevos valores son distintos a los anteriores
  // mostramos los nuevos y los almacenamos como previos.

  if (H > P_H) {
      presentoTFT("Humedad....",      H, "%", (char) 24, 75, 85, 10);
  }
  else if (H < P_H){
      presentoTFT("Humedad....",      H, "%", (char) 25, 75, 85, 10);
  }
  else if (H == P_H){
      presentoTFT("Humedad....",      H, "%",       "-", 75, 85, 10);
  }
  
  if (T>P_T) {
      presentoTFT("Temperatura....",  T, "C", (char) 24, 80, 90, 40);
  }
  else if (T < P_T){
      presentoTFT("Temperatura....",  T, "C", (char) 25, 80, 90, 40);
  }
  else if (T == P_T){
      presentoTFT("Temperatura....",  T, "C",       "-", 80, 90, 40);
  }

  P_H = H;
  P_T = T;

  // Esperamos antes de hacer la siguiente lectura.
  delay (2500);
}

void presentoTFT(String texto, float tmp, char t1, char t2, byte posx1, byte posx2, byte posy) {
    display.clearDisplay();
    // Mostramos la Humedad en el monitor Serial
    display.setTextSize(1);
    // Color del texto
    display.setTextColor(SSD1306_WHITE);
    // Posición del texto
    display.setCursor(16, 0);
    // Escribir texto
    display.println(texto);   // imprimir en pantalla un texto
    display.setCursor(10, 10);
    display.setTextSize(2);
    display.println(tmp);    //imprimir en pantalla valor
    display.setCursor(posx1, posy);
    display.println(t1);   // imprimir en pantalla un texto
    display.setCursor(posx2, posy);
    display.println(t2);
    display.display();
}

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