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

  • 43
    Like
  • 4
    Comment
More than 1 year has 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