LoginSignup
2
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-06

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

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

・準備

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

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

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

[3]ビルドして実行
結果をみてみる。
adata_log_1.png

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

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

[3]再び配線->実行
ググって配線しなおして、再実行
配線
ps_2.png

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

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

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

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

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

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

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

esp_sensor_log_1.png

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

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

rpi_log_1.png

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

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

esp_sensor_log_2.png

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

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3