Сегодня на рынке электронных компонентов для Arduino среди датчиков температуры и влажности можно найти не только устройства серии DHT (DHT11 и DHT22), но и многие другие датчики.

В данном материале мы рассмотрим работу Arduino с датчиком AHT10 на примере создания комнатного термометра, который будет выдавать данные о температуре и влажности на дисплей SSD1306.
Датчик AHT10 оснащен ASIC-микросхемой новой конструкции, улучшенным полупроводниковым емкостным МЭМС датчиком влажности и стандартным встроенным датчиком температуры. Он может выводить калиброванный цифровой сигнал в стандартном формате I2C. Модуль AHT10 работает от 1,6 В до 6 В, что идеально, если мы используем внешний источник 5 В для питания этого датчика вместе с дисплеем SSD1306 и платой Arduino. Модуль с датчиком AHT10, который мы здесь будем использовать, имеет собственный встроенный линейный регулятор напряжения и базовую схему сдвига логического уровня. Существует возможность изменить адрес I2C по умолчанию (0x38).

Схема подключения Arduino, датчика AHT10 и дисплея SSD1306 представлена далее.

Код программы для Arduino следующий:
#include <Wire.h>
#include <AHTxx.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT);
float ahtValue;
AHTxx aht10(AHTXX_ADDRESS_X38, AHT1x_SENSOR);
void setup()
{
#if defined(ESP8266)
WiFi.persistent(false);
WiFi.forceSleepBegin();
#endif
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
Serial.begin(115200);
Serial.println();
while (aht10.begin() != true)
{
Serial.println(F("AHT1x not connected or fail to load calibration coefficient"));
delay(5000);
}
Serial.println(F("AHT10 OK"));
//Wire.setClock(400000);
}
void loop()
{
Serial.println();
Serial.println(F("DEMO 1: read 12-bytes"));
ahtValue = aht10.readTemperature();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30, 0);
display.println(F("Temp-"));
// Serial.print(F("Temperature...: "));
if (ahtValue != AHTXX_ERROR)
{
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(35, 25);
display.println(ahtValue);
display.display();
// Serial.print(ahtValue);
}
else
{
printStatus();
if (aht10.softReset() == true) Serial.println(F("reset success"));
else Serial.println(F("reset failed"));
}
delay(2000);
ahtValue = aht10.readHumidity();
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(30, 0);
display.println(F("Humd-"));
// Serial.print(F("Humd-"));
if (ahtValue != AHTXX_ERROR)
{
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(35, 25);
display.println(ahtValue);
display.display();
// Serial.println(F(" +-2%"));
}
else
{
printStatus();
}
delay(2000);
Serial.println();
Serial.println(F("DEMO 2: read 6-byte"));
ahtValue = aht10.readTemperature();
Serial.print(F("Temperature: "));
if (ahtValue != AHTXX_ERROR)
{
Serial.print(ahtValue);
Serial.println(F(" +-0.3C"));
}
else
{
printStatus();
}
ahtValue = aht10.readHumidity(AHTXX_USE_READ_DATA);
Serial.print(F("Humidity...: "));
if (ahtValue != AHTXX_ERROR)
{
Serial.print(ahtValue);
Serial.println(F(" +-2%"));
}
else
{
printStatus();
}
delay(10000);
}
void printStatus()
{
switch (aht10.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;
}
}
Датчик температуры AHT10 работает успешно и отображает показания температуры, а затем показания влажности одно за другим с временным интервалом 2000 миллисекунд после загрузки кода.
© digitrode.ru