Hola, chicos. Estoy intentando poner dos sensores AHT20 con una placa LILYGO T-Display-S3. Cuando imprimo los valores en pantalla, solo se me muestra en los dos lugares el valor del sensor A. ¿Qué puedo hacer?
#include "Adafruit_AHTX0.h"
#include "TFT_eSPI.h";
#include "Wire.h"
uint8_t sensor1Data = 43;
uint8_t sensor1Clock = 44;
uint8_t sensor2Data = 12;
uint8_t sensor2Clock = 11;
Adafruit_AHTX0 aht1;
Adafruit_AHTX0 aht2;
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite sprite = TFT_eSprite(&tft);
void setup() {
Serial.begin(115200);
Serial.println("SYSTEM Setup.");
tft.init();
tft.setRotation(0);
tft.setSwapBytes(true);
tft.fillScreen(TFT_WHITE);
sprite.createSprite(320, 170);
sprite.setTextColor(TFT_BLACK, TFT_WHITE);
tft.setRotation(3);
sprite.setTextDatum(4);
Serial.println("Adafruit AHT10/AHT20 demo!");
Wire1.setPins(sensor1Data, sensor1Clock);
Wire1.begin();
if (! aht1.begin(&Wire1)) {
Serial.println("Could not find AHT1? Check wiring");
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
sprite.drawString("Could not find AHT1? Check wiring" , 30, 10, 2);
sprite.pushSprite(0, 0);
while (1) delay(10);
}
Wire1.setPins(sensor2Data, sensor2Clock);
Wire1.begin();
if (! aht2.begin(&Wire1)) {
Serial.println("Could not find AHT2? Check wiring");
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
sprite.drawString("Could not find AHT2? Check wiring" , 30, 10, 2);
sprite.pushSprite(0, 0);
while (1) delay(10);
}
Serial.println("AHT10 or AHT20 found");
}
void loop() {
sensors_event_t humidity, temp;
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
aht1.getEvent(&humidity, &temp);
sprite.drawString("Sensor A", 30, 10, 2);
sprite.drawString(String(temp.temperature) + " C", 30, 30, 2);
sprite.drawString(String(humidity.relative_humidity) + " %", 30, 50, 2);
aht2.getEvent(&humidity, &temp);
sprite.drawString("Sensor B", 30, 70, 2);
sprite.drawString(String(temp.temperature) + " C", 30, 90, 2);
sprite.drawString(String(humidity.relative_humidity) + " %", 30, 110, 2);
sprite.pushSprite(0, 0);
}
xfpd
May 29, 2024, 2:59pm
2
rjmoragara87:
sensor A
Su código no contiene un "sensor A".
1 Like
Me expresé mal... Lo siento. En el código defino a dos sensores:
Adafruit_AHTX0 aht1;
Adafruit_AHTX0 aht2;
Entonces "aht1" = Sensor A y "aht2" = Sensor B... Aquí es donde imprimo los valores en pantalla:
aht1.getEvent(&humidity, &temp);
sprite.drawString("Sensor A", 30, 10, 2);
sprite.drawString(String(temp.temperature) + " C", 30, 30, 2);
sprite.drawString(String(humidity.relative_humidity) + " %", 30, 50, 2);
aht2.getEvent(&humidity, &temp);
sprite.drawString("Sensor B", 30, 70, 2);
sprite.drawString(String(temp.temperature) + " C", 30, 90, 2);
sprite.drawString(String(humidity.relative_humidity) + " %", 30, 110, 2);
xfpd
May 29, 2024, 3:24pm
4
El uso de aht1 y aht2 es mejor que el uso de variables no declaradas. Probablemente necesite humedad y temperatura para cada sensor.
1 Like
Ok, voy a probar de esa forma y le comento. Gracias!!!!
rjmoragara87:
Adafruit_AHTX0 aht1
Es más legible usar
Adafruit_AHTX0 sensorA;
1 Like
Cuando se ejecuta esta instrucción es porque ambos sensores fueron encontrados
1 Like
¡Hola Chicos! Ya hice los ajustes y me sigue imprimiendo el valor del sensorA en los dos lugares... hice algunos ajustes, espero que sea más legible.
#include "Adafruit_AHTX0.h"
#include "TFT_eSPI.h";
#include "Wire.h"
uint8_t sensorAData = 43;
uint8_t sensorAClock = 44;
uint8_t sensorBData = 12;
uint8_t sensorBClock = 44;
Adafruit_AHTX0 sensorA;
Adafruit_AHTX0 sensorB;
Adafruit_Sensor *sensorA_humidity, *sensorA_temp;
Adafruit_Sensor *sensorB_humidity, *sensorB_temp;
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite sprite = TFT_eSprite(&tft);
void setup() {
Serial.begin(115200);
Serial.println("SYSTEM Setup.");
tft.init();
tft.setRotation(0);
tft.setSwapBytes(true);
tft.fillScreen(TFT_WHITE);
sprite.createSprite(320, 170);
sprite.setTextColor(TFT_BLACK, TFT_WHITE);
tft.setRotation(3);
sprite.setTextDatum(4);
Serial.println("Adafruit AHT10/AHT20 demo!");
Wire1.setPins(sensorAData, sensorAClock);
Wire1.begin();
if (! sensorA.begin(&Wire1)) {
Serial.println("Could not find AHT1? Check wiring");
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
sprite.drawString("Could not find AHT1? Check wiring" , 30, 10, 2);
sprite.pushSprite(0, 0);
while (1) delay(10);
}
Wire1.setPins(sensorBData, sensorBClock);
Wire1.begin();
if (! sensorB.begin(&Wire1)) {
Serial.println("Could not find AHT2? Check wiring");
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
sprite.drawString("Could not find AHT2? Check wiring" , 30, 10, 2);
sprite.pushSprite(0, 0);
while (1) delay(10);
}
Serial.println("AHT10 or AHT20 found");
sensorA_temp = sensorA.getTemperatureSensor();
sensorA_temp->printSensorDetails();
sensorA_humidity = sensorA.getHumiditySensor();
sensorA_humidity->printSensorDetails();
sensorB_temp = sensorB.getTemperatureSensor();
sensorB_temp->printSensorDetails();
sensorB_humidity = sensorB.getHumiditySensor();
sensorB_humidity->printSensorDetails();
}
void loop() {
sensors_event_t sensorAhumidity;
sensors_event_t sensorAtemp;
sensors_event_t sensorBhumidity;
sensors_event_t sensorBtemp;
sensorA_humidity->getEvent(&sensorAhumidity);
sensorA_temp->getEvent(&sensorAtemp);
sensorB_humidity->getEvent(&sensorBhumidity);
sensorB_temp->getEvent(&sensorBtemp);
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_24);
sprite.setTextSize(1);
sprite.drawString("Sensor A", 40, 20, 2);
sprite.drawString(String(sensorAtemp.temperature) + " C", 40, 40, 2);
sprite.drawString(String(sensorAhumidity.relative_humidity) + " %", 40, 60, 2);
sprite.drawString("Sensor B", 40, 100, 2);
sprite.drawString(String(sensorBtemp.temperature) + " C", 40, 120, 2);
sprite.drawString(String(sensorBhumidity.relative_humidity) + " %", 40, 140, 2);
sprite.pushSprite(0, 0);
}
xfpd
May 30, 2024, 4:14pm
9
¿Son correctas? El mismo reloj suena bien, pero solo verificando.
Compruebe que el sensorA y el sensorB se están inicializando. El código original era "si no se inicializó".
1 Like
Puse el mismo reloj para los dos sensores y moví los cables. También se llegan a inicializar los dos sensores, le puse una condición para en el caso que no se inicializaran, no pasara de ahí. La ejecución pasa correctamente el setup() y luego corre normalmente en el loop(), pero sigue sin imprimir los datos del sensor B, en su lugar muestra los del A.
Wire1.setPins(sensorAData, sensorAClock);
Wire1.begin();
if (!sensorA.begin(&Wire1)) {
Serial.println("Could not find AHT1? Check wiring");
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
sprite.drawString("Could not find AHT1? Check wiring" , 30, 10, 2);
sprite.pushSprite(0, 0);
while (1) delay(10);
}
Wire1.setPins(sensorBData, sensorBClock);
Wire1.begin();
if (! sensorB.begin(&Wire1)) {
Serial.println("Could not find AHT2? Check wiring");
sprite.fillSprite(TFT_WHITE);
sprite.setFreeFont(&Orbitron_Light_32);
sprite.setTextSize(0);
sprite.drawString("Could not find AHT2? Check wiring" , 30, 10, 2);
sprite.pushSprite(0, 0);
while (1) delay(10);
}
xfpd
May 30, 2024, 4:46pm
11
Haga esto e informe los resultados.
1 Like
@xfpd por alguna razón no logro ver los mensajes que se imprimen por el puerto serie... entonces lo imprimí en pantalla...
xfpd
May 30, 2024, 7:03pm
13
¡Fue una buena idea!
Vemos que "A" y "B" están inicializados, y parece estar funcionando (A y B son diferentes ahora).
Cuando se muestren dos temperaturas y humedades, asegúrese de sostener el sensor o los sensores están en entornos muy diferentes. (sostenga uno en su mano cerrada)
1 Like
@xfpd Ya sostube el sensor A con la mano cerrada, los valores se disparan por igual en los dos lugares. La verdad es que es muy raro...
Lo único que se me ocurre es que haya algún problema con el tema de como se manejan los datos en los sensores:
sensors_event_t sensorAhumidity;
sensors_event_t sensorAtemp;
sensors_event_t sensorBhumidity;
sensors_event_t sensorBtemp;
sensorA_humidity->getEvent(&sensorAhumidity);
sensorA_temp->getEvent(&sensorAtemp);
sensorB_humidity->getEvent(&sensorBhumidity);
sensorB_temp->getEvent(&sensorBtemp);
xfpd
May 30, 2024, 7:20pm
15
Pruebe esto con el sensor B.
Si encuentra los mismos valores en el sensor B, dé un segundo después de leer el sensor A y un segundo después del sensor B.
1 Like
@xfpd ya hice esta prueba y nada... los datos siguien siendo los mismo del sensor A.
xfpd
May 30, 2024, 7:57pm
17
rjmoragara87:
esta prueba
¿Qué prueba? ¿Mantener presionado B o esperar 1 segundo?
(LO SIENTO, debe esperar 2 segundos entre la lectura A y la lectura B)
1 Like
@xfpd Hola! ya hice esa prueba... Esperé dos segundos para tocar cada sensor y solo cambia los valores cuando toco el sensor A... Es muy raro lo que está pasando, es como si en los eventos solo se leyeran o almacenaran los valores del SensorA, El SensorB se inicializa, pero no lo llega a leer.
xfpd
May 31, 2024, 3:08pm
19
Una vez más, lamento mi mala comunicación. Debe hacer que el código espere dos segundos entre la lectura del SensorA y el SensorB mientras sostiene un sensor. Algunos sensores (por ejemplo, DHT11) solo tienen datos a los dos segundos.
1 Like
@xfpd Voy a probar con 3 seg