米粒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

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

 

関連記事

秋月電子 キャラクタLCD

秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、ちょっと比較してみる。 買っ

記事を読む

no image

Androidで一眼レフカメラのシャッターを制御する

またSoftModemネタです。 調子に乗って arms22さんの記事 iPhoneで一眼レフカメ

記事を読む

米粒AVRでI2C通信

米粒AVRでI2C通信(マスター)

米粒AVRことATtiny10は3つまたは4つのI/Oピンしか使えないのですが、I2Cなら2つの

記事を読む

Raspberry Pi 起動SDカード

Raspberry Piの起動SDカードを準備する

先日入手したRaspberry PiでLinuxを起動する為のSDカードを準備します。 Ras

記事を読む

no image

AVRISPmk2

米粒AVR(ATtiny10)のプログラム書き込み用にAVRISPmk2を購入しました。 先人

記事を読む

X-Window

Raspberry Piのスクリーンショット

  ブログで使う用に、Raspberry Piのスクリーンショットを撮りたいと思った時、

記事を読む

Arduinoで温湿度計

Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前「パソコンで温度計」と言うもの

記事を読む

ssh_connected

Raspberry PiをWindowsで操作する(SSH)

SSHを使って、Raspberry Piを外部PC(Windows)で操作する。

記事を読む

no image

Wimeji Client for Arduino

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

記事を読む

sdcards

Raspberry Pi SDカードのクラスと起動速度

SDカードにOSをインストールするので、起動にはそれなりに時間がかかります。 では、どれくらい

記事を読む

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 ↑