cara memprogram mini data logger || cara membaca dan menyimpan data ke dalam sd card

 

Pada artikel kali ini kita akan membahas mengenai modul mini data logger seperti gambar di bawah ini.

modul mini data logger ini biasa digunakan untuk merekam data baik dari sensor maupun data dari kontroller lainnya. Modul ini dilengkapi dengan slot sd card dan rtc untuk fungsi time-stamping yang menggunakan IC DS1307. Modul ini memiliki 8 pin i/O antara lain CS, MOSI, MISO,SCK,SCL,SDA,GND,and 5V pin. Untuk sd cardnya sendiri, modul ini support sd card dengan format FAT16 dan FAT32. Modul ini juga dilengkapi dengan baterai 3V tipe CR1220. Dimensi modul ini relatif kecil dengan ukuran lebih kurang 36.5mm x 33.6mm sehingga cocok digunakan dalam sistem yang compact.

Spesifikasi umum

1. Compatible dengan Arduino Uno, Duemilanove, Diecimila, Leonardo, Mega

2. Sudah terpasang regulator 3.3V

3. Terdapat Real-time Clock (RTC)

4. Interface SD Card support FAT16 dan FAT32. Terdapat circuit shifter untuk memproteksi SD Card dari kerusakan.

 lalu bagaimana cara menggunakan/memprogramnya? simak tutorial di bawah ini ya.

Pada tutorial ini kita akan mencoba membaca data dari sensor temperatur menggunakan sensor DHT11 dan menyimpan pembacaan data sensor tersebut ke dalam SD card dalam bentuk TXT file menggunakan modul data logger ini.

 

 Apa saja yang dibutuhkan?

  • arduino nano
  • modul mini data logger
  • sensor DHT11
  • wiring
  • library arduino
  • RTClib
  • DHT sensor
  • adafruit unified sensor

untuk file library nya  bisa download disini ya Download library

 Wiring

 


Program

Sebelum memprogram, pastikan kalian sudah memiliki/menginstal library yg akan digunakan ya...library bisa di download di link yang ada di atas.

Program yang akan kita buat nantinya akan seperti di bawah ini ya..

Penjelasan program

Untuk memudahkan dalam proses pengecekan program, setiap hasil dari proses akan ditampilkan pada serial monitor seperti gambar di atas ya

1. Status Pengecekan SD card, jika SD card berhasil terbaca di modul, maka status yang muncul adalah "SD card initialized". Jika SD card tidak berhasil terbaca karena error atau SD card tidak di masukkan ke modul maka yang muncul adalah pesan "SD card initialization failed!".

2.  Data yang terbaca akan tersimpan pada file dengan nama "LOG008.TXT". Jika sistem ter- reset / re-start data akan tersimpan pada nama "LOG009.TXT" , "LOG010.TXT" dan seterusnya.

3. Tanggal dan waktu yang terbaca/tersimpan pada modul RTC saat ini.  

4. Opsi untuk mengganti tanggal dan waktu. Y untuk mengganti, dan N untuk tetap menggunakan data tanggal dan waktu seperti pada poin ke 3

5. Jika kalian ingin mengganti tanggal dan waktu, maka inputkan data dan waktu sesuai dengan format pada poin ke 5 ini. Jika format tidak sesuai, maka data waktu dan tanggal tidak akan tersimpan dan akan muncul notifikasi seperti pada poin ke 6

6.  Notifikasi input data tanggal dan waktu tidak sesuai format

7. Jika berhasil mengganti format waktu dan tanggal maka akan muncul notifikasi seperti pada poin ke 7 ini yaitu  "RTC updated!"

8.  Sistem akan mulai membaca data sensor dan akan ditampilkan di serial monitor

9. Data sensor berhasil tersimpan di SD card dengan nama file yang tertera di poin ke 2 


Program


#include <Wire.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT11
#define CSPIN 10

DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
File logFile;

char filename[13]; // 8.3 format: "LOG001.TXT"

void setup() {
Serial.begin(9600);
while (!Serial);

dht.begin();
Wire.begin();

if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}

if (!SD.begin(CSPIN)) {
Serial.println("SD card initialization failed!");
while (1);
}
Serial.println("SD card initialized.");

createNewLogFile();
logFile = SD.open(filename, FILE_WRITE);
if (logFile) {
logFile.println("Date,Time,Temp,Humidity");
logFile.close();
Serial.print("Logging to: ");
Serial.println(filename);
} else {
Serial.println("Failed to create log file.");
while (1);
}

DateTime now = rtc.now();
printDateTime(now);

Serial.println("\nUpdate RTC time? (Y/N)");
while (true) {
if (Serial.available()) {
char response = Serial.read();
if (response == 'Y' || response == 'y') {
Serial.println("Enter: YYYY/MM/DD HH:MM:SS");
while (true) {
if (Serial.available()) {
char buffer[32];
byte len = Serial.readBytesUntil('\n', buffer, sizeof(buffer) - 1);
buffer[len] = '\0';
if (parseAndSetTime(buffer)) {
Serial.println("RTC updated!");
break;
} else {
Serial.println("Invalid. Try again:");
}
}
}
break;
} else if (response == 'N' || response == 'n') {
Serial.println("Using current RTC time.");
break;
}
}
}
}

void loop() {
DateTime now = rtc.now();
float h = dht.readHumidity();
float t = dht.readTemperature();

if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT!");
delay(5000);
return;
}

logFile = SD.open(filename, FILE_WRITE);
if (logFile) {
String data = String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + " " +
String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()) + ", " +
String(t) + " C, " + String(h) + " %";
logFile.println(data);
logFile.close();

Serial.println(data);
Serial.println("Data Saved");
} else {
Serial.println("Error opening file for writing.");
}

delay(5000);
}

void createNewLogFile() {
for (int i = 1; i <= 999; i++) {
sprintf(filename, "LOG%03d.TXT", i);
if (!SD.exists(filename)) {
return;
}
}
strcpy(filename, "LOG999.TXT");
}

bool parseAndSetTime(char* input) {
int y, m, d, hh, mm, ss;
if (sscanf(input, "%d/%d/%d %d:%d:%d", &y, &m, &d, &hh, &mm, &ss) == 6) {
rtc.adjust(DateTime(y, m, d, hh, mm, ss));
return true;
}
return false;
}

void printDateTime(const DateTime& dt) {
Serial.print(dt.year()); Serial.print('/');
Serial.print(dt.month()); Serial.print('/');
Serial.print(dt.day()); Serial.print(" ");
Serial.print(dt.hour()); Serial.print(':');
Serial.print(dt.minute()); Serial.print(':');
Serial.println(dt.second());
}

Comments