ロギング装置の作製とESP8266のセットアップ
- 2017/03/01 23:33
- カテゴリー:Arduino・AVR, 電子工作
- タグ:ESP8266
ロギング装置の構想は前々からあるのだがロギングするようなシステム作ってないので着手しなかった
ところが今回作製した放電器はロギングの必要性が高いと感じログ装置を作製することにする
どう実現するか,基本スタンドアロンでのロギングするとして,装置毎(例えば放電器)にSDカード等を実装して保存する内蔵型か,UART通信などを経由してので外付け型となる
外付け型ならSDカード保存の他にフラッシュメモリー保存や無線通信にてクラウド保存も可能だし融通がききそう
そこで楽しめそうな外付け型でSDカードへのロギングをやってみることにした
この装置は前にも似たような物を作製したことあるのでさくっと実験版は完成
SDカードは3.3Vロジックのため3.3V版Arduino(AVR)を利用したほうが回路が楽になる
外付けなのでプロトコルが必要となるが通信は無手順,ログの記録として開始と終了のみ決めた
開始:@Begin
終了:@End
ログ装置側のプログラム(簡単すぎだけど公開)
// Serial Logging To SD Card
//
// シリアル出力のロギングをSDカードに書き込む
// シリアル:9600bps
// SD:ファイル名は連番(Ex.log.1xxxx.txt)
// プロトコル
// @Begin. - @End.間をSDに書き込む
// Ex.
// @Begin.
// ;Constant current : 500mA
// ;End voltage : 1000mV
// 0, 1237, 0, 0
// 1, 1237, 499, 8
// 2, 1226, 501, 16
// 131, 1051, 499, 1088
// @End.
//
#include <EEPROM.h>
#include <SPI.h>
#include <SD.h>
// SD card attached to SPI bus as follows:
// * MOSI - pin 11
// * MISO - pin 12
// * CLK - pin 13
// * CS - pin 10
// ※CS pinは使用しているシールドで変更する必要がある
// イーサーネットシールドは 4
// Adafruit のSDシールドは 10
// Sparkfun のSDシールドは 8
//
//#define DEBUG 1
#define CSPIN 10 //チップセレクト
#define LEDPIN 8 //状態表示LED
#define BLINKTIME 1000 //点滅間隔
static char strBegin[] = { '@', 'B', 'e', 'g', 'i', 'n', '.', '\r', '\n', '\0' };
static char strEnd[] = { '@', 'E', 'n', 'd', '.', '\r', '\n', '\0' };
static uint16_t year = 2017;
static uint8_t month = 1, day = 1, hour = 19, minute = 0, second = 0;
static char fileName[16]; //ログファイル名
static boolean sd = false; //SD書込み開始フラグ
static boolean light; //LED点灯フラグ
static int timer; //LED点滅時間カウンタ
static int getByte() {
for(;;) {
timer++;
if(Serial.available()) {
return(Serial.read());
}
delay(1);
if(timer > BLINKTIME) {
timer = 0;
if(sd) {
if(light) {
digitalWrite(LEDPIN, LOW);
light = false;
} else {
digitalWrite(LEDPIN, HIGH);
light = true;
}
}
}
}
}
void dateTime(uint16_t *date, uint16_t *time) {
// FAT_DATEマクロでフィールドを埋めて日付を返す
*date = FAT_DATE(year, month, day);
// FAT_TIMEマクロでフィールドを埋めて時間を返す
*time = FAT_TIME(hour, minute, second);
}
static void makeFileName() {
int fileNum = (EEPROM.read(0)<<8) + EEPROM.read(1);
if(fileNum < 10000) fileNum = 10001;
sprintf(fileName, "log%5d.txt", fileNum);
//次のファイル番号
fileNum++;
EEPROM.write(0, fileNum>>8);
EEPROM.write(1, fileNum&0xff);
}
void setup() {
Serial.begin(9600); // 9600bpsでポートを開く
#ifdef DEBUG
// Serial.println("Start");
#endif
//SSピンは使用しない場合でも出力にしないとSDライブラリが動作しない
//pinMode(SS, OUTPUT);
//SDライブラリの初期化
if(!SD.begin(CSPIN)) {
Serial.println("SD Card failed");
for(;;);
}
//日付と時刻を返す関数を登録
//登録することでファイルの作成日時や変更日時が記録できる
SdFile::dateTimeCallback(&dateTime);
//初期化正常で開始
pinMode(LEDPIN, OUTPUT);
digitalWrite(LEDPIN, HIGH); //点灯
light = true;
sd = false;
timer = 0;
}
void loop() {
char c, buf[128];
int n = 0;
File dataFile;
for(;;) {
c = getByte();
buf[n++] = c;
if(c == '\n') {
buf[n] = '\0';
n = 0;
#ifdef DEBUG
// Serial.print(buf);
#endif
if(!sd) {
if(!strcmp(buf, strBegin)) {
//sd write start
makeFileName();
if(dataFile = SD.open(fileName, FILE_WRITE)) {
sd = true;
#ifdef DEBUG
Serial.println("logging start");
#endif
} else {
//ファイルが開けなかったらエラーを出力
Serial.print("can not open ");
Serial.println(fileName);
}
}
#ifdef DEBUG
else {
//ignore string
Serial.print("ignore : ");
Serial.print(buf);
}
#endif
} else {
if(!strcmp(buf, strEnd)) {
//sd write done
dataFile.close();
sd = false;
#ifdef DEBUG
Serial.println("logging done");
#endif
} else {
//sd writting
dataFile.print(buf);
#ifdef DEBUG
Serial.print("sd wrt : ");
Serial.print(buf);
#endif
}
}
}
}
}
ログ装置側が動作してるかどうか判るようにLEDで通知(点灯:Reday,点滅:Logging)するようにした
・・・
さてボードに組み込もうかと思ったところで,どうせならってことで・・・
いつか使おうと思いながら購入して置きっぱなしだった「ESP-WROOM-02」を取り出す(世間では「ESP-WROOM-32」が旬みたいだけど・・・)
いつもお世話になってるこちらを参考にしてブレッドボードに展開
ATコマンドで動作確認して(115200bps8N1,行末:CR+LF)
開発環境を整え(参考)
プログラムを書き込み動作させることができた
注意点や嵌った事など
デフォルトでは「softAP」モードになっていて先ずは「station」モードに変更しないとWiFiが使えない(AT+CWMODE=1)
cc版でないとESPは扱えないのでダウンロードしてarduino.1.8.1を設定(和解統合されてIDEはorg版オンリーになったようだが),拙者はcc版だと何故か問題があったためorgを使っていたので,これまでのローカル設定が全部使えてない
尚,分裂時のorg版とは共存できるようなので良かった
ボード選択設定(追加)
ボード | Generic ESP8266 Module |
Flash Mode | QIO |
Flash Frequency | 40MHz |
CPU Frequency | 80MHz |
Flash Size | 4M(3M SPIFFS) |
Debug port | Disabled |
Debug Level | なし |
Reset Method | 手動SWなら「ck」,自動の場合(スイッチサイエンスの開発ボードなら)「nodemcu」 |
Upload Speed | 115200 |
シリアルポート | シリアルポート番号 |