Arduino Nano互換品でデータロガーを自作

Arduino Nano互換品で作成したデジタル時計を改良しました。
色々試行錯誤した結果、気温と気圧を30分に一回SDカードへ記録できるようになり、
データ区切り文字でセミコロンを選べば簡単にエクセルでグラフ化可能な状態にしました。
つまり、気圧&温度計測データロガーです。
etc_0068.jpg

etc_0069.jpg

etc_0070.jpg

【変更点】
・温度、気圧をSDカードに記録
・ブレッドボードからユニバーサル基板へ変更

【準備したもの】
・Arduino Nano互換品
・DS3231 AT24C32 高精度リアルタイムクロックモジュール
・GY-68 BMP180 大気圧センサーモジュール
・128×64 OLED LCDディスプレイ SSD1306
・Micro SD TFカードメモリシールドモジュール
・Micro SDカード SDHC32GB(FAT32でフォーマット 容量はこんなに大きくなくてもよいかも。。)
・5cm×7cmのユニバーサル基板
・各種メス型ピンヘッダー
・USBケーブル(スマホ充電用として使用していたが断線したものを分解して使用)
・マスキングテープ(はんだ付け時にコードを仮固定するのに使用)
※DS3231はアマゾンレビュー等に記載されているように抵抗を取り外して電池を入れました。

【配線】
SD TFカードメモリシールドモジュールへは以下の配線を繋ぎます。
CS → D4
SCK → D13
MOSI → D11
MISO → D12
VCC → 5V
GND → GND
I2CモジュールはArduino Nano互換品に4本の配線を繋ぎます。
VCC → 5V
GND→GND
SDA → A4
SCL → A5
※SDとRTCモジュールのピンヘッダは付け替えました。あまり慣れていないので半日ぐらいかかりました。

【スケッチ】
ネット上の先人達をものすごく参考にして、下記のスケッチ(プログラム)を作成しました。
素人が作成しておりますので、よりよい作成方法があるかもしれません。
変数名がかっこ悪かったり、文字表示位置を直接指定しマジックナンバー状態になっててすいません。。
includeで使用しているものは適宜ライブラリマネージャでインストールして下さい。
---------------------------------------------------------------------------—-

#include <Wire.h>

//SDカード
#include <SD.h>
const int chipSelect = 4;

//OLED準備
#include <U8glib.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // Display which does not send AC

//BMP180準備
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;

//DS3231準備
#define RTC_addr 0x68
#define ASCII_ZERO 48
char* pchDate = "1990/01/01";
char* pchTime = "00:00:00";
byte sec = 0;
byte mini = 0;
byte hour = 0;
byte day = 0;
byte date = 0;
byte month = 0;
byte year = 0;
const char *Week[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
int hun = 0;
int flag = 0;

void setup() {

//OLED準備
u8g.setColorIndex(1);

//BMP180準備
Serial.begin(9600);
if (!bmp.begin()) {
while (1) {}
}

//SDカード
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card…");
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
}

//DS3231_日時を取得
void RTC_DS3231(void) {

Wire.beginTransmission(RTC_addr);
Wire.write(0x00);
Wire.endTransmission();

Wire.requestFrom(RTC_addr, 7);
if (Wire.available() >= 7)
{
sec = Wire.read();
mini = Wire.read();
hour = Wire.read();
day = Wire.read();
date = Wire.read();
month = Wire.read();
year = Wire.read();
hun = ((int) (mini >> 4)) * 10 + (int) (mini & B00001111);

pchTime[0] = bitRead(hour, 5) * 2 + bitRead(hour, 4) + ASCII_ZERO;
pchTime[1] = (hour & B00001111) + ASCII_ZERO;
pchTime[3] = (mini >> 4) + ASCII_ZERO;
pchTime[4] = (mini & B00001111) + ASCII_ZERO;
pchTime[6] = (sec >> 4) + ASCII_ZERO;
pchTime[7] = (sec & B00001111) + ASCII_ZERO;

pchDate[0] = '2’;
pchDate[1] = '0’;
pchDate[2] = (year >> 4) + ASCII_ZERO;
pchDate[3] = (year & B00001111) + ASCII_ZERO;
pchDate[5] = bitRead(month, 4) + ASCII_ZERO;
pchDate[6] = (month & B00001111) + ASCII_ZERO;
pchDate[8] = (date >> 4) + ASCII_ZERO;
pchDate[9] = (date & B00001111) + ASCII_ZERO;
}
u8g.setPrintPos(4, 13);
u8g.print(pchDate);
u8g.print("(");
u8g.print(Week[day]);
u8g.print(")");

u8g.setFont(u8g_font_courR18r);
u8g.setPrintPos(4, 40);
u8g.print(pchTime);
u8g.setFont(u8g_font_unifont);
}

//BMP180温度、気圧を取得
void bmp180() {
u8g.setPrintPos(4, 62);
u8g.print(bmp.readTemperature(), 1);
u8g.print(" C");
u8g.drawCircle(41, 53, 1);

u8g.setPrintPos(62, 62);
u8g.print(bmp.readPressure() / 100);
u8g.print("hPa");
}

//枠の作成
void frame() {
u8g.drawFrame(0, 0, 128, 64);
u8g.drawFrame(0, 0, 128, 16);
u8g.drawFrame(0, 49, 128, 64);
u8g.drawFrame(0, 49, 58, 64);
}

void loop() {

u8g.firstPage();
do {
u8g.setFont(u8g_font_unifont);

RTC_DS3231();
bmp180();
frame();

//SDカード
if (hun == 0 && flag == 0) {
// 動作A
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(pchDate);
dataFile.print(";");
dataFile.print(pchTime);
dataFile.print(";");
dataFile.print(bmp.readTemperature(), 1);
dataFile.print(";");
dataFile.println(bmp.readPressure() / 100);
dataFile.close();
flag = 30;
}
else {
// Serial.println("error opening datalog.csv");
}

} else if (hun == 30 && flag == 30) {
// 動作B
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(pchDate);
dataFile.print(";");
dataFile.print(pchTime);
dataFile.print(";");
dataFile.print(bmp.readTemperature(), 1);
dataFile.print(";");
dataFile.println(bmp.readPressure() / 100);
dataFile.close();
flag = 0;
}
else {
// Serial.println("error opening datalog.csv");
}

} else {
// 動作C
}
//SDカード終了

} while ( u8g.nextPage() );

}

---------------------------------------------------------------------------—-
このスケッチでSDカード内に「DATALOG.CSV」ファイルができ、下記のような情報が30分に一回記録されます。
2019/02/14;20:00:00;12.6;1029
2019/02/14;20:30:00;12.5;1029
2019/02/14;21:00:00;13.0;1030
2019/02/14;21:30:00;13.4;1030

スポンサードリンク
     

電子工作

Posted by gonzy