[作業ログ]ESP8266でアナログデータをwifiで飛ばしてみる[その２]


esp8266を子機デバイスとしてwifiでアナログデータを飛ばすの続編。(http://qiita.com/cyclon2joker/items/c790b30f20e4da764781)


今回は、
・接続情報をSDカードから読む
・アナログデータを可変抵抗から圧力センサーを使う
に変えてみた。


・準備

なぜか手元にあった圧力センサーを試してみる。
日本橋の共立かマルツで1000円くらいだったと思う。

![ps_0.png](https://qiita-image-store.s3.amazonaws.com/0/38889/e850da66-6f1d-8309-c0e5-1eb031c237b4.png "ps_0.png")




[1]ソース
とりあえず、押した値をデバッグ出力。

```
#include <ESP8266WiFi.h>

// アナログ値
int val = 0;

void setup() {
  Serial.begin(9800);

}

void loop() {
  // アナログ入力
  val=analogRead(0);
  String msg = "sensor_val=" + String(val);

  // デバッグ出力
  Serial.println("------------");
  Serial.println(msg);
  Serial.println("------------");
  delay(2000);

}

```

[2]配線
こんな感じ。
![ps_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/2f40b58e-af29-0fd6-a656-3131bd41472c.png "ps_1.png")

3Vを＋に、A0を-に。。。

[3]ビルドして実行
結果をみてみる。
![adata_log_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/085d7314-c11b-85e5-962e-ed3febf7f646.png "adata_log_1.png")

・・・
うまくいかないorz
押し込んでも、値が吹き飛んでる感じ。。。

かなり悩んでググってみる。。。

[3]再び配線->実行
ググって配線しなおして、再実行
配線
![ps_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/95029f9a-27c9-f6cf-de80-4c2e88bd7951.png "ps_2.png")

esp8266の3.3Vから1K抵抗を挟み、
分岐して、ESP側A0、センサーの+へ繋ぐ。
（A0を先にする）

センサーの-はESPのGNDに繋ぐ。

USBを再接続し、シリアルコンソールを再起動して
ログの出力を見てみる。

![adata_log_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/19727f4e-04a0-928b-b2c6-e2a46f779199.png "adata_log_2.png")

押すと値が変わっていく。
値がとりあえず、吹き飛んでいないので合ってる感じ。

こういう基礎知識がないので躓くと、
とても困る。。。


・実装
以前書いたアナログ値をUDPで飛ばすソースに、
APへの接続情報をSDから読むよう修正した。

[1]設定ファイル


```

ssid=TKTK
pwd=12345678
svr=192.168.128.12
port=1234

```

APのSSID・パスワード、UDPサーバーのIP、ポートを定義した「APPCONF.TXT」を、SDの直下に設置した。



[2]Aruduiono側ソース
前回作成したソースに、SDから接続設定を読み込むように修正。
http://qiita.com/cyclon2joker/items/c790b30f20e4da764781


```

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <SPI.h>
#include <SD.h>


static boolean flagInit;

static String AP_SSID;
static String AP_PWD;
static String APP_SVR;
static String APP_SVR_PORT;

// 割り振られたIP
static String localIp;
// ボードのMAC
static String macAddr;
// UDP
static WiFiUDP wifiUdp;

// アナログ値
int val = 0;


// 設定ファイルをSDから読み込み
static boolean ReadAppConfigOnSD() {
  File configFile;
  String line;
  char c;
  
  if (!SD.begin(15)) {
    Serial.println("SD Card initialization failed!");
    return false;
  }
  Serial.println("SD Card initialization successed...");

  // APPCONF.TXTから設定を読み込む
  configFile = SD.open("/APPCONF.TXT", FILE_READ);
  if (configFile) {
    line = "";
    while (configFile.available()) {
      c = configFile.read();
      if (c == '\n' || c == '\r') {
        if (line.length() > 0) {
//          Serial.println(("read define:["+line+"]").c_str());
          if (line.startsWith("ssid=")) {
            AP_SSID = line.substring(String("ssid=").length(), line.length());
          } else if (line.startsWith("pwd=")) { 
            AP_PWD = line.substring(String("pwd=").length(), line.length());
          } else if (line.startsWith("svr=")) { 
            APP_SVR = line.substring(String("svr=").length(), line.length());
          } else if (line.startsWith("port=")) { 
            APP_SVR_PORT = line.substring(String("port=").length(), line.length());//.toInt();
          }
        }
        line = "";
      } else {
        line = line + String(c);       
      }
    }
    if (line.length() > 0) {
          if (line.startsWith("ssid=")) {
            AP_SSID = line.substring(String("ssid=").length(), line.length());
          } else if (line.startsWith("pwd=")) { 
            AP_PWD = line.substring(String("pwd=").length(), line.length());
          } else if (line.startsWith("svr=")) { 
            APP_SVR = line.substring(String("svr=").length(), line.length());
          } else if (line.startsWith("port=")) { 
            APP_SVR_PORT = line.substring(String("port=").length(), line.length());//.toInt();
          }
    }
    
    Serial.println("===========================");
    Serial.println("===========================");
    Serial.println(("*** SSID:[" + AP_SSID + "]").c_str());
    Serial.println(("*** PWD:[" + AP_PWD + "]").c_str());
    Serial.println(("*** SVR:[" + APP_SVR + "]").c_str());
    Serial.println(("*** PORT:[" + APP_SVR_PORT + "]").c_str());
    Serial.println("===========================");
    Serial.println("===========================");

    configFile.close();
    
  } else {
    Serial.println("error opening config file...");
    return false;
  }
  return true;
}


// MACアドレス取得
static String getMACAddress()
{
  byte mac[6];
  WiFi.macAddress(mac);
  return String(mac[5],HEX)
    + ":"
    + String(mac[4],HEX)
    + ":"
    + String(mac[3],HEX)
    + ":"
    + String(mac[2],HEX)
    + ":"
    + String(mac[1],HEX)
    + ":"
    + String(mac[0],HEX);
}


// Wifi接続初期化
static void WiFi_setup()
{
  IPAddress ip;
  // APに接続
  WiFi.begin(AP_SSID.c_str(), AP_PWD.c_str());
  while(WiFi.status() != WL_CONNECTED) {
    // つながるまで待つ
    delay(1000);  
  }
  Serial.println("ap connected!!!");

  localIp = String(WiFi.localIP());
  macAddr = getMACAddress();
  
  Serial.print("local ip:"); 
  Serial.println(localIp);
  Serial.print("mac:"); 
  Serial.println(macAddr);
  wifiUdp.begin(APP_SVR_PORT.toInt());
}

void setup() {
  Serial.begin(9800);

  flagInit = ReadAppConfigOnSD();
  if (flagInit) {
    //  Wifi接続初期化
    WiFi_setup();
  } else {
    Serial.println("Configuration was failed...");
  }
}



void loop() {

  if (!flagInit) {
    delay(10000);
    return;
  }
  
  // アナログ入力
  val=analogRead(0);

  // 電文作成(MACとアナログ入力値を送る)
  String send_msg;
  send_msg = "mac=" + macAddr + ",sensor_val=" + String(val) + "\r\n";
  char msgBuf[send_msg.length()];
  send_msg.toCharArray(msgBuf, send_msg.length());

  // デバッグ出力
  Serial.println("------------"); 
  Serial.println(msgBuf); 
  Serial.println("------------"); 
  

  wifiUdp.beginPacket(APP_SVR.c_str(), APP_SVR_PORT.toInt());
  wifiUdp.write(msgBuf);
  wifiUdp.endPacket();  

  // 5秒wait
  delay(5000);
}

```

[3]配線
圧力センサーの接続は、上記「・準備」参照。
SDカードの接続は、以下参照。
http://qiita.com/cyclon2joker/items/1ce911558141e5c72dcf


![sd_and_ps.png](https://qiita-image-store.s3.amazonaws.com/0/38889/02aebff1-61a9-8955-8338-146f966d5510.png "sd_and_ps.png")

ブレッドボードを２枚使うorz...


[4]UDPサーバー
前回、ラズパイ上に用意したrubyのupdサーバーを使う。

http://qiita.com/cyclon2joker/items/c790b30f20e4da764781


[5]espを起動
とりあえず、ラズパイを起動してアクセスポイントにし（udpはまだ、未起動）、Arduinoをビルドして圧力センサーを押しながら、コンソールを確認する。

![esp_sensor_log_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/528626d6-847c-359e-56d5-1949b2550678.png "esp_sensor_log_1.png")

SDから接続情報を読み込んでラズパイに接続し、センサーの値を飛ばしている（ハズ。。。。）

[6]UDPサーバーを起動し、両方のログを確認。
ラズパイにログインし、udpサーバーを起動してコンソールの表示を見る。

![rpi_log_1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/9330ed5a-e5e8-8a81-8879-1d12fb38c063.png "rpi_log_1.png")

(日付と時刻がおかしいのは、時間調整してないからだったり。。。)

そのころ、arduinoのシリアルモニタは、

![esp_sensor_log_2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/531275f1-afa0-7876-7c3b-7f2e183a271d.png "esp_sensor_log_2.png")



無事、SDから読み込んだ接続情報でAPに接続し、センサーの読み取り値を、UDPで飛ばす事が出来た。。。


・TODO
全くエラー処理なんかは入ってないので、エラー処理を考える（SDのスロットは挿入状態を検知できるよーになってるハズなんで、そこら辺の処理を入れる。AP接続出来なかった対処も。。。）