Совместная работа BME280 и AHT20

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
Не получается добиться нормальной совместной работы BME280 и AHT20, может кто сталкивался?
Для BME280 используется последняя библиотека GyverBME280
Для AHT20 последняя с гитхаба https://github.com/enjoyneering/AHTxx

При подключении BME280 и AHT20 на этой прошивке, BME280 выдаёт какуюто дичь
------ AHT20 -------
DEMO 1: read 12-bytes
Temperature...: 23.26 +-0.3C
Humidity......: 21.80 +-2%

------ AHT20 -------
DEMO 2: read 6-byte
Temperature: 23.26 +-0.3C
Humidity...: 21.69 +-2%


------ BME280 -------
Temperature: 0.00 *C
Humidity: 22.21 %
Pressure: 693.67 hPa , 520.30 mm Hg
Altitide: 3084.02 m

При работе BME280 с отдельной прошивкой всё нормально, но единственное для моей локации ошибается в высоте над уровнем моря более чем на половину.

------ BME280 -------
Temperature: 23.40 *C
Humidity: 16.25 %
Pressure: 1009.56 hPa , 757.23 mm Hg
Altitide: 30.78 m


Код прошивки BME280 и AHT20:
// #include <Wire.h>
#include <AHTxx.h>
#include <Arduino.h>
#include <GyverBME280.h>                      // Подключение библиотеки
GyverBME280 bme;                              // Создание обьекта bme
float ahtValue;                               // to store T/RH result
AHTxx aht20(AHTXX_ADDRESS_X38, AHT2x_SENSOR); // sensor address, sensor type

void setup()
{
  aht20.begin();
  Serial.begin(9600); // Запуск последовательного порта
  // while (aht20.begin() != true)
  // {
  //   Serial.println(F("AHT2x not connected or fail to load calibration coefficient")); //(F()) save string to flash & keeps dynamic memory free
  delay(5000);
  // }
  // Serial.println(F("AHT20 OK"));
  bme.begin(); // Если доп. настройки не нужны  - инициализируем датчик
}

void bme280()
{
  Serial.println("");
  Serial.println(F("------ BME280 -------"));
  Serial.print("Temperature: ");
  Serial.print(bme.readTemperature()); // Выводим темперутуру в [*C]
  Serial.println(" *C");

  Serial.print("Humidity: ");
  Serial.print(bme.readHumidity()); // Выводим влажность в [%]
  Serial.println(" %");

  float pressure = bme.readPressure(); // Читаем давление в [Па]
  Serial.print("Pressure: ");
  Serial.print(pressure / 100.0F); // Выводим давление в [гПа]
  Serial.print(" hPa , ");
  Serial.print(pressureToMmHg(pressure)); // Выводим давление в [мм рт. столба]
  Serial.println(" mm Hg");
  Serial.print("Altitide: ");
  Serial.print(pressureToAltitude(pressure)); // Выводим высоту в [м над ур. моря]
  Serial.println(" m");
  Serial.println("");
  delay(5000);
}

void printStatus()
{
  switch (aht20.getStatus())
  {
  case AHTXX_NO_ERROR:
    Serial.println(F("no error"));
    break;

  case AHTXX_BUSY_ERROR:
    Serial.println(F("sensor busy, increase polling time"));
    break;

  case AHTXX_ACK_ERROR:
    Serial.println(F("sensor didn't return ACK, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)"));
    break;

  case AHTXX_DATA_ERROR:
    Serial.println(F("received data smaller than expected, not connected, broken, long wires (reduce speed), bus locked by slave (increase stretch limit)"));
    break;

  case AHTXX_CRC8_ERROR:
    Serial.println(F("computed CRC8 not match received CRC8, this feature supported only by AHT2x sensors"));
    break;

  default:
    Serial.println(F("unknown status"));
    break;
  }
}

void AHT20_func()
{
  /* DEMO - 1, every temperature or humidity call will read 6-bytes over I2C, total 12-bytes */
  Serial.println();
  Serial.println(F("------ AHT20 -------"));
  Serial.println(F("DEMO 1: read 12-bytes"));

  ahtValue = aht20.readTemperature(); // read 6-bytes via I2C, takes 80 milliseconds

  Serial.print(F("Temperature...: "));

  if (ahtValue != AHTXX_ERROR) // AHTXX_ERROR = 255, library returns 255 if error occurs
  {
    Serial.print(ahtValue);
    Serial.println(F(" +-0.3C"));
  }
  else
  {
    printStatus(); // print temperature command status

    if (aht20.softReset() == true)
      Serial.println(F("reset success")); // as the last chance to make it alive
    else
      Serial.println(F("reset failed"));
  }

  delay(2000); // measurement with high frequency leads to heating of the sensor, see NOTE

  ahtValue = aht20.readHumidity(); // read another 6-bytes via I2C, takes 80 milliseconds

  Serial.print(F("Humidity......: "));

  if (ahtValue != AHTXX_ERROR) // AHTXX_ERROR = 255, library returns 255 if error occurs
  {
    Serial.print(ahtValue);
    Serial.println(F(" +-2%"));
  }
  else
  {
    printStatus(); // print humidity command status
  }

  delay(2000); // measurement with high frequency leads to heating of the sensor, see NOTE

  /* DEMO - 2, temperature call will read 6-bytes via I2C, humidity will use same 6-bytes */
  Serial.println();
  Serial.println(F("------ AHT20 -------"));
  Serial.println(F("DEMO 2: read 6-byte"));

  ahtValue = aht20.readTemperature(); // read 6-bytes via I2C, takes 80 milliseconds

  Serial.print(F("Temperature: "));

  if (ahtValue != AHTXX_ERROR) // AHTXX_ERROR = 255, library returns 255 if error occurs
  {
    Serial.print(ahtValue);
    Serial.println(F(" +-0.3C"));
  }
  else
  {
    printStatus(); // print temperature command status
  }

  ahtValue = aht20.readHumidity(AHTXX_USE_READ_DATA); // use 6-bytes from temperature reading, takes zero milliseconds!!!

  Serial.print(F("Humidity...: "));

  if (ahtValue != AHTXX_ERROR) // AHTXX_ERROR = 255, library returns 255 if error occurs
  {
    Serial.print(ahtValue);
    Serial.println(F(" +-2%"));
    Serial.println("");
  }
  else
  {
    printStatus(); // print temperature command status not humidity!!! RH measurement use same 6-bytes from T measurement
  }

  delay(10000); // recomended polling frequency 8sec..30sec
}

void loop()
{
  AHT20_func();
  bme280();
}
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@dxf, для того, чтобы высота отображалась правильно, нужно задавать давление на нулевой высоте над уровнем моря.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@dxf, как подключены датчики? Почему нет проверки на правильность инициализации?
После инициализации BME280 требует минимум 100мс для загрузки.
 

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
@poty, время для инициализации тоже пробовал выставлять 5с, к сожалению не помогает.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@dxf, не помешает проверить аппаратную часть.
На шине I2C нужны 2 резистора, подтягивающие сигналы SDA и SCL к потенциалу питания. Если они есть на обоих платах датчиков, то лишние нужно убрать. Собственно, лучше вообще убрать эти резисторы с плат датчиков и припаять их как можно ближе к выводам МК.

UPD: Так же будет не лишним в ардуину загрузить прошивку "Scanner I2C" и точно определить адреса датчиков. Затем явно прописать эти адреса в коде, не полагаясь на умолчания.
 
Изменено:

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
@PiratFox, резисторы пробовал припаивать, разницы нет. Они так то на плате есть. По адресам они верные - т.к. если одновременно датчики не подсоединять то они работают корректно. Где то на забугорном форуме вычитал фразу, что AHT10 от китайцев корявые и очень мешают работать всем остальным устройствам на шине I2C, к сожалению пока больше ничего ненашёл.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@dxf, а если при обоих подсоединённых датчиках просканировать I2C шину, адреса показывает правильно?
 
  • Лойс +1
Реакции: poty

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
@dxf,
(Я не работал ни с AHTxx.h ни с GyverBME280.h)
Если у вас проблемы с bme280, почему вы не проверяете первым делом результат
bme.begin();

Дальше предложения без учета возможной специфики AHTxx.h ни с GyverBME280.h
(Исходя из предположения, что по собранной схеме bme280 точно должен работать)
- сначала закомментировать вызов AHT20_func();
void loop()
{
// AHT20_func();
bme280();
}

Если bme280 все равно не заработает, то возможно дело в особенности библиотеки при инициализации AHT20
Поставить таймаут на 25000 (вместо нынешних 1000 при инициализации AHT20)
Добавить Wire.setWireTimeout(25000, false); после aht20.begin();
aht20.begin();
Wire.setWireTimeout(25000, false);

Если и это не поможет, закомментировать все относящееся к AHT20. Если не поможет, то вероятно дело в схемотехнике.
 
  • Лойс +1
Реакции: dxf

dxf

✩✩✩✩✩✩✩
17 Апр 2020
47
2
@Bruzzer, натолкнули на мысль ) поменял местами инициализацию датчиков и всё заработало. Всем спасибо.
Вывод датчиков:
------ AHT20 -------
DEMO 1: read 12-bytes
Temperature...: 24.46 +-0.3C
Humidity......: 19.37 +-2%

------ AHT20 -------
DEMO 2: read 6-byte
Temperature: 24.45 +-0.3C
Humidity...: 19.44 +-2%


------ BME280 -------
Temperature: 24.51 *C
Humidity: 14.50 %
Pressure: 1006.07 hPa , 754.62 mm Hg
Altitide: 59.95 m
Показатель влажности нормально так отличается.