USBでPCと接続+SDカードに記録+LCD表示 多チャンネル温度ロガー

当サイトでかつて、USBでPCと接続する多チャンネル温度ロガーを解説しました.
その他の解説では、LCDを取りつけたり、SDカードを取りつけたりしてきました.

今回は、集大成として、USB+SD+LCD+温度ロガー を全部組み合わせた製作例を解説します.
下図がその写真です.左端がSDカード.右がLCD.下がUSBシリアル.中央がSTM8S-DISCOVERYです.
ただし、STM8S-DISCOVERYはCPU部分だけを残してプリント基板を切断しました.
上に伸びる黒赤黄の線は温度センサへいく配線です.


温度センサは秋月電子で売られている LM61CZ というセンサを使いました.
LM61CZには誤差がありますので、STM8SのEEPROMデータで誤差をキャンセルします.
温度センサは防水のためにシリコン接着剤で覆いました.CPUへの接続はピンヘッダで接続します.


USBシリアルモジュールは、ウェブページでおなじみの、シリアル-USB変換基板(秋月電子)を使います.
着脱可能なように7ピンのピンヘッダに配線しました.


SDカードは、FAT16の最大容量である2GBでしか動きません.4Gとか8GのSDでは動きません.
1GBのSDだったら動くのかどうか、それは試していません.
7ピンのピンヘッダでCPUに接続するようにしました.


LCDは、秋月電子で¥500で売られているやつです.バックライト付きの¥700のやつでも構いません.

CPU部分の拡大写真はこのようになっています.
黄色いSWはresetです.黒いSWはTLIの割り込みSWです.



動作画面・使い方

動かすのはPCとUSBで接続してTerminal softでやります.PCと接続しなくても動かすことはできます.

●最初にSDカードを挿さない状態でresetすると、
Terminal画面にはこのように表示され、SDカードの挿入を待ちます.
start temperature logger
waiting for SD card
LCD画面には、
waiting for SD
と表示されます.

●最初からSDカードを挿した状態でresetすると、以下の動作に自動的に走っていきます.

●SDカードを挿入すると、Terminal画面はこのようになります.
確認もせずに、いきなりSDカードをformatしますので、ご注意ください.
その後、毎秒の温度を表示し続けます.
SD card inserted
Wrote block 0-5 (BPB)   ←formatします
Wrote block 6 (FAT)   ←formatします
Wrote block 472 (RDE)   ←formatします
SD card formatted
SD card cleared   ←block 504〜520をゼロクリアします
000 00:00:01 0:35.8 1:45.0 2:12.8 3:35.3 4:44.8 5:49.2 6:12.5 7:35.2 8:44.5 9:11.6
    ←毎秒の温度 0ch〜9ch
 日   時分秒   0ch     1ch     2ch     3ch     4ch     5ch     6ch    7ch     8ch     9ch
000 00:00:02 0:35.9 1:45.0 2:12.8 3:35.3 4:44.8 5:49.1 6:12.5 7:35.3 8:44.5 9:11.6
000 00:00:03 0:36.0 1:45.2 2:12.8 3:35.2 4:44.6 5:49.1 6:12.5 7:35.2 8:44.5 9:11.7
000 00:00:04 0:35.9 1:45.2 2:12.9 3:35.6 4:45.0 5:49.3 6:12.4 7:35.2 8:44.6 9:11.6
000 00:00:05 0:35.7 1:45.0 2:12.8 3:35.3 4:44.7 5:49.1 6:12.4 7:35.2 8:44.6 9:11.6
000 00:00:06 0:35.7 1:45.1 2:13.0 3:35.3 4:44.8 5:49.3 6:12.6 7:35.2 8:44.6 9:11.6
000 00:00:07 0:35.8 1:45.0 2:12.9 3:35.6 4:45.1 5:49.3 6:12.5 7:35.2 8:44.6 9:11.6
CLUSTER 2
     ←バッファが満杯になったのでクラスタ2へ書き込む
BLK[504/0] SizeB[00000200] FAT[6/4]
   ←書いた場所はblock504で、クラスタの0番目、ここまでのサイズは200Hバイト、FATはblock6の4番目のエントリ

●LCDの表示はつぎのようになります.
000 00:00:01      ←日時
12.6 12.5 11.7    ←ch2,ch6,ch9の温度

●enterキーを押すと、次の表示が出ます.これはメニューの表示です.
COMMAND NG!
-----TEMPERATURE LOGGER MENU-----
time 18 9 30  : set day&time 18th 9:30      ←日時の設定です.18日9時30分にします
int 3              : interval time 3 seconds     ←測定インターバル[秒]です
v                   : switch verbose <--> silent  ←ADCの生データなどを表示するverbose modeです

●verbose modeでは次の行が追加的に表示されます.
ADC(0-9)=0:294 1:322 2:253 3:292 4:322 5:335 6:253 7:292 8:321 9:254    ←生ADC値
mV(0-9)=0:958 1:1050 2:826 3:951 4:1048 5:1090 6:824 7:952 8:1046 9:827   ←mV換算値

●SDカードに常時記録していますので、むやみにSDカードを抜去してしまうとファイルシステムが破壊されてしまいます.
そこで、TLI SWを押します.  -----写真の黒いSWです------
すると、loggingを停止させ、SDカードにデータを最後まで書いて閉じます.
Terminal softには次の表示が出ます.
SD flushing
EndCLUSTER 2 EndBLOCK 556 TotalSIZE 00006900[BYTE], FAT updated, RDE updated
temperature logging is terminated
LCDには次の表示が出ます.
temp log stopped

●その後にenterを押すと、次の表示が出ます.メニュー表示です.
loggingを停止したあとは、EEPROMメニューと、SDカードメニューに切り替わります.
-----TEMPERATURE LOGGER EEPROM MENU-----
ofs 4 -0.5    : set AIN4 offset to -0.5     ←温度誤差を補正します.補正値はEEPROMに不揮発で記録されます
dump         : dump EEPROM    ←温度誤差の補正値を表示します
clr              : clear EEPROM    ←温度誤差の補正値領域をクリアします
-----SD CARD MENU-----
inc 2          : write incremental to block 2 (adrs=2*512)     ←SDカードのblock2をインクリメンタルデータで埋めます
fill 49 129   : write 49 to block 129 (adrs=129*512)    ←SDカードのblock129を49で埋めます
fill 49 12 129: write 49 to block 12-129   ←SDカードのblock12-129を49で埋めます
txt hello 996 : write hello to block 996 (adrs=996*512)   ←SDカードのblock996の先頭に”hello”を書きます
format        : format 2GB FAT16     ←SDカードをformatします
3               : dump block 3 (adrs=3*512)     ←SDカードのblock3を表示します
3 18          : dump block from 3 to 18   ←SDカードのblock3-18を表示します

●SDカードを外して、PCに挿すとwindowsから読めます.

●作成した回路は10chの温度を測定できますが、2ch,4ch,9chにしか温度センサを取りつけていません.
温度表示の一例はこのようになっていて、まともな温度が表示されているのは2,6,9chだけなのはそのせいです.
000 00:00:03 0:36.0 1:45.2 2:12.8 3:35.2 4:44.6 5:49.1 6:12.5 7:35.2 8:44.5 9:11.7
それで、これらの温度は同じ数値を表示して欲しいわけですので、補正します.
たとえば、2chの表示を-0.3したければ、
  ofs 2 -0.3
とterminal softから打ちます.
EEPROMの温度補正値領域をダンプするには、dumpと打ちますと、次のように表示されます.
dump
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
2d 30 2e 33 00 00 00 00 00 00 00 00 00 00 00 00  | -0.3............    ←2chの温度補正値-0.3
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................


基板回路図

全体回路図(pdf)はこちらです.


ハードウエアの製作

@SDカード
下記の回路図のように作ります.SDカードのコネクタはヒロセの製品です.秋葉で¥315でした.
1uFは、SDカードを挿入したときにラッシュカレントでSTM8Sにresetがかかってしまう不具合があったので、防止するためにつけました.


マイクロSDカードでも動作確認しました.
マイクロSDコネクタは秋月で売っているDIP変換基板を使いました.


AUSBシリアル変換回路
秋月のUSBシリアル変換基板を使いました.
     ←USBシリアルのJP設定

B温度センサ
温度センサは秋月電子で売られている LM61CZ というセンサを使いました.  (LM61CZのpdf)
下図の3つが今回取りつけた温度センサです.
CN3とはSTM8S-DISCOVERYのCN3のことです.AIN2,AIN6,AIN9に温度センサを接続しています.
温度センサを10ヶ取りつければ10chの同時測定ができます.
     ←LM61CZ

CCPU周辺回路
SD,LCD,USB,センサを取りつけるためのコネクタを作ります.
Reset SWとTLI SWもつけます.
R3,C3はLCDのコントラストを決定するためのDC電圧をPWMで作るためのLPFです.PWMはTIM3で生成します.






ソースコードの解説

サンプルプログラムをこちらに置きます

今回は、ソースコードサイズが大きいので、STVDをこの設定でbuildしました.
ADCのライブラリを使うとサイズが大きくなるようです.
Global Variables = in Data
Program model = STM8 Large model


ソースコードの解説は工事中です.近日upします.
main.c
usrlib_lcd.h       usrlib_lcd.c
usrlib_sd.h        usrlib_sd.c
usrlib_uart.h      usrlib_uart.c

inserted by FC2 system