ต่อ SHT41 สองตัวกับ Raspberry Pi Pico ยังไง เมื่อ I²C Address ชนกัน?

อยากวัดอุณหภูมิและความชื้นสองจุดพร้อมกัน แต่ SHT41 สองตัวที่ใช้ใน Project นี้ตอบอยู่ที่ Address 0x44 เหมือนกัน ถ้าเอาไปต่อบน I²C Bus เดียวกันตรง ๆ Controller ก็แยกไม่ออกว่ากำลังคุยกับ Sensor ตัวไหน

Project ของ AkashWave RF แก้ปัญหานี้ด้วยจุดแข็งของ Raspberry Pi Pico: RP2040 มี I²C Controller สองชุด จึงแยก SHT41 ตัวแรกไปไว้บน I²C0 และตัวที่สองไปไว้บน I²C1 โดยไม่ต้องเปลี่ยน Address ของ Sensor

จากนั้น Pico อ่าน Temperature และ Relative Humidity จากทั้งสองตัว คำนวณ Heat Index และแสดงข้อมูลบน OLED 128×64 โดยระบบยังตรวจได้ด้วยว่า Sensor ตัวไหนถูกถอดออก และสามารถกลับมาอ่านใหม่เมื่อเสียบ Sensor กลับเข้าไป

Dual SHT41 temperature and humidity monitor with Raspberry Pi Pico
Dual SHT41 Monitor ใช้ Raspberry Pi Pico อ่าน Temperature และ Humidity จาก SHT41 สองตัว พร้อมแสดงผลบน OLED
Key Takeaways
  • SHT41 สองตัวใน Project ใช้ I²C Address 0x44 เหมือนกัน
  • Raspberry Pi Pico มี I²C Controller สองชุด จึงแยก Sensor ไปคนละ Bus ได้
  • I²C0 ใช้ GPIO4 / GPIO5 และแชร์ Bus กับ OLED ที่ Address 0x3C
  • I²C1 ใช้ GPIO10 / GPIO11 สำหรับ SHT41 ตัวที่สอง
  • ใช้งาน Sensor เพียงตัวเดียวก็ได้ ระบบจะให้ Sensor ที่ยังเชื่อมต่อทำงานต่อ
  • Code ใช้ High Precision Mode และปิด Heater ของ SHT41
  • OLED แสดง Temperature, Humidity และ Heat Index ของ Sensor ทั้งสองฝั่ง
  • ผลเปรียบเทียบ SHT41 กับ DHT22 เป็นการทดลองของผู้สร้าง ไม่ใช่ Benchmark สำหรับ Sensor ทุกตัว

Project นี้ทำอะไร?

Raspberry Pi Pico with dual SHT41 sensors and OLED display
Prototype ใช้ Raspberry Pi Pico เป็น Controller เชื่อม SHT41 และ OLED สำหรับ Environmental Monitoring

ระบบนี้เป็น Dual-sensor Temperature, Humidity และ Heat Index Monitor โดยใช้ SHT41 สูงสุดสองตัว และจอ OLED 128×64 หนึ่งจอ

จุดเด่นของ Project ไม่ใช่เพียงการอ่าน Sensor สองตัว แต่คือการแก้ปัญหา Address ชนกัน โดยใช้ Hardware I²C สองชุดที่มีอยู่บน RP2040 แทนการเพิ่ม I²C Multiplexer หรือพยายามเปลี่ยน Address ของ Sensor

SHT41 #1I²C0Raspberry Pi PicoI²C1SHT41 #2

ปัญหาใหญ่: SHT41 สองตัวใช้ Address เดียวกัน

I²C ใช้ Address เพื่อระบุว่า Controller ต้องการสื่อสารกับ Device ตัวใดบน Bus

ใน Code ของ Project SHT41 ทั้งสองตัวถูกตรวจที่: 0x44

ถ้าเอา Sensor สองตัวที่ตอบ Address เดียวกัน ไปวางบน Bus เดียวกัน Pico จะไม่สามารถเลือกคุยกับ Sensor ทีละตัวด้วย Address อย่างเดียวได้

Solution ของ Project:
ไม่เปลี่ยน Address แต่แยก Sensor ไปอยู่คนละ Hardware I²C Controller
อย่าเหมารวม SHT4x ทุก Variant: Code ของ Project นี้ใช้ Sensor ที่ตอบที่ 0x44 แต่ Sensirion มี SHT4x Variant อื่นที่อาจใช้ Address ต่างออกไป จึงควรตรวจ Part Number ของ Sensor ที่ใช้งานจริง

Raspberry Pi Pico แก้ปัญหาด้วย I²C0 + I²C1

RP2040 มี Hardware I²C Controller สองชุด คือ I²C0 และ I²C1

Project จึงกำหนด:

Bus SDA SCL Device
I²C0 / Wire GPIO4 GPIO5 SHT41 #1 + OLED
I²C1 / Wire1 GPIO10 GPIO11 SHT41 #2

OLED สามารถแชร์ I²C0 กับ Sensor #1 ได้ เพราะ OLED ใช้ Address 0x3C ขณะที่ SHT41 ใน Project ใช้ 0x44

SHT41 #1 @ 0x44 + OLED @ 0x3CI²C0
SHT41 #2 @ 0x44I²C1

Hardware ที่ต้องใช้

อุปกรณ์สำหรับ Dual SHT41 Raspberry Pi Pico monitor
อุปกรณ์ที่ใช้ใน Project เช่น Raspberry Pi Pico, SHT41, OLED, Breadboard และ Jumper Wire
  • SHT41 จำนวน 1 หรือ 2 ตัว
  • Raspberry Pi Pico
  • Male-to-Male Jumper Cable
  • OLED 128×64
  • Breadboard
  • USB Cable
อุปกรณ์บน Breadboard สำหรับ Dual SHT41 monitor
ภาพอุปกรณ์และการจัดวางสำหรับ Prototype จาก Source ต้นฉบับ

Circuit Diagram และ Pin ที่ใช้

Circuit diagram ของ Raspberry Pi Pico กับ SHT41 สองตัวและ OLED
Circuit Diagram จาก Instructables แสดงแนวทางแยก SHT41 สองตัวไปคนละ I²C Bus
อุปกรณ์ Bus Pin ที่ Code กำหนด Address
SHT41 #1 I²C0 SDA GPIO4 / SCL GPIO5 0x44
OLED I²C0 แชร์ SDA/SCL กับ I²C0 0x3C
SHT41 #2 I²C1 SDA GPIO10 / SCL GPIO11 0x44

Pin Mapping ในตารางยึดจาก Arduino Code ที่ผู้สร้างให้ไว้ ส่วนรายละเอียด Power Wiring ควรตรวจจาก Schematic ต้นฉบับและ Module ที่ใช้งานจริง

Architecture ของ Dual SHT41 Monitor

SHT41 #1Wire / I²C0PicoOLED
SHT41 #2Wire1 / I²C1Pico

Software สร้าง Object Sensor แยกเป็น: sht1 และ sht2

ตอน Setup ระบบจะเริ่ม I²C0 และ I²C1 แยกกัน แล้วตรวจว่ามี Device ที่ Address 0x44 อยู่บนแต่ละ Bus หรือไม่

เมื่อเจอ Sensor Code จะกำหนด:

  • SHT4X_HIGH_PRECISION
  • SHT4X_NO_HEATER

ถ้าใช้ SHT41 แค่ตัวเดียวได้ไหม?

ได้

Project ถูกเขียนให้ตรวจ Sensor แต่ละ Bus แยกกัน ถ้า Sensor ตัวใดไม่พบ Sensor อีกตัวจะยังอ่านและแสดงค่าต่อไป

ใน Code จริง บริเวณของ Sensor ที่หาย จะแสดงข้อความ:

SENSOR
ERROR

ดังนั้นผู้ใช้ไม่จำเป็นต้องมี SHT41 สองตัว ถึงจะทดลอง Project นี้ได้

Code ตรวจ Sensor หลุดและต่อกลับอย่างไร?

จุดที่น่าสนใจคือ Sensor Presence ไม่ได้ถูกตรวจเฉพาะตอน Boot

ในทุก Loop Code เรียก: devicePresent() เพื่อตรวจ Address 0x44 บน Bus ของ Sensor แต่ละตัว

หาก Sensor หายไป Flag เช่น sensor1_ok จะถูกเปลี่ยนเป็น false

และหาก Sensor ถูกเสียบกลับ Code จะลอง begin() ใหม่และพิมพ์ข้อความใน Serial เช่น:

Sensor #1 Reconnected

วิธีนี้ทำให้ Prototype รับมือกับการถอดและเสียบ Sensor กลับ ได้ดีกว่า Code แบบที่ตรวจ Hardware เพียงครั้งเดียวตอน Startup

SHT41 วัดอะไร และสเปกจาก Sensirion เป็นอย่างไร?

SHT41 เป็น Digital Temperature และ Humidity Sensor ของ Sensirion ที่ใช้ I²C Interface และได้รับ Factory Calibration

Specification SHT41 ตาม Sensirion
Typical Relative Humidity Accuracy ±1.8 %RH
Typical Temperature Accuracy ±0.2°C
Relative Humidity Range 0–100 %RH
Operating Temperature -40 ถึง 125°C
Supply Voltage 1.08–3.6 V
Interface I²C
Calibration Factory calibration
Datasheet Accuracy ≠ Accuracy ของ Prototype ทั้งระบบ: ตัวเลขข้างต้นเป็น Specification ของ Sensor IC ไม่ได้หมายความว่า Assembly, Breakout Board, ตำแหน่ง Sensor และ Environment ใน Project นี้ จะให้ผลเท่ากับตัวเลขดังกล่าวทุกสถานการณ์

SHT41 vs DHT22 ในการทดลองนี้ต่างกันอย่างไร?

การทดลองเปรียบเทียบ SHT41 กับ DHT22
ผู้สร้างทดลอง SHT41 สองตัว เทียบกับ DHT22 สองตัวภายใต้การทดลองเดียวกัน

ผู้สร้างนำ:

  • DHT22 จำนวน 2 ตัว
  • SHT41 จำนวน 2 ตัว

มาทดลองพร้อมกัน และรายงานว่า DHT22 สองตัว ให้ค่าต่างกันสังเกตได้มากกว่า ขณะที่ SHT41 สองตัวให้ค่าคล้ายกันมาก และบางช่วงให้ค่าเท่ากัน

SHT41 และ DHT22 ในการทดสอบของผู้สร้าง
ภาพเพิ่มเติมจากการเปรียบเทียบ Sensor ของผู้สร้าง
อย่าใช้ Test นี้สรุปว่า DHT22 ทุกตัวไม่แม่น: การทดลองนี้ใช้ Sensor อย่างละสองตัว และ Source ไม่ได้ให้ Statistical Study, Calibration Reference หรือ Sample Size ขนาดใหญ่ จึงควรเรียกว่า “ผลที่ผู้สร้างพบในการทดลองนี้” มากกว่าข้อสรุปทั่วไปของ Sensor ทั้งสองตระกูล

Heat Index ใน Project คืออะไร?

นอกจาก Temperature และ Relative Humidity Code ยังสร้างค่า Heat Index สำหรับ Sensor แต่ละตัว

Function: computeHeatIndexC() จะรับ Temperature °C และ Humidity จากนั้นแปลง Temperature เป็น Fahrenheit ใช้สมการที่เขียนไว้ใน Source Code แล้วแปลงผลลัพธ์กลับเป็น Celsius

Temperature + HumidityFormula ใน CodeHeat Index °C
Heat Index เป็นค่าที่คำนวณ: ไม่ใช่ค่าที่ SHT41 วัดโดยตรง และ Source ไม่ได้ระบุ Validity Range หรือ Accuracy ของสมการในบริบท Project นี้ จึงไม่ควรใช้แทนเครื่องมือประเมิน Heat Stress ที่มีมาตรฐานเฉพาะ

OLED แสดงข้อมูลอะไร?

จอถูกแบ่งครึ่งเป็น Sensor 1 และ Sensor 2 ด้วยเส้นกลางแนวตั้ง

แต่ละฝั่งแสดง:

  • T: Temperature
  • H: Relative Humidity
  • HI: Heat Index

หาก Sensor ตัวใดหาย ฝั่งนั้นจะเปลี่ยนเป็นข้อความ Error ขณะที่อีกฝั่งยังอัปเดตตามปกติ

ท้าย Loop มี delay(1000) จึงมีช่วงรอประมาณหนึ่งวินาทีระหว่างรอบของ Main Loop แต่ไม่ควรเรียกว่า Sampling Rate 1 Hz แบบแม่นยำ เพราะการอ่าน Sensor, Serial และ OLED ใช้เวลาเพิ่มด้วย

Source Code สำหรับ Dual SHT41 Monitor

Arduino code สำหรับ Raspberry Pi Pico และ SHT41
Project ใช้ Arduino Code ร่วมกับ Adafruit SHT4x, GFX และ SSD1306 Library

Library หลักที่ Source ใช้:

  • Wire
  • Adafruit_SHT4x
  • Adafruit_GFX
  • Adafruit_SSD1306
Dual SHT41 Monitor — Raspberry Pi Pico
#include <Wire.h>
#include <Adafruit_SHT4x.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ---------- I2C Pins ----------
#define I2C0_SDA 4
#define I2C0_SCL 5

#define I2C1_SDA 10
#define I2C1_SCL 11

// ---------- OLED ----------
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDRESS 0x3C

Adafruit_SSD1306 display(
  SCREEN_WIDTH,
  SCREEN_HEIGHT,
  &Wire,
  -1
);

// ---------- Sensor Objects ----------
Adafruit_SHT4x sht1;
Adafruit_SHT4x sht2;

bool sensor1_ok = false;
bool sensor2_ok = false;

// ---------- Heat Index ----------
float computeHeatIndexC(float tempC, float humidity)
{
  float tempF = tempC * 9.0 / 5.0 + 32.0;

  float hiF =
    -42.379 +
    2.04901523 * tempF +
    10.14333127 * humidity -
    0.22475541 * tempF * humidity -
    0.00683783 * tempF * tempF -
    0.05481717 * humidity * humidity +
    0.00122874 * tempF * tempF * humidity +
    0.00085282 * tempF * humidity * humidity -
    0.00000199 * tempF * tempF *
    humidity * humidity;

  return (hiF - 32.0) * 5.0 / 9.0;
}

// ---------- Check Sensor Presence ----------
bool devicePresent(TwoWire &bus, uint8_t address)
{
  bus.beginTransmission(address);
  return (bus.endTransmission() == 0);
}

// ---------- OLED Display ----------
void updateOLED(
  bool sensor1_present,
  float temp1,
  float hum1,
  float HI1,
  bool sensor2_present,
  float temp2,
  float hum2,
  float HI2)
{
  display.clearDisplay();

  // ---------- SENSOR 1 ----------
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0, 0);
  display.println("SENSOR 1");
  display.drawLine(0, 9, 63, 9, SSD1306_WHITE);

  if (sensor1_present)
  {
    display.setCursor(0, 14);
    display.print("T:");
    display.print(temp1, 1);
    display.println(" C");

    display.setCursor(0, 29);
    display.print("H:");
    display.print(hum1, 1);
    display.println(" %");

    display.setCursor(0, 44);
    display.print("HI:");
    display.print(HI1, 1);
    display.println(" C");
  }
  else
  {
    display.setCursor(5, 27);
    display.println("SENSOR");

    display.setCursor(4, 39);
    display.println("ERROR");
  }

  // ---------- SENSOR 2 ----------
  display.setCursor(68, 0);
  display.println("SENSOR 2");
  display.drawLine(64, 9, 127, 9, SSD1306_WHITE);

  if (sensor2_present)
  {
    display.setCursor(68, 14);
    display.print("T:");
    display.print(temp2, 1);
    display.println(" C");

    display.setCursor(68, 29);
    display.print("H:");
    display.print(hum2, 1);
    display.println(" %");

    display.setCursor(68, 44);
    display.print("HI:");
    display.print(HI2, 1);
    display.println(" C");
  }
  else
  {
    display.setCursor(73, 27);
    display.println("SENSOR");

    display.setCursor(72, 39);
    display.println("ERROR");
  }

  // ---------- Divider ----------
  display.drawLine(64, 0, 64, 63, SSD1306_WHITE);

  display.display();
}

void setup()
{
  pinMode(6, OUTPUT);

  Serial.begin(115200);
  delay(2000);

  Serial.println();
  Serial.println("========================================");
  Serial.println(" Dual SHT41 Monitor - Raspberry Pi Pico ");
  Serial.println("========================================");

  // -------- I2C0 --------
  Wire.setSDA(I2C0_SDA);
  Wire.setSCL(I2C0_SCL);
  Wire.begin();

  // -------- I2C1 --------
  Wire1.setSDA(I2C1_SDA);
  Wire1.setSCL(I2C1_SCL);
  Wire1.begin();

  // -------- OLED --------
  if (!display.begin(
        SSD1306_SWITCHCAPVCC,
        OLED_ADDRESS))
  {
    Serial.println("OLED NOT detected");
  }
  else
  {
    display.setRotation(0);

    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setTextSize(1);

    display.setCursor(22, 20);
    display.println("DUAL SHT41");

    display.setCursor(28, 35);
    display.println("MONITOR");

    display.display();
    delay(1000);
  }

  delay(200);

  // -------- Sensor 1 --------
  if (devicePresent(Wire, 0x44))
  {
    if (sht1.begin(&Wire))
    {
      sht1.setPrecision(SHT4X_HIGH_PRECISION);
      sht1.setHeater(SHT4X_NO_HEATER);

      sensor1_ok = true;
      Serial.println("Sensor #1 Found on I2C0");
    }
  }

  if (!sensor1_ok)
  {
    Serial.println("Sensor #1 NOT detected");
  }

  // -------- Sensor 2 --------
  if (devicePresent(Wire1, 0x44))
  {
    if (sht2.begin(&Wire1))
    {
      sht2.setPrecision(SHT4X_HIGH_PRECISION);
      sht2.setHeater(SHT4X_NO_HEATER);

      sensor2_ok = true;
      Serial.println("Sensor #2 Found on I2C1");
    }
  }

  if (!sensor2_ok)
  {
    Serial.println("Sensor #2 NOT detected");
  }
}

void loop()
{
  digitalWrite(6, HIGH);

  Serial.println();
  Serial.println("================================");

  float temp1_display = 0;
  float hum1_display = 0;
  float HI1_display = 0;

  float temp2_display = 0;
  float hum2_display = 0;
  float HI2_display = 0;

  bool sensor1_present = false;
  bool sensor2_present = false;

  // ---------- SENSOR 1 ----------
  if (devicePresent(Wire, 0x44))
  {
    if (!sensor1_ok)
    {
      if (sht1.begin(&Wire))
      {
        sht1.setPrecision(SHT4X_HIGH_PRECISION);
        sht1.setHeater(SHT4X_NO_HEATER);

        sensor1_ok = true;
        Serial.println("Sensor #1 Reconnected");
      }
    }

    sensors_event_t hum1, temp1;
    sht1.getEvent(&hum1, &temp1);

    float HI1 = computeHeatIndexC(
      temp1.temperature,
      hum1.relative_humidity
    );

    sensor1_present = true;

    temp1_display = temp1.temperature;
    hum1_display = hum1.relative_humidity;
    HI1_display = HI1;

    Serial.println("SENSOR #1 (I2C0)");

    Serial.print("Temperature : ");
    Serial.print(temp1.temperature, 2);
    Serial.println(" C");

    Serial.print("Humidity : ");
    Serial.print(hum1.relative_humidity, 2);
    Serial.println(" %");

    Serial.print("Heat Index : ");
    Serial.print(HI1, 2);
    Serial.println(" C");
  }
  else
  {
    sensor1_ok = false;

    Serial.println("SENSOR #1 (I2C0)");
    Serial.println(">>> DISCONNECTED <<<");
  }

  Serial.println();

  // ---------- SENSOR 2 ----------
  if (devicePresent(Wire1, 0x44))
  {
    if (!sensor2_ok)
    {
      if (sht2.begin(&Wire1))
      {
        sht2.setPrecision(SHT4X_HIGH_PRECISION);
        sht2.setHeater(SHT4X_NO_HEATER);

        sensor2_ok = true;
        Serial.println("Sensor #2 Reconnected");
      }
    }

    sensors_event_t hum2, temp2;
    sht2.getEvent(&hum2, &temp2);

    float HI2 = computeHeatIndexC(
      temp2.temperature,
      hum2.relative_humidity
    );

    sensor2_present = true;

    temp2_display = temp2.temperature;
    hum2_display = hum2.relative_humidity;
    HI2_display = HI2;

    Serial.println("SENSOR #2 (I2C1)");

    Serial.print("Temperature : ");
    Serial.print(temp2.temperature, 2);
    Serial.println(" C");

    Serial.print("Humidity : ");
    Serial.print(hum2.relative_humidity, 2);
    Serial.println(" %");

    Serial.print("Heat Index : ");
    Serial.print(HI2, 2);
    Serial.println(" C");
  }
  else
  {
    sensor2_ok = false;

    Serial.println("SENSOR #2 (I2C1)");
    Serial.println(">>> DISCONNECTED <<<");
  }

  Serial.println("================================");

  updateOLED(
    sensor1_present,
    temp1_display,
    hum1_display,
    HI1_display,
    sensor2_present,
    temp2_display,
    hum2_display,
    HI2_display
  );

  delay(1000);
}
GPIO6: Source Code ตั้ง GPIO6 เป็น Output และเขียน HIGH ใน Loop แต่ Tutorial ไม่ได้อธิบายหน้าที่ของ Pin นี้เพิ่มเติม จึงไม่ควรเดาว่าต่อกับอุปกรณ์อะไร

OLED กลับหัวต้องแก้อะไร?

มี Detail เล็ก ๆ ที่ Source อธิบายไม่ตรงกับ Code Listing และควรรู้ก่อน Copy Code

ใน Code ที่เผยแพร่มี:

display.setRotation(0);

แต่ท้าย Tutorial ผู้สร้างอธิบายว่า Prototype ของเขาติดจอ OLED กลับหัว จึงใช้:

display.setRotation(2);

หากติด OLED ตาม Orientation ปกติ ค่าที่เหมาะสมจึงขึ้นกับการติดตั้งจริง ไม่ควร Copy Rotation โดยไม่ดูจอของตัวเอง

ดูการทดลอง SHT41, DHT22 และการประกอบจริง

Video ของผู้สร้างรวมทั้ง Circuit Explanation, การใช้งาน Dual SHT41 และการทดลองเปรียบเทียบกับ DHT22

ชื่อ Video ใช้ภาษาสร้าง Hook: คำว่า “DHT22 Is Just a kids' Toy” เป็นชื่อที่ผู้สร้างใช้ใน Video ไม่ควรนำมาใช้เป็นข้อสรุปทางวิศวกรรมว่า DHT22 ทุกตัวไม่มีประโยชน์หรือไม่แม่น

เปิด Schematic PDF ต้นฉบับ

ถ้าต้องการ Build ตามจริง แนะนำเปิด Schematic PDF ควบคู่กับ Code และ Circuit Diagram เพื่อเช็ก Connection ของ Module ที่ใช้งานจริง

เปิด Schematic PDF ต้นฉบับ

FAQ: Dual SHT41 กับ Raspberry Pi Pico

1. ทำไม SHT41 สองตัวต่อ I²C Bus เดียวกันไม่ได้ใน Project นี้?

เพราะ Code ใช้ SHT41 ที่ Address 0x44 เหมือนกันทั้งสองตัว จึงแยกไปใช้ I²C0 และ I²C1

2. Raspberry Pi Pico มี I²C กี่ชุด?

RP2040 มี Hardware I²C Controller สองชุด ซึ่ง Project ใช้เป็น I²C0 และ I²C1

3. I²C0 ใช้ Pin ไหนใน Code นี้?

GPIO4 เป็น SDA และ GPIO5 เป็น SCL

4. I²C1 ใช้ Pin ไหน?

GPIO10 เป็น SDA และ GPIO11 เป็น SCL

5. OLED อยู่บน Bus ไหน?

OLED ใช้ Wire / I²C0 ร่วมกับ SHT41 #1 โดย OLED ใช้ Address 0x3C

6. ใช้ SHT41 แค่ตัวเดียวได้ไหม?

ได้ Code รองรับกรณีที่อีก Sensor ไม่เชื่อมต่อ และ Sensor ที่เหลือยังอ่านค่าและแสดงผลได้

7. ถอด Sensor ระหว่างทำงานได้ไหม?

Code ตรวจ Presence ใน Loop และมี Logic สำหรับตรวจการ Disconnect / Reconnect ของ Sensor

8. SHT41 วัด Heat Index ได้โดยตรงหรือไม่?

ไม่ SHT41 วัด Temperature และ Relative Humidity ส่วน Heat Index ถูกคำนวณจาก Formula ใน Firmware

9. SHT41 แม่นกว่า DHT22 แน่นอนหรือไม่?

ในการทดลองของผู้สร้าง SHT41 สองตัวให้ค่าคล้ายกันมากกว่า DHT22 สองตัว แต่ Source ไม่ได้เป็น Benchmark ขนาดใหญ่ จึงไม่ควรขยายผลเป็นข้อสรุปทุกสถานการณ์

10. SHT41 มี Accuracy เท่าไร?

Sensirion ระบุ Typical RH Accuracy ±1.8 %RH และ Typical Temperature Accuracy ±0.2°C สำหรับ SHT41 แต่เป็น Specification ของ Sensor IC ไม่ใช่การรับรอง Accuracy ของ Prototype ทั้งระบบ

11. Project ใช้ Heater ของ SHT41 หรือไม่?

ไม่ Code ตั้ง SHT4X_NO_HEATER สำหรับ Sensor ทั้งสองตัว

12. Code ใช้ Precision Mode ไหน?

ใช้ SHT4X_HIGH_PRECISION

13. OLED Address เท่าไร?

Code กำหนดไว้ที่ 0x3C

14. ทำไมจอ OLED อาจกลับหัว?

ผู้สร้างติด OLED กลับหัวใน Prototype และกล่าวถึงการใช้ setRotation(2) แต่ Code Listing ที่ให้มาใช้ setRotation(0) จึงต้องปรับตาม Orientation จริง

15. SHT41 ใน Project นี้คือ SHT41I Industrial Variant หรือไม่?

Source ไม่ได้ระบุ Part Number ที่ยืนยันว่าเป็น SHT41I จึงไม่ควรเปลี่ยนชื่อ Sensor ในบทความให้เป็น SHT41I

สรุป: จุดเด่นของ Project นี้ไม่ใช่แค่ Sensor แม่นขึ้น แต่คือการแก้ I²C Address ชนกันแบบตรงไปตรงมา

ถ้ามองภายนอก Project นี้คือ Temperature และ Humidity Monitor ที่มี Sensor สองตัวกับ OLED หนึ่งจอ

แต่ในมุม Embedded จุดที่มีประโยชน์กว่าคือ การใช้ Hardware I²C สองชุดของ Raspberry Pi Pico เพื่อจัดการ Device ที่มี Address เหมือนกัน โดยไม่ต้องเพิ่ม Multiplexer

Code ยังเพิ่ม Logic ตรวจ Sensor หลุด, Reconnect, High Precision Measurement, Heat Index Calculation และแบ่ง OLED เป็นสองฝั่ง ทำให้ Project นี้เหมาะกับคนที่อยากก้าวจาก “อ่าน Sensor ตัวเดียว” ไปสู่ Multi-sensor System ที่จัดการ Error ได้จริงมากขึ้น

ส่วนการเปรียบเทียบกับ DHT22 ควรมองเป็นผลการทดลองของ Creator มากกว่าคำตัดสินว่า Sensor ตัวหนึ่ง “ดี” หรือ “แย่” ในทุก Application

Project นี้มีทั้ง Code, Circuit และ Video แนะนำดู Source ควบคู่กัน

หากต้องการสร้างตามจริง ควรตรวจ Circuit Diagram, Schematic PDF, Source Code และ Part Number ของ SHT41 Module ที่ใช้งาน ก่อนต่อ Hardware

อ่าน Tutorial Dual SHT41 ฉบับเต็มจาก Instructables

ดู Video การทดลองจาก AkashWave RF

เปิด Schematic PDF ต้นฉบับ

อ่าน Specification ของ SHT41 จาก Sensirion

References / แหล่งข้อมูลต้นฉบับ

อยากลองทำ Environmental Monitoring บน Raspberry Pi Pico?

ถ้ากำลังทดลอง Raspberry Pi Pico, Temperature / Humidity Sensor, OLED, Breadboard หรืออุปกรณ์สำหรับ Multi-sensor Project สามารถสอบถามทีม Globalbyte เรื่องบอร์ดและอุปกรณ์ที่เหมาะกับงานได้

ก่อนเลือก Sensor ควรตรวจ Part Number, I²C Address, Supply Voltage และ Interface ของ Module ให้ตรงกับ Architecture ที่ต้องการ

Disclaimer: บทความนี้เป็นการสรุปและเรียบเรียงจากแหล่งข้อมูลภาษาอังกฤษ อาจมีความคลาดเคลื่อน กรุณาตรวจสอบ Source ต้นฉบับก่อนลงมือทำ

ค่า Accuracy, Operating Range และ Supply Voltage ที่กล่าวถึงเป็น Specification ของ SHT41 Sensor จาก Sensirion ไม่ใช่ผล Calibration ของ Module หรือ Prototype ทั้งระบบใน Tutorial

การทดลองเปรียบเทียบ SHT41 กับ DHT22 ใช้ Sensor อย่างละสองตัวตามการทดลองของผู้สร้าง และไม่มีข้อมูล Statistical Benchmark ขนาดใหญ่ จึงไม่ควรใช้ผลดังกล่าวสรุป Performance ของ Sensor ทุกตัวหรือทุก Application

ชื่อ Tutorial และ Video ใช้คำว่า Industrial Grade แต่ Source ไม่ได้ระบุ Part Number ที่ยืนยันว่า Module เป็น SHT41I ซึ่งเป็น Industrial-oriented Product Family แยกต่างหากของ Sensirion บทความนี้จึงคงชื่อ Sensor เป็น SHT41 ตาม Source เท่านั้น

Heat Index ใน Project เป็นค่าที่ Firmware คำนวณจาก Temperature และ Relative Humidity ไม่ใช่ค่าที่ SHT41 วัดโดยตรง และ Source ไม่ได้ให้ Accuracy หรือ Validation Range ของ Heat Index Formula สำหรับการใช้งานด้าน Safety

Source มีความไม่สอดคล้องเรื่อง OLED Rotation: Code Listing ใช้ setRotation(0) ขณะที่คำอธิบายท้าย Tutorial กล่าวถึง setRotation(2) สำหรับ Prototype ที่ติด OLED กลับหัว จึงควรตั้งค่าตาม Orientation ของจอจริง

Schematic PDF มีให้จาก Source ต้นฉบับ แต่บทความนี้ไม่ได้สร้างหรือเพิ่มเติม Power Wiring, Pull-up Value, Module Current, Total Power Consumption, Battery Runtime, Heat Index Accuracy, Thailand Availability หรือ Stock ที่ Source ไม่ได้ระบุ

 

แท็ก


Blog posts