· 

15.温度センサープロジェクト(5)SHT35ーRaspberry Pi Pico WindowsC言語入門

13.5.SHT35による温度、湿度計測

プロジェクト名:TempSHT35

プロジェクト概要

SHT35高精度温湿度センサーによる温度計測プロジェクトです。モジュールとの通信はI2Cです。アドレスはADRがオープンのとき0x45ADRGNDのとき0x44となり2つから選択できます。温度、湿度ともにデータビット数16ビットです。仕様は以下です。

電源電圧                         DC2.4V5.5V

温度                                  -40℃+125℃±0.1℃ (@20℃60℃)

相対湿度                         0%100%±1.5% (@080%)

分解能                             0.015℃ [温度]、湿度0.01% [湿度]

部品リスト

SHT35高精度温湿度センサモジュール                              1            秋月電子通商

GROVE16 x 2 LCD                                                                     スイッチサイエンス

 

 

配線図

ソースリスト

#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通信が完全にリセットできなかったためです。

 

画面のように変動も少なく精度もいいようです。