0

部屋の温度が低い時に警告するようにした

最近寒いんだけど、明らかに寒いというほどでもない。
夜中に3時間ぐらい座って作業しているとじわじわと冷えていて次第に手足が動かなくなり、キーボードが打てなくなってようやく寒さに気づく。
つまり、集中しているとじわじわとした寒さに気づかない。

計測してみるとだいたい室温19度で数時間経つと冷えきるっぽいので、20度未満の時に「お体に障りますよ」と警告するようにした。
20度以上でも、「現在の気温 21度です」とか読み上げるようになっている。
これを30分おきにcronで動かしているので最近はもう凍えないようになった。ヤバくなる前にスープとか作って飲む。


まず、気温とか明るさをtweetするようにしたで作ったプログラムをarduino_firmataで簡単にした。
https://github.com/shokai/tweet_env
これがJSONでtweetする。


次に、tweetをチェックして温度が20度以下だったら「お体に障りますよ」と警告するプログラムを作った
https://github.com/shokai/okaradani-sawarimasuyo


git clone git@github.com:shokai/okaradani-sawarimasuyo.git
cd okaradani-sawarimasuyo
gem install bundler
bundle install
ruby okaradani-sawarimasuyo.rb

crontabに登録、毎時20と50分にしゃべる
20,50 * * * * cd $HOME/src/ruby/okaradani-sawarimasuyo && ruby okaradani-sawarimasuyo.rb > /dev/null 2>&1

Macのsaykanaを使ってるけど、他にもいろいろあるので別の声にしたければどうぞ → Mac/Linuxに日本語を喋らせる

0

EnergiaでMSP430 LaunchPadの内蔵温度センサーを読む

Energiaで450円のMSP430 LaunchPadがArduino化したので、内蔵の温度センサを読んで摂氏に変換してみた。

ボード : MSP430 LauncPad
マイコン : MSP430G2553
プログラム環境 : Energia


プログラム

温度を計ってシリアル通信でパソコンに送る。
内蔵電圧を1.5Vとして計算しているけど、実際は1.41~1.59Vらしいので精度はあきらめた。もともとチップ内部に封入されているし、きちんと気温を計るためのものではない。
https://github.com/shokai/energia-study/tree/master/temperature_serial
int ad;
double temp;
bool led_stat = false;

void setup() {
pinMode(GREEN_LED, OUTPUT);
Serial.begin(9600);
analogReference(INTERNAL1V5); // 内蔵1.5Vを基準にする
// analogReference(DEFAULT);
analogRead(TEMPSENSOR); // 最初の1回目のAD変換は正確に取れないので、捨てる
}

void loop() {
delay(1000);
ad = analogRead(TEMPSENSOR);
Serial.print("ad:");
Serial.println(ad);

temp = 1.5/1024*(ad-673)/0.00355; // 電圧を温度に変換
Serial.print("temp:");
Serial.println(temp);

digitalWrite(GREEN_LED, led_stat);
led_stat = !led_stat;
}


結果

ad:711
temp:15.68
ad:712
temp:16.09
ad:710
temp:15.27
ad:714
temp:16.92

けっこうブレるので10回ぐらい読んで平均を取ったりしたほうが良さそう
ちなみにLM35DZで計った気温は19度だった。


しばらく冷蔵庫に入れた後は
ad:680
temp:2.89
ad:681
temp:3.30
ad:683
temp:4.13
ad:681
temp:3.30
ad:681
temp:3.30


調査

white clouds: MSP430 温度計
同じボードでmsp-gccでやっているけど、同じ要領でEnergiaで書いたらADコンバータから全然違う数値がでてきた。
AD変換の比較電圧が違う気がする。
正しければ、摂氏0度の時に673が出てくるらしい。

Energia/examples/3.Analog/AnalogInput_InternalThermometer_430/AnalogInput_InternalThermometer_430.ino at master · energia/Energia
華氏で計算している。

Using the internal temperature sensor – Code vault – 43oh
華氏で計算している。
analogReference(INTERNAL1V5);
というのが気になる。

hardware/msp430/cores/msp430/Energia.h で定義されていた
DEFAULT SREF_0
INTERNAL1V5 SREF_1 + REFON
INTERNAL2V5 SREF_1 + REFON + REF2_5V
EXTERNAL SREF_2


データシートを見る
16ビット・超低消費電力マイコン MSP430™ – バリュー・ライン – MSP430G2553 – TI
40ページより、温度センサの仕様。1℃ごとに3.55mV増える。

38ページより、ADコンバータの仕様。レジスタの設定しだいで内蔵1.5Vか2.5になる。
外部電圧を参照するなら5,6番ピンを使う。


というわけでこうなった
analogReference(INTERNAL1V5);
int ad = analogRead(TEMPSENSOR);
double temp = 1.5/1024*(ad-673)/0.00355;
Serial.println(temp);