発売前から気になっていたのですが,先日やっと購入しました.
届いてみると,その小ささと美しさにビックリ.
8pinoのパッケージ.美しいです. |
インフルエンザ感染予防目安温湿度計 この機能性に優れたカッコいい器械を8pinoで作ります |
/////////////////////////////////////////////////////
Concept
① 温度・湿度を計測
② 感染リスクを計算
③ LEDの色でリスクを表示
//////////////////////////////////////////////////////
8pinoで開発しやすいように,pinをハンダ付けしました.8pino自体よりもpinの方が大きいくらいですw
ブレッドボードにさすとこんな感じです.USBを直接繋ぎます.
とりあえず,赤青2色LEDを光らせてみます.(本当はRGB LEDを使いたかったんですが,pinの数がたらないので2色にしました・・・)今回使用したLEDはカソードコモンでしたので,カソードをGNDに接続して,8pinoのpin #1をLEDの赤anodeに,pin #4を青anodeに繋ぎます.本当は電流制限抵抗とか入れるべきなのでしょうが,横着してそのまま繋ぎます.ジャンパ線の色がむちゃくちゃなのは気にしないでください(涙
赤・青・紫(赤+青)がつきました.Lチカ成功です!!w
さて,LEDはついたので次は温度と湿度の測定です.
8pinoはI2C通信に対応しているので,I2Cの温湿度計が使えそうです.
今回はHDC1000搭載のモジュールを使ってみます.
HDC1000温湿度モジュール.小さいしデザインも好みなのでよく使います. |
容量絶対湿度[g/m^3]を求める→7 g/m^3以下なら危険(赤),7~11 g/m^3なら中程度(紫),11~ g/m^3なら低(青)となるようにLEDを光らせます.
#include <TinyWireM.h> //温湿度センサモジュール #define HDC1000_ADDRESS 0x40 //温度センサモジュールのアドレス(固定) #define HDC1000_RDY 3 //温度センサモジュールのRDY pinを8pinoの3に繋ぐ #define HDC1000_TEMPERATURE_POINTER 0x00 #define HDC1000_CONFIGURATION_POINTER 0x02 #define HDC1000_CONFIGURE_MSB 0x10 //0x10=00010000 #define HDC1000_CONFIGURE_LSB 0x00 //0x00=00000000 int ledR = 1; //LEDの赤Anode int ledB = 4; //LEDの青Anode float ab_hum; //容量絶対湿度[g/m3] void setup() { pinMode(ledR, OUTPUT); pinMode(ledB, OUTPUT); TinyWireM.begin(); //initialize I2C bus delay(15); //HDC1000は電源on後15msec程度の待ち時間が必要 configure(); //HDC1000の初期設定 delay(10); getTempAndHumid(&ab_hum); } void loop() { if(ab_hum < 7){ analogWrite(ledR, 100); delay(2000); }else if(7 <= ab_hum && ab_hum < 11){ analogWrite(ledR, 100); analogWrite(ledB, 150); delay(2000); }else{ analogWrite(ledB, 100); delay(2000); } digitalWrite(ledR, LOW); digitalWrite(ledB, LOW); delay(1000); } void configure(){ //Setup the HDC1000 TinyWireM.beginTransmission(HDC1000_ADDRESS); TinyWireM.send(HDC1000_CONFIGURATION_POINTER); //pointerを指定した後 TinyWireM.send(HDC1000_CONFIGURE_MSB); //2byte(つまり8bit 8bit)のデータを送信している TinyWireM.send(HDC1000_CONFIGURE_LSB); //この場合 00010000 00000000 従って12bit目が1にセットされた。 TinyWireM.endTransmission(); //12bit目が1だと温度湿度の順に32bitデータを送信するモードになる } //詳細はHDC1000のデータシートを参照 void getTempAndHumid(float *ab_hum){ //気温と相対湿度から容積絶対湿度を求める float tem, hum; //temparature[deg], humidity(相対湿度)[%] float sp_hum, p, wp, roh; int tempData, humidData; TinyWireM.beginTransmission(HDC1000_ADDRESS); TinyWireM.send(HDC1000_TEMPERATURE_POINTER); TinyWireM.endTransmission(); while(digitalRead(HDC1000_RDY) == HIGH){//HDC1000はデータ変換が終了するとRDY pinをHIGHにする ; } TinyWireM.requestFrom(HDC1000_ADDRESS, 4); while(TinyWireM.available() < 4){ //温度湿度それぞれ2byteのデータが送られてくる; ; } tempData = TinyWireM.receive() << 8; tempData |= TinyWireM.receive(); humidData = TinyWireM.receive() << 8; humidData |= TinyWireM.receive(); tem = tempData / 65536.0 * 165.0 - 40.0; //温度と湿度に変換 hum = humidData / 65536.0 * 100.0; //容積絶対湿度[g/m3]の計算 p = 6.1078 * pow(10, (7.5 * tem) / (237.3 + tem)); //飽和水蒸気圧[hPa] Tetens equation wp = p * hum / 100; //水蒸気圧[hPa] sp_hum = 622 * wp / (1013.25 - wp); //重量絶対湿度[g/kg] 大気圧を1013.25hPaとした roh = 1.293 * 1 / (1 + tem / 273.15) * (1 - 0.378 * wp / 1013.25); //空気の密度[kg/m3] *ab_hum = sp_hum * roh; //容積絶対湿度[g/m3] }
8pinoはI2Cに対応しているのですが,Arduino標準のWireライブラリが使えないそうです.マニュアル通りTinyWireライブラリをダウンロードして使えました.使い方はWireライブラリの関数とほとんど同じです.
動かしてみました.この時期はほぼ赤ですね(汗 |
Parts Lists
8pino x1 : https://www.switch-science.com/catalog/2108/
2色LED(赤・青)OSRB3132A x1 : http://akizukidenshi.com/catalog/g/gI-04079/HDC1000温湿度センサモジュール x1 : http://akizukidenshi.com/catalog/g/gM-08775/
Reference
8pino: http://8pino.strikingly.com/
TinyWireMライブラリ: https://github.com/adafruit/TinyWireM
HDC1000温湿度モジュールの使い方について: http://garretlab.web.fc2.com/arduino/lab/temperature_and_humidity_sensor/index.html
HDC1000温湿度モジュールの使い方について: http://garretlab.web.fc2.com/arduino/lab/temperature_and_humidity_sensor/index.html
Note
8pinoはスケッチの書き込みに癖があるみたいです.このあたりが8pinoはArduino互換というよりTrinket互換機といわれるゆえんでしょうか.8pinoはUSBをPCと繋ぐことで書き込みモードに移項します.書き込みモードになると,pin #1につながっているLEDが点滅します.点滅しているときが書き込み可能時間だそうです.この間にIDEの書き込みボタンを押せば書き込めます.公式サイトのマニュアルでは,書き込みボタンを押す直前・直後にUSBをつなげと書いてありますが,私の環境ではそこまでシビアにやる必要は無いです.ただ,なぜか書き込みモードにならなくなった8pinoがありますが・・・(壊れた?).
0 件のコメント:
コメントを投稿