Esp32 error con pantallas y hx711

Tengo programada 3 pantallas LCD mediante i2c, y 3 celdas de carga con hx711 pero al momento de subir el código, las pantallas no muestran nada, sin embargo, cuando desconecto algunas hx711 las pantallas funcionar de manera normal, pero si vuelvo a conectar las hx711 no leen valores de la celda de carga, ayuda

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @gilmar_69.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Ayúdanos leyendo las normas del foro y siguiendo sus lineamientos.

Si no adjuntas el código (de acuerdo a las Normas del Foro en Español, punto 7) y el esquema de como has conectado todo (puedes hacerlo a mano y subir una foto, lo importante es que se entienda) nos haces imposible ayudarte porque solo nos das la opción de adivinar.

Disculpa, aqui el codigo:

#include <WiFi.h>
#include <FirebaseESP32.h>
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
#include "HX711.h"

// WiFi
#define WIFI_SSID "Redmi Note 12S"
#define WIFI_PASSWORD "123456789"

// Firebase
#define FB_HOST "firebase"
#define FB_KEY "Clave"

// Direcciones I2C de las pantallas LCD
#define LCD1_ADDRESS 0x23
#define LCD2_ADDRESS 0x27
#define LCD3_ADDRESS 0x22

// Pines del ESP32 para HX711
const int LOADCELL1_DOUT_PIN = 25;
const int LOADCELL1_SCK_PIN = 26;
const int LOADCELL2_DOUT_PIN = 32;
const int LOADCELL2_SCK_PIN = 33;
const int LOADCELL3_DOUT_PIN = 13;
const int LOADCELL3_SCK_PIN = 14;

// Pines para transistores y configuración de interrupciones
const int transistor1Pin = 5;
const int transistor2Pin = 18;
const int transistor3Pin = 19;
const int transistor4Pin = 23; // No usar para otra cosa debido a I2C
const int buzzerPin = 4; // Pin disponible para el buzzer

FirebaseData firebaseData;
FirebaseAuth auth;
FirebaseConfig config;

LiquidCrystal_PCF8574 lcd1(LCD1_ADDRESS);
LiquidCrystal_PCF8574 lcd2(LCD2_ADDRESS);
LiquidCrystal_PCF8574 lcd3(LCD3_ADDRESS);

HX711 scale1;
HX711 scale2;
HX711 scale3;

// Factores de escala para las celdas de carga
const float LOADCELL1_SCALE = 468.4; // Cambia este valor según la calibración de tu celda de carga 1
const float LOADCELL2_SCALE = -462.4; // Cambia este valor según la calibración de tu celda de carga 2
const float LOADCELL3_SCALE = -474; // Cambia este valor según la calibración de tu celda de carga 3

void setup() {
    Serial.begin(115200);

    // Configuración inicial de pines
    pinMode(transistor1Pin, OUTPUT);
    pinMode(transistor2Pin, OUTPUT);
    pinMode(transistor3Pin, OUTPUT);
    pinMode(transistor4Pin, OUTPUT);
    pinMode(buzzerPin, OUTPUT);

    // Asegurarse de que todos los transistores estén apagados al inicio
    digitalWrite(transistor1Pin, LOW);
    digitalWrite(transistor2Pin, LOW);
    digitalWrite(transistor3Pin, LOW);
    digitalWrite(transistor4Pin, LOW);
    digitalWrite(buzzerPin, LOW);

    // Inicialización de WiFi
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("Conectando a WiFi...");
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Conectado a WiFi.");

    // Inicialización de Firebase
    config.host = FB_HOST;
    config.signer.tokens.legacy_token = FB_KEY;
    Firebase.begin(&config, &auth);
    Firebase.reconnectWiFi(true);

    // Inicialización de pantallas LCD
    lcd1.begin(16, 2);
    lcd2.begin(16, 2);
    lcd3.begin(16, 2);

    // Configuración de brillo de las pantallas (opcional)
    lcd1.setBacklight(255);
    lcd2.setBacklight(255);
    lcd3.setBacklight(255);

    // Agregar un pequeño retraso antes de inicializar los HX711
    delay(500);

    // Inicialización de HX711
    scale1.begin(LOADCELL1_DOUT_PIN, LOADCELL1_SCK_PIN);
    scale1.set_scale(LOADCELL1_SCALE); // Establecer el factor de escala para la balanza 1
    scale1.tare(); // Restablecer la tara (peso vacío)

    scale2.begin(LOADCELL2_DOUT_PIN, LOADCELL2_SCK_PIN);
    scale2.set_scale(LOADCELL2_SCALE); // Establecer el factor de escala para la balanza 2
    scale2.tare(); // Restablecer la tara (peso vacío)

    scale3.begin(LOADCELL3_DOUT_PIN, LOADCELL3_SCK_PIN);
    scale3.set_scale(LOADCELL3_SCALE); // Establecer el factor de escala para la balanza 3
    scale3.tare(); // Restablecer la tara (peso vacío)

    Serial.println("Setup completado.");
}

void loop() {
    // Leer el peso de cada balanza
    float weight1 = scale1.get_units(10); // Obtener un promedio de 10 lecturas de la balanza 1
    float weight2 = scale2.get_units(10); // Obtener un promedio de 10 lecturas de la balanza 2
    float weight3 = scale3.get_units(10); // Obtener un promedio de 10 lecturas de la balanza 3

    // Obtener las órdenes para los motores desde Firebase como strings
    String orden_peq_str = getFirebaseString("/App_proyecto/Orden_peq");
    String orden_med_str = getFirebaseString("/App_proyecto/Orden_med");
    String orden_gran_str = getFirebaseString("/App_proyecto/Orden_gran");
    String orden_motor_str = getFirebaseString("/App_proyecto/Orden_motor");

    // Convertir strings a enteros para procesamiento más rápido
    int orden_peq = orden_peq_str.toInt();
    int orden_med = orden_med_str.toInt();
    int orden_gran = orden_gran_str.toInt();
    int orden_motor = orden_motor_str.toInt();

    // Mostrar las órdenes en el monitor serial
    Serial.print("Orden Pequeña: ");
    Serial.println(orden_peq);
    Serial.print("Orden Mediana: ");
    Serial.println(orden_med);
    Serial.print("Orden Grande: ");
    Serial.println(orden_gran);
    Serial.print("Orden Motor: ");
    Serial.println(orden_motor);

    // Mostrar los pesos y objetivos en las pantallas LCD
    displayWeightGoal(lcd1, orden_peq, weight1);
    displayWeightGoal(lcd2, orden_med, weight2);
    displayWeightGoal(lcd3, orden_gran, weight3);

    // Verificar si se alcanzó el peso objetivo en alguna balanza y manejar el buzzer
    handleBuzzer(weight1, orden_peq);
    handleBuzzer(weight2, orden_med);
    handleBuzzer(weight3, orden_gran);

    // Manejar los transistores según la orden recibida para el motor
    handleMotorOrder(orden_motor);

    // Apagar y encender los HX711 para ahorrar energía
    scale1.power_down(); // Apagar el HX711 de la balanza 1
    scale2.power_down(); // Apagar el HX711 de la balanza 2
    scale3.power_down(); // Apagar el HX711 de la balanza 3

    delay(1000); // Esperar un segundo antes de la siguiente lectura

    scale1.power_up(); // Encender el HX711 de la balanza 1
    scale2.power_up(); // Encender el HX711 de la balanza 2
    scale3.power_up(); // Encender el HX711 de la balanza 3
}

void handleBuzzer(float currentWeight, int objetivo) {
    // Convertir el objetivo a kilogramos para la comparación
    float objetivoKg = static_cast<float>(objetivo);
    // Activar el buzzer si se supera el peso objetivo y no es el modo sin objetivo (4)
    if (objetivo != 4 && currentWeight >= objetivoKg) {
        digitalWrite(buzzerPin, HIGH);
        triggerTransistor(transistor1Pin);
    } else {
        digitalWrite(buzzerPin, LOW);
    }
}

void handleMotorOrder(int order) {
    switch (order) {
        case 1:
            triggerTransistor(transistor1Pin);
            break;
        case 2:
            triggerTransistor(transistor2Pin);
            break;
        case 3:
            triggerTransistor(transistor3Pin);
            break;
        case 4:
            triggerTransistor(transistor4Pin);
            break;
        default:
            // Apagar todos los transistores si la orden no es válida
            digitalWrite(transistor1Pin, LOW);
            digitalWrite(transistor2Pin, LOW);
            digitalWrite(transistor3Pin, LOW);
            digitalWrite(transistor4Pin, LOW);
            break;
    }
}

void triggerTransistor(int pin) {
    digitalWrite(pin, HIGH); // Activar el transistor
    delay(100); // Mantenerlo activado durante 100 ms
    digitalWrite(pin, LOW); // Desactivar el transistor
}

String getFirebaseString(const char* path) {
    String result = "";
    if (Firebase.getString(firebaseData, path)) {
        result = firebaseData.stringData();
    } else {
        Serial.print("Error al obtener datos desde Firebase para ");
        Serial.println(path);
    }
    return result;
}

void displayWeightGoal(LiquidCrystal_PCF8574 &lcd, int objetivo, float pesoActual) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("P.O.: ");

    lcd.setCursor(5, 0);
    switch (objetivo) {
        case 1:
            lcd.print("1kg");
            break;
        case 2:
            lcd.print("2kg");
            break;
        case 3:
            lcd.print("3kg");
            break;
        case 4:
            lcd.print("Sin Objetivo");
            break;
        default:
            lcd.print("Descon.");
            break;
    }

    lcd.setCursor(0, 1);
    lcd.print("Peso: ");
    
    if (pesoActual < 0) {
        pesoActual = 0;
    }

    float pesoKg = pesoActual; // Usar directamente peso en kilogramos
    lcd.print(pesoKg, 3); // Mostrar el peso actual en kilogramos con tres decimales
    lcd.print(" kg");

    // Mostrar el mensaje "Peso alcanzado" si el peso actual alcanza o supera el objetivo
    if (objetivo != 4 && pesoKg >= static_cast<float>(objetivo)) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Peso alcanzado");
    }
} 

las conexiones son tal cual, las pantallas comparte conexiones dado el i2c y las celdas comparten alimentacion y tierra con sus respectivos dt y sck definidos en el codigo`

Mi codigo consisten en 3 balanzas con 3 pantallas que muestran el peso recibido de cada galga, recibiendo datos de una firebase mediante una app, define pesos objetivos, en cada balanza, cuando se alcanza este peso, se activa un pequeño buzzer, los transistores generan interrupciones en otro microcontrolador.

La función wait_ready() de la librería HX711 es llamada cuando ejecutas get_units().

Por lo pronto, revisa a detalle las conexiones de los módulos. Pines, cables, soldaduras, etc.

Si tienes un medidor de continuidad o un óhmetro puedes verificar que todo esté bien conectado.

Esperamos tu comentario

¿El problema estaría entonces en las conexiones fisicas?, quiero descartar problemas de codigo, gracias

Es una posibilidad.

¿Usas algo como esto para tu circuito, o tienes cables soldados?

Trabajo en una PCB

Checa la continuidad, la integridad de los cables y de las soldaduras. Una mala conexión puede dejar el sketch esperando una respuesta indefinidamente

ok, revisare esto, muchas gracias

¿Alguna de las 3, cualquiera de ellas o siempre la misma?
¿O cuando desconectas las 3?

Ten en cuenta que la lectura de las celdas es bloqueante, queda en espera de que la celda responda, tal vez tendrías que usar la función is_ready() antes de hacer la lectura de cada celda por si alguna genera problemas.
Mira el ejemplo HX711_basic_example de la librería.

También podrías fijar un timeout para las lecturas por si alguna celda no responde, revisa la documentación de la librería.

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