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

AndroidとArduinoの接続で使えそうなBluetoothモジュール

1ヶ月ほど前に書いた、Android + Bluetooth + Arduino が割と人気があるよ

記事を読む

no image

PIC24FJ64GB002でADKを試す(その2)

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

記事を読む

Arduinoで温湿度データロガー

Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを取り付けて温湿度データロガーを

記事を読む

米粒AVT(tiny10) リモコンレシーバー

米粒AVRでリモコン受信処理

  米粒AVR(Tiny10)で赤外線リモコンを受信して処理をするサンプルを作ってみまし

記事を読む

Androidから米粒AVRへデータを送る

米粒AVRでSoftModem的なこと その2

前回は「米粒AVRからAndroidへデータを送る」ことを試しました。 今回はその逆の「And

記事を読む

thermometer

パソコンで温度計 #2

今回は温度表示とログ取りアプリを作ったので公開。 前回にArduino+STTS751で作った

記事を読む

no image

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

以前書いた、Androidで一眼レフカメラのシャッターを制御するでは、AndroidとArduino

記事を読む

no image

Wimeji Client for Arduino

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

記事を読む

SDFormatter

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

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

記事を読む

no image

SoundIRModemライブラリのサンプル

 SoundIRModemライブラリは、米粒AVR(Tiny10)とAndroid端末をイ

記事を読む

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 ↑