0 đánh giá

Tự làm dự án Log dữ liệu lên thẻ SD với Arduino

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. Với bài này, bạn sẽ dễ dàng tạo cho mình 1 dự án lưu trữ trạng thái để có thể đọc lại kiểm tra sau này.

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.

Bước 1: Chuẩn bị linh kiện
khoere_datalogger-shield-9176750099.jpg khoere_lcd-16x2-6793889193.jpg khoere_quang-tro-8662907183.jpg khoere_lm35-3004445596.jpg

Bận cần Datalogger shield (có thể mua tại đây).

Arduino Uno

LCD 16x02.

Quang trở

LM35

Bước 2: Nối dây
khoere_datalogger-shield--1-1451179957.jpg khoere_datalogger-shield-2-7593486080.jpg khoere_so-do-noi-day-3718241527.jpg

Bạn tiến hành nối dây như hình trên. Đầu tiên t úp shield dataloger lên arduino uno.

Sau đó nối các đầu dây của LCD, LM 35, quang trở vào arduino như hình trên. Bạn nối vào chân tương ứng trên shield vì nó được nối trực tiếp xuống arduino

Bước 3: 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)

 

Bước 4: Chương trình
// Đăng bởi Cộng Đồng Khỏe Re https://khoere.com
#include <LiquidCrystal.h>
#include <SD.h>
#include <Wire.h>
#include RTClib.h

const int chipSelect = 10;
//File dataFile;
File logfile;


// khởi động LCD với các chân tương ứng, bạn có thể them khảo trên arduino.cc
LiquidCrystal lcd(7, 8, 9, 4, 2, 6);


//TMP36 Pin Variables
int temperaturePin = 0; //chân analog của LM35

//PhotoResistor Pin
int lightPin = 1; //chân analog của quang trở

//led for light sensor
int lcdRed = 3;   //the pin the LED is connected to
int lcdBlue = 5;   //the pin the LED is connected to


RTC_DS1307 RTC; // định nghĩa thư viện thời gian thực


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

void setup() {
  // số hàng và cột của lcd
  lcd.begin(16, 2);
  Serial.begin(9600);  
  //to view the result open the serial monitor
  //last button beneath the file bar (looks like a box with an antena
  pinMode(lcdRed, INPUT); //đầu ra của LCD đỏ
  pinMode(lcdBlue, INPUT); //đầu ra của LCD xanh

  Wire.begin();
  RTC.begin();
  //----------------------------------------
  if (! RTC.isrunning()) {
    Serial.println(Thoi gian thuc ko chay);
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  //-------------------------------

  Serial.print(Khoi dong the SD...);
  // make sure that the default chip select pin is set to
  // output, even if you dont use it:
  pinMode(SS, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println(the co loi hoạc ko duoc cam vao);
    // dont do anything more:
    while (1) ;
  }
  Serial.println(the khoi dong xong.);
  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)) {
      // only open a new file if it doesnt exist
      logfile = SD.open(filename, FILE_WRITE);
      break;  // leave the loop!
    }
  }

  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() {

  float temperature = getVoltage(temperaturePin);  //getting the voltage reading from the temperature sensor
  temperature = ((temperature - .5) * 100) * 1.8 + 32;      //converting from 10 mv per degree wit 500 mV offset
  //to degrees ((volatge - 500mV) times 100)
  // Serial.println(temperature);                     //printing the result
  // delay(500);                                     //waiting a second

  //------------------------
  int lightLevel = analogRead(lightPin); //Read the
  lightLevel = map(lightLevel, 0, 900, 0, 150);  //adjust the value 0 to 900 to span 0 to 255
  lightLevel = constrain(lightLevel, 0, 150);   //make sure the value is betwween 0 and 255
  //////
  int tempLevel = analogRead(temperaturePin) * 100; //Read the
  tempLevel = map(tempLevel, 66, 82, 0, 150);  //adjust the value 0 to 900 to span 0 to 255
  tempLevel = constrain(tempLevel, 0, 150);   //make sure the value is betwween 0 and 255
  analogWrite(lcdBlue, lightLevel);  //write the value
  analogWrite(lcdRed, tempLevel);  //write the value
  //-----------------------------------------------------------

  String dataString = ;

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

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

  DateTime now = RTC.now();
  // log time
  // logfile.print(now.unixtime()); // seconds since 1/1/1970
  //  logfile.print(, );
  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);

  //----------------
  /*
    // read sensors and append to the string:
    for (int analogPin = 0; analogPin < 2; analogPin++) {
      int sensor = analogRead(analogPin);
      dataString += String(sensor);
      if (analogPin < 1) {
        dataString += ,;
      }
    }
  */
  // dataFile.println(dataString);
  logfile.println(dataString);
  //  Serial.println(dataString);
  //   dataFile.flush();
  logfile.flush();

  //-----------------------------------------------------------
  // set the cursor to (0,0):
  lcd.setCursor(0, 0);
  // print from 0 to 9:
  //  for (int thisChar = 0; thisChar < 10; thisChar++) {
  lcd.print(temperature);
  //   lcd.print(myString);
  lcd.setCursor(0, 1);
  lcd.print(lightLevel);

  lcd.setCursor(8, 0);
  lcd.print(Temp);   //display temp on the lcd
  lcd.setCursor(8, 1);
  lcd.print(Light);   //display light on the lcd


  delay(500);

  //---------------------lcd backlight
  // lightLevel = constrain(lightLevel, 0, 255);//make sure the
  //value is betwween
  //0 and 255

}


//------------------------------------------------------------


// set the cursor to (16,1):
//  lcd.setCursor(16, 1);
// set the display to automatically scroll:
//  lcd.autoscroll();
// print from 0 to 9:
//  for (int thisChar = 0; thisChar < 10; thisChar++) {
//    lcd.print(thisChar);
//    delay(500);
//  }
// turn off automatic scrolling
//  lcd.noAutoscroll();

// clear screen for the next loop:
//  lcd.clear();
//}

//==========================================================
float getVoltage(int pin) {
  return (analogRead(pin) * .004882814); //converting from a 0 to 1023 digital range
  // to 0 to 5 volts (each 1 reading equals ~ 5 millivolts
}

 

(!) Nếu có bất kỳ thắc mắc nào cần hỏi vui lòng đặt câu hỏi tại HỏiHay.Net, Cộng đồng Hỏi đáp Hỏi Hay sẽ trả lời bạn.
490 lượt xem ^tháng ^ngày, ^năm
admin 2,010 điểm

Please log in or register to Comment this Media.