[SOLUCIONADO] Expansor de pines PCF8574 con DHT21

Hola a todos, no tengo muy claro si esta consulta es de software o hardware, supongo que dependerá de su aclaración.

Estoy con un proyecto para controlar la temperatura (con el sensor AM2301) de cuatro cámaras frigoríficas con su gestión de alarmas y una pantallita Nokia5110. Usando nodemcu.

La pantalla se gestiona sin problema con SPI, enciendo y apago los leds a través del PCF8574 (I2C).

El problema es cuando incluyo la línea “dht.begin()” compila correcto, pero deja de mostrarme las salidas puerto serie y parece que el resto funciona correctamente.

No tengo nada en lo pines GPIO3 y GPIO1. Será ¿GPIO2 el culpable?

Mando un programita reducido que reproduce la incidencia, por si alguien pudiera darme una pista de lo que ocurre o por donde mirar.

///// Para la pantalla Nokia 5110
#include <SPI.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(14, 13, 2, 15, 16);   // NodeMCU SPI 14x6 con el tamano 0

//Expansor de pines I2C
#include "PCF8574.h"
PCF8574 pcf8574(0x20);

//Sensor AM2301
#include "DHT.h"
#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht_Nevera (P1, DHTTYPE);

int Ultimo_Display=0;
const int MOSTRAR_TEMPERATURA =2000;
int Contador=0;
float Humedad      = 0;
float Temperatura  = 0;

void setup() {

  Serial.begin(9600);

  pcf8574.pinMode(P0, OUTPUT);
  pcf8574.pinMode(P1, INPUT);
  pcf8574.pinMode(P2, INPUT);
  pcf8574.pinMode(P3, INPUT);
  pcf8574.pinMode(P4, INPUT);
  pcf8574.pinMode(P5, INPUT);
  pcf8574.pinMode(P6, INPUT);
  pcf8574.pinMode(P7, INPUT);
  pcf8574.begin();

  pcf8574.digitalWrite(P0, 0);  // Controla los LED de la pantalla 0 = encendido
  
  Serial.println("Empezamos");
  
  display.begin();
  display.setContrast(60);  // entre 0 y 100
  display.clearDisplay();
  display.setTextSize(0);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
  display.println("Empezamos...");
  display.display();
  delay(2000);  //Sólo para poder ver que lo muestra el display.

// Si descomento esta linea no muestra el puerto serie.
//  dht_Nevera.begin();
//
  Serial.println("Salimos SetUp");
  
  display.clearDisplay();
  display.setCursor(0,0);
  display.println("Salimos SetUp...");
  display.display();
  delay(2000); //Sólo para poder ver que lo muestra el display.
}

void loop() {
  // Recuperamos datos de DHT21
  // Humedad      = dht_Nevera.readHumidity();
  //  Temperatura  = dht_Nevera.readTemperature();
  
  if (isnan(Humedad) || isnan(Temperatura)) Serial.println("Error en sensor"); 
  
  if (millis() > Ultimo_Display + MOSTRAR_TEMPERATURA) {
      Contador++;                 //sólo para ver funciona el display,
      Ultimo_Display = millis();
      String Texto="Temperatura: "+ String(Temperatura, DEC)+" C";
      Serial.print(Contador);Serial.println(Texto);
      display.clearDisplay();
      display.setCursor(0,0);
      display.println(Texto);
      display.println(Contador);
      display.display();
   }
}

Gracias por vuestra atención.

Solución: El problema es que la librería DHT.h está preparada para apuntar a pines físicos del Nodemcu o Arduino, no a través de un dispositivo I2C. Creo otra librería únicamente cambiando lo siguiente:

pinMode(… por pcf8574.pinMode(
digitalWrite(… por pcf8574.digitalWrite(
digitalRead(… por pcf8574.digitalRead(

Y si conecto el sensor de temperatura directamente, funciona todo correctamente.

El conflicto entonces es el DHT21 ¿con PCF8574 o con la Pantalla 5110? :confused:

Sigo con mis pruebas, a la espera de sus comentarios.

Veo esta linea pero no encuentro la referencia a P1

DHT dht_Nevera (P1, DHTTYPE);

P1 esta indicado como parte del PC8574? Pues ahi esta el problema

Porque DHT.h esta preparada para apuntar a pines físicos del NODEMCU o Arduino, no a través de un dispositivo I2C.
Vas a tener que trabajar modificando DHT para tu beneficio.

La sorpresa es que cuando lo haces con el DHT solo, si funciona o te he mal entendido?
Bueno, ahora comprendo mejor tu redacción.

El DHT lo has probado solo pero no a través del PC8574 o me equivoco?
Voy a suponer que lo has probado conectado a un pin del nodemcu y claramente funciona.
Te funciona la pantalla, te funciona el DHT y los pines a través del PC8574.

Mi pregunta es simple, no te queda un solo pin del nodemcu para apuntar directamente y por la vía conocida Nodemcu <=> DHT21 y no a través del PC8574. No vale la pena el esfuerzo.

Surbyte, es tal como lo describes. DHT no me funciona, únicamente cuando lo conecto al PC8574.

El problema soy yo, que la voy liando poco a poco. Empecé con sensores para las 4 cámaras de refrigeración y congelación que tengo en mi empresa. Envía datos a la plataforma Thingspeak y por Telegram me envía alertas ante incidencias y le pido temperaturas. ¿Y si pongo un sensor infrarrojo para controlar si alguien pasa los fines de semana? ¡¡¡Implantado!!! Recibo la pantalla Nokia que he pedido y me parece superchula. Decido ponerla también con el proyecto de las “heladeras” … y lógicamente me quedo sin pines del nodemecu.

Muchas gracias por tu ayuda, no se me ocurrió que pudiera ser DHT.h y tiene toda su lógica. El pin P1 del PC8574, no significa nada para el sensor.

Voy a ver la librería del DHT, ya por curiosidad. Si lo veo complicado suprimo la pantalla, que realmente no hace falta, pero me gustaba el resultado final.

La pantalla reducela a algo que sea I2c que podria ser OLED y eso te devuelve 2 pines contra los 4 del SPI.

Surbyte, con esa pista que me has dado, he buscado de forma distinta en Google y efectivamente la solución pasa por modificar la librería.

Pero alguien comentaba que cambiando:

pinMode(… por pcf8574.pinMode(
digitalWrite(… por pcf8574.digitalWrite(
digitalRead(… por pcf8574.digitalRead(

Era suficiente.

No he revisado demasiado el código, pero me ha parecido coherente. Cambiando esas tres cosas, en principio funciona todo bien.

Voy a revisarlo bien y dejar el código un poco mas prolijo, que hice copy&paste y modifiqué sin más.

Pero ¿Qué les parece?

Como siempre, gracias infinitas por tanta ayuda desinteresada.

En principio debería funcionar.
Renombra la libreria para que quede claro que esta modifcada pero esta obviedad seguramente ya la has pensado.
I2C si se programa a máxima velocidad permite 400Khz.
Tienes mucho margen para que funcione, a ver qué resulta!!

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