米粒AVRで温度計(STTS751使用)

公開日: 電子工作 | , ,

米粒AVRで温度計

前回までに紹介したI2CライブラリとLCDライブラリを使って作る、温度計のサンプルです。
温度センサーには、秋月で販売されているSTTS751と言うI2C接続の温度センサーを使っています。

 

STTS751

STTS751は、I2C接続の温度センサーです。
主な仕様は、

  • 動作電圧:2.25V~3.6V
  • 動作温度:-40℃~+125℃
  • 分解能:9bit (0.5℃)、10bit (0.25℃)、11bit (0.125℃)、12bit (0.0625℃)
  • 精度:±1℃ (0~+85℃)、±2℃ (-40~+125℃)

アドレス

STTS751のアドレスは、外付けのプルアップ抵抗によって4つの中から選択できる。
オープン状態では使えないっぽいので、以下のいずれかの抵抗を用意しておく。

また、GNDに接続しても良いようです。
(コメントで教えて頂いきました。ありがとうございました。)

STTS751-0WB3F SMBus address
抵抗値 アドレス
 7.5k ±5% 1001000b (48h)
 12k ±5% 1001001b (49h)
 20k ±5% 0111000b (38h)
 33k ±5% 0111001b (39h)
 GND 0111001b (39h)

 

STTS751は、1つ100円で秋月で販売されています。
ICのパッケージは米粒AVRと同じSOT23-6L。なので米粒AVR用に買ったSOT-23変換基板が使える。

   

プログラム

#define F_CPU 1000000UL<br />
<br />
#include <stdlib.h><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
#include "tiny10softI2C.h"<br />
#include "tiny10softI2C_LCD.h"<br />
<br />
#define STTS751_ADDR    0b1001001<br />
<br />
int main(void)<br />
{<br />
    CCP = 0xD8;<br />
    CLKMSR = 0x00;<br />
    CCP = 0xD8;<br />
    CLKPSR = 0b00000011;<br />
    <br />
    LCD_init();<br />
    LCD_write('T');<br />
    LCD_write('e');<br />
    LCD_write('m');<br />
    LCD_write('p');<br />
<br />
    // Configuration register 設定<br />
    I2C_start();<br />
    I2C_write(STTS751_ADDR<<1);<br />
    I2C_write(0x03);<br />
    I2C_write(0b10001100);    // EVENT停止、12bit解像度指定<br />
    I2C_stop();<br />
    <br />
    // conversion rate 設定<br />
    I2C_start();<br />
    I2C_write(STTS751_ADDR<<1);<br />
    I2C_write(0x04);<br />
    I2C_write(5);            // 1秒間に2回のconversion指定<br />
    I2C_stop();<br />
<br />
    uint8_t value_h;<br />
    uint8_t value_l;<br />
    uint8_t temp;<br />
    int16_t temp16;<br />
    <br />
    while(1)<br />
    {        <br />
        // 整数部読み込み<br />
        I2C_start();<br />
        I2C_write(STTS751_ADDR<<1);<br />
        I2C_write(0);<br />
        I2C_start();<br />
        I2C_write(STTS751_ADDR<<1|1);<br />
        value_h = I2C_read(0);<br />
        I2C_stop();<br />
<br />
        // 小数部読み込み<br />
        I2C_start();<br />
        I2C_write(STTS751_ADDR<<1);<br />
        I2C_write(2);<br />
        I2C_start();<br />
        I2C_write(STTS751_ADDR<<1|1);<br />
        value_l = I2C_read(0);<br />
        I2C_stop();<br />
<br />
        LCD_command(LCD_CURSOR_CMD(0,1));<br />
        <br />
        LCD_write((value_h&0x80)?'-':'+');<br />
<br />
        temp16=abs(value_h<<8|value_l);<br />
        value_h=(temp16>>8)&0xFF;<br />
        value_l=temp16&0xFF;<br />
        <br />
        if(value_h>=100)<br />
        {<br />
            temp='0';<br />
            temp+=(value_h/100);<br />
            value_h%=100;<br />
            LCD_write(temp);<br />
        }<br />
        <br />
        temp='0';<br />
        temp+=(value_h/10);<br />
        value_h%=10;<br />
        LCD_write(temp);<br />
        <br />
        LCD_write('0'+(value_h));<br />
        LCD_write('.');<br />
        <br />
        temp16=value_l>>4;<br />
        temp16*=625;<br />
        value_l=temp16/100;<br />
<br />
        temp='0';<br />
        temp+=(value_l/10);<br />
        LCD_write(temp);<br />
<br />
        LCD_write('゚');<br />
        LCD_write('C');<br />
        LCD_write(' ');<br />
<br />
        _delay_ms(500);<br />
    }<br />
}<br />

プログラム中で読み込んでいる tiny10softI2C.htiny10softI2C_LCD.h は、それぞれ前の記事で紹介したものを利用しています。

STTS751のアドレス指定は、10行目の#defineで指定しています。
今回は、12kの抵抗を繋いでいるので、0b1001001です。

あまりスピードは必要無いので、今回はTiny10を1MHzで動作させています。
表示の更新間隔は約500m秒毎に行うようになっています。
温度表示はできるだけ細かくしたいのですが、センサー数値の揺れを考慮して、センサーの最大分解能の12bitで読み込んで、0.1℃単位での表示にしています。

 

回路図

米粒AVRで温度計(STTS751使用)の回路

 

精度

このセンサーの精度は常温で ±1℃とのこと。
で、ちょっと気になったので、まったく同じものを2つ作って並べてみた。

tiny10-i2c-temp2

センサーの個体差によって得られる値はだいぶと違うようで・・・
絶対的な温度を表示できるものを持ってないので校正はできないし、
さてどうしたものか(´・ω・`)

 

関連記事

no image

Wimeji Client for Arduino

前回紹介したWimeji Client for WindowsXPをArduinoでやってみました。

記事を読む

SDカード・マイクロSDカード

ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduinoでも比較的簡単にSDカードを

記事を読む

vlc_media_player

Raspberry Piのサウンドを試したら音が出なかった話

(これはX-WindowのVLCメディアプレイヤーのスクショ) Raspberry Piでは、

記事を読む

no image

気になる物

HT-03Aで使えるのかどうかは知らないけど、Bluetooth-シリアルモジュール(BT-MOD1

記事を読む

SDFormatter

Raspbianの起動SDカードを再利用

一度、Raspbianのイメージを書き込んだSDカードは、フォーマットが違う為にWindowsでは利

記事を読む

no image

Android Open Accessory開発時のWiFiデバッグ

Android Open Accessory開発時のデバッグは、ADBをWiFiで接続しろと、USB

記事を読む

no image

Android + Bluetooth + Arduino

 以前書いた『気になる物』で紹介したBluetoothモジュールですが、本当に気になって実

記事を読む

Arduino + STTS751

パソコンで温度計

ありきたりのPC温度計ですが、なんとなく作りたくなったので作ってみる。 コントローラーは手軽な

記事を読む

米粒AVR リモコン

米粒AVRでリモコン送信機

米粒AVR(tiny10)を使った赤外線リモコン送信機を作ってみました。 これで送信できるのは

記事を読む

no image

PIC24FJ64GB002でADKを試す(その2)

 前回「PIC24FJ64GB002でADKを試す(その1)」では回路の説明までしたので、

記事を読む

Comment (2件)

  1. いかづちSqueak

    アドレスピンはオープンでは使えませんがGNDに落としても良いようですね。
    (7ページ Table 3. Pin descriptions)

    1. Futaba

      完全に見落としてました・・・確かにそう書かれてますね。
      抵抗1つ減らせるので、とても良い情報!
      教えて頂きまして、ありがとうございました!

Arduinoで温湿度データロガー
Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを

Arduinoで温湿度計
Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前

SDカード・マイクロSDカード
ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduin

秋月電子 リアルタイムクロック(RTC)モジュール
秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを

秋月電子 キャラクタLCD
秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、

PAGE TOP ↑