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 に転送できる。

Arduino IDEでファームウェアを転送

 転送が完了したら、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 が表示される。

 こんな感じでだいたい取りたいものが取れるようになったので、次は実際に運用するに当たっての問題点を解決していきたい。