そこで秋月でUSBシリアル変換モジュールを購入し,8pinoの#0・#4 pinをそれぞれRX・TXに設定してみましたが,どうにもモニタできませんでした.オシロスコープで確認したところ,信号はきちんと出てるようなので,おそらくシリアル変換モジュールとPCの問題だと思います.ちなみに使用しているのはMacbook Airで,OSはYosemiteです.ドライバのインストールなどは問題無いと思います,認識もされているんですが・・・。なぜでしょうか.
仕方が無いので,Unoに8pinoのスケッチを書き込んで,シリアルモニタできちんと動いているか確認しました.まあ,Unoで動く事が確認できても8pinoで動いてるかわかんないんですが・・・.ちゃんと動きました.
TinyWireM.hをWire.hに変更しています |
また,loop()のなかで温度と湿度を逐次計測するように変更しました.これできちんと動いているか,外気温度を変えたりすれば確認できます.
#include <TinyWireM.h> //温湿度センサモジュール #define HDC1000_ADDRESS 0x40 //温度センサモジュールのアドレス(固定) #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); getTempAndHumid(&ab_hum); } 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(); delay(500); 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 = abs(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] }
(右)リスクが低い,つまり温度や湿度が高いと青色に光ります
(左)逆にリスクが高くなると赤色っぽくなります
次回はスイッチを組み込みたいと思います.
Parts Lists
USBシリアル変換モジュール: http://akizukidenshi.com/catalog/g/gM-08461/
Reference
FTDI USBシリアル変換モジュールについて:
http://www.besttechnology.co.jp/modules/knowledge/?how%20to%20install%20FTDI%27s%20device%20driver
http://www.geocities.jp/zattouka/GarageHouse/micon/linkPC/FT232R.htm
http://www.besttechnology.co.jp/modules/knowledge/?how%20to%20install%20FTDI%27s%20device%20driver
http://www.geocities.jp/zattouka/GarageHouse/micon/linkPC/FT232R.htm
Note
なぜかHDC1000から送られてくる湿度が負を示す事があります.どうやらある値より大きな湿度の時にそうなるようです.絶対値は正しいようなので,とりあえずabs()で対応しています.なぜ負になるのか理由はまだわかりません.
0 件のコメント:
コメントを投稿