esp8266を子機デバイスとしてwifiでアナログデータを飛ばすの続編。(http://qiita.com/cyclon2joker/items/c790b30f20e4da764781)
今回は、
・接続情報をSDカードから読む
・アナログデータを可変抵抗から圧力センサーを使う
に変えてみた。
・準備
なぜか手元にあった圧力センサーを試してみる。
日本橋の共立かマルツで1000円くらいだったと思う。
[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);
}
3Vを+に、A0を-に。。。
・・・
うまくいかないorz
押し込んでも、値が吹き飛んでる感じ。。。
かなり悩んでググってみる。。。
[3]再び配線->実行
ググって配線しなおして、再実行
配線
esp8266の3.3Vから1K抵抗を挟み、
分岐して、ESP側A0、センサーの+へ繋ぐ。
(A0を先にする)
センサーの-はESPのGNDに繋ぐ。
USBを再接続し、シリアルコンソールを再起動して
ログの出力を見てみる。
押すと値が変わっていく。
値がとりあえず、吹き飛んでいないので合ってる感じ。
こういう基礎知識がないので躓くと、
とても困る。。。
・実装
以前書いたアナログ値を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
ブレッドボードを2枚使うorz...
[4]UDPサーバー
前回、ラズパイ上に用意したrubyのupdサーバーを使う。
[5]espを起動
とりあえず、ラズパイを起動してアクセスポイントにし(udpはまだ、未起動)、Arduinoをビルドして圧力センサーを押しながら、コンソールを確認する。
SDから接続情報を読み込んでラズパイに接続し、センサーの値を飛ばしている(ハズ。。。。)
[6]UDPサーバーを起動し、両方のログを確認。
ラズパイにログインし、udpサーバーを起動してコンソールの表示を見る。
(日付と時刻がおかしいのは、時間調整してないからだったり。。。)
そのころ、arduinoのシリアルモニタは、
無事、SDから読み込んだ接続情報でAPに接続し、センサーの読み取り値を、UDPで飛ばす事が出来た。。。
・TODO
全くエラー処理なんかは入ってないので、エラー処理を考える(SDのスロットは挿入状態を検知できるよーになってるハズなんで、そこら辺の処理を入れる。AP接続出来なかった対処も。。。)