Lưu log dữ liệu vào thẻ SD với Arduino và Datalogger shield

Mô tả dự án: 

Với các công việc lập trình cần lưu trữ dữ liệu, bạn cần phải lưu trạng thái của các tín hiệu đầu vào theo thời gian. Hôm nay, mình sẽ hướng dẫn bạn làm điều đó vớ shield datalogger. Bài này chủ yếu ví dụ cho bạn cách làm sao để lưu dữ liệu của cảm biển nhiệt độ, vừa hiển thị lên LCD. Dữ liệu được lưu dưới dạng file excel.

Nối dây

Mình nghĩ khi tìm đến bài này, các bạn đã có một lượng kiến thức nhất định nên mình sẽ không nói lại vì sao nối dây của các thiết bị như quang trở, lcd,...

Còn datalogger shield thì gắn shield lên hoy mà heart

Tải về các thư viện

Bài này ta cần các thư viện sau:

  1. LiquidCrystal (có sẵn)
  2. SD (có sẵn)
  3. Wire (có sẵn)
  4. và Logger Shield​ (tải về tại đây)

Lập trình

#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

const int chipSelect = 10; 


//đối tượng file
File logfile;


// khởi động LCD với các chân tương ứng
LiquidCrystal lcd(7, 8, 9, 4, 2, 6);



int temperaturePin = A0; //chân analog của LM35


int lightPin = A1; //chân analog của quang trở

//chân để test cảm biến ánh sáng
int lcdRed = 3; 
int lcdBlue = 5;


RTC_DS1307 RTC; // định nghĩa thư viện thời gian thực - có sẵn trên board datalogger ù


//========================================================

void setup() {
  // số hàng và cột của lcd
  lcd.begin(16, 2);
  Serial.begin(9600); //khởi chạy serial ở baudrate 9600
  
  
  pinMode(lcdRed, INPUT); //đầu ra của LCD đỏ
  pinMode(lcdBlue, INPUT); //đầu ra của LCD xanh

  Wire.begin();//khởi chạy thư viện i2c
  RTC.begin(); //khởi chạy thư viện đọc tín hiệu đồng hồ
  //----------------------------------------
  if (! RTC.isrunning()) {
    Serial.println("Thoi gian thuc hok chay dc!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  //-------------------------------

  Serial.println("Khoi dong the SD...");
  pinMode(SS, OUTPUT);


  if (!SD.begin(chipSelect)) {
    Serial.println("the co loi hoạc ko duoc cam vao");
    while (1) ;//dung chuogn trinh
  }
  Serial.println("the khoi dong xong.");
  
  //tạo ra các file từ logger00 -> logger99.csv theo mỗi lẩn reset board
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i / 10 + 0;
    filename[7] = i % 10 + 0;
    if (! SD.exists(filename)) {//nếu fle này chưa được tạo => tạo ra rồi ghi
      
      logfile = SD.open(filename, FILE_WRITE);
      break; //dừng vòng lặp tìm file ok
    }
  }

  Serial.print("Luu vao file: ");
  Serial.println(filename);
  logfile.println(",,,Willy,Reen");
  logfile.println("Data Logging File");
  logfile.println("Date,Temp(F),Light");
}


//=========================================================

void loop() {

	//đọc nhiệt độ
  float temperature = getVoltage(temperaturePin);  
  temperature = ((temperature - .5) * 100) * 1.8 + 32;      
  //đọc cảm biến ánh sáng
  //------------------------
  int lightLevel = analogRead(lightPin);
  lightLevel = map(lightLevel, 0, 900, 0, 150); 
  lightLevel = constrain(lightLevel, 0, 150);  
  
  // đọc cảm biến nhiệt độ
  int tempLevel = analogRead(temperaturePin) * 100; 
  tempLevel = map(tempLevel, 66, 82, 0, 150);  
  tempLevel = constrain(tempLevel, 0, 150);  
  
  //cập nhập giá trị cảm biến cho độ sáng của led
  analogWrite(lcdBlue, lightLevel);  
  analogWrite(lcdRed, tempLevel);  
  //-----------------------------------------------------------

  String dataString = "";

  //date time stuff-------------------------------------------

  //-------------------------------------------------------
  //logfile.println();

  DateTime now = RTC.now();
  logfile.print("");
  logfile.print(now.year(), DEC);
  logfile.print('/');
  logfile.print(now.month(), DEC);
  logfile.print('/');
  logfile.print(now.day(), DEC);
  logfile.print(' ');
  logfile.print(now.hour(), DEC);
  logfile.print(':');
  logfile.print(now.minute(), DEC);
  logfile.print(':');
  logfile.print(now.second(), DEC);
  logfile.print("");
  logfile.print(",");
  //
  logfile.print(temperature);
  logfile.print(",");
  logfile.print(lightLevel);
  delay(500);

  logfile.println(dataString);
  logfile.flush();

 
  lcd.setCursor(0, 0);
  lcd.print(temperature);
  lcd.setCursor(0, 1);
  lcd.print(lightLevel);

  lcd.setCursor(8, 0);
  lcd.print("Temp");  
  lcd.setCursor(8, 1);
  lcd.print("Light");   


  delay(500);


}


//==========================================================
float getVoltage(int pin) {
  return (analogRead(pin) * .004882814);
}

 

Kết luận

Chúc các bạn thành công, có thắc mắc bạn cứ bình luận phía dưới nhé!

Những hình ảnh về dự án: 
lên
17 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Hướng dẫn sử dụng cảm biến nhiệt độ DS18B20 (-55°C đến +125°C) sai số ±0.5°C

Lại quay về vấn đề đo nhiệt độ, như ở bài trước, mình đã dùng cả LM35, cả TMP36. Nhưng rốt cuộc vẫn không hiệu quả, lần này mình đang sử dụng con DS18B20 này và cảm thấy khá ổn hơn so với lần trước. Nhiệt độ ít bị chênh lệch hơn và như quảng cáo là chỉ có sai số ±0.5°C thôi (nếu nhiệt độ trong phạm vi -10°C to +85°C, đáng để thử phải không nào?

lên
18 thành viên đã đánh giá bài viết này hữu ích.

Hướng dẫn sử dụng cảm biến nhiệt độ TMP36 - Khoảng đo từ -40 đến 125 độ C

Mình thấy cảm biến nhiệt độ LM35 rất rẻ và hoạt động cũng tương đối chính xác. Tuy nhiên, độ bền của nó không cao vì mình thấy mình chỉ dùng cảm biến LM35 trong khoảng thời gian 3 tháng, sau đó phải thay cảm biến khác (để đo nhiệt độ luộc gà). Bản thân mình không thích điều đó nên thử dùng một cảm biến khác cũng có chức năng tương tự là TMP36 và thấy nó hoạt động bền hơn (đã đến tháng thứ 4 nhưng chưa hư). Mình xin chia sẻ với các bạn nhé. Loại này hơi khó tìm và không thông dụng, nhưng nó bền hơn hẳn LM35 các bạn nhé.

lên
10 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Hướng dẫn sử dụng module bàn phím 4x4 với Arduino

Sau một thời gian dài theo dõi cộng đồng, mình thấy có một số bạn hỏi về module bàn phím 4x4 nhưng vẫn chưa có một sự hướng dẫn rõ ràng. Hôm nay, qua bài viết này, mình xin hướng dẫn các bạn phương pháp sử dụng module 4x4 với một thư viện khá hay trên Arduino.

lên
42 thành viên đã đánh giá bài viết này hữu ích.

Hướng dẫn điều khiển động cơ bước với thư viện Accel Stepper và driver điều khiển động cơ bước A4988 hoặc DRV8825

Mình thấy có nhiều bạn hỏi về stepper và cách điều khiển nó. Đồng thời thấy vấn đề điều khiển động cơ bước là một vấn đề kinh điển nhưng lại chưa có trên Cộng đồng. Ngoài ra, vì chức năng điểm cộng đồng khá hay và mình cũng muốn có quà nên hôm nay mình sẽ hướng dẫn rất kỹ với các bạn! Thư viện mình dùng là thư viện AccelStepper chứ không phải thư viện stepper mặc định của Arduino nên có thể điều khiển đồng thời nhiều stepper và kết hợp với các thư viện bất đồng bộ khác.

lên
54 thành viên đã đánh giá bài viết này hữu ích.