Edited at

ちょと裏技っぽいけど、ESP8266 でAD変換やる方法

More than 3 years have passed since last update.

開発環境の準備WiFiの接続まで、出来たところでいきなりAD変換に行ってみたいと思います。


ESP8266でのAD変換(概要)

ESP8266にはTOUTピンがあり、コレがAD変換できる唯一のピンのようです。

このピンは仕様書を読む限り、「電源電圧の測定」もしくは、「外部の適当な電圧の測定」が行える様です。

(英語に自信が無いので、間違っていたらゴメンなさい)

今回は、「外部の適当な電圧」の測定をやってみます。

注意点が一つあります!

TOUTピンを使ったAD変換は、0v~1Vの範囲で10bitの分解能を持って計測する事ができるとのこと

1V以上の電圧を入れると壊れるのかは試していませんが、電圧の計算ご注意下さい。

あと、今の所AD変換はArduinoっぽく使えないので、プログラムの所よく読んで下さい。


簡単な回路図

しょぼいですが、手書きの回路図です。抵抗で3.3Vの電源電圧を分圧しているだけですが・・

DSC_1332-2.jpg

 

DSC_1329.JPG

DSC_1330.JPG


プログラム

本来は、Arduinoっぽく、アナログリードと書きたいところですが今の時点では、アナログリードは実装されていない様子で上手く動きませんでした。

そこで、色々調べたら次のコードを使うと上手く動きました。

 

extern "C" {

#include "user_interface.h"
}

プログラムの始めESPのヘッダーファイルを読み込んでいる所に上記の記述を追加します。

 

system_adc_read()

そして、AD変換をするのはこの関数で出来るらしいです。

 

前回のWiFiのプログラムに書き足すと下記になります。


QiitaWiFi02

#include <ESP8266WiFi.h>

extern "C" {
#include "user_interface.h"
}

char toSSID[] = "XXXXXXX";
char ssidPASSWD[] = "YYYYYYYYYY";

void setup() {
//デバッグ用にシリアルを開く
Serial.begin(115200);
Serial.println("PG start");

//WiFiに繋がったらLEDを点灯させるので、そのピンをOUTPUTに設定して、LOWに。
pinMode(5, OUTPUT);
digitalWrite(5, LOW);

//WiFiクライアントモード設定
WiFi.mode(WIFI_STA);

//WiFiを繋ぐ前に、WiFi状態をシリアルに出力
WiFi.printDiag(Serial);

//WiFiの設定を入れる。IPは、デフォルトがDHCPのようで、IPが共有されるときはWiFiのアクセス情報だけでOK
WiFi.begin(toSSID, ssidPASSWD);

// 固定IPではネットワークステータスが上手く動かないので、今は使えなさそう。本家にバグ登録はされているらしい。
// WiFi.config(ip, gateway, subnet);

//接続が確立するまで、・・・を表示
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");

//WiFi.printDiag(Serial);

}

//ここに来たら、接続完了している。

//改行して繋がったことをシリアルで伝える。
Serial.println("");
Serial.println("WiFi connected");

//WiFiの状態を表示
WiFi.printDiag(Serial);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

// 無線LAN接続OK LED点灯
digitalWrite(5, HIGH);

}

void loop() {

//unsigned int 型の入れ物を用意
uint ADC_Value = 0;

//AD変換実行
ADC_Value = system_adc_read();

//計測結果をシリアルに書き出す。0-1024の値
Serial.println("=======ANALOG " + String(ADC_Value) + "ANALOG ");

if (WiFi.status() != WL_CONNECTED) {
// コネクション確立済み以外のステータスなので
// 無線LAN接続NG LED消灯
digitalWrite(5, LOW);
} else {
//コネクションOKなので、点灯
digitalWrite(5, HIGH );
}

delay(500);

}


このプログラムを実行すると、こんな感じにシリアルにAD変換した値が流れてきます。

analog-read.jpg

電源の電圧を測るコマンドは何か調べられていませんが、分かったらこの記事に書き足したいと思います。


次にやろうと思っている事

ESP8266の真骨頂?! ディープスリープモードへ突入する仕方、復帰するやり方

です。お楽しみに~

またハマりどころを、下記に順次まとめています。あわせてこちらもご覧下さい。(随時更新中なので、ストックしてもらえれば更新時に通知させてもらいます)

http://qiita.com/azusa9/items/fe20794aa858a73fd97b