質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

解決済

1回答

849閲覧

ESP8266でアナログTDSセンサーを使いたい。

uzurano

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

0グッド

0クリップ

投稿2018/04/25 02:59

前提・実現したいこと

Arduinoで使うためのTDSセンサーをESP8266(単体)で使いたい。

※TDSセンサーとは水の中に溶けている不純物の濃度を調べるものです。

発生している問題・エラーメッセージ

Ardoinoのアナログ入力は0-5Vの入力電圧を0-1023の整数値に変換しているようですが、 ESP8266のアナログ入力の入力電圧は0-1Vなので、センサーの測定結果がおかしくなってしまいます。

該当のソースコード

c言語

1/*************************************************** 2 DFRobot Gravity: Analog TDS Sensor / Meter For Arduino 3 <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_TDS_Sensor_/_Meter_For_Arduino_SKU:_SEN0244> 4 5 Created 2017-8-22 6 By Jason <jason.ling@dfrobot.com@dfrobot.com> 7 8 GNU Lesser General Public License. 9 See <http://www.gnu.org/licenses/> for details. 10 All above must be included in any redistribution 11 12 /***********Notice and Trouble shooting*************** 13 1. This code is tested on Arduino Uno and Leonardo with Arduino IDE 1.0.5 r2 and 1.8.2. 14 2. More details, please click this link: <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_TDS_Sensor_/_Meter_For_Arduino_SKU:_SEN0244> 15 ****************************************************/ 16 17#define TdsSensorPin A0 18#define VREF 5.0 // analog reference voltage(Volt) of the ADC 19#define SCOUNT 30 // sum of sample point 20int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC 21int analogBufferTemp[SCOUNT]; 22int analogBufferIndex = 0,copyIndex = 0; 23float averageVoltage = 0,tdsValue = 0,temperature = 25; 24 25void setup() 26{ 27 Serial.begin(115200); 28 pinMode(TdsSensorPin,INPUT); 29} 30 31void loop() 32{ 33 static unsigned long analogSampleTimepoint = millis(); 34 if(millis()-analogSampleTimepoint > 40U) //every 40 milliseconds,read the analog value from the ADC 35 { 36 analogSampleTimepoint = millis(); 37 analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //read the analog value and store into the buffer 38 analogBufferIndex++; 39 if(analogBufferIndex == SCOUNT) 40 analogBufferIndex = 0; 41 } 42 static unsigned long printTimepoint = millis(); 43 if(millis()-printTimepoint > 800U) 44 { 45 printTimepoint = millis(); 46 for(copyIndex=0;copyIndex<SCOUNT;copyIndex++) 47 analogBufferTemp[copyIndex]= analogBuffer[copyIndex]; 48 averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value 49 float compensationCoefficient=1.0+0.02*(temperature-25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); 50 float compensationVolatge=averageVoltage/compensationCoefficient; //temperature compensation 51 tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value 52 //Serial.print("voltage:"); 53 //Serial.print(averageVoltage,2); 54 //Serial.print("V "); 55 Serial.print("TDS Value:"); 56 Serial.print(tdsValue,0); 57 Serial.println("ppm"); 58 } 59} 60int getMedianNum(int bArray[], int iFilterLen) 61{ 62 int bTab[iFilterLen]; 63 for (byte i = 0; i<iFilterLen; i++) 64 bTab[i] = bArray[i]; 65 int i, j, bTemp; 66 for (j = 0; j < iFilterLen - 1; j++) 67 { 68 for (i = 0; i < iFilterLen - j - 1; i++) 69 { 70 if (bTab[i] > bTab[i + 1]) 71 { 72 bTemp = bTab[i]; 73 bTab[i] = bTab[i + 1]; 74 bTab[i + 1] = bTemp; 75 } 76 } 77 } 78 if ((iFilterLen & 1) > 0) 79 bTemp = bTab[(iFilterLen - 1) / 2]; 80 else 81 bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; 82 return bTemp; 83}

試したこと

・サンプルコードではアナログ入力ピンはA1となっていましたが、ESP8266のアナログ入力ピンは1つしかなく、A0(TOUT)というピンを使いました。
・センサーの電源を3.3Vにして#define VREF 3.3にして試しました。
・センサーの電源を5.0Vにして#define VREF 5.0にして試しました。

補足情報(FW/ツールのバージョンなど)

このアナログTDSセンサーを使っています。
https://www.dfrobot.com/product-1662.html

前提・実現したいこと

ESP8266、チューブモーター、リレースイッチ、Blynkというアプリを使って、スマホから水質のモニタリングや遠隔操作による水質調整をしようとしています。

発生している問題・エラーメッセージ

使おうとしているアナログTDSセンサーがArduino UNOでは正常に作動するが、そのセンサーをESP8266で使おうとしても数値がおかしくなる。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

注意:
[この質問は、センサーの電圧出力(Arduinoのアナログ入力に適している)をESP8266のアナログ入力(Arduinoのものと仕様が異なる)で測定したいというもので、ソフトウェアでは解決しえない。
そのため回答は電気的回路で物理的に解決する方法となっており、teratailの範囲から外れています]

<回答>
0-5Vのレンジを測定できるArduinoのアナログ入力に適したセンサー出力を、0-1Vのレンジを測定できるESP8266のアナログ入力で測定するには、ゲインが1/5の非反転増幅回路を介します。

オペアンプを使った非反転増幅回路の作り方は、以下のページなどを参考にしてください。
オペアンプ回路の基本設計法

アナログ信号を扱いますので、アースの取り方や引き回す線のシールドなどに注意する必要があります。
モーターやリレーといった電磁ノイズ源となりやすい機器と共に使う場合は、ノイズ対策が重要です。

投稿2018/04/25 03:24

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uzurano

2018/04/25 03:36

畑違いですみませんでした。なんかおかしいなとうすうす感じてました。とっても恥ずかしいです! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問