Các chân DS1307

Một phần của tài liệu Nghiên cứu và mô phỏng hệ thống tưới cây tự động có hiển thị màn hình LCD (Trang 28)

Chúng ta sẽ kết nối DS1307 với Arduino như sau:

Bảng 3.2: Kết nối DS1307 với Arduino

Arduino Uno R3 DS 1307

5V 5V

GND GND

A4 SDA

A5 SCL

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

21

Cấu tạo bên trong của DS1307 bao gồm mạch nguồn, dao động, logic và con trỏ, thanh ghi thực hiện việc ghi đọc. Do trong các bài toán chúng ta thường sử dụng DS1307 cho đồng hồ thời gian thực nên do đó chúng ta chỉ quan tâm đến việc ghi đọc các thanh ghi cần thiết (sec, min, hour...) thông qua chuẩn truyền thông I2C.

Trong bộ nhớ của DS1307 có tất cả 64 thanh ghi địa chỉ từ 0 đến 63 và được bắt đầu từ 0x00 đến 0x3F nhưng trong đó chỉ có 8 thanh ghi đầu là thanh ghi thời gian thực nên chúng ta sẽ đi sâu vào 8 thanh ghi (chức năng và địa chỉ thanh ghi thời gian thực này). Nhìn vào bảng thanh ghi ta sẽ thấy như sau :

Hình 3.16: Bảng thanh ghi của DS 1307

Thời gian thực nó được sắp sếp theo thứ tự: giây, phút, giờ, thứ, ngày , tháng, năm và bắt đầu từ thanh ghi Giây (0x00) và kết thúc bằng thanh ghi Năm (0x06). Riêng thanh ghi Control dùng để điều khiển ngõ ra của chân SQW/OUT nên trong thực tế không sử dụng thanh ghi này trong thời gian.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

22

Hình 3.17: Tổ chức thanh ghi DS 1307

Thanh ghi giây (0x00): đây là thanh ghi giây của DS1307. Nhìn trên bảng trên ta thấy được từ bit 0 đến bit 3 là dùng để mã hóa số BCD hàng đơn vị của giây. Tiếp theo từ bit 4 đến bit 6 dùng để mã hóa BCD hàng chục của giây. Tại sao nó chỉ sử dụng có 3 bit này là do giây lớn nhất chỉ đến 59 nên hàng chục lớn nhất là 5 nên chỉ cần 3 thanh ghi này là cũng đủ mã hóa

Thanh ghi phút (0x01): đây là thanh ghi phút của DS1307. Cũng nhìn trên bảng thanh ghi này được tổ chức như thanh ghi giây. Cũng là 3 bit thấp dùng để mã hóa BCD chữ số hàng đơn vị và số hàng chục chỉ lớn nhất là 5 nên do đó chỉ cần dùng từ bit 4 đến bit 6 để mã hóa BCD tiếp chữ số hàng chục. Nhưng thanh ghi này có sự khác biệt với thanh ghi giây là bit 7 nó đã mặc định bằng 0

Thanh ghi giờ (0x02): đây là thanh ghi giờ của ta thấy từ bit 0 đến bit 3 nó dùng để mã hóa BCD của chữ số hàng đơn vị của giờ. Nhưng giờ có chế độ 24h và 12h nên do đó nó phức tạp ở các bit cao (bit 4 đến bit 7) và sự chọn chế độ 12h và 24h nó lại nằm ở bit 6. Nếu bit 6 = 0 thì ở chế độ 24h thì do chữ số hàng chục lớn nhất là 2 nên do đó nó chỉ dùng 2 bit (bit 4 và bit 5) để mã hóa BCD chữ số hàng chục của giờ. Nếu bit 6 = 1 thì chế độ 12h được chọn nhưng do chữ số của hàng chục của giờ trong chế độ này chỉ lớn nhất là 1 nên do đó bit thứ 4 là đủ để mã hóa BCD chữ số hàng chục

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

23

của giờ rồi nhưng mà bit thứ 5 nó lại dùng để chỉ buổi sáng hay chiều, nếu mà bit 5 = 0 là AM và bit 5 = 1 là PM. Trong cả 2 chế độ 12h và 24h thì bit 7 = 0.

Thanh ghi thứ (0x03): đây là thanh ghi thứ trong tuần của DS1307 và thanh ghi này khá là đơn giản trong DS1307. Nó dùng số để chỉ thứ trong tuần nên do đó nó chỉ lấy từ 1 đến 7 tương đương từ thứ hai đến chủ nhật. Nên do đó nó dùng 3 bit thấp (bit 0 đến bit 2) để mã hóa BCD ra thứ trong ngày. Cịn các bit từ 3 đến 7 thì nó mặc định bằng 0.

Thanh ghi ngày (0x04): đây là thanh ghi ngày trong tháng của DS1307. Do trong các tháng có số ngày khác nhau nhưng mà nằm trong khoảng từ 1đến 31 ngày. Nó dùng 4 bit thấp (bit 0 đến bit 3) dùng để mã hóa BCD ra chữ số hàng đơn vị của ngày trong tháng. Nhưng do chữ số hàng chục của ngày trong tháng chỉ lớn nhất là 3 nên chỉ dùng bit 4 và bit 5 là đủ mã hóa BCD. Cịn bit 6 và bit 7 mặc định bằng 0.

Thanh ghi tháng (0x05): đây là thanh ghi tháng trong năm của DS1307. Tháng trong năm chỉ có từ 1 đến 12 tháng nên việc tổ chức trong bit cũng tương tự như ngày trong tháng nên do cũng 4 bit thấp (từ bit 0 đến bit 3) mã hóa BCD hàng đơn vị của tháng. Nhưng do hàng chục chỉ lớn nhất là 1 nên chỉ dùng 1 bit thứ 4 để mã hóa BCD ra chữ số hàng chục và các bit cịn lại từ bit 5 đến bit 7 thì mặc định cho xuống mức 0.

Thanh ghi năm (0x06): đây là thanh ghi năm trong DS1307. DS1307 chỉ có 100 năm thôi tương đương với 00 đến 99 nên nó dùng tất cả các bit thấp và bit cao để mã hóa BCD ra năm.

Thanh ghi điều khiển (0x07): đây là thanh ghi điều khiển quá trình ghi của DS1307 và quá trình ghi phải được kết thúc bằng địa chỉ 0x93.

3.3.3.3 Lập trình

#include <Wire.h> /* Địa chỉ của DS1307 */ const byte DS1307 = 0x68;

/* Số byte dữ liệu sẽ đọc từ DS1307 */ const byte NumberOfFields = 7;

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

24

int second, minute, hour, day, wday, month, year;

void setup() {

Wire.begin();

/* cài đặt thời gian cho module */

setTime(12, 30, 45, 1, 8, 2, 15); // 12:30:45 CN 08-02-2015 Serial.begin(9600); } void loop() { /* Đọc dữ liệu của DS1307 */ readDS1307();

/* Hiển thị thời gian ra Serial monitor */ digitalClockDisplay(); delay(1000); } void readDS1307() { Wire.beginTransmission(DS1307); Wire.write((byte)0x00); Wire.endTransmission(); Wire.requestFrom(DS1307, NumberOfFields);

second = bcd2dec(Wire.read() & 0x7f); minute = bcd2dec(Wire.read() );

hour = bcd2dec(Wire.read() & 0x3f); // chế độ 24h. wday = bcd2dec(Wire.read() );

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường 25 day = bcd2dec(Wire.read() ); month = bcd2dec(Wire.read() ); year = bcd2dec(Wire.read() ); year += 2000; }

/* Chuyển từ format BCD (Binary-Coded Decimal) sang Decimal */ int bcd2dec(byte num)

{

return ((num/16 * 10) + (num % 16)); }

/* Chuyển từ Decimal sang BCD */ int dec2bcd(byte num)

{

return ((num/10 * 16) + (num % 10)); } void digitalClockDisplay(){ Serial.print(hour); printDigits(minute); printDigits(second); Serial.print(" "); Serial.print(day); Serial.print(" "); Serial.print(month); Serial.print(" "); Serial.print(year); Serial.println(); }

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

26

// các thành phần thời gian được ngăn chách bằng dấu : Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits); }

/* cài đặt thời gian cho DS1307 */

void setTime(byte hr, byte min, byte sec, byte wd, byte d, byte mth, byte yr) {

Wire.beginTransmission(DS1307); Wire.write(byte(0x00)); // đặt lại pointer Wire.write(dec2bcd(sec));

Wire.write(dec2bcd(min)); Wire.write(dec2bcd(hr));

Wire.write(dec2bcd(wd)); // day of week: Sunday = 1, Saturday = 7 Wire.write(dec2bcd(d));

Wire.write(dec2bcd(mth)); Wire.write(dec2bcd(yr)); Wire.endTransmission(); }

3.3.3.4 Một số hàm trong thư viện Wire.h

Wire.begin(address (optional));

 Khởi tạo thư viện Wire.h và tham gia vào I2C bus.

 address: 7 bit địa chỉ của thiết bị "Slave" (optional); nếu khơng có địa chỉ thì coi như "Master".

Wire.beginTransmission(address);

 Bắt đầu truyền dữ liệu đến thiết bị "Slave" với address đã có. Wire.endTransmission();

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

27

 Kết thúc truyền dữ liệu đến thiết bị "Slave" đã được bắt đầu bởi Wire.beginTransmission(address).

Wire.write(value);

 Ghi dữ liệu lên thiết bị “Slave”, được gọi giữa beginTranmission() và endTransmission.

Wire.read();

 Đọc dữ liệu được truyền từ thiết bị "Slave" đến Arduino, được gọi sau requestFrom().

Wire.requestFrom(address, quantity);

 Được sử dụng bởi thiết bị "Master" để yêu cầu dữ liệu từ thiết bị "Slave".

 address: là địa chỉ của thiết bị "Slave".

 quantity: số lượng bytes yêu cầu.

3.3.4 Module cảm biến độ ẩm đất 3.3.4.1 Nguyên lí hoạt động 3.3.4.1 Nguyên lí hoạt động

Cảm biến độ ẩm đất, trạng thái đầu ra mức thấp (0V), khi đất thiếu nước đầu ra sẽ là mức cao (5V), độ nhạy cao chúng ta có thể điều chỉnh được bằng biến trở. Phần đầu đo được cắm vào đất để phát hiện độ ẩm của đất, khi độ ầm của đất đạt ngưỡng thiết lập, đầu ra DO sẽ chuyển trạng thái từ mức thấp lên mức cao. Nhờ thế, ta có thể sử dụng Analog hoặc Digital của Arduino để đọc giá trị từ cảm biến.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

28

Hình 3.18: Module cảm biến độ ẩm đất

3.3.4.2 Thông số kỹ thuật

Điện áp vào : 2V – 5V.

Trạng thái đầu ra: LOW-mức thấp(0V); HIGH-mức cao(5V). Kiểu đầu ra : Analog.

Độ sâu cần thiết:38mm. Kích thước: 20mm*51mm.

Có thể điều chỉnh độ nhạy bằng biến trở.

3.3.4.3 Cách đo và cách đọ độ ẩm đất dùng cảm biến độ ẩm đất

Cách đo: phần đầu đo được cắm vào đất để phát hiện độ ẩm của đất.

Cách đọc: có hai cách đọc tín hiệu từ cảm biến độ ẩm đất. Đọc giá trị Digital hoặc đọc giá trị Analog:

- Đọc giá trị Digital (đọc bằng chân D0): Khi độ ẩm đất đạt ngưỡng thiết lập, đầu ra D0 sẽ chuyển trạng thái từ mức thấp lên mức cao.

- Đọc giá trị Analog (đọc bằng chân A0): Giá trị đầu ra sẽ có điện áp từ 0-5V tương ứng với độ ẩm từ 0-100%.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

29

3.3.4.4 Cách quy đổi độ ẩm đất thành phần trăm

Tín hiệu Analog có độ phân giải mặc định là từ 0 - 1023 tương ứng 0 - 5V. Để quy đổi nó sang %, chúng ta sẽ chuyển nó bằng hàm map về 0 - 100%.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

30

3.3.4.5 Kết nối dây với Arduino

Ta dựa vào bảng sau để kết nôi chân cảm biến độ ẩm đất với Arduino UNO R3

Bảng 3.3: Kết nối cảm biến độ ẩm đất với Arduino.

Cảm biến độ ẩm đất Arduino UNO R3

Vcc 5V GND GND A0 A0 3.3.5 Lập trình cho cảm biến độ ẩm đất void setup() { Serial.begin(9600);//Mở cổng Serial ở mức 9600 pinMode (2, INPUT); pinMode(A0, INPUT); pinMode (13, OUTPUT); } void loop() {

int value = analogRead(A0); // Ta sẽ đọc giá trị hiệu điện thế của cảm biến // Giá trị được số hóa thành 1 số nguyên có giá trị

// trong khoảng từ 0 đến 1023

Serial.println(value);//Xuất ra serial Monitor delay(10);

// Đọc giá trị D0 rồi điều khiển Led 13...Các bạn cũng có thể điều khiển bơm nước thông qua rơle....

if (digitalRead (2) == 0) {

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường 31 } else{ digitalWrite (13, LOW); } } 3.3.6 Module Relay 5VDC 3.3.6.1 Cấu tạo

Do các chân Digital của Arduino chỉ xuất ra mức tín hiệu thấp 0V hoặc cao 5V nên chúng ta chọn relay dịng kích 5VDC.

Relay là thiết bị đóng cắt cơ bản, nó được sử dụng rất nhiều trong cuộc sống và trong các thiết bị điều khiển điện tử. Nó là một chuyển mạch hoạt động bằng điện. Dòng điện chạy qua cuộn dây của relay tạo ra một từ trường hút lõi sắt non làm thay đổi công tắc chuyển mạch. Dịng điện qua cuộn dây có thể được bật hoặc tắt vì thế rơle có hai vị trí chuyển mạch qua lại.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

32 Cấu tạo relay gồm 2 phần:

- Cuộn hút: tạo ra năng lượng từ trường để hút các tiếp điểm về mình. - Cặp tiếp điểm: khi không cấp điện tiếp điểm 1 được tiếp xúc tiếp điểm

2 (tiếp điểm thường đóng). Khi cấp điện tiếp điểm 1 bị hút chuyển.

3.3.6.2 Cách sử dụng

Relay bình thường gồm có 6 chân. Trong đó có 3 chân để kích, 3 chân cịn lại nối với đồ dùng điện có cơng suất cao:

- 3 chân dùng để kích:

 +: cấp hiệu điện thế kích tối ưu vào chân này.

 : nối với cực âm.

 S: chân tín hiệu, tùy vào loại module relay mà nó sẽ làm nhiệm vụ kích relay.

Nếu bạn đang dùng module relay kích ở mức cao và chân S bạn cấp điện thế dương vào thì module relay của bạn sẽ được kích, ngược lại thì khơng.

Tương tự với module relay kích ở mức thấp.

- 3 chân cịn lại nối với đồ dùng điện cơng suất cao:

 COM: chân nối với 1 chân bất kỳ của đồ dùng điện, nhưng mình khuyên nên mắc vào dây chân lửa (nóng) nếu dùng hiệu điện thế xoay chiều và cực dương nếu là hiệu điện một chiều.

 ON hoặc NO: chân này bạn sẽ nối với chân lửa (nóng) nếu dùng điện xoay chiều và cực dương của nguồn nếu dòng điện một chiều.

 OFF hoặc NC: chân này bạn sẽ nối chân lạnh (trung hòa) nếu dùng điện xoay chiều và cực âm của nguồn nếu dùng điện một chiều.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

33

3.3.7 Màn hình LCD 3.3.7.1 Cấu tạo 3.3.7.1 Cấu tạo

LCD phổ thông khi giao tiếp "chay" với Arduino thì tốn rất nhiều chân, để khắc phục tình trạng đó mà module I2C ra đời.

Hình 3.21: LCD 2004

- VSS: tương đương với GND - cực âm.

- VDD: tương đương với VCC - cực dương (5V). - Constrast Voltage (V0): điều khiển độ sáng màn hình.

- Register Select (RS): điều khiển địa chỉ nào sẽ được ghi dữ liệu.

- Read/Write (RW): Bạn sẽ đọc (read mode) hay ghi (write mode) dữ liệu Nó sẽ phụ thuộc vào bạn gửi giá trị gì vào.

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

34

- D0 - D7: 8 chân dư liệu, mỗi chân sẽ có giá trị HIGH hoặc LOW nếu bạn đang ở chế độ đọc (read mode) và nó sẽ nhận giá trị HIGH hoặc LOW nếu đang ở chế độ ghi (write mode).

- Backlight (Backlight Anode (+) và Backlight Cathode (-): Tắt bật đèn màn hình LCD.

Hình 3.22: LCD 2004 - module I2C

Kết nối LCD với Arduino:

Bảng 3.4: Kết nối LCD với Arduino

Module màn hình LCD Arduino UNO R3

GND GND

Vcc 5V

SDA A4

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

35

3.3.7.2 Lập trình

// thư viện LiquitCrystal có sẵn #include <LiquidCrystal.h>

//Khởi tạo với các chân

LiquidCrystal lcd(0x27, 20, 4);

void setup() {

//Thông báo đây là LCD 1602 lcd.begin();

//In ra màn hình lcd dịng chữ Toi yeu Arduino lcd.print("Toi yeu Arduino!");

}

void loop() {

// đặt con trỏ vào cột 0, dòng 1

// Lưu ý: dòng 1 là dòng thứ 2, lịng 0 là dịng thứ 1. Nơm na, nó đếm từ 0 chứ khơng phải từ 1

lcd.setCursor(0, 1); // In ra dong chu

lcd.print(" Arduino.VN"); }

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

36

3.3.8 Bàn phím ma trận 4x4 3.3.8.1 Sơ đồ nguyên lí 3.3.8.1 Sơ đồ ngun lí

Hình 3.23: Sơ đồ ngun lí Keypad

Trên đây là hình ảnh sơ đồ ngun lý của module bàn phím 4x4. Tuy có đến 16 nút nhấn, nghĩa là nếu làm một cách thông thường (dùng chân digital) thì ta phải cần đến 16 chân Arduino để đọc. Nhưng với bàn phím này, chúng ta chỉ cần dùng 8 chân (4 chân hàng ngang (row), và 4 chân cột dọc (column)).

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường

37 Kết nối Keypad với Arduino:

Bảng 3.5: Kết nối Arduino với Keypad

Arduino Keypad 5 R1 6 R2 7 R3 8 R4 9 C1 10 C2 11 C3 12 C4 3.3.8.2 Lập trình #include Keypad.h

const byte rows = 4; //số hàng const byte columns = 4; //số cột

int holdDelay = 700; //Thời gian trễ để xem là nhấn 1 nút nhằm tránh nhiễu int n = 3; //

int state = 0; //nếu state =0 ko nhấn,state =1 nhấn thời gian nhỏ , state = 2 nhấn giữ lâu

char key = 0;

//Định nghĩa các giá trị trả về char keys[rows][columns] = {

Khóa luận tốt nghiệp Đặng Trung Trực – Nguyễn Văn Trường 38 {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}, };

byte rowPins[rows] = {8, 7, 6, 5}; //Cách nối chân với Arduino byte columnPins[columns] = {12, 11, 10, 9};

//cài đặt thư viện keypad

Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rows,

Một phần của tài liệu Nghiên cứu và mô phỏng hệ thống tưới cây tự động có hiển thị màn hình LCD (Trang 28)