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

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Hướng dẫn điều khiển stepper 28BYJ-48 bằng mạch điều khiển động cơ bước ULN2003

Động cơ bước 28BYJ-48 có đến 5 dây chứ không phải thuộc loại 4 dây hoặc 6 dây như ta thường thấy. Nhưng thật may mắn, chúng ta lại có board điều khiển động cơ bước ULN2003 với 5 giây vừa khít với con động cơ bước này luôn. Vì vậy, bộ động cơ bước + stepper driver này thường được dùng trong các dự án DIY. Hôm nay, mình sẽ chỉ các bạn cách sử dụng thư viện để sử dụng bộ combo này cho dễ nhé.

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

Software Serial - Giao tiếp giữa Arduino và nhiều mạch Serial khác - Truyền tải trung gian giữa một mạch khác qua giao tiếp Serial

Có thể nói Serial là một trong những phương thức giao tiếp đơn giản nhất trong môi trường Serial. Vì bạn chỉ cần 2 dây và cách thức truyền dữ liệu của nó lại giống hệt stream trong các ngôn ngữ lập trình. Nhưng thật đáng tiết, con Arduino Uno chỉ có duy nhất một cổng Serial được phần cứng hỗ trợ sẵn (Mega thì 3). Vì vậy, nếu bạn muốn giao tiếp với nhiều module Serial thì đó là một chuyện không thể. Và đó chính là lý do vì sao thư viện Software Serial ra đời. Hôm nay, chúng ta sẽ tìm cách giao tiếp giữa 2 mạch Arduino thông qua Serial và một ví dụ về chuyển tiếp giá trị của một module giao tiếp qua Serial với thư viện này.

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