Arduinoの温度センサーが異常値を返す

このQ&Aのポイント
  • Win10環境でArduino UNOと温度センサーTMP36を使って「Love-o-Meter」という温度計を作成しています。
  • シリアルモニターを起動して最初の数行は正しそうな室温を示してくれるのですが、それ以降、急激に温度が上がってしまうようです。
  • 温度センサーを触ってみても、温度が上がっているようには思えません。回路の方は正しく動いてそうで、シリアルモニターを起動し直した直後のLEDは全消灯、1秒くらいで2個点いて、その後に全点灯になります。
回答を見る
  • ベストアンサー

Arduinoの温度センサーが異常値を返す

Win10環境でArduino UNOと温度センサーTMP36を使って「Love-o-Meter」という温度計を作成しています。電源はUSBを介してPCからです。 コードはこちら(ただし、最後のprintln()以外はすべてprint()に修正、delayは1000msに変更しました): https://programminginarduino.wordpress.com/2016/02/29/projecte-3/ シリアルモニターを起動して最初の数行は正しそうな室温を示してくれるのですが、それ以降、急激に温度(というか電圧)が上がってしまうようです: sensor Value: 147, Volts: 0.72, degrees C: 21.78 sensor Value: 147, Volts: 0.72, degrees C: 21.78 sensor Value: 147, Volts: 0.72, degrees C: 21.78 sensor Value: 148, Volts: 0.72, degrees C: 22.27 sensor Value: 166, Volts: 0.81, degrees C: 31.05 sensor Value: 222, Volts: 1.08, degrees C: 58.40 sensor Value: 222, Volts: 1.08, degrees C: 58.40 sensor Value: 216, Volts: 1.05, degrees C: 55.47 sensor Value: 215, Volts: 1.05, degrees C: 54.98 sensor Value: 219, Volts: 1.07, degrees C: 56.93 sensor Value: 218, Volts: 1.06, degrees C: 56.45 sensor Value: 221, Volts: 1.08, degrees C: 57.91 sensor Value: 225, Volts: 1.10, degrees C: 59.86 sensor Value: 221, Volts: 1.08, degrees C: 57.91 一度、シリアルモニターを閉じてまた開くと、最初の一行だけ正しそうになりました: sensor Value: 149, Volts: 0.73, degrees C: 22.75 sensor Value: 167, Volts: 0.82, degrees C: 31.54 sensor Value: 217, Volts: 1.06, degrees C: 55.96 sensor Value: 218, Volts: 1.06, degrees C: 56.45 sensor Value: 217, Volts: 1.06, degrees C: 55.96 sensor Value: 216, Volts: 1.05, degrees C: 55.47 sensor Value: 212, Volts: 1.04, degrees C: 53.52 sensor Value: 222, Volts: 1.08, degrees C: 58.40 sensor Value: 216, Volts: 1.05, degrees C: 55.47 温度センサーを触ってみても、(55℃くらいに)温度が上がっているようには思えません。 回路の方は正しく動いてそうで、シリアルモニターを起動し直した直後のLEDは全消灯、1秒くらいで2個点いて、その後に全点灯になります。詳しくは添付の動画をご覧ください。 この原因を推測できますでしょうか? また、直し方を教えていただきたいです。 指示があれば従います。 ちなみに、マルチメーターはまだ持っていません。 ではよろしくお願いします。

  • sucker
  • お礼率91% (213/234)

質問者が選んだベストアンサー

  • ベストアンサー
noname#252332
noname#252332
回答No.1

https://www.switch-science.com/catalog/789/  入力電圧はDCジャックから7~12Vと書いてありますが、USBコネクタの給電だけで動くんですか? もし仮に電源電圧が不足してくると、マイコンチップ内のA/Dコンバータに与える基準電圧が小さくなるのですから、相対的に同じ入力電圧に対して大きい値として計測されることになります。想像ですが。科学精神とは知識や知能ではなく、現象をいかに激しく見るかということです。つまりテスターを買う時が来たんじゃないですかと言いたいです。次はオシロが欲しくなりますよ。物入りですね。がんばってください。

sucker
質問者

お礼

ベストアンサーを差し上げます。 仰る通り、9Vの電池を繋げたら正しく動きました! USBの電源じゃ足りないんですね…しかも、足りないなら値も小さく出るのかと思っていましたが「電源電圧が不足してくると、マイコンチップ内のA/Dコンバータに与える基準電圧が小さくなるのですから、相対的に同じ入力電圧に対して大きい値として計測される」んですね。勉強になりました。 早速、「テスター」と「Arduino用アダプター電源 9V-1A」を購入したいと思います。オシロスコープもいつか欲しいですね。 ありがとうございました!

関連するQ&A

  • Arduino

    Arduino Unoにスケッチを書き込もうとしたりシリアルモニタを開こうとすると 「Board at COM1 is not available」とエラーがでて何もできません。 解決方法があれば教えてください。

  • Arduinoを介してソフトを起動・操作する方法?

    Arduino Unoのinputピンからきた信号をトリガーにして,twitterを起動したりTL更新したいのですが,できますか? Arduino Unoのinputピンから入力信号をシリアルモニタに表示するところまではできたのですが, その後,どうやってtwitterを起動したり操作すればいいのかわかりません. どうか,宜しくお願い致します.

  • Arduino 条件式

    Arduinoでシリアルモニタを使用しています。 それで、入力した数字を条件式で判断し、真ならLEDを光らせるプログラムを作りたいのですが、入力した数字をどのようなコードで描いたらいいでしょうか? ちなみに、if (Serial.readString() <= 40) { と書いたらダメでした。 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int RST = 3; int RstFlag = 0; int Tr = 4; int TrFlag = 0; int LED = 2; //初期設定 void setup() { pinMode(RST, INPUT); pinMode(Tr, INPUT); pinMode(LED, OUTPUT); lcd.init(); lcd.backlight(); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Lab"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } void loop() { RstFlag = digitalRead(RST); TrFlag = digitalRead(Tr); lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 if (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); //Serial.readString():データを”文字列”として読み込む lcd.setCursor(10, 1); lcd.print(Serial.readString() + "s"); } } if (RstFlag == 0) { delay(100); lcd.clear(); Serial.println("LCD Clear!"); } /*if ( ○○○ <= 40) { //仮に40とする delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } */ length(readString()); }

  • Arduino

    Arduinoのシリアル通信を用いてLCDに文字列を表示しようと思っています。 以下コード #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //初期設定 void setup() { //LCDの初期設定(縦横のスケール) lcd.begin(16, 2); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Hello world!"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } //動作開始 void loop() { lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Voltage = "); //データを受信時のみの動作 if (Serial.available()) { delay(100); lcd.clear(); while (Serial.available() > 0) { Serial.println("LCD Received!"); lcd.setCursor(10, 1); lcd.print(Serial.available()); } } } このコードでコンパイル後モニタを開き文字列を送信すると、 例 100を送信したとき⇒”0”のみ表示   101を送信したとき⇒”1”のみ表示 のように、最後の文字しか反映されません。 どのように修正したらよいでしょうか。

  • Arduinoのアナログ入力とシリアル通信

    Arduino UNOにシールドを乗っけて電圧をアナログピンで測っているのですが, シリアルモニタに表示される値に謎のノイズ?が乗ります. でもノイズだったら+と-どっちにも触れそうなものなのに, たまに+側に揺れるだけというのもよくわかりません. 一応パスコンを挟んだり移動平均取ったりしても改善されなくて, 最終的にシリアル通信するときの値の表示がおかしいのか?ってなったのですが なにか,こういう原因じゃないのか?とか改善案とか,教えて頂きたいです. ふわっとした質問でごめんなさい. ご回答よろしくお願いします.

  • Arduinoで曲げセンサの値を取得する方法

    Arduinoで曲げセンサを使い、その値を取得してProcessingで音を鳴らす方法はどのような方法があるのでしょうか。 例えば弱く曲げればsample01.mp3が流れ、強く曲げればsample02.mp3が流れるようにしたいです。 自分なりに調べてProcessing側でMinimライブラリを使って下記のプログラムを書けば音を鳴らせるとこまではいけました。 Processing側のプログラムです。 import ddf.minim.*; Minim minim; AudioPlayer player; void setup(){ size(200,200); minim = new Minim(this); player = minim.loadFile("sample01.mp3"); player.play(); } void draw(){ } void stop(){ player.close(); minim.stop(); super.stop(); } Arduinoのプログラムです。 const int led_pin = 9; const int vol_pin = 1; int vol_value = 0; void setup() { Serial.begin( 9600 ); } void loop() { vol_value = analogRead( vol_pin ); analogWrite( led_pin, vol_value/4 ); Serial.write( byte(vol_value/4) ); delay( 50 ); } よろしくお願い申し上げます。

  • Arduinoスケッチがリセットしないと動作しない

    Arduino UNO R3とArduino Nano互換機でI2Cで動く液晶を、標準Wireライブラリーでコントロールするスケッチをプログラミングしました。 しかしながら、Arduino IDEでスケッチを描き込んだ直後は動作するのですが、電源を入れ直すと電源ランプが点灯するだけで、プログラムが実行されなくなります。 一方で、この状態でリセットボタンを押すと、意図したとおりにプログラムが動作するので、おそらく一度はリセットしないと、正しく動かないようです。 ArduinoのFAQではブートローダーによるシリアル通信の関係で、RXを10kΩの抵抗を介してGNDにつなげるか、RXとTXをショートさせると良いとあったのですが、この方法では解決しませんでした。 Arduino単体(パソコンにつなげずに電源のみの供給)で、スケッチを正しく起動させるにはどうしたらよいでしょうか。

  • arduinoでのシリアル通信速度の影響

    arduinoで◯ミリ秒後に13番ピンを△ミリ秒間HIGHにする、というプログラムを組みたいと思い、できたことはできたのですが、シリアルモニターで確かめようとすると、◯ミリ秒後の設定がその影響を受けてか狂ってしまいます。 具体的には以下の様なプログラムです。 #include <MsTimer2.h> //カウント用定数 unsigned long static int i = 0; static int j = 0; //待ち時間(秒) unsigned long wtime = 252000000; //稼働時間(秒) unsigned int mtime = 900000; void func(){ i++; Serial.println(i); Serial.println(j); if(i == wtime){ digitalWrite(13,HIGH); i=0; j=1; } if(j > 0 & j < mtime){ i=0; j++; } else if(j == mtime){ digitalWrite(13,LOW); i=0; j=0; } } void setup() { pinMode(13,OUTPUT); MsTimer2::set(1,func); MsTimer2::start(); Serial.begin(9600); } void loop() { } MsTimerを使って、1ミリ秒ごとにfuncを呼び出し、カウント用変数をインクリメントして間隔を制御する、というものです。 シリアル通信をするコードを削除すれば問題ないのですが、上記のようにすると、カウントが9.6分の1の速さになってしまうようです。 これはなぜでしょうか。 なお、当方arduinoをいじるのは初めてで、C言語はほぼ素人です。 ご存知のかたいらっしゃいましたら教えて下さいませ。 よろしくお願い致します。

  • 機器のI/OをArduinoでSDに記録したい

    皆様、お世話になります。 Arduinoでデーターロガーのスケッチを作成しています。 スケッチしてみましたが動くかどうか確認とこう直した方が良いなど改善点が有れば、お願い致します。 2番ピンに変化が有った時(ONかOFF)に時間と2番ピンの状態をSDカードに記録したいのです。 これが、うまくいけば系統を増やしていきたいです。 書いたスケッチ #include <SD.h> // この値は使用しているシールドや基板に合わせて変更すること。たとえば、 // イーサーネットシールドは 4 // Adafruit のSDシールドは 10 // Sparkfun のSDシールドは 8 const int chipSelect = 4; void setup() { // シリアルポート初期化 Serial.begin(9600); while (!Serial) { ; // USBケーブルが接続されるのを待つ。この待ちループは Leonardo のみ必要。 pinMode(2,INPUT) ; //スイッチに接続ピンをデジタル入力に設定A } Serial.print(F("Initializing SD card...")); // SSピン(Unoは10番、Megaは53番)は使わない場合でも出力にする必要があります。 // そうしないと、SPIがスレーブモードに移行し、SDライブラリが動作しなくなります。 pinMode(SS, OUTPUT); // SDライブラリを初期化 if (!SD.begin(chipSelect)) { Serial.println(F("Card failed, or not present")); // 失敗、何もしない while(1); } Serial.println(F("ok.")); // 日付と時刻を返す関数を登録 SdFile::dateTimeCallback( &dateTime ); } void loop() { // ファイルを開く File dataFile = SD.open("datalog.txt", FILE_WRITE); // もし2番ピンに変化が有れば書き込む if (digitalRead(2)==HIGH) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } if (digitalRead(2)==LOW) { int value = digitalRead(2); dataFile.println(value); dataFile.close(); // シリアルポートにも出力 Serial.println(value); } // ファイルが開けなかったらエラーを出力 else { Serial.println(F("error opening datalog.txt")); } } void dateTime(uint16_t* date, uint16_t* time) { uint16_t year = 2014; uint8_t month = 7, day = 22, hour = 14, minute = 0, second = 0; // GPSやRTCから日付と時間を取得 // FAT_DATEマクロでフィールドを埋めて日付を返す *date = FAT_DATE(year, month, day); // FAT_TIMEマクロでフィールドを埋めて時間を返す *time = FAT_TIME(hour, minute, second); } よろしくお願い致します。

  • Arduinoで複数のLEDマトリクスに映像出力

    私はこのページを参考に( http://kousaku-kousaku.blogspot.jp/2008/08/arduinoprocessingledweb.html )ArduinoMegaの互換機ChipKitMax32を使用して、12×32のLEDマトリクスを制御し映像を表示させています。 が、映像を表示させるには速度的に問題があり、参考先のプログラムではdelayMicrosecondsで各ドットの明るさを制御していますがそれも怪しく、映像自体のフレームレートを下げるなどしても改善せず、マイコン1台で映像表示するのは厳しいか…と思い、 8×8のLEDマトリクスにつき1台のArduino unoを使用し、それを何個も連結させ大きなLEDマトリクスにしようと考えました。 複数のArduinoを接続する方法として、I2CやSPI通信等がありますが、SPIでは後々Arduino unoのピン数が足りなくなるかもという不安もあり、複雑そうですがI2CでArduino同士を通信させようと思いました。 回路のイメージは添付画像の通り、 プログラムの内容は、 1 Processingから映像の各ドットの明るさの数値を受け取る 2 Arduinoマスタからスレーブ1へ最初の8つの数値を送る 3 スレーブ1がマスタから受け取った8つの数値をLEDマトリクス1の一行目の各ドットの明るさに割り振り点灯 4 Arduinoマスタからスレーブ2へ次の8つの数値を送る 5 スレーブ2がマスタから受け取った8つの数値をLEDマトリクス2の一行目の各ドットの明るさに割り振り点灯(LEDマトリクス1・2の一行目が点灯完了) これをあと7回くりかえし、LEDマトリクスの全画面の点灯完了 最終的には8×8のLEDマトリクスを10台程使用して、16×40のLEDマトリクスに映像を表示させたいです。 Arduinoで複数のLEDマトリクスを扱う場合、「映像表示の速度に耐えられるようにするために、Arduino自体の数を増やす、その通信をI2Cで行い、上記のようなプログラムで制御する」という方法で正しいか、可能かどうかの判断をお願いしたいです。 また、これより良い方法や、その他アドバイス等ありましたらお願い致します。