đây là tài liệu về cách giao tiếp căn bản giữa board Arduino Uno R3 và các module mạch điện thông dụng hiện nay như: DHT11, LM35, RTC DS1307, Cảm biến siêu âm SRF05, Module Wifi, Ethernetshield, Module Đo độ PH,... Tài liệu này là phần 1, bao gồm giao tiếp với DHT11, LM35 và module thời gian thực RTC DS1307. Tài liệu thật sự bổ ích cho các bạn mới tìm hiểu về arduino.
Trang 1LỜI NÓI ĐẦU
Ngày nay với sự phát triển của ngành kĩ thuật với những người đang theo học chuyên ngành kĩ thuật, những người muốn làm ứng dụng về điện- điện tử Vì thế nhu cầu sử dụng board mạch nhúng Arduino ngày càng được ưa chuộng và phát triển mạnh mẽ
Board mạch nhúng Arduino Uno R3 là một sản phẩm tuyệt với cho các bạn không chuyên về điện tử, lập trình có thể tạo ra cho mình những sản phẩm ứng dụng cao trong thực tế như: đo nhiệt độ, độ ẩm, tránh vật cản môi trường xung quanh, cân điện tử, đo mực nước, máy đo độ PH,…đây là một board mạch rất mạch ở khả năng sử dụng thư viện mở, và ứng dụng vào thực tế rất cao
Tài liệu này sẽ giúp các bạn tìm hiểu căn bản về cách giao tiếp giữa board mạch Arduino Uno R3 và các Module sử dụng cho arduino hiện nay Từ đó các bạn có thể tự thiết kế cho mình những ứng dụng, những sản phẩm phục vụ cho cuộc sống của bạn
Liên Hệ
Email: ttldientu@gmail.com
Sđt: 01686648144
Chúc thành công!
Trang 2MỤC LỤC
NHỮNG ĐIỀU LƯU Ý KHI SỬ DỤNG BOARD ARDUINO UNO R3 3
BÀI 1: GIAO TIẾP ARDUINO VÀ MODULE DHT11 5
1 Giới thiệu về module DHT11 5
2 Giao tiếp Arduino Uno và Module DHT11 5
Sơ đồ kết nối DHT11 vào Arduino Uno như sau: 5
3 Truyền nhận dữ liệu giữa Arduino và DHT11 6
Code giao tiếp: 7
BÀI 2: GIAO TIẾP ARDUINO VÀ MODULE RTC DS1307 8
1 Giới thiệu về DS1307 8
2 Module RTC DS1307- Thời gian thực 10
3 Lập trình giao tiếp DS1307 và Arduino Uno R3 11
BÀI 3: GIAO TIẾP ARDUINO VÀ LM35 14
1 Giới thiệu về IC LM35 14
2 Kết nối LM35 và Arduino Uno R3 14
3 Chuyển đổi ADC 15
Trang 3NHỮNG ĐIỀU LƯU Ý KHI SỬ DỤNG BOARD ARDUINO
UNO R3
Khi sử dụng board mạch nhúng Arduino Uno R3 phải chú ý đến các vấn đề sau
đây, để có thể sử dụng tránh làm hư hỏng board mạch:
Điều đầu tiên đó là chúng ta cấp nguồn ngoài cho board Arduino Điện áp cho phép là từ 7V- 12V, cấp vào jack DC của board mạch Ta có thể sử dụng adapter để cấp nguồn cho an toàn, ổn định Ta chọn 9V- 2A
Hình 1: Jack DC Arduino Uno
Hình 2: Adapter 9V- 2A
Trang 4 Chân 5Volt power pin: chân này cấp đầu ra 5V, khi sử dụng chân này cấp nguồn cho các module rời hay linh kiện khác thì phải đảm bảo dòng ra không vượt quá 500ma
Chân 3,3Volt power pin: chân này cấp đầu ra 3.3V, khi sử dụng chân này cấp cho các mạch rời thì phải đảm bảo dòng ra trên chân này không vượt quá 50ma
Chân Vin: chân này cũng có thể dùng để cấp nguồn ngoài cho Arduino Uno, chân dương nối vào chân Vin và chân âm nối vào chân Gnd của Arduino Uno
Chân IOREF: chân này dùng để đo điện áp sử dụng của Arduino, tuy nhiên bạn không được phép sử dụng để cấp nguồn cho các mạch ngoại vi
Arduino Uno được thiết kế không có hệ thống bảo vệ cắm ngược nguồn, vì thế trước đi cắm nguồn ngoài vào bạn phải kiểm thật kĩ, để tránh làm hỏng boar mạch
Các chân 3.3V, 5V được sử dụng để cấp nguồn cho các mạch ngoài Vì thế không khuyên dùng để cấp nguồn từ ngoài vào hai chân này cho board arduino
Cấp nguồn ngoài thông qua Vin hoặc jack DC dưới 6V có thể làm hỏng board
Cấp điện áp trên 13V qua chân reset có thể làm hỏng vi điều khiển ATMEGA328
Cường độ vào/ra ở tất cả các chân Analog/Digital nếu vượt quá 200ma sẽ làm hỏng board mạch
Cấp điện áp trên 5.5V vào các chân Analog/Digital sẽ làm hỏng vi điều khiển
Cường độ dòng điện qua một chân digital hoặc arduino bất kì vào khoảng 40ma, nếu vượt quá sẽ làm hỏng board Khuyên bạn nếu không dùng để truyền nhận dữ liệu thì nên mắc một điện trở hạn dòng
Trên đây là những điều bạn cần tránh khi sử dụng an toàn, hiệu quả board mạch Arduino Uno R3 Các bạn có thể đọc thêm tài liệu khác
Trang 5BÀI 1: GIAO TIẾP ARDUINO VÀ MODULE DHT11
1 Giới thiệu về module DHT11
DHT11 là cảm biến tích hợp đo cả nhiệt độ và độ ẩm
Hình 1: IC DHT11
Một vài thông số DHT11:
Đo độ ẩm khoảng 20% đến 95%
Nhiệt độ từ 00C đến 500C
Sai số độ ẩm: 5%
Sai số nhiệt độ: 20C
2 Giao tiếp Arduino Uno và Module DHT11
Sơ đồ kết nối DHT11 vào Arduino Uno nhƣ sau:
Vcc=5VDC
Gnd
DATA
Trang 6Thông số kết nối:
Nguồn: sử dụng nguồn một chiều khoảng 5V
Nối Mass: nối chung mass(Gnd) với Arduino Uno
Chân Data: đây là chân dùng để giao tiếp qua lại giữa Arduino và DHT11
Có sử dụng điện trở kéo chân Data lên mức cao thường trực, ta chọn điện trở này khoảng 10k và kéo lên Vcc=5VDC
3 Truyền nhận dữ liệu giữa Arduino và DHT11
DHT11 sử dụng chuẩn giao tiếp một dây, dựa vào việc ta thiết lập chân DATA của
ic DHT11 ở mức cao hoặc thấp, ngõ vào hoặc ngõ ra thì ta sẽ có thể giao tiếp được với DHT11 một cách dễ dàng
Ta sử dụng module được thiết kế sẵn dành cho các ứng dụng:
Bạn chỉ việc cấp nguồn 5VDC vào chân VCC và nối mass chung với Arduino nếu bạn cấp bằng Arduino Nếu bạn cấp nguồn ngoài cho module DHT11 thì bạn phải nối tất cả Mass chung lại với nhau Cuối cùng là nối chân DATA vào pin số 2 của board Arduino Uno
Cách thức giao tiếp giữa Arduino và Module DHT11:
Đầu tiên Arduino thiết lập chân Data là Output, kéo chân Data xuống 0 trong khoảng > 18ms( thường lấy khoảng 25ms) Khi đó DHT11 hiểu Arduino muốn giao tiếp
Tiếp theo Arduino đưa chân Data lên 1 và thiết lập là là chân Input
Sau từ khoảng 20us đến 40us DHT11 sẽ kéo chân Data xuống mức thấp Nếu trong khoảng > 40us DHT11 không kéo chân Data xuống thấp thì giao tiếp thất bại
Chân Data sẽ ở mức thấp khoảng 80us, sau đó được DHT11 kéo lên mức cao khoảng 80us Nếu đo được tín hiệu lên cao thì hoàn thành giao tiếp
Trang 7 DHT11 sẽ trả về nhiệt độ và độ ẩm trong 5byte, Trong đó:
Byte 1: giá trị phần nguyên của độ ẩm( RH%)
Byte 2: giá trị phần lẻ của độ ẩm( RH%)
Byte 3: giá trị phần nguyên của nhiệt độ( 0C)
Byte 4: giá trị phần lẻ của nhiệt độ(0C)
Byte 5: là tổng của 4 byte trên, nếu giá trị byte 5 này không bằng tổng giá trị của 4 byte đầu thì giao tiếp thất bại
Code giao tiếp:
Ta sử dụng thƣ viên giao tiếp của DHT11 và Arduino Uno R3
Thƣ viện giao tiếp các bạn có thể download tại link sau:
https://github.com/adafruit/DHT-sensor-library
các bạn tải thƣ viện về và chép vào file thƣ viên của Arduino nhé Sau đó mở code DHT11 trong Example lên nhé
Đoạn code tham khảo:
//==============================================
void loop() {
// Wait a few seconds between measurements
delay(2000);
float h = dht.readHumidity(); //đọc giá trị độ ẩm
float t = dht.readTemperature(); //đọc giá trị nhiệt độ
if (isnan(h) || isnan(t) || isnan(f)) { //kiểm tra giao tiếp ok hay không
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: "); //hiển thị RH=% lên Serial
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: "); //hiển thị nhiệt độ lên Serial
Serial.print(t);
Serial.print(" *C ");
}
//==============================================
Các hàm nhƣ: dht.readHumidity(),dht.readTemperature() đều có trong thƣ viên
DHT.h các bạn tải về các bạn có thể tìm hiểu trong thƣ viện đó nhé
Với các giá trị h,t các bạn có thể xuất ra led 7 đoạn, LCD 1602 để làm những ứng dụng đơn giản phục vụ cho cuộc sống hàng ngày
Trang 8BÀI 2: GIAO TIẾP ARDUINO VÀ MODULE RTC DS1307
1 Giới thiệu về DS1307
DS1307 là ic tích hợp thời gian thực được sử dụng rất nhiều trong các ứng dụng liên quan đến thời gian
Hình ảnh DS1307
Hình 1: IC DS1307
Thông số kĩ thuật:
8 chân
Điện áp hoạt động 5V
Sử dụng nguồn pin 3V bên ngoài để duy trì hoạt động khi mất điện
56 Byte RAM trống dành cho người dùng
Có thể xuất ra được xung tần số 1Hz, 4.096KHz, 8.192Kz, 32.768KHz
Tên và chức năng các chân của DS1307:
2 Gnd Chung mass với nguồn cấp vào và pin 3V
Dùng cho thạch anh 32768Hz
7 Vbat Chân Pin 3V nuôi mạch khi mất điện
8 SQW(OUT) Chân xuất xung có thể lập trình
Bảng 1: Tên Và Chức Năng Các Chân DS1307
Trang 9Các thanh ghi trong DS1307:
DS1307 bao gồm 7 thanh ghi(0x00- 0x06) chứa các thông tin về thời gian đồng hồ
và một thanh ghi Control( 0x07) dùng để điều khiển xuất xung ra trên chân SQW
Hình 2: các thanh ghi trong DS1307 Chú ý: các giá trị trong các thanh ghi trong DS1307 là giá trị dạng BCD:
Ví dụ: giả sử thanh ghi 0x00 có giá trị là: 00010100 Khi đó giá trị sẽ là:
0001=1 và 0100 =4 => giá trị sẽ là 14 Khi đó bạn muốn xuất ra trên lcd thì bạn biến đổi lại thành các giá trị thập phân hoặc xuất ra led 7 đoạn thì bạn dùng lun giá trị BCD này
Tên và chức năng các thanh ghi trong DS1307:
Trang 10Thanh ghi Control( 0x07):
Hình 4: 8 bits thanh ghi Control Trong đó:
OUT: lựa chọn mức logic xuất ra tại chân SQW/OUT khi không kích hoạt
chức năng SQW/OUT:
OUT=1: xuất ra mức logic 1
OUT=0: xuất ra mức logic 0
SQW=1: cho phép xuất xung clock ra chân này Với tần số đƣợc thiết lập
thông qua hai bit RS1 và RS0, ta có thể xem bảng sau:
Hình 5: chức năng thanh ghi Control
Theo bảng trên, nếu ta muốn làm ứng dụng về đèn giao thông, đếm sản phẩm cần
sử dụng đến thời gian thực thì ta sử dụng tần số 1Hz sẽ tạo ra chuẩn T=1s Có thể
sử dụng tần số thông qua chân SQW/OUT này để làm tần số hoạt động của mạch ngoại vi,…
2 Module RTC DS1307- Thời gian thực
Mạch RTC sử dụng DS1307 đƣợc thiết kế rất đơn giản với tần số hoạt động là 32768Hz, nguồn vào 5VDC với hai chân dữ liệu vào ra SCL, SDA Có nguồn nuôi pin 3V để đảm bảo hoạt động ở chế độ chờ
Sơ đồ mạch RTC dùng DS1307:
Hình 6: sơ đồ mạch điện RTC dùng DS1307
Trang 11Trong đó:
X1: thạch anh 32768Hz, nối vào hai chân 1, 2 của DS1307
Pin Cmos 3V: nguồn nuôi mạch khi mất điện, nối vào chân 3 DS1307
3 chân SCL(6), SDA(5), SQW/OUT(7): cần có điện trở 10kΩ kéo lên nguồn để hoạt động ổn định, không bị nhiễu khi truyền nhận dữ liệu
Giữa nguồn và mass có thể gắn thêm tụ điện 0.1uF để mạch hoạt động tốt hơn
Hình ảnh tham khảo về module RTC được thiết kế sẵn trên thị trường
Hình 7: Module RTC DS1307
3 Lập trình giao tiếp DS1307 và Arduino Uno R3
Để giao tiếp được với module RTC DS1307 các bạn phải tìm hiểu về giao tiếp I2C, trên internet có rất nhiều tài liệu về vấn đề này Các bạn phải nắm vững các phương pháp, đặc điểm của giao tiếp I2C để từ đó có thể sử dụng nhiều module I2C khác nữa cho những mục đích của các bạn
Về mặt lý thuyết thì trên một mạng I2C có tối đa 128 thiết bị giao tiếp với Arduino, mỗi thiết bị này đều có một địa chỉ giao tiếp riêng biệt.DS1307 có địa chỉ
Trang 12Chế độ Write:
Trong đó:
Điều kiện Start( S): khi SCL, SDA đều ở mức cao Nếu Arduino muốn giao tiếp với DS1307 thì Arduino sẽ kéo chân SDA xuống thấp trong khi chân
SCL vẫn ở mức cao
Điều kiện Stop(P): khi kéo chân SDA lên mức cao trong khi SCL vẫn ở mức cao Điều kiện Stop chỉ thực hiện khi quá trình truyện nhận dữ liệu đã
đƣợc thực hiện
Tiếp theo đó là địa chỉ Slave là 0x68 Đây là chế độ Write nên bit W=0, khi
đó Arduino sẽ gửi bit W theo sau Slave Address Sau đó DS1307 sẽ gửi một bit ACK về Arduino Tiếp theo là ghi vào từng địa chỉ trong các thanh ghi: second, minutes, hour, date, day, month, year của DS1307 Việc giao tiếp
kết thức khi Arduino phát ra điều kiện Stop
Chế độ Read:
Trong đó:
Arduino sẽ gửi Slava address + W(=1) = 0xD1, sau đó tiến hành đọc dữ liệu
về từ DS1307 Dữ liệu đọc đƣợc các giá trị BCD của thời gian Các bạn có
thể sử dụng với ứng dụng của các bạn
Các điều kiện Start, Stop giống với phần Write phía trên
Thƣ viện RTC DS1307 và code Arduino các bạn có thể tải theo link sau:
https://github.com/adafruit/RTClib
Trang 13Một số hàm giao tiếp trong thư viện wire.h Arduino:
Trên board Arduino Uno R3: SDA là chân analog 4, và SCL là chân analog 5
Wire.begin(address): khởi tạo thư viện wire.h và tham gia vào mạng I2C address là địa chỉ DS1307( 0x68) Nếu không có địa chỉ thì đó là Master
Wire.beginTransmission(address): bắt đầu truyền dữ liệu đến DS1307
Wire.endTransmission(): kết thức quá trình truyền dữ liệu đến DS1307 đã được bắt đầu bằng Wire.beginTransmission(address)
Wire.requestFrom(address, quanty): yêu cầu dữ liệu từ Arduino Uno R3 với DS1307 Address = 0x68 và quanty là số byte yêu cầu nhận
Wire.write(value): ghi value lên DS1307 giữa hai tín hiệu Start và Stop
Wire.read(): đọc dữ liệu từ DS1307, là các giá trị thời gian
Lưu ý khi giao tiếp DS1307:
Thanh ghi second có bit 7 là CH- khóa giao động, do đó khi ta lấy giá trị second từ DS1307 về ta loại bỏ bit7 này, ví dụ:
Second = Wire.read() & 0x7f
Khi ta thực hiện phép toán & với 0x7f thì bit 7 được loại bỏ
Thanh ghi hour: bit6=1, chế độ 12h, do đó ta cần loại bỏ bit6, do đó:
Hour = Wire.read() & 0x3f
Khi ghi dữ liệu cài đặt lại thời gian khởi tạo ban đầu cho DS1307 ta phải đưa giá trị vào dạng BCD, code chuyển đổi:
((second/10 * 16) + (second % 10))
Với các ứng dụng của module thời gian thực RTC trong cuộc sống là rất nhiều, như hệ thống phun tưới tự động, bật tắt tự động thiết bị đèn trong nhà để tiết kiệm điện năng
Trang 14BÀI 3: GIAO TIẾP ARDUINO VÀ LM35
1 Giới thiệu về IC LM35
Đây là cảm biến nhiệt độ dạng analog, dùng để đo nhiệt độ môi trường xung quanh Dựa vào sự thay đổi điện áp đầu vào so với nhiệt độ môi trường
Một vài hình ảnh về M35:
Hình 1: LM35 thực tế Hình 2: sơ đồ chân
Thông số kĩ thuật:
Điện áp hoạt động: 4- 20V.( Tùy loại nhé các bạn)
Độ phân giải điện áp: 10bit, 10mv/0C( Celsius)
Độ chính xác cao ở 250C là 0.50C
Dải nhiệt độ đo được: -500C đến 1500C
Một vài thông số kĩ thuật khác các bạn có thể tra trong datasheet nhé
2 Kết nối LM35 và Arduino Uno R3
Cách kết nối LM35 vào Arduino Uno R3 như sau:
Hình 3: kết nối LM35 và Arduino Uno R3
Trang 15Ta kết nối như sau:
Chân số 1 của LM35 ta mắc vào nguồn out- 5VDC của Arduino Uno R3, có thể thì các bạn nên sử dụng nguồn 5VDC rời nhé Vì khi sử dụng nguồn của arduino có thể làm hư board
Chân số 3 các bạn mắc vào Gnd của arduino Nếu sử dụng nguồn ngoài thì cần mắc chung mass của nguồn và arduino
Chân ở giữa các bạn mắc vào một trong 6 chân analog của arduino nhé ở đây mình mắc vào kênh A0 của Arduino Uno R3
Các bạn có thể mắc trực tiếp theo hình 3 cũng được, nếu cần chống nhiễu các bạn
có thể mắc một tụ điện 102 vào 2 chân 1 và 3 của LM35
Hình 4: Tụ điện 102
3 Chuyển đổi ADC
Arduino giao tiếp với LM35 hay các loại chip lập trình khác như: MSP430, AVR, STM, PIC,… thì cũng phải giao tiếp qua ADC
Chuyển đổi ADC có nhiều dạng như: ADC 10bits, ADC 12bits,…
ở đây sử dụng giao tiếp ADC 10bits
Tính toán thông số chuyển đổi ADC 10bits:
Theo trong datasheet LM35 thì 10C sẽ cho ra chân số 2 của LM35 là 10mV Đây là chuyển đổi 10bits nên ta sẽ có 1024 giá trị ADC
Giả sử:
- Nhiệt độ môi trường là 300C thì đầu ra của chân 2 LM35 sẽ có mức điện áp
là 300mV Khi đó ta sẽ đo giá trị này, đưa vào chuyển đổi ADC trong Arduino để suy ngược lại giá trị nhiệt độ
Điện áp cấp cho LM35 là 5VDC
Bước thay đổi của LM35 là 5/1024 giá trị ADC Khi đó ta suy ra giá trị nhiệt độ đo được từ giá trị lượng tử ADC đầu vào thay đổi theo giá trị điện áp đầu vào theo công thức :
Float temperature = (5.0*analogRead(A0)*100.0/1024.0)