0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

サーミスタで気温を計ってみた

Last updated at Posted at 2023-10-02

どこかで買ったジャンク袋に一個だけ入っていたサーミスタで気温を計ってみました。

写真(2023-10-03 7.29).jpg

サーミスタ2.png

PIC12F1822でI2CのSlaveを作りADCした値をI2Cで拾えるようにしました。値は10から3300の範囲でミリボルトになりボリュームを付けてテスターで調べてほぼほぼ正確です。

mruby on YABMな蟹さんで拾った値をそのままTheingSpeakに投げます。

#
# mruby script
#
# thingspeak channel update by HomeSpotCube
#

APIKEY = "naisyo"

# GPIO I2C Pin (SW12)

SCL = 2
SDA = 11

STATUS_LED1 = (1 << 0)
STATUS_LED2 = (1 << 6)
STATUS_LED3 = (1 << 17)
TOP_LED1 = (1 << 16)
TOP_LED2 = (1 << 4)
TOP_LED3 = (1 << 1)
TOP_BUTTON = (1 << 3)
ALLLEDS = (STATUS_LED1 | STATUS_LED2 | STATUS_LED3 |
  TOP_LED1 | TOP_LED2 | TOP_LED3)

def gpioinit(yabm) 
  yabm.gpiosetsel(0x003c300c, 0x003c300c, 0x00001800, 0x00001800)

  reg = yabm.gpiogetctl()
  reg &= ~ALLLEDS
  reg &= ~TOP_BUTTON
  yabm.gpiosetctl(reg)

  reg = yabm.gpiogetdir()
  reg |= ALLLEDS
  reg &= ~TOP_BUTTON
  yabm.gpiosetdir(reg)

  reg = yabm.gpiogetdat()
  reg |= ALLLEDS
  yabm.gpiosetdat(reg)
end

def ledon yabm
  reg = yabm.gpiogetdat()
  yabm.gpiosetdat(reg & ~TOP_LED1)
end

def ledoff yabm
  reg = yabm.gpiogetdat()
  yabm.gpiosetdat(reg | TOP_LED1)
end

def chkcrc dat, n
  crc8 = 0xff
  for i in 0..(n - 1) do
    crc8 = crc8 ^ dat[i]
    8.times {
      if crc8 & 0x80 == 0x80 then
        crc8 = crc8 << 1
        crc8 = crc8 ^ 0x31
      else
        crc8 = crc8 << 1
      end
    }
  end
  crc8 & 0xff
end


begin

yabm = YABM.new

yabm.netstartdhcp

gpioinit(yabm)

# sync date by ntp use https X.509
ntpaddr = yabm.lookup("ntp.nict.jp")
yabm.sntp(ntpaddr)

yabm.i2cinit(SCL, SDA, 1)

count = 0
interval = 30

yabm.watchdogstart(256)

arr = Array.new(3)

loop do
  ledon yabm

  yabm.i2cwrite(4, 0, 0)
  for addr in 0..2 do
    arr[addr] = yabm.i2cread(4, addr)
  end
  yabm.print arr[0].to_s(16).rjust(2, '0') + ","
  yabm.print arr[1].to_s(16).rjust(2, '0') + ","
  yabm.print arr[2].to_s(16).rjust(2, '0') + " "
  val = arr[0] * 0x100 + arr[1]
  crc = chkcrc(arr, 2)
  yabm.print val.to_s + " " + crc.to_s(16).rjust(2, '0') + "\r\n"

  res = SimpleHttp.new("https", "api.thingspeak.com", 443).request("GET", "/update?api_key=" + APIKEY + "&field1=" + val.to_s, {'User-Agent' => "test-agent"})
  ledoff yabm
  yabm.print "." + "\r\n"
  yabm.msleep interval * 1000
  yabm.watchdogreset
end

rescue => e
  yabm.print e.to_s
end

結果はこんな感じです。

サーミスタグラフ.png

サーミスタは温度が下がると抵抗値が大きくなり、その結果ADCに入る電流が増えます。この時間帯の気温は25度から20度くらいになっていました。

25度で3.3Vのだいたい半分くらいになっているので、25度時に10KΩのサーミスタと思われます。

温度センサーよりコストが抑えられるので、卓上時計などに付いている温度計はサーミスタが使われていることが多いです。

生のデータを見ると結構ばらつきがあるので、いろいろ工夫が必要なようです。

温度に変換する場合logの計算が必要になるのですが、mruby on YABMはfloatをサポートしていないので、計算するのが難しいです。

またジャンクの部品では定数が分からないので、計算が困難です。

PIC12の開発がWindowsの重いIDEでしかできないのも問題です。

素直にI2Cの温度センサーを使うのが良さそうです。

と思ったのですが、PICで計算して温度を返すようにするのが良さそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?