エントリー

タグ「ロガー」の検索結果は以下のとおりです。

ページ移動

  • ページ
  • 1
  • 前のページ
  • 次のページ

ESP8266で電圧ロガーを作製

計測した電圧をWEBから確認するESP8266を使用したプロトタイプを作っておこうと先ずはESP8266を使用した電圧ロガーを作製

これが簡単にできると思っていたが使い物になるまで日数が掛かってしまった

IMG_20201217_203851.jpg

仕様
  • 定間隔で電圧を計測してDBに登録
  • 計測電圧は0~15V
  • 高低電圧を設定でき範囲外となった場合計測を終了(同時にリレーをON/OFF)
  • DBの登録データはブラウザでグラフ表示
  • LOG ON/OFF,UP,DOWNの3ボタン
操作(UI)
  • LOGボタンでログのON/OFF
  • LOGボタンの長押しで最大/最小電圧の選択切替
  • UP,DOWNボタンで選択電圧の変更
  • LOGボタンでを押しながらUP/DOWNボタンでログ間隔を変更
回路図

voltMonitor_回路図.png

  • 2つのボタンはBOOT時HIGHで使用するIO0とIO2を利用
  • ADCの分圧は多回転半固定で調整できるようにした
  • 現在リレーは未実装
作製

いつものとおりブレッドボードで試作

IMG_20201122_194106.jpg

ADCの精度

ESP8266にはアナログ入力が1PinあるがADCの精度があまり良くないという情報を得ていたので外部ADCも検討したが手持ちのADC(MCP3002)がSPI接続だったためとりあえずは内部ADCで作製することにした

0~15Vでの測定なので分圧し,いつものように割合をソフトで調整しようとしたのだが,測定電圧がブレてしまい電圧が定まらない

ブレッドボード上のせいか?と思われたので基板に載せて調整しようとしたが同じ結果だったためソフトでの調整を諦め多回転半固定でハード的に調整することにした

IMG_20201129_205914.jpg

結果,そこそこマシにはなったが精度が悪くロガーとしては問題がある

不明のスタックエラー

プログラム開発の途中で原因不明のExceptionによる異常終了に陥った

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (0):
epc1=0x402030dc epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffab0 end: 3fffffc0 offset: 0190
3ffffc40: 3ffe8c85 40104dc3 3ffec6c0 feefeffe
3ffffc50: 401026af 3ffec6c0 3fffc248 4000050c
3ffffc60: 400043e6 00000030 00000017 ffffffff
3ffffc70: 400044ab 3fffc718 3ffffd60 08000000
3ffffc80: 60000200 08000000 08000000 00000000



3fffff90: feefeffe feefeffe feefeffe feefeffe
3fffffa0: 3fffdad0 00000000 3ffeeae4 40206c80
3fffffb0: feefeffe feefeffe 3ffe8510 401012c9
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

WiFi接続時に発生していることが判明したが原因は判らなかった

最終的にI2Cの初期化と順番を変えることで解決

×
  //I2C初期化
  Wire.begin();
  u8g2.begin();
  u8g2.clear();

  //WiFi接続
  WiFi.begin(ssid, password);
    unsigned long timeout = millis();
  while(WiFi.status() != WL_CONNECTED) {
  if(millis() - timeout > 30000) halt();
delay(100);
    }
-------------------

  //WiFi接続
    WiFi.begin(ssid, password);
unsigned long timeout = millis();
while(WiFi.status() != WL_CONNECTED) {
if(millis() - timeout > 30000) halt();
delay(100);
}

    //I2C初期化
Wire.begin();
   u8g2.begin();
   u8g2.clear();
チャタリング

ボタンを3個にしたため,電圧を上下させる際の最大/最小切り替えるボタンをLOGボタンの3秒長押しにしたのだが,LOGボタンを長押しした後ボタンを離すとチャタリングが発生しているようでソフトで対策したが完全に解決しない

static volatile unsigned long btnintrtm;

void ICACHE_RAM_ATTR logsw_intr() {
if(millis() - btnintrtm <= 50) {
//チャタリング防止
return;
}
btnintrtm = millis();
 noInterrupts();



interrupts();
}

LOGボタンの不良または内部プルアップであることが原因かもしれない(未確認)

懸案事項
  • 現行では3分記録ログで約200mAhの消費電力なので100mAh以下を目指す
  • 測定電圧の精度が良くないので外部ADC化
  • チャタリングのハード的な原因調査
  • リレーの実装
参考までに

DBテーブル(FUNCIDは現在未使用)

CREATE TABLE IF NOT EXISTS `FUNCID` (
`ID` char(2) NOT NULL DEFAULT '0' COMMENT 'ID',
`NAME` char(32) NOT NULL COMMENT '名称',
`SUMMARY` text NOT NULL COMMENT '概要',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='装置機能別名称';

CREATE TABLE IF NOT EXISTS `HISTORY` (
`ID` char(2) CHARACTER SET utf8 NOT NULL DEFAULT '0' COMMENT 'ID',
`CTIME` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '初期日',
`INTERVAL` decimal(2,0) NOT NULL COMMENT 'ログ間隔(分)',
`MINVOLT` decimal(4,2) NOT NULL COMMENT '最小終止電圧',
`MAXVOLT` decimal(4,2) NOT NULL COMMENT '最大終止電圧',
PRIMARY KEY (`ID`,`CTIME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='履歴';

CREATE TABLE IF NOT EXISTS `LOG` (
`ID` char(2) NOT NULL DEFAULT '0' COMMENT 'ID',
`CTIME` datetime NOT NULL COMMENT '初期日',
`MTIME` datetime NOT NULL COMMENT '適用日',
`VOLTAGE` decimal(4,2) NOT NULL COMMENT '測定電圧',
`VALIDITY` char(1) NOT NULL DEFAULT '0' COMMENT 'データ有効性',
UNIQUE KEY `ID` (`ID`,`CTIME`,`MTIME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='電圧監視ログ';

以下は現在版で将来的には十分に改版あり(現在のブラウザのデフォルトがSJISのようなのでUTF8からSJISに変換している)

DB登録(regVolt.php

ログ表示(gLogVolt.php

ESP8266ロガープログラム(voltMonitor.ino

ロギング装置の作製(ESP8266版)

開発ボードでSD版が完成したので基板に載せた

ログ

(写真のようにESP-WROOM-02を置いたが上下逆に付けるようにすればコンパクトになるなと完成した後に気が付く)

正式なマイクロSDカードスロットはブレッドボートで開発用にとして利用したいのでマイクロSDカードアダプタにピンを付けて(余り物を)利用してみた

SDカード裏SDカード表

両端は未使用なので7ピンのみ取付,なかなか良い感じ

ピンの接続情報を記録しておく(上がスロット,下がアダプタの場合)

SD-PIN

放電器と高さを合わせ(合体)接続できるようにしたが,放電器の電源アダプタが左側で電源が接続できなくなり取り外して付け替えるのも大変なので電源アダプタを右側にも付け,ついでに入力が直5Vなので安全のため5.1Vのツェナーダイオードを追加

合体

テスト実施のログ出力(SDカード)

;Constant voltage : 1000mV
;End current : 100mA
0, 991, 325, 0
1, 1003, 311, 5
2, 1002, 310, 10
3, 997, 314, 15
4, 997, 314, 20
5, 996, 316, 26
6, 995, 318, 31
7, 995, 322, 36
8, 997, 323, 42
9, 1000, 326, 47
10, 1000, 332, 53
11, 1004, 334, 58
12, 1000, 344, 64
(略)
291, 999, 84, 1595
292, 998, 83, 1596
293, 997, 82, 1597

グラフ化すると

青線:放電流値(mA)

赤線:累積電力(mAh)

上記の試験サンプルは劣化している充電池のため大きな電流を流せていない

今後の展開

このボードではIoT化しないと効果を発揮しないのでWebとの連携仕様を考える

基本仕様として当初はロギング装置を汎用化と考えていたが,別物を作製することも早々無いしその都度プログラムを変えるのも趣味の世界はありなので,放電器専用のロギング装置として構築することにする

ログの数値表とグラフを表示する位までは構築していこうと思う(気長に・・・)

ロギング装置の作製とESP8266のセットアップ

ロギング装置の構想は前々からあるのだがロギングするようなシステム作ってないので着手しなかった

ところが今回作製した放電器はロギングの必要性が高いと感じログ装置を作製することにする

どう実現するか,基本スタンドアロンでのロギングするとして,装置毎(例えば放電器)にSDカード等を実装して保存する内蔵型か,UART通信などを経由してので外付け型となる

外付け型ならSDカード保存の他にフラッシュメモリー保存や無線通信にてクラウド保存も可能だし融通がききそう

そこで楽しめそうな外付け型で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-02」を取り出す(世間では「ESP-WROOM-32」が旬みたいだけど・・・)

いつもお世話になってるこちらを参考にしてブレッドボードに展開

ブレッドボード

ATコマンドで動作確認して(115200bps8N1,行末:CR+LF)

AT1

AT2

開発環境を整え(参考

IDE

プログラムを書き込み動作させることができた

注意点や嵌った事など

デフォルトでは「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
シリアルポート シリアルポート番号

ページ移動

  • 前のページ
  • 次のページ
  • ページ
  • 1

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

Re:NOAA受信システム復旧
2025/06/11 from admin
Re:NOAA受信システム復旧
2025/06/11 from とおりすがり
Re:SDRplay社RSP1クローンを購入
2025/05/25 from 匿名希望
Re:Mozilla FirefoxではNHKプラスを再生できない件
2025/05/09 from Donabeyaki
Re:ATS-25を作製する
2025/03/23 from kazu

過去ログ

Feed