カテゴリ:マイクロチップ
(1)アナログポートに接続する温度センサは精度が低いので注意。I2Cなどのシリアル接続がよさげ。 (2)5Vの三端子レギュレータは、電池駆動の場合、高くとも低ドロップを使って、供給電圧を下げる。3.3Vの電池2個で駆動できるようにするとよい。 (3)発熱するレギュレータの近くにセンサを配置しない。ちなみに湿度センサは写真中のブルーの素子です。 使い方が難しいHS-15P湿度センサですが、1Khzの正弦波をトランジスタ1個で発生させて使っています。回路自体はLCDの下に隠れて見えません。 ということで、温度、湿度計をバッチ形式で胸につけられるようにするつもりでしたが、 小型であってもLCDを採用した関係で重くて、ちょっと無理。 シリアル接続の温度センサ、軽いLCD、消費電力の少ないCPUを使って、もう一度、回路から設計しなおします。 課題 (1)USB直結型のarduinoで、デバック用にシリアルプリントする方法を教えてください。 サンプルスケッチを一応紹介します。 <>は、小文字にしてください。 電圧から温度を求める式は、実装した素子にあわせて定数を変更しています。 #include <math.h> #include <LiquidCrystal.h> int ledPin = 13; // LED connected to digital pin 13 int ledonetmp = 9 ; int ledonetemp = 10 ; int ledtentmp = 11 ; int ledtentemp = 12 ; int analogPinin =0 ; int analogPinout =1 ; int analogPintemp =2 ; int tentmp = -99 ; int tentemp = -99; int ten =0 ; char tenchartmp = '?'; char tenchartemp = '?'; int onetmp = -99; int onetemp = -99; int one = 0; char onechartmp = '?'; char onechartemp = '?'; static unsigned long tmp; int temp; long wtime = 0 ; LiquidCrystal lcd(2,3, 4, 5, 6, 7, 8); unsigned int measurement(unsigned short channel) { unsigned int ad, max, min, cnt; // analogReference(INTERNAL) ; ad = 0; max = 0; min = 1024; for (cnt = 0; cnt < 1000; cnt++) { ad = analogRead(channel); max = ad > max ? ad : max; min = ad < min ? ad : min; analogReference(EXTERNAL) ; } return (max - min); } unsigned int tempm(unsigned short channel) { delay(100); unsigned int cnt; unsigned long ad; // ad = 0; for (cnt = 0; cnt < 100; cnt++) { ad = analogRead(channel) + ad ; // Serial.println(analogRead(channel)); delay(5); } ad = ad /100; Serial.print(ad); Serial.print(" "); return (ad); } void setup() // run once, when the sketch starts { analogReference(EXTERNAL) ; Serial.begin(9600); // シリアル通信の初期化 lcd.print("Designed by Odrie"); lcd.setCursor(0, 1) ; lcd.print(" Minaminoshima"); pinMode(ledonetmp, OUTPUT); pinMode(ledonetemp, OUTPUT); pinMode(ledtentmp, OUTPUT); pinMode(ledtentemp, OUTPUT); } void loop() // run over and over again { delay(1000); int val1 = 0; int val2 = 0; val1 = measurement(analogPinin); // アナログピンを読み取る val2 = measurement(analogPinout); // val2 = val1 / val2 ; //lcd.clear(); //lcd.setCursor(0, 0) ; // lcd.print(val1 ); // デバグ用に送信 // lcd.print(" "); // lcd.setCursor(0, 1) ; // lcd.print(val2 ); tmp = val2; tmp *= 1000; tmp /= val1; Serial.print(" "); Serial.print(tmp ); Serial.print(" "); if (tmp <= 17) { Serial.print("90%"); } else if (tmp <= 35) { Serial.print("80%"); } else if (tmp <= 90) { Serial.print("70%"); } else if (tmp <= 230) { Serial.print("60%"); } else if (tmp <= 600) { Serial.print("50%"); } else if (tmp <= 2200) { Serial.print("40%"); } else if (tmp <= 9000) { Serial.print("30%"); } else if (tmp <= 80000) { Serial.print("20%"); } else Serial.print("10%"); tmp = val2; tmp *= 1000000; tmp /= val1; int Td = 30; Serial.print(tmp); Serial.print(" "); //Td = ((( 0.958 / 1024.0 ) * tempm(analogPintemp)) - 0.424 ) / 0.00625 ; Td = ((( 2.42 / 1024.0 ) * tempm(analogPintemp)) - 0.433 ) / 0.00625 ; temp =Td; Serial.print(Td); Serial.print(" "); tmp = tmp*5.1552*exp(-0.0644*Td); tmp=pow(10,(log10(tmp)-18.48)/(-7.8282) ); Serial.println(tmp); wtime=millis() / 60000; Serial.println(wtime); if (wtime > one ) { one = wtime ; onetmp = tmp; onetemp = temp; } if ( onetmp < tmp ) { onechartmp = '+' ; digitalWrite(ledonetmp, HIGH); } else if ( onetmp > tmp ) { onechartmp = '-' ; digitalWrite(ledonetmp, LOW); } else { digitalWrite(ledonetmp, LOW); onechartmp = '=' ; } if ( onetemp < temp ) { onechartemp = '+' ; digitalWrite(ledonetemp, HIGH); } else if ( onetemp > temp ) { onechartemp = '-' ; digitalWrite(ledonetemp, LOW); } else { onechartemp = '=' ; digitalWrite(ledonetemp, LOW); } // ******* wtime=millis() / 600000; if (wtime > ten ) { ten = wtime ; tentmp = tmp; tentemp = temp; } if ( tentmp < tmp ) { tenchartmp = '+' ; digitalWrite(ledtentmp, HIGH); } else if ( tentmp > tmp ) { tenchartmp = '-' ; digitalWrite(ledtentmp, LOW); } else { tenchartmp = '=' ; digitalWrite(ledtentmp, LOW); } if ( tentemp < temp ) { tenchartemp = '+' ; digitalWrite(ledtentemp, HIGH); } else if ( tentemp > temp ) { tenchartemp = '-' ; digitalWrite(ledtentemp, LOW); } else { digitalWrite(ledtentemp, LOW); tenchartemp = '=' ; } delay(1000); lcd.clear(); lcd.setCursor(0, 0) ; lcd.print("Humidity: "); lcd.print(tmp); lcd.print("% "); lcd.print(onechartmp); lcd.print(tenchartmp); lcd.setCursor(0, 1) ; lcd.print("Tempe. : "); lcd.print(Td); lcd.print("c "); lcd.print(onechartemp); lcd.print(tenchartemp); } お気に入りの記事を「いいね!」で応援しよう
最終更新日
2009年09月03日 22時47分54秒
コメント(0) | コメントを書く
[マイクロチップ] カテゴリの最新記事
|
|