การอ่านค่าจากเซ็นเซอร์ DS18B20 ด้วย Arduino UNO R3 บันทึกลง MicroSD card
อุปกรณ์ที่จำเป็น
บอร์ด Arduino UNO R3
เซ็นเซอร์ DS18B20
Real Time Clock DS1307
Module SD card
Adaptor ต่อ MicroSDcard กับพีซีเพื่อทำการ format
บอร์ดขนมปัง (ถ้ามี)
สาย Jumper
แหล่งจ่ายไฟ (ถ้าไม่ใช้จาก Arduino power) usb ต่อคอมพิวเตอร์
อธิบายการทำงานของ RTC DS1307
RTC DS1307 หรือ Real Time Clock DS1307 คือชิปอิเล็กทรอนิกส์ที่ออกแบบมาเพื่อเก็บรักษาเวลาและวันที่ได้อย่างแม่นยำ
แม้ว่าจะไม่มีการจ่ายไฟให้กับระบบ ซึ่งทำให้มันเป็นส่วนประกอบสำคัญ ในอุปกรณ์อิเล็กทรอนิกส์หลายชนิด ที่ต้องการติดตามเวลาอย่างต่อเนื่อง
เช่น นาฬิกาปลุก, ระบบควบคุมเวลา, และอุปกรณ์ IoT ต่างๆ
หลักการทำงานเบื้องต้น
นาฬิกาภายใน: DS1307 มีนาฬิกาคริสตัล ภายในที่สั่นสะเทือนด้วยความถี่คงที่ ทำหน้าที่เป็นตัวอ้างอิงเวลาหลัก
ตัวนับ: สัญญาณจากคริสตัลจะถูกนำไปยัง ตัวนับอิเล็กทรอนิกส์ภายใน เพื่อนับจำนวนการสั่นสะเทือน และแปลงเป็นหน่วยเวลา
เช่น วินาที นาที ชั่วโมง วันที่ เดือน และปี
หน่วยความจำ: ข้อมูลเวลาทั้งหมดจะถูกเก็บไว้ในหน่วยความจำภายในชิป ซึ่งสามารถคงอยู่ได้แม้จะไม่มีไฟเลี้ยง เนื่องจากมีแบตเตอรี่ขนาดเล็กภายในชิป
การสื่อสาร: DS1307 มักจะสื่อสารกับไมโครคอนโทรลเลอร์ (เช่น Arduino) ผ่านทางอินเตอร์เฟซ I2C
ซึ่งเป็นโปรโตคอลการสื่อสารแบบอนุกรมที่ใช้กันอย่างแพร่หลาย
การเชื่อมต่อ
SD card module Arduino Uno
CS 10
SCK 13
MOSI(DI) 11
MISO (DO) 12
VCC 3.3V or 5V
GND GND
ข้อควรระวัีง การอัพโหลดโค้ด ต้องปิดหน้าต่าง serial monitor เพื่อป้องกัน Access is denied.
1.ทดสอบการเชื่อมต่อ และการอ่าน MicroSDcard
File> Examples > SD > CardInfo.
2.คำสั่งใช้ในการสร้าง File:
File> Examples > SD > ReadWrite
เช่น myFile = SD.open("test.txt", FILE_WRITE);
เป็นการเขียนแบบ (Append)
3.คำสั่งใช้ในการ List File:
File> Examples > SD > ListFiles
ปรับการเรียกใช้ คำสั่งเป็น
printDirectory(SD.open("/"), 0);
4.คำสั่งใช้ในการลบFile:
void setup() {
SD.remove("test.txt");
}
5.คำสั่งใช้ในการเขียน File:
myFile = SD.open("test.txt", FILE_WRITE);
myFile.println("testing 01");
myFile.close();
6.คำสั่งใช้ในการอ่านข้อมูลใน File.
// read data in file to Serial Monitor
myFile = SD.open("test.txt",FILE_READ);
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// End Read
7.การติดตั้ง DS1307
คือชิปอิเล็กทรอนิกส์ชนิดหนึ่ง ที่ถูกออกแบบมาเพื่อทำหน้าที่เป็น นาฬิกาเวลาจริง (Real Time Clock - RTC)
ซึ่งมีความสามารถในการเก็บรักษา เวลาและวันที่ได้อย่างแม่นยำ แม้ว่าอุปกรณ์ที่เชื่อมต่ออยู่ จะถูกตัดไฟไปแล้วก็ตาม ทำให้ DS1307
เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการใช้งานในโครงงานอิเล็กทรอนิกส์ต่าง ๆ ที่ต้องการความแม่นยำของเวลา เช่น นาฬิกาปลุก, นาฬิกาจับเวลา,
ระบบควบคุมเวลา และอื่นๆ อีกมากมาย
หลักการทำงานเบื้องต้น
การเก็บรักษาเวลา: DS1307 จะเก็บข้อมูลเวลาในรูปแบบดิจิทัล ซึ่งรวมถึง วินาที นาที ชั่วโมง วันที่ เดือน และปี โดยข้อมูลเหล่านี้จะถูกเก็บไว้ในหน่วยความจำภายในของชิป
การทำงานต่อเนื่อง: DS1307 มีแบตเตอรี่ขนาดเล็กในตัว ทำให้สามารถทำงานได้ต่อเนื่อง แม้ว่าจะไม่มีไฟหลักมาจ่ายให้ ทำให้เวลาที่ถูกเก็บไว้ ไม่หายไปเมื่อเกิดเหตุการณ์ไฟดับ
การสื่อสาร: DS1307 สามารถสื่อสาร กับไมโครคอนโทรลเลอร์ เช่น Arduino ได้ผ่านทางอินเตอร์เฟซ I2C ซึ่งเป็นโปรโตคอลการสื่อสารแบบง่าย ๆ ที่นิยมใช้กันอย่างแพร่หลาย
การตั้งค่าเวลา: เราสามารถตั้งค่าเวลาให้กับ DS1307 ได้ผ่านทางไมโครคอนโทรลเลอร์ โดยการเขียนโปรแกรมเพื่อส่งข้อมูลเวลาไปยังชิป
การเชื่อมต่อ
DS1307 ---> Arduino Uno
SCL A5
SDA A4
VCC 5V
GND GND
ติดตั้ง ไลบรารี DS1307
Sketch ->Include Libraires -> Manage Libraires พิมพ์ uRTCLib จาก Naguissa
Sketch ->Include Libraires -> Manage Libraires พิมพ์ uEEPROMLib จาก Naguissa
การปรับในส่วนของโปรแกรม ให้เพิ่มโค้ดในส่วนบน
#include "Arduino.h"
#include "uRTCLib.h"
// uRTCLib rtc;
uRTCLib rtc(0x68);
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
....
การปรับในส่วนของ void setup()
void setup() {
...
delay(3000); // wait for console opening
URTCLIB_WIRE.begin();
// Comment out below line once you set the date & time.
// Following line sets the RTC with an explicit date & time
// for example to set January 13 2022 at 12:56 you would call:
rtc.set(0, 56, 12, 6, 1, 11, 24);
// rtc.set(second, minute, hour, dayOfWeek(friday=6), dayOfMonth, month, year)
// set day of week (1=Sunday, 7=Saturday)
}
การปรับในส่วนของ void loop()
void loop() {
rtc.refresh();
Serial.print("Date Time(yy/mm/dd): ");
Serial.print(rtc.year());
Serial.print('/');
Serial.print(rtc.month());
Serial.print('/');
Serial.print(rtc.day());
Serial.print(" (");
Serial.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
Serial.print(") ");
Serial.print(rtc.hour());
Serial.print(':');
Serial.print(rtc.minute());
Serial.print(':');
Serial.println(rtc.second());
delay(1000);
}
หากมีปัญหาในการอัพโหลด ลองถอดสาย usb แล้วเสียบใหม่ หรือกดปุ่มรีเซ็ตที่บอร์ด Arduino Uno แล้วลองอัพโหลดใหม่
8.การเขียนลงใน MicroSDcard
จัดรูปแบบการเขียนให้เหลือบรรทัดเดียว
myFile = SD.open("test.txt", FILE_WRITE);
myFile.print(String("Date(dd/mm/yy):")+String(rtc.day())+String("/")+String(rtc.month())+String("/")+String(rtc.year()));
myFile.println(String(" Time:")+String(rtc.hour())+String(":")+String(rtc.minute())+String(":")+String(rtc.second()));
myFile.close();
สำหรับการเชื่อมต่อ DS18B20 สามารถอ่านค่าอุณหภูมิได้
Serial.print((float) rtc.temp() / 100);
9.การเชื่อมต่อเซ็นเซอร์ DS18B20 เพื่อเก็บค่าอุณหภูมิ ความชื้น
ขั้นตอนการต่อสาย:
DS18B20 --> Arduino
เชื่อมต่อ Vcc (ขาสีแดง) +5V
เชื่อมต่อ DQ (ขาเหลือง) ขาสัญญาณดิจิทัล D2
เชื่อมต่อ GND (ขาสีดำ) GND
ต่อ ต้านทาน 4.7kΩ ระหว่าง DQ และ +5V เพื่อใช้เป็น pull-up
เพิ่มโค้ด:
#include <OneWire.h>
#include <DallasTemperature.h>
// ตั้งค่าขาเชื่อมต่อ
#define ONE_WIRE_BUS 2
// เริ่มต้น OneWire และ DallasTemperature
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void loop() {
sensors.requestTemperatures(); // ขอค่าอุณหภูมิจากเซ็นเซอร์
float temperature = sensors.getTempCByIndex(0); // อ่านค่าที่ได้ (Celsius)
Serial.println(String("Temperature: ")+String(temperature)+String(" °C"));
delay(1000); // รอ 1 วินาทีก่อนที่จะอ่านค่าใหม่
}
// Full code /
#include "Arduino.h"
#include "uRTCLib.h"
// uRTCLib rtc;
uRTCLib rtc(0x68);
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
#include <OneWire.h>
#include <DallasTemperature.h>
// ตั้งค่าขาเชื่อมต่อ
#define ONE_WIRE_BUS 2
// เริ่มต้น OneWire และ DallasTemperature
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#include <SD.h>
const int chipSelect = 10;
File root;
File myFile;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
// wait for Serial Monitor to connect. Needed for native USB port boards only:
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("1. is a card inserted?");
Serial.println("2. is your wiring correct?");
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
while (true);
}
// read data in file to Serial Monitor
myFile = SD.open("test.txt",FILE_READ);
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// End Read
delay(3000); // wait for console opening
URTCLIB_WIRE.begin();
// Comment out below line once you set the date & time.
// Following line sets the RTC with an explicit date & time
// for example to set January 13 2022 at 12:56 you would call:
rtc.set(0, 56, 12, 2, 30, 10, 25);
// rtc.set(second, minute, hour, dayOfWeek(friday=6), dayOfMonth, month, year)
// set day of week (1=Sunday, 7=Saturday)
}
void loop() {
rtc.refresh();
Serial.print("Date Time(yy/mm/dd): ");
Serial.print(rtc.year());
Serial.print('/');
Serial.print(rtc.month());
Serial.print('/');
Serial.print(rtc.day());
Serial.print(" (");
Serial.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
Serial.print(") ");
Serial.print(rtc.hour());
Serial.print(':');
Serial.print(rtc.minute());
Serial.print(':');
Serial.print(rtc.second());
sensors.requestTemperatures(); // ขอค่าอุณหภูมิจากเซ็นเซอร์
float temperature = sensors.getTempCByIndex(0); // อ่านค่าที่ได้ (Celsius)
Serial.println(String(" Temperature: ")+String(temperature)+String(" °C"));
delay(3000);
myFile = SD.open("test.txt", FILE_WRITE);
myFile.print(String("Date(dd/mm/yy):")+String(rtc.day())+String("/")+String(rtc.month())+String("/")+String(rtc.year()));
myFile.print(String(" Time:")+String(rtc.hour())+String(":")+String(rtc.minute())+String(":")+String(rtc.second()));
myFile.println(String(" Temperature: ")+String(temperature)+String(" °C"));
myFile.close();
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
/////
Relate Link :
ไลบรารี DS1307 โดย Naguissa/uRTCLib จาก GitHub
https://github.com/Naguissa/uRTCLib
แหล่งข้อมูล
ไลบรารี DS1307 โดย Watterott จาก GitHub
https://www.electronicwings.com/arduino/ds1307-rtc-module-interfacing-with-arduino-uno
DS1307 DataSheets
https://www.analog.com/media/en/technical-documentation/data-sheets/ds1307.pdf
Tag:
DS1307,Arduino UNO R3,Arduio IDE,Error exist status
MicroSDcard,FILE_WRITE,FILE_READ,File,Remove,

ความคิดเห็น
แสดงความคิดเห็น