13.5.SHT35による温度、湿度計測
プロジェクト概要
SHT35高精度温湿度センサーによる温度計測プロジェクトです。モジュールとの通信はI2Cです。アドレスはADRがオープンのとき0x45 、ADRがGNDのとき0x44となり2つから選択できます。温度、湿度ともにデータビット数16ビットです。仕様は以下です。
電源電圧 DC2.4V ~ 5.5V
温度 -40℃~ +125℃、±0.1℃ (@20℃~ 60℃)
相対湿度 0% ~ 100%、±1.5% (@0~ 80%)
分解能 0.015℃ [温度]、湿度0.01% [湿度]
部品リスト
SHT35高精度温湿度センサモジュール 1 秋月電子通商
GROVEの16 x 2 LCD 1 スイッチサイエンス
配線図

ソースリスト
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "hardware/rtc.h"
#include "hardware/adc.h"
//#define PICO_DEFAULT_LED_PIN 25
#define LED_PIN PICO_DEFAULT_LED_PIN
#define I2C_PORT i2c0
#define I2C_SDA 8
#define I2C_SCL 9
//SHT35 --------------------------------
#define SHT35_ADDR 0x45
void ResetSHT35()
{
uint8_t sendBuf[16];
sendBuf[0] = 0x30;
sendBuf[1] = 0xA2;
i2c_write_blocking(I2C_PORT, SHT35_ADDR, sendBuf, 2, false);
sleep_ms(15);
}
void ResetSHT35General()
{
uint8_t sendBuf[16];
sendBuf[0] = 0x00;
sendBuf[1] = 0x06;
i2c_write_blocking(I2C_PORT, SHT35_ADDR, sendBuf, 2, false);
sleep_ms(15);
}
void ReadSHT35Temperature(float *temperature, float *humidity)
{
*temperature = 0;
*humidity = 0;
uint8_t sendBuf[16];
sendBuf[0] = 0x2C;
sendBuf[1] = 0x06;
i2c_write_blocking(I2C_PORT, SHT35_ADDR, sendBuf, 2, false);
sleep_ms(15);
uint8_t reciveBuf[16];
i2c_read_blocking(I2C_PORT, SHT35_ADDR, reciveBuf, 6, false);
sleep_ms(15);
float temp, humi;
temp = -45.0f + (175.0f * ((reciveBuf[0] * 256.0f) + reciveBuf[1]) / 65535.0f); //reciveBuff[2] = checksum
humi = (100.0f * ((reciveBuf[3] * 256.0f) + reciveBuf[4])) / 65535.0f; //reciveBuff[5] = checksum
*temperature = temp;
*humidity = humi;
}
int main()
{
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
i2c_init(I2C_PORT, 400*1000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA);
gpio_pull_up(I2C_SCL);
WaitTerminalStartup(30*1000);
printf("\nTerminal connected\n");
ScanI2CBus();
printf("I2C Scan completed\n");
lcd_init();
InitAdc();
InitRtc();
char buf[128];
datetime_t nowdt;
int presec = -1;
while (1) {
rtc_get_datetime(&nowdt);
if(presec != nowdt.sec)
{
float bTemp = ReadOnBoardTemperature();
float shtTemp, shtHumi;
ReadSHT35Temperature(&shtTemp, &shtHumi);
sprintf(buf, "%02d:%02d:%02d AD:%4.1f", nowdt.hour,nowdt.min, nowdt.sec, bTemp);
lcd_set_cursor(0, 0);
lcd_string(buf);
sprintf(buf, " %4.1fC %4.1f%%", shtTemp, shtHumi);
lcd_set_cursor(1, 0);
lcd_string(buf);
printf("%4d/%02d/%02d %02d:%02d:%02d ShtTemp:%4.1fC AdcTemp:%4.1fC ShtHumi:%4.1f%%\n",
nowdt.year, nowdt.month, nowdt.day,
nowdt.hour,nowdt.min, nowdt.sec, shtTemp, bTemp, shtHumi);
}
presec = nowdt.sec;
sleep_ms(200);
}
return 0;
}

本プロジェクトでは、再起動する場合、RESETボタンではなく、電源を再投入してください。
秋月電子通商のSHT35高精度温湿度センサモジュールではリセットが端子にでていないため、またソフトリセットでも完全にI2C通信が完全にリセットできなかったためです。
画面のように変動も少なく精度もいいようです。
コメントをお書きください