USB Weather Boardのファームウェア更新 + 湿度表示を変更してみた
前回紹介した SparkFun USB Weather Board だが、マイコン周りは Arduino と同等なので、自分でファームウェアを書き換えたりもできる。今回、SparkFun のサイトから USB Weather Board の最新ファームウェアをダウンロードした上で、湿度表示が小数点表示になるように変更してみた。
SHT15 temperature: 10.05 deg C SHT15 humidity: 42.1 % SHT15 dewpoint: -2.27 deg C BMP085 pressure: 1004.88 mbar BMP085 temperature: 11.20 deg C TEMT6000 light: 0.1 % Weather meters wind speed: 0.0 m/s FAIL Weather meters wind direction: -1 degrees FAIL Weather meters rainfall: 0 mm FAIL External power: 0.00 Volts FAIL
まず、Arduino の開発環境をダウンロードするが、Arduino IDE は Java ベースなので Arduino IDE と JRE をダウンロードし、JRE をインストールする。Gentoo Linux の場合は Portage ツリーに入っているので、Arduino playground – Arduino on Gentoo を参考にインストールするとよい。私はへたれて手軽に Windows で開発環境を整備した。
次に SparkFun のサイトから Weather_Board_3_v12.zip をダウンロードし、展開する。中に libraries
フォルダがあるので、この中にある SFE_BMP085
フォルダと SHT1x
フォルダを Arduino IDE のフォルダ直下にある libraries
フォルダにコピーする。これでファームウェア構築環境が整うので、Arduino IDE を起動して Weather_Board_3_v12.zip の Weather_Board_3
フォルダにある Weather_Board_3.pde
を読み込む。
この状態で USB Weather Board を接続しておき、USB Weather Board が接続されているポートを [Tools]-[Serial Port] から選択しておく。また、コンパイルしたファームウェアを USB Weather Board に転送するには、[tools]-[Board] から「接続している Arduino の種類」を設定しておく必要がある。データシートにもある通り、USB Weather Board の場合は Arduino Pro Mini (3.3V, 8MHz) w/ ATmega328 を選択しておく。ここまでくれば、あとは「Upload」ボタンを押せばファームウェアをコンパイルした上で USB Weather Board に転送できる。
転送が完了したら、USB Weather Board の電源を一度切って再起動させてみる。Ctrl + Z
で設定画面を表示し、ファームウェアのバージョンが 1.2 になっていれば正しく転送が完了している。
さて、USB Weather Board だが、湿度表示は整数表示になっている。SHT15 の湿度における精度は ±2%RH なので精度的に整数表示させる意味は全くないが、とりあえずやってみたかったのでやってみた。データ表示箇所は 396 行目 ~ 608 行目の巨大な switch
文なので、ここにある
Serial.print(SHT15_humidity,0);
となっている表示部分を
Serial.print(SHT15_humidity,2);
などとする。第2引数で小数点第何位までを表示するかを指定しているので、ここを希望する桁数にすればよい。
このほか、日本では外気温が氷点下になったり 35 ℃以上になったりすることもあるが、USB Weather Board では 15 ℃ ~ 30 ℃の範囲を超えると FAIL 表示になるので、これは気分的によろしくない。これについては 462 行目 ~ 474 行目と 531 行目 ~ 543 行目で表示しているのでそれぞれ変更すればよい。
*** Weather_Board_3.pde.orig 2012-02-26 13:08:10.000000000 +0900 --- Weather_Board_3.pde 2012-02-26 13:09:27.000000000 +0900 *************** *** 403,409 **** printComma(); Serial.print(SHT15_temp,1); printComma(); ! Serial.print(SHT15_humidity,0); printComma(); Serial.print(SHT15_dewpoint,1); printComma(); --- 403,409 ---- printComma(); Serial.print(SHT15_temp,1); printComma(); ! Serial.print(SHT15_humidity,1); printComma(); Serial.print(SHT15_dewpoint,1); printComma(); *************** *** 468,481 **** case SI: Serial.print("C "); ansiTab(); ! if ((SHT15_temp > 15) && (SHT15_temp < 30)) pass(); else fail(); break; } Serial.print("SHT15 humidity: "); ansiTab(); ansiTab(); ! Serial.print(SHT15_humidity,0); Serial.print("% "); ansiTab(); ansiTab(); --- 468,481 ---- case SI: Serial.print("C "); ansiTab(); ! if ((SHT15_temp > -5) && (SHT15_temp < 40)) pass(); else fail(); break; } Serial.print("SHT15 humidity: "); ansiTab(); ansiTab(); ! Serial.print(SHT15_humidity,1); Serial.print("% "); ansiTab(); ansiTab(); *************** *** 537,543 **** case SI: Serial.print("C "); ansiTab(); ! if ((BMP085_temp > 15) && (BMP085_temp < 35)) pass(); else fail(); break; } --- 537,543 ---- case SI: Serial.print("C "); ansiTab(); ! if ((BMP085_temp > -5) && (BMP085_temp < 40)) pass(); else fail(); break; } *************** *** 631,637 **** } LCDline2(); Serial.print("humid: "); ! Serial.print(SHT15_humidity,0); Serial.print("%"); break; case 1: --- 631,637 ---- } LCDline2(); Serial.print("humid: "); ! Serial.print(SHT15_humidity,1); Serial.print("%"); break; case 1:
だいたいこんな感じだろうか。上記は摂氏のみ対応しており、華氏では 1.2 オリジナルと同じ基準で FAIL が表示される。
こんな感じでだいたい取りたいものが取れるようになったので、次は実際に運用するに当たっての問題点を解決していきたい。