どこかで買ったジャンク袋に一個だけ入っていたサーミスタで気温を計ってみました。
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
結果はこんな感じです。
サーミスタは温度が下がると抵抗値が大きくなり、その結果ADCに入る電流が増えます。この時間帯の気温は25度から20度くらいになっていました。
25度で3.3Vのだいたい半分くらいになっているので、25度時に10KΩのサーミスタと思われます。
温度センサーよりコストが抑えられるので、卓上時計などに付いている温度計はサーミスタが使われていることが多いです。
生のデータを見ると結構ばらつきがあるので、いろいろ工夫が必要なようです。
温度に変換する場合logの計算が必要になるのですが、mruby on YABMはfloatをサポートしていないので、計算するのが難しいです。
またジャンクの部品では定数が分からないので、計算が困難です。
PIC12の開発がWindowsの重いIDEでしかできないのも問題です。
素直にI2Cの温度センサーを使うのが良さそうです。
と思ったのですが、PICで計算して温度を返すようにするのが良さそうです。