Temperature Sensor Investigation (Electronic work)
[What is the first place? ]

Overview

When actually using ESP32, investigate which temperature sensor is good.
We investigated 11 temperature sensors with prices ranging from 40 yen to 480 yen.

Video

Japanese【日本語】

English

Sensor List

Circuit

Program

//*************************************************************************
//  Temprature1 Ver2023.2.23
//  Arduino board : ESP32(Arduino core for the ESP32) by Espressif Systems ver 2.0.7
//  Written by IT-Taro
//***********************************************************************

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

#define ADC1_PIN 34
#define ADC2_PIN 15
#define S5851_ADDRESS 0x48  // S-5851A Address

Adafruit_AHTX0 aht;

unsigned long loopCount = 0;

void setup() {
  // Serial monitor
  Serial.begin(115200);
  // ADC Setting
  //analogSetAttenuation(ADC_0db);  // ATT 0dB[Default 11db]
  //analogSetAttenuation(ADC_6db);  // ATT -6dB[Default 11db],
  //analogSetWidth(10);             // Resolution Default:12bit(0-4095)[9-12]
  pinMode(ADC1_PIN, ANALOG);
  pinMode(ADC2_PIN, ANALOG);
  // I2C Setting
  Wire.begin();
  // AHT Setting
  if (! aht.begin()) {
    Serial.println("Could not find AHT? Check wiring");
    while (1) delay(1000);
  }
  // Display Serial monitor
  Serial.println("Setup completed!");
}

void loop() {
  // Sleep[30 sec]
  delay(30000);
  loopCount++;
  // ADC1[MCP9700]
  uint16_t analog1_adc = analogRead(ADC1_PIN);
  uint32_t analog1_mv = analogReadMilliVolts(ADC1_PIN);
  double temprature1 = double(analog1_mv - 500) / 10.0;
  Serial.printf("[%ld] MCP9700 ADC=%d, mV=%d[mV], temprature=%2.2f[°]\n", loopCount, analog1_adc, analog1_mv, temprature1);
  // ADC2[MCP9700A]
  uint16_t analog2_adc = analogRead(ADC2_PIN);
  uint32_t analog2_mv = analogReadMilliVolts(ADC2_PIN);
  double temprature2 = double(analog2_mv - 500) / 10.0;
  Serial.printf("[%ld] MCP9700A, ADC=%d, mV=%d[mV], temprature=%2.2f[°]\n", loopCount, analog2_adc, analog2_mv, temprature2);
  // I2C[S5851]
  double temprature3 = updateS5851() * 0.0625 ;
  Serial.printf("[%ld] S-5851A[I2C], temprature=%f[°]\n", loopCount, temprature3); 
  // I2C[AHT21]
  sensors_event_t humidity, temp;
  aht.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  Serial.printf("[%ld] AHT21[I2C], temprature=%f[°], humidity=%f[%]\n", loopCount, temp.temperature, humidity.relative_humidity); 
}

int updateS5851 () {
    Wire.beginTransmission(S5851_ADDRESS); 
    Wire.write(0x00);      // Read Tempreture Sensor
    Wire.endTransmission();
    Wire.requestFrom(S5851_ADDRESS, 2);
    //wait for response
    while(Wire.available() == 0);
    int T = Wire.read(); 
    T = ( T << 8 | Wire.read() ) >> 4  ; 
    return  ( -(T & 0b100000000000) | (T & 0b011111111111) );
}
//*************************************************************************
//  Temprature2 Ver2023.2.23
//  Arduino board : ESP32(Arduino core for the ESP32) by Espressif Systems ver 2.0.7
//  Written by IT-Taro
//***********************************************************************

#include   <Wire.h>
#include   <CRC8.h>

#define ADC1_PIN 34
#define ADC2_PIN 15
#define AHT25_ADDRESS 0x38    // AHT25 ADDRESS

unsigned long loopCount = 0;
CRC8 crc;

void setup() {
  // Serial monitor
  Serial.begin(115200);
  // ADC Setting
  //analogSetAttenuation(ADC_0db);  // ATT 0dB[Default 11db]
  //analogSetAttenuation(ADC_6db);  // ATT -6dB[Default 11db],
  //analogSetWidth(10);             // Resolution Default:12bit(0-4095)[9-12]
  pinMode(ADC1_PIN, ANALOG);
  pinMode(ADC2_PIN, ANALOG);
  // I2C Setting
  Wire.begin();
  // Init AHT25
  initAht25();
  // Display Serial monitor
  Serial.println("Setup completed!");
}

void loop() {
  // Sleep[30 sec]
  delay(30000);
  loopCount++;
  // ADC1[TMP36]
  uint16_t analog1_adc = analogRead(ADC1_PIN);
  uint32_t analog1_mv = analogReadMilliVolts(ADC1_PIN);
  double temprature1 = double(analog1_mv - 500) / 10.0;
  Serial.printf("[%ld] TMP36 ADC=%d, mV=%d[mV], temprature=%2.2f[°]\n", loopCount, analog1_adc, analog1_mv, temprature1);
  // ADC2[LM335Z]
  uint16_t analog2_adc = analogRead(ADC2_PIN);
  uint32_t analog2_mv = analogReadMilliVolts(ADC2_PIN);
  double temprature2 = double(analog2_mv / 10) - 273.15;;
  Serial.printf("[%ld] LM335Z, ADC=%d, mV=%d[mV], temprature=%2.2f[°]\n", loopCount, analog2_adc, analog2_mv, temprature2);
  // I2C[AHT25]
  updateAht25();
}

void initAht25() {
  delay(100);
  Wire.beginTransmission(AHT25_ADDRESS);
  Wire.write(0x71);
  Wire.endTransmission();
  delay(10);

  crc.setPolynome(0x31);
  crc.setStartXOR(0xFF);
}

void updateAht25() {
  byte buf[7];
  uint32_t humidity_raw;
  uint32_t temperature_raw;
  byte state;

  Wire.beginTransmission(AHT25_ADDRESS);
  Wire.write(0xAC);
  Wire.write(0x33);
  Wire.write(0x00);
  Wire.endTransmission();
  do {
    delay(80);
    Wire.requestFrom(AHT25_ADDRESS, 7);
    if (Wire.available() >= 7) {
      for(int i=0; i<7; i++) {
        buf[i] = Wire.read();
      }
    }
  } while((buf[0] & 0x80) != 0);

  crc.restart();
  crc.add(buf, 6);

  if (buf[6] == crc.getCRC()) {
    state = buf[0];
    humidity_raw = ((uint32_t)buf[1] << 12)|((uint32_t)buf[2] << 4)|(((uint32_t)buf[3] >> 4) & 0x0F);
    temperature_raw = (((uint32_t)buf[3] & 0x0F) << 16)|((uint32_t)buf[4] << 8)|((uint32_t)buf[5]);

    double humidity = humidity_raw / 1048576.0 * 100;
    double temperature = temperature_raw / 1048576.0 * 200 - 50;
    Serial.printf("[%ld] AHT25[I2C], temprature=%f[°], humidity=%f[%]\n", loopCount, temperature, humidity); 

  } else {
    // error
    Serial.printf("[%ld] AHT25[I2C] Read Error!\n");
  }
}
//*************************************************************************
//  Temprature3 Ver2023.2.23
//  Arduino board : ESP32(Arduino core for the ESP32) by Espressif Systems ver 2.0.7
//  Written by IT-Taro
//***********************************************************************

#include   <Wire.h>
#include   <DHT.h>

#define ADC1_PIN  34
//#define ADC2_PIN  15
#define DHT11_PIN 32
#define DHT20_ADDRESS 0x38  // DHT20 Address

DHT dht11(DHT11_PIN, DHT11);

unsigned long loopCount = 0;

void setup() {
  // Serial monitor
  Serial.begin(115200);
  // ADC Setting
  //analogSetAttenuation(ADC_0db);  // ATT 0dB[Default 11db]
  //analogSetAttenuation(ADC_6db);  // ATT -6dB[Default 11db],
  //analogSetWidth(10);             // Resolution Default:12bit(0-4095)[9-12]
  pinMode(ADC1_PIN, ANALOG);
//  pinMode(ADC2_PIN, ANALOG);
  // I2C Setting
  Wire.begin();
  // DHT11 Setting
  dht11.begin();
  // Display Serial monitor
  Serial.println("Setup completed!");
}

void loop() {
  // Sleep[30 sec]
  delay(30000);
  loopCount++;
  // ADC1[LM61]
  uint16_t analog1_adc = analogRead(ADC1_PIN);
  uint32_t analog1_mv = analogReadMilliVolts(ADC1_PIN);
  double temprature1 = double(analog1_mv - 600) / 10.0;
  Serial.printf("[%ld] LM61 ADC=%d, mV=%d[mV], temprature=%2.2f[°]\n", loopCount, analog1_adc, analog1_mv, temprature1);
  /*/ ADC2[LM60]
  uint16_t analog2_adc = analogRead(ADC2_PIN);
  uint32_t analog2_mv = analogReadMilliVolts(ADC2_PIN);
  double temprature2 = double(analog2_mv - 424) / 6.25;
  Serial.printf("[%ld] LM60, ADC=%d, mV=%d[mV], temprature=%2.2f[°]\n", loopCount, analog2_adc, analog2_mv, temprature2);*/
  // I2C[DHT20]
  updateDht20();
  // IO26[DHT11]
  float humidity4 = dht11.readHumidity();
  float temperature4 = dht11.readTemperature();
  Serial.printf("[%ld] DHT11[IO26], temprature=%f[°], humidity=%f[%]\n", loopCount, temperature4, humidity4);
}

void updateDht20 () {
  float hu, tp;
  uint8_t buf[8];
  long a;
  int flg;

  delay(500);
  flg = 1;
  while (flg) {
      Wire.beginTransmission(DHT20_ADDRESS);
      Wire.write(0xac);
      Wire.write(0x33);
      Wire.write(0x00);
      Wire.endTransmission();
      delay(100);

      Wire.requestFrom(DHT20_ADDRESS, 6);
      for (uint8_t i = 0; i < 6; i++)  buf[i] = Wire.read();

      if (buf[0] & 0x80) Serial.println("Measurement not Comp");
      else flg = 0;
  }
  a = buf[1];
  a <<= 8;
  a |= buf[2];
  a <<= 4;
  a |= ((buf[3] >> 4) & 0x0f);
  hu = a / 10485.76;

  a = (buf[3] & 0xf);
  a <<= 8;
  a |= buf[4];
  a <<= 8;
  a |= buf[5];
  tp = a / 5242.88 - 50;

  Serial.printf("[%ld] DHT20[I2C], temprature=%f[°], humidity=%f[%]\n", loopCount, tp, hu);
}

Measurement result

・The temperature measurement was within the tolerance of the specification. (Excluding LM335Z/LM60)
・The data output sensor (I2C/serial) tends to have a smaller error than the voltage output sensor
・ Least error 1st place: AHT21B 2nd place: AHT25 3rd place: DHT11

Document

Comments

Copied title and URL