米粒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でリモコン3 その1(AndroidAccessory接続)

何度か、Android+リモコンのネタを書いたことがあるのですが、今回はAndroid Access

記事を読む

no image

PIC24FJ64GB002でADKを試す(その1)

先日、MicrochipからPIC向けのAndroid Open Accessoryのライブラリが公

記事を読む

no image

オシロスコープを手に入れた

ついにオシロスコープを買っちゃいました。 と言っても、DSO QUADと言うポータブルタイプの

記事を読む

no image

Android + Arduino でリモコン2 (softmodem接続)

以前、LAN接続のリモコン Android + Arduino でリモコン と言うものを作ったのです

記事を読む

no image

Arduino + USBホストシールド で ADK を試す(その3)

「Arduino + USBホストシールド で ADK を試す(その1)」では、Android上のア

記事を読む

no image

Android+Arduinoでリモコン3 その2(AndroidAccessory接続)

何度か、Android+リモコンのネタを書いたことがあるのですが、今回はAndroid Access

記事を読む

Raspberry Pi インターネット接続

Raspberry Piをインターネットに接続してみた。 有線で接続(Ethern

記事を読む

no image

SoundIRModemライブラリのサンプル

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

記事を読む

S2 SoundIR analyzer

赤外線リモコン受信機(イヤホンジャック接続)のアプリ

 前回の赤外線リモコン受信機(イヤホンジャック接続)の回路 を使う為のAndroidア

記事を読む

soundIR 送信機

赤外線リモコン送信機(イヤホンジャック接続)の回路

前回は受信機で、今回は送信機を作ってみました。 受信機と違って、送信機の作成は少し面倒です。

記事を読む

Comment (2件)

  1. いかづちSqueak

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

    1. Futaba

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

Arduinoで温湿度計 #2

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

Arduinoで温湿度計

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

ArduinoでSDカード

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

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

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

秋月の小型キャラクタLCD

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

PAGE TOP ↑