ESP32C3 Super MiniとAHT20+BMP280で大気圧計付きの温度、温度計を作る

2025/08/05

ハードウェア プログラム

t f B! P L
AliExpressでESP32マイコンが安く売ってたので買ってみました。

マイコンは前から興味あったんですが、どうせLチカしたら満足するのに1000円とか出すのも...とか思ってたら300円ぐらいで売ってたので買ってみました。

で、後日 温度、湿度、大気圧センサも買ってみました。大気圧が測れる温度計はそこそこのお値段するのですが、センサ単体だと180円とかだったので。

そんなわけで、大気圧計付きの温度、温度計を作ってみました。


液晶も付いた完成形
(写真だとドット抜けに見えるところがあるけど、肉眼だとちゃんと見える)

配線とスケッチ

接続は 3.3v , GND , SCA , SDL の4本を繋ぐだけ。

ESP32シリーズはボードのバリエーションが多く、ものによってピン配列が違うのでしっかり確認しましょう。
今回使ったESP32C3 Super Miniのピン配列はこれです(ここで少しハマった)。
(追記 : 公式が404なので WebArchiveのミラーに更新しました)


液晶の配線もした後だけど、とてもシンプル


Arduino IDE のスケッチはこんな感じ。AHT20のサンプルスケッチとBMP280のサンプルスケッチを合体させただけです。

(温度センサは AHT20 と BMP280 の両方に載っているので片方をコメントアウトしています)

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_AHTX0.h>

Adafruit_BMP280 bmp; //I2c 0x77
Adafruit_AHTX0 aht;  //I2c 0x38


void setup() {
  Serial.begin(9600);
  while ( !Serial ) delay(10);   // wait for native usb
  Serial.println(F("BMP280 test"));
  unsigned status;
  status = bmp.begin();
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
    Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
    Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
    Serial.print("        ID of 0x60 represents a BME 280.\n");
    Serial.print("        ID of 0x61 represents a BME 680.\n");
    while (1) delay(10);
  }
  if (! aht.begin()) 
  {
    Serial.println("Could not find AHT? Check wiring");
    while (1) delay(10);
  }
  else
  {
    Serial.println("AHT10 or AHT20 found");
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {
    sensors_event_t humidity, temp;
    aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data

    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");

    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
    Serial.println(" m");

    //Serial.print("Temperature: "); 
    //Serial.print(temp.temperature); 
    //Serial.println(" degrees C");
    Serial.print("Humidity: "); 
    Serial.print(humidity.relative_humidity); 
    Serial.println("% rH");

    Serial.println();
    delay(2000);
}  
実行するとシリアルモニタに読み取った数値が表示されます。

液晶も追加してみる

後日、液晶も400円ぐらいだったので買ってみました。
配線は I2C インターフェイスボードに 3.3v , GND , SCA , SDL の4本を繫ぐだけ。

コードはこんな感じ。

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_AHTX0.h>
#include <LiquidCrystal_I2C.h>

Adafruit_BMP280 bmp;
Adafruit_AHTX0 aht;
LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  Serial.begin(9600);
  unsigned long start = millis();
  while (!Serial && millis() - start < 3000) { delay(10); } 

  Serial.println(F("BMP280 test"));

  unsigned status;
  status = bmp.begin();       //status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
    Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
    Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
    Serial.print("        ID of 0x60 represents a BME 280.\n");
    Serial.print("        ID of 0x61 represents a BME 680.\n");
    while (1) delay(10);
  }
  if (! aht.begin()) 
  {
    Serial.println("Could not find AHT? Check wiring");
    while (1) delay(10);
  }
  else
  {
    Serial.println("AHT10 or AHT20 found");
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
  lcd.init();
  lcd.backlight();
}

void loop() {
    sensors_event_t humidity, temp;
    aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data

    lcd.setCursor(0, 0);

    float temperature = bmp.readTemperature();
    int hum = humidity.relative_humidity;
    char tempStrA[21];
    snprintf(tempStrA, sizeof(tempStrA), "Temp %.1f*C Hum %d%%", temperature , hum);
    lcd.print(tempStrA);

    lcd.setCursor(0, 1);
    int Pressure = bmp.readPressure();
    float PressurehPa = Pressure / 100.0;   
    char tempStrB[21];
    snprintf(tempStrB, sizeof(tempStrB), "Prs %.1fhPa", PressurehPa);
    lcd.print(tempStrB);

    lcd.setCursor(0, 2);
    float Altitude = bmp.readAltitude(1013.25); /* Adjusted to local forecast! */
    char tempStrC[21];
    snprintf(tempStrC, sizeof(tempStrC), "Alt %.1fm", Altitude);
    lcd.print(tempStrC);

    Serial.print(F("Temperature = "));
    Serial.print(temperature);
    Serial.println(" *C");

    Serial.print(F("Pressure = "));
    Serial.print(Pressure);
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Serial.print(Altitude); 
    Serial.println(" m");

    //Serial.print("Temperature: "); 
    //Serial.print(temp.temperature); 
    //Serial.println(" degrees C");
    Serial.print("Humidity: "); 
    Serial.print(hum); 
    Serial.println("% rH");

    Serial.println();
    delay(2000);
}
lcd.print で直接表示すると文字化けするので、snprintf で液晶1行分(20文字+終端1文字)に整形してから lcd.print しています。

液晶の表示領域は余ってるので、時計等を足しても良さそうです。

今回の使用品と補足

今回使ったパーツと補足です。アリエクの方は私が購入した商品(ショップ)です。
 

1-10個 ESP32 C3 SuperMini[AliExpress]

ESP32C3 Super Mini は国内通販でも買えますが、国内技適はありません。
電波関連の機能を使いたい場合は技適ありの別機種を選んでください。


AHT20+BMP280[AliExpress]

温度+湿度センサーと温度+気圧センサーが載ったボード。
中華メーカーが勝手に 2 in 1 ボード作ったから、ぴったりのサンプルスケッチが存在しないのかな。


LCD2004 I2C シリアルインターフェイス[AliExpress]

液晶モジュールは I2C変換モジュール付きの物を買うとマイコンとの接続が楽です。
また5Vの表記がありますが、手元の(アリエクで買った物)は3.3Vでも正常動作するようです。

国内流通品はカタカナが表示できるものもあるようです。

このブログを検索

Amazon.co.jp[PR]

このブログについて

QooQ