1 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 2 MỤC LỤC A. GIỚI THIỆU VỀ ARDUINO .................................................................................. 30 I. ARDUINO LÀ GÌ? ................................................................................................... 32 II. ARDUINO LÀM ĐƢỢC NHỮNG GÌ? .................................................................. 33 III. SƠ LƢỢC VỀ ARDUINO UNO R3 ........................................................................ 36 1. Một số thông số kỹ thuật nhƣ sau : ...................................................................... 37 2. Sơ đồ chân của Arduino Uno................................................................................ 38 IV. SƠ LƢỢC BỘ KIT TỰ HỌC ARDUINO .............................................................. 40 1. Giới thiệu sơ lƣợc về KIT TỰ HỌC: ................................................................... 40 2. Những lợi ích của Kit Tự Học Arduino: ............................................................. 40 3. Mục đích của bộ KIT TỰ HỌC: .......................................................................... 41 4. Một số bộ KIT TỰ HỌC ARDUINO: ................................................................ 42 V. CÀI ĐẶT PHẦN MỀM IDE VÀ DRIVER ............................................................ 42 1. Cài đặt phần mềm Arduino IDE: ........................................................................ 42 a. Cài Java Runtime Environment (JRE). ....................................................................................... 42 b. Cài đặt Arduino IDE: .................................................................................................................. 43 2. Cài đặt Driver đối với Arduino Uno, mê ga,…: ................................................. 45 a. Cài đặt Driver:............................................................................................................................. 45 b. Nạp chƣơng trình cho Arduino Uno (mega tƣơng tự): ............................................................... 47 3. Cài đặt Driver đối với Nano: ................................................................................ 49 a. Giới thiệu board arduino Nano. .................................................................................................. 49 b. Cài đặt driver cho Arduino Nano ................................................................................................ 49 c. Thông số kỹ thuật Arduino Nano:............................................................................................... 50 d. Nạp chƣơng trình cho Arduino Nano:......................................................................................... 51 VI. GIỚI THIỆU PHẦN MỀM ( FRITZING) HỔ TRỢ VIỆC VẼ MẠCH NGUYÊN LÝ 52 1. Giới thiệu phần mềm Fritzing:............................................................................. 52 2. Dowload phần mềm Fritzing ( miễn phí): ........................................................... 53 3. Hƣớng dẫn sử dụng phần mềm: .......................................................................... 54 B. NGÔN NGỮ LẬP TRÌNH ARDUINO ..................................................................... 55 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 3 I. HÀM CHỨC NĂNG (FUNCTION): ...................................................................... 55 1. Hàm nhập xuất Digital I/O: .................................................................................. 56 a. digitalWrite(): ............................................................................................................................. 56 b. digitalRead(): .............................................................................................................................. 57 c. pinMode(): .................................................................................................................................. 58 2. Hàm nhập xuất Analog I/O: ................................................................................. 60 a. analogRead() ............................................................................................................................... 60 b. analogReference () ...................................................................................................................... 61 c. analogWrite() .............................................................................................................................. 63 d. analogReadResolution (): ............................................................................................................ 64 e. analogWriteResolution () ............................................................................................................ 66 3. Hàm nhập xuất nâng cao I/O: ........................................................................... 68 a. noTone();..................................................................................................................................... 68 b. pulseIn () ..................................................................................................................................... 68 c. shiftIn(); ...................................................................................................................................... 69 d. shiftOut(); .................................................................................................................................... 70 e. tone(); .......................................................................................................................................... 73 4. Hàm thời gian: ....................................................................................................... 74 a. delay() ......................................................................................................................................... 74 b. delayMicroseconds () .................................................................................................................. 75 c. micros() ....................................................................................................................................... 76 d. millis(); ........................................................................................................................................ 77 5. Hàm toán học: ........................................................................................................ 79 a. abs()............................................................................................................................................. 79 b. constrain() ................................................................................................................................... 79 c. map() ........................................................................................................................................... 80 d. max() ........................................................................................................................................... 81 e. min()............................................................................................................................................ 81 f. sq() .............................................................................................................................................. 82 g. sqrt() ............................................................................................................................................ 82 6. Hàm lƣợng giác: .................................................................................................... 83 a. cos()............................................................................................................................................. 83 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 4 b. sin() ............................................................................................................................................. 83 c. tan() ............................................................................................................................................. 84 7. Hàm số ngẫu nhiên: ............................................................................................... 84 a. random()...................................................................................................................................... 84 b. randomSeed() .............................................................................................................................. 85 8. Bits và Bytes: .......................................................................................................... 87 a. Bit() ............................................................................................................................................. 87 b. bitClear() ..................................................................................................................................... 88 c. bitRead() ..................................................................................................................................... 88 d. bitWrite()..................................................................................................................................... 89 e. bitSet()......................................................................................................................................... 90 f. lowByte() .................................................................................................................................... 90 g. highByte() ................................................................................................................................... 91 9. Hàm Ngắt (interrupt) ............................................................................................ 92 a. interrupts()................................................................................................................................... 92 b. noInterrupts() .............................................................................................................................. 93 10. Hàm Ngắt Ngoài: ................................................................................................... 94 a. attachInterrupt() .......................................................................................................................... 94 b. detachInterrupt() ......................................................................................................................... 96 11. Hàm Giao tiếp ........................................................................................................ 98 a. Serial()......................................................................................................................................... 98 12. Xử lý chuỗi: ............................................................................................................ 99 a. Hàm isAlpha() ............................................................................................................................. 99 b. Hàm isAscii() ............................................................................................................................ 100 c. Hàm isWhitespace() .................................................................................................................. 101 d. Hàm isPrintable(): ..................................................................................................................... 102 e. Hàm isUpperCase(): ..................................................................................................................... 103 f. Hàm isHexadecimalDigit() .......................................................................................................... 104 g. tolower: ....................................................................................................................................... 105 h. Hàm toupper() .............................................................................................................................. 105 i. Hàm isLowerCase() ....................................................................................................................... 106 II. GIÁ TRỊ : ................................................................................................................ 107 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 5 1. Hằng số ................................................................................................................. 108 a. Hằng số thực: ............................................................................................................................ 108 b. Hằng số nguyên......................................................................................................................... 108 c. HIGH......................................................................................................................................... 111 d. LOW ......................................................................................................................................... 112 e. INPUT:...................................................................................................................................... 113 f. INPUT_PULLUP ...................................................................................................................... 113 g. OUTPUT ................................................................................................................................... 114 h. LED_BUILTIN ......................................................................................................................... 114 i. true ............................................................................................................................................ 114 j. false ........................................................................................................................................... 115 2. Kiểu dữ liệu: ......................................................................................................... 115 a. void ........................................................................................................................................... 115 b. boolean ...................................................................................................................................... 116 c. int: ............................................................................................................................................. 117 d. unsigned int ............................................................................................................................... 118 e. char............................................................................................................................................ 119 f. unsigned char ............................................................................................................................ 119 g. byte............................................................................................................................................ 119 h. word .......................................................................................................................................... 120 i. long ........................................................................................................................................... 120 j. unsigned long ............................................................................................................................ 120 k. short........................................................................................................................................... 121 l. float ........................................................................................................................................... 121 m. double.................................................................................................................................... 122 n. array .......................................................................................................................................... 122 o. string ......................................................................................................................................... 124 3. Chuyển đổi kiểu dữ liệu ...................................................................................... 126 a. char() ......................................................................................................................................... 126 b. byte() ......................................................................................................................................... 126 c. int()............................................................................................................................................ 127 d. word()........................................................................................................................................ 127 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 6 e. long() ......................................................................................................................................... 128 f. float()......................................................................................................................................... 128 4. Biến hằng, biến tĩnh: ......................................................................................... 129 a. const - biến hằng ....................................................................................................................... 129 b. static - biến tĩnh ......................................................................................................................... 129 III. CẤU TRÚC ( STRUCTURE): ............................................................................... 131 1. Cấu trúc tổng thể:................................................................................................ 131 a. setup() và loop() ........................................................................................................................ 131 2. Toán tử logic: ....................................................................................................... 132 3. Các toán tử so sánh. ............................................................................................ 132 4. Cấu trúc điều khiển:............................................................................................ 133 a. Câu lệnh if…..else..................................................................................................................... 133 b. switch / case .............................................................................................................................. 134 c. for .............................................................................................................................................. 135 d. while.......................................................................................................................................... 137 e. break.......................................................................................................................................... 137 f. continue ..................................................................................................................................... 138 g. return ......................................................................................................................................... 139 h. goto ........................................................................................................................................... 139 5. Toán tử số học:..................................................................................................... 140 a. Phép gán(=) ............................................................................................................................... 140 b. Các phép cộng, trừ, nhân, chia trong Arduino .......................................................................... 140 c. Phép chia lấy dƣ%..................................................................................................................... 141 6. Cú pháp mở rộng ................................................................................................. 142 a. dấu chấm phẩy ( ; ).................................................................................................................... 142 b. {} dấu ngoặc nhọn .................................................................................................................... 142 c. Comments - Viết ghi chú trong khi viết code Arduino ............................................................. 144 d. #define....................................................................................................................................... 145 e. #include ..................................................................................................................................... 145 7. Phép toán hợp nhất ............................................................................................. 146 a. Cộng một 1 đơn vị (++) / trừ một 1 đơn vị (--) ......................................................................... 146 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 7 b. Các phép toán rút gọn += , -= , *= , /=...................................................................................... 147 C. CẤU TRÚC CHƢƠNG VÀ BÀI HỌC LẬP TRÌNH TỪ CƠ BẢN ĐẾN NÂNG CAO ................................................................................................................................ 148 I. CẤU TRÚC CHƢƠNG TRÌNH ARDUINO VÀ CÁCH THÊM THƢ VIỆN VÀO IDE. ....................................................................................................................... 148 1. Cấu trúc chƣơng trình Arduino: ....................................................................... 148 2. Hƣớng dẫn add thƣ viện cho Arduino IDE: ..................................................... 149 II. BÀI HỌC LẬP TRÌNH ARDUINO TỪ CƠ BẢN ĐẾN NÂNG CAO. ............. 154 1. Điều khiển LED đơn sáng nhấp nháy................................................................ 154 Nội dung chính. ................................................................................................................................. 154 Phần cứng ( Trên kit đã tích hợp sẵn chỉ cần nối dây là đƣợc) ......................................................... 154 Lắp mạch ........................................................................................................................................... 154 Hình ảnh thực tế: ............................................................................................................................... 155 Code lập trình và giải thích ............................................................................................................... 155 2. Thay đổi độ sáng của LED đơn. ......................................................................... 157 Nội dung chính:................................................................................................................................. 157 Phần cứng ( đƣợc tích hợp sẵn trên kit) nếu không có các bạn chuẩn bị: ......................................... 157 Lắp mạch ........................................................................................................................................... 157 Hình ảnh thực tế: ............................................................................................................................... 158 Chƣơng trình: .................................................................................................................................... 158 3. Điều khiển đèn giao thông. ................................................................................. 159 Phần cứng cần chuẩn bị ( nếu sử dụng kit thì đƣợc tích hợp sẵn)..................................................... 159 Lắp mạch:.......................................................................................................................................... 159 Hình ảnh thực tế: ............................................................................................................................... 160 Code lập trình:................................................................................................................................... 160 4. Điều khiển Rơ le 5Vdc 1, 2 kênh mức cao. ........................................................ 162 Giới thiệu thiệu chung:...................................................................................................................... 162 Thông số kỹ thuật: ............................................................................................................................ 162 Phần cứng chuẩn bị: .......................................................................................................................... 162 Lắp mạch:.......................................................................................................................................... 163 Code chƣơng trình: ........................................................................................................................... 163 Hình ảnh thực tế: ............................................................................................................................... 164 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 8 5. Điều khiển Công tắc tơ 3 pha: ............................................................................ 164 Giới thiệu công tắc tơ 3 pha: ............................................................................................................. 164 Phần cứng chuẩn bị: .......................................................................................................................... 166 Lắp mạch:.......................................................................................................................................... 167 Code chƣơng trình: ........................................................................................................................... 167 6. Đọc tín hiệu nút nhấn hiển thị lên serial monitor............................................. 168 Giới thiệu về nút nhấn:...................................................................................................................... 168 Phần cứng chuẩn bị: .......................................................................................................................... 170 Sơ đồ nguyên lí: ................................................................................................................................ 171 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn): ......................................................... 171 Hình ảnh thực tế: ............................................................................................................................... 172 Lập trình:........................................................................................................................................... 172 7. Lƣu giá trị nút nhấn. ........................................................................................... 174 Phần cứng chuẩn bị: .......................................................................................................................... 174 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn): ......................................................... 174 Hình ảnh thực tế: ............................................................................................................................... 175 Lập trình:........................................................................................................................................... 175 8. Bật tắt LED khi nhấn nút nhấn. ........................................................................ 177 Phần cứng chuẩn bị: .......................................................................................................................... 177 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn): ......................................................... 177 Hình ảnh thực tế: ............................................................................................................................... 178 Lập trình:........................................................................................................................................... 178 9. Bật tắt rơ le khi nhấn nút nhấn. ......................................................................... 180 Phần cứng chuẩn bị: .......................................................................................................................... 180 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn): ......................................................... 180 Hình ảnh thực tế: ............................................................................................................................... 181 Lập trình:........................................................................................................................................... 181 10. Lập trình hiển thị led 7 đoạn đơn: .................................................................... 183 Giới thiệu led 7 đoạn đơn:................................................................................................................ 183 Phần cứng chuẩn bị: .......................................................................................................................... 184 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn): ......................................................... 185 Lập trình:........................................................................................................................................... 185 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 9 Hình ảnh thực tế: ............................................................................................................................... 187 11. Hiển thị chữ cái, số ra module 4 led 7 đoạn. ..................................................... 188 Giới thiệu module 4 led 7 đoạn:........................................................................................................ 188 Phần cứng chuẩn bị: .......................................................................................................................... 189 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn): ....................................................................... 189 Hình ảnh thực tế: ............................................................................................................................... 190 Lập trình:........................................................................................................................................... 190 12. Lập trình hiển thị module led ma trận 8x8. ...................................................... 192 Giới thiệu module ma trận 8x8: ........................................................................................................ 192 Phần cứng chuẩn bị: ( tất cả đƣợc tích hợp trên Kit Tự Học) ........................................................... 192 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn): ....................................................................... 193 Hình ảnh thực tế: ............................................................................................................................... 193 Lập trình:........................................................................................................................................... 193 13. Hiển thị chữ lên màn hình LCD16x02. .............................................................. 198 Giới thiệu module LCD 16X02: ....................................................................................................... 198 Phần cứng chuẩn bị: ( tất cả đƣợc tích hợp trên Kit Tự Học) ........................................................... 198 Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây): .............................................................. 199 Hình ảnh thực tế: ............................................................................................................................... 200 Lập trình:........................................................................................................................................... 200 14. Kết hợp Module I2C với LCD16x02. ................................................................. 200 Giới thiệu module I2C cho LCD:...................................................................................................... 200 Phần cứng chuẩn bị: ( tất cả đƣợc tích hợp trên Kit Tự Học) ........................................................... 201 Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây): .............................................................. 201 Lập trình:........................................................................................................................................... 202 Hình ảnh thực tế: ............................................................................................................................... 202 15. Đọc giá trị cảm biến quang trở hiển thị lên serial monitor. ............................ 203 Giới thiệu cảm biến quang trở: ......................................................................................................... 203 Phần cứng chuẩn bị: (đƣợc tích hợp trên Kit Tự Học)...................................................................... 204 Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây): .............................................................. 204 Hình ảnh thực tế: ............................................................................................................................... 204 Lập trình:........................................................................................................................................... 205 16. Đọc gái trị CB nhiệt độ LM35 hiển thị lên serial monitor. .............................. 206 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 10 Giới thiệu cảm biến nhiệt độ LM35: ................................................................................................. 206 Phần cứng chuẩn bị: .......................................................................................................................... 207 Lắp mạch:.......................................................................................................................................... 207 Hình ảnh thực tế: ............................................................................................................................... 207 Lập trình:........................................................................................................................................... 207 17. Đọc giá trị CB nhiệt độ DS18B20 hiển thị lên serial monitor. ........................ 208 Giới thiệu cảm biến nhiệt độ DS 18B20: .......................................................................................... 208 Phần cứng chuẩn bị: .......................................................................................................................... 209 Lắp mạch:.......................................................................................................................................... 210 Lập trình:........................................................................................................................................... 210 18. Hiển thị giá trị CB nhiệt độ LM35 lên mà hình LCD. ..................................... 212 Phần cứng chuẩn bị: .......................................................................................................................... 212 Lắp mạch :......................................................................................................................................... 212 Lập trình :.......................................................................................................................................... 212 Hình ảnh thực tế: ............................................................................................................................... 213 19. Đọc giá trị cảm biến mƣa hiển thị lên serial monitor. ..................................... 214 Giới thiệu cảm biến mƣa: .................................................................................................................. 214 Phần cứng chuẩn bị: .......................................................................................................................... 215 Lắp mạch :......................................................................................................................................... 215 Lập trình :.......................................................................................................................................... 215 Hình ảnh thực tế: ............................................................................................................................... 216 20. Đọc giá trị CB siêu âm SRF 05 hiển thị lên serial monitor. ............................ 217 Giới thiệu cảm biến siêu âm SRF05: ................................................................................................ 217 Phần cứng chuẩn bị: .......................................................................................................................... 218 Lắp mạch :......................................................................................................................................... 218 Hình ảnh thực tế: ............................................................................................................................... 219 Lập trình :.......................................................................................................................................... 220 Kết quả hiển thị lên Serial monitor : ................................................................................................. 221 21. Đọc giá trị cảm biến độ ẩm đất hiển thị lên LCD16x02. .................................. 221 Giới thiệu cảm biến độ ẩm đất: ......................................................................................................... 221 Thông số kỹ thuật: ............................................................................................................................ 222 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn) ................................................................................... 222 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 11 Lắp mạch :......................................................................................................................................... 222 Hình ảnh thực tế: ............................................................................................................................... 223 Lập trình :.......................................................................................................................................... 223 Kết quả hiển thị lên Serial monitor : ................................................................................................. 224 22. Đọc giá trị CB dò line hiển thị lên serial monitor và LCD. ............................. 224 Giới thiệu cảm biến dò line: .............................................................................................................. 224 Thông số kỹ thuật: ............................................................................................................................ 225 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn) ................................................................................... 225 Lắp mạch :......................................................................................................................................... 226 Lập trình :.......................................................................................................................................... 226 Hình ảnh thực tế: ............................................................................................................................... 228 Kết quả hiển thị lên Serial monitor : ................................................................................................. 228 23. Đọc giá trị điện áp khi điều chỉnh biến trở hiển thị lên serial ......................... 229 Giới thiệu về biến trở: ....................................................................................................................... 229 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn biến trở 10K) .............................................................. 229 Lắp mạch :......................................................................................................................................... 229 Lập trình :.......................................................................................................................................... 230 Hình ảnh thực tế: ............................................................................................................................... 231 Kết quả hiển thị lên Serial monitor : ................................................................................................. 231 24. Hiển thị thời gian thực (DS1307) lên LCD và serial monitor.......................... 232 Giới thiệu về module DS1307: ......................................................................................................... 232 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn biến trở 10K) .............................................................. 233 Lắp mạch :......................................................................................................................................... 233 Lập trình :.......................................................................................................................................... 234 Hình ảnh thực tế: ............................................................................................................................... 236 Kết quả hiển thị lên Serial monitor : ................................................................................................. 236 25. Hiển thị tốc độ đo bằng Encoder quay lên LCD............................................... 237 Giới thiệu về module Encoder quay: ................................................................................................ 237 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ) .................................................................................. 237 Thông số kỹ thuật: ............................................................................................................................ 237 Lắp mạch:.......................................................................................................................................... 240 Lập trình :.......................................................................................................................................... 240 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 12 Hình ảnh thực tế: ............................................................................................................................... 243 26. Cài đặt và hiển thị nhiệt độ, độ ẩm (DTH11).................................................... 243 Giới thiệu về giao tiếp I2C: ............................................................................................................... 243 Thông số kỹ thuật DHT11: ............................................................................................................... 244 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). ................................................................................. 244 Lập trình :.......................................................................................................................................... 246 Hình ảnh thực tế: ............................................................................................................................... 248 27. Điều khiển động cơ servo SG90: ........................................................................ 249 Giới thiệu về động cơ servo SG90: ................................................................................................... 249 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). ................................................................................. 249 Lắp mạch:.......................................................................................................................................... 250 Lập trình :.......................................................................................................................................... 250 Hình ảnh thực tế: ............................................................................................................................... 251 28. Điều khiển động cơ bƣớc stepper 28BYJ-48: .................................................. 252 Giới thiệu về động cơ bƣớc stepper 28BYJ-48: ............................................................................... 252 Thông số kỹ thuật: ............................................................................................................................ 252 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). ................................................................................. 252 Lắp mạch:.......................................................................................................................................... 253 Lập trình :.......................................................................................................................................... 253 Hình ảnh thực tế: ............................................................................................................................... 255 29. Bật tắt LED bằng Remote hồng ngoại: ............................................................. 256 Giới thiệu về Remote hồng ngoại: .................................................................................................... 256 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). ................................................................................. 257 Mắt thu hồng ngoại: .......................................................................................................................... 257 Lắp mạch:.......................................................................................................................................... 258 Lập trình:........................................................................................................................................... 258 Hình ảnh thực tế: ............................................................................................................................... 261 30. Điều khiển động cơ bằng module L298n:.......................................................... 261 Giới thiệu về Module L298:.............................................................................................................. 261 Thông số kỹ thuật: ............................................................................................................................ 262 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). ................................................................................. 262 Lắp mạch. .......................................................................................................................................... 262 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 13 Lập trình:........................................................................................................................................... 263 31. Lập trình module Wifi ESP8266 V1 bằng Uno R3: ......................................... 265 Giới thiệu về module Wifi ESP8266 V1: ......................................................................................... 265 Thông số kỹ thuật: ............................................................................................................................ 265 Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). ................................................................................. 266 Lắp mạch:.......................................................................................................................................... 266 Lập trình :.......................................................................................................................................... 267 Hình ảnh thực tế: ............................................................................................................................... 269 32. Giao tiếp giữa 2 board Arduino với nhau. ........................................................ 270 Giới thiệu: ......................................................................................................................................... 270 Thƣ viện hổ trợ việc giao tiếp giữa 2 Arduino:................................................................................ 270 Phần cứng chuẩn bị: .......................................................................................................................... 270 Lắp mạch:.......................................................................................................................................... 270 Lập trình:........................................................................................................................................... 271 33. Điều khiển LED RGB ( LED 3 màu). ................................................................ 272 Giới thiệu: ......................................................................................................................................... 272 Để thay màu sắc của LED RGB, ta chỉ việc thay đổi độ sáng của từng con diode (led) trong con led rgb. Để thay đổi độ sáng của một con LED ta chỉ việc điều chỉnh điện áp xuất ra con LED, mà để điều chỉnh điện áp xuất ra con LED ta sẽ dùng xung PWM. ............................................................ 273 Lắp mạch:.......................................................................................................................................... 273 Lập trình:........................................................................................................................................... 273 Hình ảnh thực tế: ............................................................................................................................... 274 34. Hiển thị giá trị điện áp khi điều chỉnh biến trở. ............................................... 275 Giới thiệu: ......................................................................................................................................... 275 Phần cứng chuẩn bị: .......................................................................................................................... 276 Lắp mạch:.......................................................................................................................................... 276 Lập trình:........................................................................................................................................... 277 35. Đọc giá trị cảm biến báo cháy hiển thị serial monitor. .................................... 277 Giới thiệu: ......................................................................................................................................... 277 Thông số kĩ thuật: ............................................................................................................................. 277 Phần cứng chuẩn bị: .......................................................................................................................... 278 Lắp mạch:.......................................................................................................................................... 278 Lập trình:........................................................................................................................................... 279 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 14 36. Đọc giá trị CB màu (TCS3200) hiển thị serial monitor. .................................. 280 Giới thiệu: ......................................................................................................................................... 280 Thông số kĩ thuật: ............................................................................................................................. 280 Phần cứng chuẩn bị: .......................................................................................................................... 281 Lắp mạch:.......................................................................................................................................... 282 Lập trình:........................................................................................................................................... 282 37. Đọc giá trị CB chuyển động PIR hiển thị serial monitor. ................................ 283 Giới thiệu: ......................................................................................................................................... 283 Nguyên lý làm việc của loại đầu dò PIR nhƣ hình sau: .................................................................... 284 Thông số kĩ thuật: ............................................................................................................................. 285 Phần cứng chuẩn bị: .......................................................................................................................... 285 Lắp mạch:.......................................................................................................................................... 286 Lập trình:........................................................................................................................................... 286 38. Đọc giá trị CB khí gas (MQ2) hiển thị serial monitor..................................... 287 Giới thiệu: ......................................................................................................................................... 287 Thông số kĩ thuật: ............................................................................................................................. 288 Phần cứng chuẩn bị: .......................................................................................................................... 288 Lắp mạch:.......................................................................................................................................... 288 Lập trình:........................................................................................................................................... 288 39. Điều khiển thiết bị bằng BLUETOOTH ( HC05 hoặc HC06) ( chỉ áp dụng cho Điện thoại android). ................................................................................................... 289 Giới thiệu: ......................................................................................................................................... 289 Thông số kĩ thuật: ............................................................................................................................. 289 Phần cứng chuẩn bị: .......................................................................................................................... 290 Lắp mạch:.......................................................................................................................................... 290 Lập trình cho Arduino:...................................................................................................................... 291 Viết app điều khiển thiết bị điện bằng Bluetooth trên điện thoại Andriod: ...................................... 292 Hình ảnh thực tế: ............................................................................................................................... 294 40. Sử dụng IC Max7219 để điều khiển led ma trận 8x8. ...................................... 294 Giới thiệu: ......................................................................................................................................... 294 Thông số kĩ thuật: ............................................................................................................................. 295 Phần cứng chuẩn bị: .......................................................................................................................... 295 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 15 Lắp mạch:.......................................................................................................................................... 295 Lập trình:........................................................................................................................................... 295 Hình ảnh thực tế: ............................................................................................................................... 296 41. Đo Tốc Độ Động Cơ Bằng Cảm Biến IR FC03. ................................................ 297 Giới thiệu: ......................................................................................................................................... 297 Phần cứng chuẩn bị: .......................................................................................................................... 297 CB tốc độ IR FC03: .......................................................................................................................... 297 Thông số kĩ thuật: ............................................................................................................................. 298 Nguyên lý hoạt động: ........................................................................................................................ 298 Lắp mạch:.......................................................................................................................................... 299 Lập trình:........................................................................................................................................... 299 42. Điều khiển RGB LED sử dụng Module Bluetooth HC05 . ............................. 300 Giới thiệu: ......................................................................................................................................... 300 Phần cứng chuẩn bị: .......................................................................................................................... 300 Lắp mạch:.......................................................................................................................................... 300 Lập trình cho arduino: ....................................................................................................................... 301 Lập trình app cho điện thoại Android: .............................................................................................. 302 43. Làm game với led ma trận 8x8 Max7219 . ........................................................ 303 Phần cứng chuẩn bị: .......................................................................................................................... 303 Lắp mạch:.......................................................................................................................................... 303 Lập trình:........................................................................................................................................... 305 Hình ảnh thực tế: ............................................................................................................................... 306 44. Lập trình với keypad 4x4 . .................................................................................. 307 Giới thiệu: ......................................................................................................................................... 307 Lắp mạch:.......................................................................................................................................... 308 Lập trình:........................................................................................................................................... 308 Hình ảnh thực tế: ............................................................................................................................... 309 45. Điều khiển thiết bị bằng module enthernet shiled . ........................................ 310 Giới thiệu về enthernet shiled: .......................................................................................................... 310 Phần cứng chuẩn bị: .......................................................................................................................... 310 Lắp mạch:.......................................................................................................................................... 311 Lập trình:........................................................................................................................................... 311 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 16 46. Đọc giá trị cảm biến áp suất BM180 . ................................................................ 313 Giới thiệu về BM180: ....................................................................................................................... 313 Phần cứng chuẩn bị: .......................................................................................................................... 314 Lắp mạch:.......................................................................................................................................... 314 Lập trình:........................................................................................................................................... 314 Hình ảnh thực tế: ............................................................................................................................... 316 47. Chạy chữ trên led ma trận 8x8 sử dụng Bluetooth HC05. .............................. 317 Phần cứng chuẩn bị: .......................................................................................................................... 317 Lắp mạch:.......................................................................................................................................... 317 Lập trình cho arduino: ....................................................................................................................... 317 Lập trình app Inventor cho điện thoại android. ................................................................................. 319 48. Điều khiển hiệu ứng RGB LED WS2812b. ....................................................... 319 Phần cứng chuẩn bị: .......................................................................................................................... 319 Giới thiệu led WS2812B: .................................................................................................................. 320 Lắp mạch:.......................................................................................................................................... 320 Lập trình cho arduino: ....................................................................................................................... 321 49. Mô phỏng hệ thống radar bằng cảm biến siêu âm SRF05. ............................ 322 Phần cứng chuẩn bị: .......................................................................................................................... 322 Lắp mạch:.......................................................................................................................................... 322 Lập trình cho arduino: ....................................................................................................................... 322 Lập trình code cho processing: ......................................................................................................... 323 Hình ảnh thực tế: ............................................................................................................................... 324 50. Lập trình điều khiển module rơ le bán dẫn SSR . ............................................ 325 Giới thiệu rơ le bán dẫn SSR: ........................................................................................................... 325 Thông số kĩ thuật: ............................................................................................................................. 325 Lắp mạch:.......................................................................................................................................... 326 Lập trình cho arduino: ....................................................................................................................... 326 D. IOT ( Internet Of Things ) ...................................................................................... 328 I. Khái niệm Internet Of Things ( IOT) là gì?. ........................................................ 328 1. Khái niệm IOT ..................................................................................................... 328 2. Những ứng dụng thực tế trong cuộc sống ......................................................... 328 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 17 3. ESP8266 dòng chip đƣợc sử dụng phổ biến nhất hiện nay trong IOT. .......... 329 4. Module và Board phát triển của ESP8266. ....................................................... 330 5. Giới thiệu về module ESP 12E( NodeMCU V1). ............................................. 331 6. Lập trình ESP 12E bằng Arduino IDE. ............................................................ 332 Giới thiệu về ESP826612E: .............................................................................................................. 332 Chuẩn bị phần cứng: ......................................................................................................................... 332 Cài đặt phần mềm arduino IDE và thƣ viện cho esp8266. ................................................................ 332 Hƣớng dẫn nạp chƣơng trình cho ESP8266 12E: ............................................................................. 335 Hình ảnh thực tế: ............................................................................................................................... 336 II. Bài học mẫu cơ bản lập trình cho ESP12E........................................................... 337 1. Bật tắt led theo ý muốn bằng esp8266 12E. ...................................................... 337 Chuẩn bị phần cứng: ......................................................................................................................... 337 Lắp mạch:.......................................................................................................................................... 337 Lập trình:........................................................................................................................................... 337 Hình ảnh thực tế: ............................................................................................................................... 338 2. Bật tắt led bằng nút nhấn ( không lƣu trạng thái). .......................................... 338 Chuẩn bị phần cứng: ......................................................................................................................... 338 Lắp mạch:.......................................................................................................................................... 338 Lập trình:........................................................................................................................................... 339 Hình ảnh thực tế: ............................................................................................................................... 339 3. Bật tắt led bằng nút nhấn (lƣu trạng thái). ....................................................... 340 Chuẩn bị phần cứng: ......................................................................................................................... 340 Lắp mạch:.......................................................................................................................................... 340 Lập trình:........................................................................................................................................... 341 Hình ảnh thực tế: ............................................................................................................................... 342 4. Điều khiển relay bằng Esp8266 V_12E. ............................................................ 342 Chuẩn bị phần cứng: ......................................................................................................................... 342 Lắp mạch:.......................................................................................................................................... 342 Lập trình:........................................................................................................................................... 343 Hình ảnh thực tế: ............................................................................................................................... 343 5. Hiển thị lên màn hình LCD bằng ESP8266 12E. .............................................. 343 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 18 Chuẩn bị phần cứng: ......................................................................................................................... 343 Lắp mạch:.......................................................................................................................................... 344 Lập trình:........................................................................................................................................... 344 Hình ảnh thực tế: ............................................................................................................................... 344 6. Đọc giá trị cảm biến nhiệt độ LM35 và gửi lên thingspeak. ............................ 345 Chuẩn bị phần cứng: ......................................................................................................................... 346 Phần mềm : ....................................................................................................................................... 346 Cài đặt trên thingspeak:..................................................................................................................... 346 Lắp mạch:.......................................................................................................................................... 348 Lập trình:........................................................................................................................................... 348 Sau khi upload code ta mở cổng serial monitor và thingspeak: ........................................................ 350 7. Điều khiển thiết bị điện bằng webserver. .......................................................... 350 Chuẩn bị phần cứng: ......................................................................................................................... 350 Phần mềm : ....................................................................................................................................... 351 Lắp mạch:.......................................................................................................................................... 351 Lập trình:........................................................................................................................................... 351 Hình ảnh thực tế: ............................................................................................................................... 357 8. Điều khiển thiết bị điện bằng wifi và app MIT invertor. ................................ 358 Phần mền cần chuẩn bị...................................................................................................................... 358 Phần cứng cần chuẩn bị: ................................................................................................................... 358 Lắp mạch:.......................................................................................................................................... 358 Code chƣơng trình: ........................................................................................................................... 359 Cài đặt app cho điện thoại ( Andriod): .............................................................................................. 363 Hình ảnh thực tế: ............................................................................................................................... 364 9. Điều khiển thiết bị điện bằng Nodemcu ( esp 12e) và app Blynk. .................. 365 Phần mền cần chuẩn bị...................................................................................................................... 365 Phần cứng cần chuẩn bị: ................................................................................................................... 365 Lắp mạch:.......................................................................................................................................... 365 Code chƣơng trình: ........................................................................................................................... 365 Các bƣớc thực hiện nhƣ sau: ............................................................................................................. 367 Hình ảnh thực tế: ............................................................................................................................... 370 D. HỌC LẬP TRÌNH ARDUINO THÔNG QUA DỰ ÁN ....................................... 371 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 19 1. Ðo và hiển thị điện áp DC ( 0 – 30Vdc). ............................................................ 371 Phần mền cần chuẩn bị...................................................................................................................... 371 Phần cứng cần chuẩn bị: ................................................................................................................... 371 Lắp mạch:.......................................................................................................................................... 371 Code chƣơng trình: ........................................................................................................................... 372 Hình ảnh thực tế: ............................................................................................................................... 373 2. Thiết kế xe robot 4 bánh điều khiển bằng điện thoại ( bluethooth) ............... 373 Mục tiêu: ........................................................................................................................................... 373 Phần mền cần chuẩn bị...................................................................................................................... 373 Phần cứng cần chuẩn bị: ................................................................................................................... 373 Lắp mạch nguyên lý: ......................................................................................................................... 374 Lắp mô hình: ..................................................................................................................................... 375 3. Thiết kế mô hình bật tắt đèn AC 220v khi trời tối, sử dụng cảm biến quang trở 384 Mục tiêu: ........................................................................................................................................... 384 Phần mền cần chuẩn bị...................................................................................................................... 384 Phần cứng cần chuẩn bị: ................................................................................................................... 384 Lắp mạch nguyên lý: ......................................................................................................................... 384 Code chƣơng trình: ........................................................................................................................... 385 Hình ảnh thực tế: ............................................................................................................................... 386 4. Thiết kế mô hình tƣới cây tự động. .................................................................... 387 Mục tiêu: ........................................................................................................................................... 387 Phần mền cần chuẩn bị...................................................................................................................... 387 Phần cứng cần chuẩn bị: ................................................................................................................... 387 Lắp mạch nguyên lý: ......................................................................................................................... 387 Code chƣơng trình............................................................................................................................. 387 Hình ảnh thực tế: ............................................................................................................................... 388 5. Thiết kế mô hình đếm số học sinh trong phòng học.. ....................................... 389 Mục tiêu: ........................................................................................................................................... 389 Phần mền cần chuẩn bị...................................................................................................................... 389 Phần cứng cần chuẩn bị: ................................................................................................................... 389 Lắp mạch nguyên lý: ......................................................................................................................... 389 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 20 Code chƣơng trình: ........................................................................................................................... 390 Hình ảnh thực tế: ............................................................................................................................... 392 6. Thiết kế mô hình bật tắt thiết bị bằng sóng rf 433Mhz. .................................. 393 Mục tiêu: ........................................................................................................................................... 393 Phần mền cần chuẩn bị...................................................................................................................... 393 Phần cứng cần chuẩn bị: ................................................................................................................... 393 Bảng mã ASCII: ................................................................................................................................ 393 Lắp mạch nguyên lý: ......................................................................................................................... 394 Code chƣơng trình: ........................................................................................................................... 395 Hình ảnh thực tế: ............................................................................................................................... 400 7. Thiết kế xe robot 4 bánh điều khiển bằng sóng Wifi ( nodemcu ). ................. 400 Mục tiêu: ........................................................................................................................................... 400 Phần mền cần chuẩn bị...................................................................................................................... 400 Phần cứng cần chuẩn bị: ................................................................................................................... 401 Lắp mạch nguyên lý: ......................................................................................................................... 401 Lắp mô hình: ..................................................................................................................................... 402 8. Thiết kế mô hình diều khiển bật tắt relay bằng cảm biến TOUCH ( cảm biến điện dung ). ................................................................................................................. 411 Mục tiêu: ........................................................................................................................................... 411 Phần mền cần chuẩn bị...................................................................................................................... 411 Phần cứng cần chuẩn bị: ................................................................................................................... 411 Lắp mạch nguyên lý: ......................................................................................................................... 411 Code chƣơng trình: ........................................................................................................................... 411 Hình ảnh thực tế: ............................................................................................................................... 412 9 Gửi thông báo về điện thoại khi có trộm bằng cảm biến chuyển động sử dụng board NodeMCU và app BLYNK. ........................................................................... 412 Mục tiêu: ........................................................................................................................................... 412 Phần mền cần chuẩn bị...................................................................................................................... 413 Phần cứng cần chuẩn bị: ................................................................................................................... 413 Lắp mạch nguyên lý: ......................................................................................................................... 413 Code chƣơng trình: ........................................................................................................................... 413 Cài app blynk cho điện thoại: ........................................................................................................... 415 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 21 Hình ảnh thực tế: ............................................................................................................................... 419 10. Điều khiển LED ma trận Max7219 với module WIFI NodeMCU................. 419 Mục tiêu: ........................................................................................................................................... 419 Phần mền cần chuẩn bị...................................................................................................................... 419 Phần cứng cần chuẩn bị: ................................................................................................................... 419 Lắp mạch nguyên lý: ......................................................................................................................... 420 Code chƣơng trình: ........................................................................................................................... 420 Hình ảnh thực tế: ............................................................................................................................... 423 11. Ðiều khiển tốc độ động cơ bƣớc bằng biến trở sử dụng board ....................... 423 Mục tiêu: ........................................................................................................................................... 423 Phần mền cần chuẩn bị...................................................................................................................... 423 Phần cứng cần chuẩn bị: ................................................................................................................... 423 Lắp mạch nguyên lý: ......................................................................................................................... 423 Code chƣơng trình: ........................................................................................................................... 424 Hình ảnh thực tế: ............................................................................................................................... 425 12 Đọc giá trị nhiệt độ, độ ẩm hiển thị lên màn hình oled 0.96” và blynk sử dụng board NodeMCU. ....................................................................................................... 426 Mục tiêu: ........................................................................................................................................... 426 Phần mền cần chuẩn bị...................................................................................................................... 426 Phần cứng cần chuẩn bị: ................................................................................................................... 426 Lắp mạch nguyên lý: ......................................................................................................................... 426 Code chƣơng trình: ........................................................................................................................... 427 Cài đặt app Blynk: ............................................................................................................................ 429 Hình ảnh thực tế: ............................................................................................................................... 433 13. Thiết kế xe 2 bánh tự cân bằng sử dụng board ardunio. ................................. 433 Mục tiêu: ........................................................................................................................................... 433 Phần mền cần chuẩn bị...................................................................................................................... 433 Phần cứng cần chuẩn bị: ................................................................................................................... 433 Lắp mạch nguyên lý: ......................................................................................................................... 436 Code chƣơng trình: (code hoàn chỉnh link kèm theo) ...................................................................... 436 Hình ảnh thực tế: ( bánh xe đƣợc thay loại có ma sát tốt hơn ) ........................................................ 438 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 22 14. Thiết kế mô hình hẹn giờ bật tắt thiết bị sử dụng module DS1307 và arduino. 439 Mục tiêu: ........................................................................................................................................... 439 Phần mền cần chuẩn bị...................................................................................................................... 439 Phần cứng cần chuẩn bị: ................................................................................................................... 439 Lắp mạch nguyên lý: ......................................................................................................................... 439 Hình ảnh thực tế: ............................................................................................................................... 445 15. Thiết kế mô hình xe 4 bánh diều khiển bằng sóng Wifi sử board NodeMCU và app Blynk ( công cụ Joystick ). ................................................................................. 445 Mục tiêu: ........................................................................................................................................... 445 Phần mền cần chuẩn bị...................................................................................................................... 445 Phần cứng cần chuẩn bị: ................................................................................................................... 445 Lắp mạch nguyên lý: ......................................................................................................................... 445 Code chƣơng trình: ........................................................................................................................... 446 16. Thiết kế mô hình xe robot 3 bánh tự hành sử dụng board ardunio. .............. 452 Mục tiêu: ........................................................................................................................................... 452 Phần mền cần chuẩn bị...................................................................................................................... 452 Phần cứng cần chuẩn bị: ................................................................................................................... 452 Lắp mạch nguyên lý: ......................................................................................................................... 453 Code chƣơng trình: ........................................................................................................................... 455 17. Ðiều khiển góc quay động cơ buớc bằng nút nhấn sử dụng board arduino. . 459 Mục tiêu: ........................................................................................................................................... 459 Phần mền cần chuẩn bị...................................................................................................................... 459 Phần cứng cần chuẩn bị: ................................................................................................................... 459 Lắp mạch nguyên lý: ......................................................................................................................... 459 Code chƣơng trình: ........................................................................................................................... 460 Hình ảnh thực tế: ............................................................................................................................... 462 18. Thiết kế xe robot 4 bánh điều khiển bằng giọng nói sử dụng board arduino. 463 Mục tiêu: ........................................................................................................................................... 463 Phần mền cần chuẩn bị...................................................................................................................... 463 Phần cứng cần chuẩn bị: ( Tuong tự với xe cấp dộ 1 )...................................................................... 463 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 23 Lắp mạch nguyên lý: ......................................................................................................................... 463 Lắp mô hình: tƣơng tự nhƣ xe robot 4 bánh ở trên ........................................................................... 465 19. Thiết kế mô hình mở cửa tự dộng sử dụng module RC522 và board arduino ( nhà thông minh). ........................................................................................................ 468 Mục tiêu: ........................................................................................................................................... 468 Phần mền cần chuẩn bị...................................................................................................................... 468 Phần cứng cần chuẩn bị: ................................................................................................................... 468 Lắp mạch nguyên lý: ......................................................................................................................... 468 Code chƣơng trình: ........................................................................................................................... 469 20. Thiết kế mô hình hiển thị giờ, nhiệt dộ và dộ ẩm lên module led matrix 32x8 sử dụng board arduino. ............................................................................................. 474 Mục tiêu: ........................................................................................................................................... 474 Phần mền cần chuẩn bị...................................................................................................................... 474 Phần cứng cần chuẩn bị: ................................................................................................................... 474 Lắp mạch nguyên lý: ......................................................................................................................... 474 Code chƣơng trình: ........................................................................................................................... 475 Hình ảnh thực tế: ............................................................................................................................... 480 21. Thiết kế mô hình hẹn giờ bật tắt thiết bị điện sử dụng module DS3231 và arduino. ....................................................................................................................... 481 Mục tiêu: ........................................................................................................................................... 481 Phần mền cần chuẩn bị...................................................................................................................... 481 Phần cứng cần chuẩn bị: ................................................................................................................... 481 Lắp mạch nguyên lý: ......................................................................................................................... 481 Code chƣơng trình: ........................................................................................................................... 482 Hình ảnh thực tế: ............................................................................................................................... 486 22. Thiết kế mô hình cài đặt và hiển thị nhiệt độ sử dụng cảm biến PT100 và board arduino. ............................................................................................................ 486 Mục tiêu: ........................................................................................................................................... 486 Phần mền cần chuẩn bị...................................................................................................................... 486 Phần cứng cần chuẩn bị: ................................................................................................................... 487 Lắp mạch nguyên lý: ......................................................................................................................... 487 Code chƣơng trình: ........................................................................................................................... 488 Hình ảnh thực tế: ............................................................................................................................... 491 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 24 23. Thiết kế mô hình hiển thị giờ lên màn hình LCD 16X02 chữ lớn không sử module thời gian thực. ............................................................................................... 491 Mục tiêu: ........................................................................................................................................... 491 Phần mền cần chuẩn bị...................................................................................................................... 491 Phần cứng cần chuẩn bị: ................................................................................................................... 491 Lắp mạch nguyên lý: ......................................................................................................................... 492 Code chƣơng trình: ........................................................................................................................... 492 Hình ảnh thực tế: ............................................................................................................................... 497 24. Thiết kế mô hình bật tắt thiết bị điện bằng máy tính thông qua phần mền processing và arduino. ............................................................................................... 497 Mục tiêu: ........................................................................................................................................... 497 Phần mền cần chuẩn bị...................................................................................................................... 497 Phần cứng cần chuẩn bị: ................................................................................................................... 498 Lắp mạch nguyên lý: ......................................................................................................................... 498 Code cho arduino: ............................................................................................................................. 498 Code cho processing: ........................................................................................................................ 499 Hình ảnh thực tế: ............................................................................................................................... 501 25. Thiết kế mô hình xe robot 4 bánh điều khiển bằng sóng RF thông qua module RF24L01 và board arduino. ...................................................................................... 502 Mục tiêu: ........................................................................................................................................... 502 Phần mền cần chuẩn bị...................................................................................................................... 502 Phần cứng cần chuẩn bị: ................................................................................................................... 502 Lắp mạch nguyên lý phần phát: ........................................................................................................ 502 Lắp mạch nguyên lý phần thu: .......................................................................................................... 503 Code cho phần phát:.......................................................................................................................... 504 Code cho phần thu: ........................................................................................................................... 504 Hình ảnh thực tế: ............................................................................................................................... 507 26. Thiết kế mô hình xe robot 3 bánh dò line và tránh vật cản sử dụng board arduino. ....................................................................................................................... 507 Mục tiêu: ........................................................................................................................................... 507 Phần mền cần chuẩn bị...................................................................................................................... 507 Phần cứng cần chuẩn bị: ................................................................................................................... 507 Lắp mạch nguyên lý: ......................................................................................................................... 508 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 25 Code chƣơng trình: ........................................................................................................................... 509 Hình ảnh thực tế: ............................................................................................................................... 512 27. Thiết kế mô hình truyền dữ liệu cảm biến qua máy tính thông qua giao tiếp MODBUS RTU . ......................................................................................................... 513 Mục tiêu: ........................................................................................................................................... 513 Phần mền cần chuẩn bị...................................................................................................................... 513 Phần cứng cần chuẩn bị: ................................................................................................................... 513 Lắp mạch nguyên lý: ......................................................................................................................... 513 Code chƣơng trình: ........................................................................................................................... 514 Hình ảnh thực tế: ............................................................................................................................... 516 28. Thiết kế mô hình đo dòng điện AC/DC sử dụng module ACS712 và board arduino . ...................................................................................................................... 517 Mục tiêu: ........................................................................................................................................... 517 Phần mền cần chuẩn bị...................................................................................................................... 517 Phần cứng cần chuẩn bị: ................................................................................................................... 517 Lắp mạch nguyên lý: ......................................................................................................................... 517 Code chƣơng trình: ........................................................................................................................... 518 Hình ảnh thực tế: ............................................................................................................................... 521 29. Thiết kế mô hình điều khiển độ sáng của đèn led ứng dụng giải thuật PID và sử dụng board arduino . ............................................................................................ 521 Mục tiêu: ........................................................................................................................................... 521 Phần mền cần chuẩn bị...................................................................................................................... 521 Phần cứng cần chuẩn bị: ................................................................................................................... 521 Lắp mạch nguyên lý: ......................................................................................................................... 522 Code chƣơng trình: ........................................................................................................................... 522 Hình ảnh thực tế: ............................................................................................................................... 523 30. Thiết kế mô hình điều khiển thiết bị điện thông qua giao thức (MQTT) và board NodeMCU. ....................................................................................................... 523 Mục tiêu: ........................................................................................................................................... 523 Phần mền cần chuẩn bị...................................................................................................................... 523 Phần cứng cần chuẩn bị: ................................................................................................................... 523 Lắp mạch nguyên lý: ......................................................................................................................... 524 Code chƣơng trình: ........................................................................................................................... 524 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 26 Cài đặt app trên Ubidots: .................................................................................................................. 525 Hình ảnh thực tế: ............................................................................................................................... 527 31. Thiết kế mô hình hiển thị vị trí lên màn hình LCD sử dụng board arduino và GPS neo6. .................................................................................................................... 527 Mục tiêu: ........................................................................................................................................... 527 Phần mền cần chuẩn bị...................................................................................................................... 527 Phần cứng cần chuẩn bị: ................................................................................................................... 527 Lắp mạch nguyên lý: ......................................................................................................................... 527 Code chƣơng trình: ........................................................................................................................... 528 Hình ảnh thực tế: ............................................................................................................................... 529 32. Thiết kế mô hình lọc nhiễu cho cảm biến trong các dự án liên qua đến arduino. ....................................................................................................................... 530 Mục tiêu: ........................................................................................................................................... 530 Phần mền cần chuẩn bị...................................................................................................................... 530 Phần cứng cần chuẩn bị: ................................................................................................................... 530 Lắp mạch nguyên lý: ......................................................................................................................... 530 Code chƣơng trình: ........................................................................................................................... 530 Hình ảnh thực tế: ............................................................................................................................... 532 33. Thiết kế mô hình điều khiển thiết bị điện và hiển thị giá trị cảm biến lên internet thông qua giao thức (MQTT) và board NodeMCU. ................................ 533 Mục tiêu: ........................................................................................................................................... 533 Phần mền cần chuẩn bị...................................................................................................................... 533 Phần cứng cần chuẩn bị: ................................................................................................................... 533 Lắp mạch nguyên lý: ......................................................................................................................... 533 Code chƣơng trình: ........................................................................................................................... 534 Cài đặt app trên Ubidots: .................................................................................................................. 535 Hình ảnh thực tế: ............................................................................................................................... 538 34. Thiết kế mô hình điều khiển đóng ngắt relay bằng SMS thông qua module sim800l và arduino. .................................................................................................... 538 Mục tiêu: ........................................................................................................................................... 538 Phần mền cần chuẩn bị...................................................................................................................... 538 Phần cứng cần chuẩn bị: ................................................................................................................... 538 Lắp mạch nguyên lý: ......................................................................................................................... 538 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 27 Code chƣơng trình: ........................................................................................................................... 539 Hình ảnh thực tế: ............................................................................................................................... 540 35. Thiết kế mô hình điều khiển đóng ngắt relay thông qua Webserver sử dụng board ESP32. .............................................................................................................. 541 Mục tiêu: ........................................................................................................................................... 541 Phần mền cần chuẩn bị...................................................................................................................... 541 Phần cứng cần chuẩn bị: ................................................................................................................... 541 Lắp mạch nguyên lý: ......................................................................................................................... 541 Code chƣơng trình: ........................................................................................................................... 542 Hình ảnh thực tế: ............................................................................................................................... 545 36. Thiết kế mô hình hiển thị vị trí tọa độ lên màn hình LCD sử dụng module GPS NEO6 và arduino. .............................................................................................. 545 Mục tiêu: ........................................................................................................................................... 545 Phần mền cần chuẩn bị...................................................................................................................... 545 Phần cứng cần chuẩn bị: ................................................................................................................... 545 Lắp mạch nguyên lý: ......................................................................................................................... 545 Code chƣơng trình: ........................................................................................................................... 546 Hình ảnh thực tế: ............................................................................................................................... 547 37. Thiết kế mô hình điều khiển thiết bị điện bằng SMS sử dụng module sim 800l và arduino. .................................................................................................................. 548 Mục tiêu: ........................................................................................................................................... 548 Phần mền cần chuẩn bị...................................................................................................................... 548 Phần cứng cần chuẩn bị: ................................................................................................................... 548 Lắp mạch nguyên lý: ......................................................................................................................... 548 Code chƣơng trình: ........................................................................................................................... 549 Hình ảnh thực tế: ............................................................................................................................... 550 38. Thiết kế mô hình điều khiển đảo chiều động cơ bƣớc stepper 0.8/step sử dụng nút nhấn và arduino. .................................................................................................. 550 Mục tiêu: ........................................................................................................................................... 550 Phần mền cần chuẩn bị...................................................................................................................... 551 Phần cứng cần chuẩn bị: ................................................................................................................... 551 Lắp mạch nguyên lý: ......................................................................................................................... 551 Code chƣơng trình: ........................................................................................................................... 552 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 28 Hình ảnh thực tế: ............................................................................................................................... 554 39. Thiết kế mô hình điều khiển tốc độ động cơ sử dụng module driver BTS7960 và arduino. .................................................................................................................. 554 Mục tiêu: ........................................................................................................................................... 554 Phần mền cần chuẩn bị...................................................................................................................... 554 Phần cứng cần chuẩn bị: ................................................................................................................... 554 Lắp mạch nguyên lý: ......................................................................................................................... 555 Code chƣơng trình: ........................................................................................................................... 555 Hình ảnh thực tế: ............................................................................................................................... 556 40. Thiết kế mô hình điều khiển động cơ bƣớc 1.8/step sử dụng module driver TB6600 và arduino. .................................................................................................... 557 Mục tiêu: ........................................................................................................................................... 557 Phần mền cần chuẩn bị...................................................................................................................... 557 Phần cứng cần chuẩn bị: ................................................................................................................... 557 Lắp mạch nguyên lý: ......................................................................................................................... 557 Code chƣơng trình: ........................................................................................................................... 558 Hình ảnh thực tế: ............................................................................................................................... 559 41. Thiết kế mô hình điều khiển thiết bị điện dựa vào giá trị cảm biến ánh sáng và đồng thời gửi tin nhắn về điện thoại. ........................................................................ 559 Mục tiêu: ........................................................................................................................................... 559 Phần mền cần chuẩn bị : ................................................................................................................... 559 Phần cứng cần chuẩn bị: ................................................................................................................... 560 Lắp mạch nguyên lý: ......................................................................................................................... 560 Code chƣơng trình: ........................................................................................................................... 560 Hình ảnh thực tế: ............................................................................................................................... 562 42. Thiết kế mô hình điều khiển góc quay động cơ bƣớc bằng cảm biến ánh sáng khi trời tối hoặc trời sáng. ......................................................................................... 562 Mục tiêu: ........................................................................................................................................... 562 Phần mền cần chuẩn bị...................................................................................................................... 563 Phần cứng cần chuẩn bị: ................................................................................................................... 563 Lắp mạch nguyên lý: ......................................................................................................................... 563 Code chƣơng trình: ........................................................................................................................... 563 Hình ảnh thực tế: ............................................................................................................................... 564 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 29 43. Thiết kế mô hình đo tốc độ động cơ hiển thị lên màn hình LCD sử dụng encorder quay và board arduino. ............................................................................. 565 Mục tiêu: ........................................................................................................................................... 565 Phần mền cần chuẩn bị...................................................................................................................... 565 Phần cứng cần chuẩn bị: ................................................................................................................... 565 Lắp mạch nguyên lý: ......................................................................................................................... 566 Code chƣơng trình: ........................................................................................................................... 566 Hình ảnh thực tế: ............................................................................................................................... 569 44. Thiết kế mô hình bật tắt thiết bị điện sử dụng cảm biến vân tay và board arduino. ....................................................................................................................... 570 Mục tiêu: ........................................................................................................................................... 570 Phần mền cần chuẩn bị...................................................................................................................... 570 Phần cứng cần chuẩn bị: ................................................................................................................... 570 Lắp mạch nguyên lý: ......................................................................................................................... 570 Code chƣơng trình: ........................................................................................................................... 571 Hình ảnh thực tế: ............................................................................................................................... 572 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 30 A. GIỚI THIỆU VỀ ARDUINO Điều khiển thứ gì đó một cách tự động, ngoài việc phải hoàn chỉnh kết cấu ―phần cứng‖, ta cần phải có mạch điện điều khiển và phải lập trình để mạch điện đó hoạt động theo ý mình. Lập trình thì không khó học, chỉ khó ở giai đoạn thiết kế mạch điều khiển là khó khăn nhất đối với những ai chƣa biết về làm mạch thì càng khó hơn ( còn đƣợc gọi thiết kế truyền thống). Và phải trải qua rất nhiều công đoạn nhƣ sau: Tuy nhiên có một thứ làm cho mọi chuyện trở nên rất dễ dàng, có tên gọi là ―Arduino”. Và trải qua các công đoạn ngắn gọn nhƣ sau: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 31 So sánh các mô hình điều khiển đƣợc sử dụng bằng phƣơng pháp thiết kế “truyền thống” và từ thiết kế bằng “Arduino”. Phƣơng pháp Truyền Thống Phƣơng pháp dùng Arduino Kỹ Năng • Hiểu biết chuyên sâu về • Chủ yếu tập trung tìm hiểu linh kiện điện tử. kết nối hệ thống, không cần quan tâm đến việc vẽ mạch, • Biết vẽ mạch, rửa mạch, in làm mạch in,… mạch,… • Biết lập trình ( việc lập trình • Biết lập trình ( việc lập dễ dàng do thƣ viện có sẵn trình khó khăn do module của các module đƣợc chuẩn tự thiết kế không có chuẩn hóa). hóa ). Đối Tƣợng • Chỉ dành cho những giới • Dành cho giới chuyên ngành, chuyên ngành điện - điện không chuyên, thậm chí là tử. học sinh cấp 1, 2,.. Thời Gian • Thời gian hoàn thành rất • Thời gian hoàn thành rất nhanh. lâu 1 tuần, có thể từ 1 đến 2 tháng. • Thời gian chủ yếu tập trung • Thời gian tập trung chủ yếu vào hệ thống nên có thể làm vào làm mạch, ít thời gian đƣợc những hệ thống phức tạp hơn. để phát triển quy mô hệ thống. Phát Triển • Phát triển đƣợc kỹ năng • Phát triển đƣợc tƣ duy lập trình hệ thống. thiết kế mạch, in mạch, hàn,… Chính vì sự tiện lợi nhƣ vậy, Arduino đã trở thành một hiện tƣợng trên toàn thế giới, nếu bạn lên mạng tìm kiếm và gõ vào Arduino, bạn sẽ thấy hàng ngàn ứng dụng khác nhau từ khắp mọi nơi trên thế giới sử dụng Arduino. Từ đó ta có thể thấy đƣợc tầm ảnh hƣởng của Arduino đến nhƣờng nào. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 32 I. ARDUINO LÀ GÌ? Arduino không phải là cái gì cao siêu hết, chỉ là sử dụng chip AVR với những thứ mà bạn sẽ cần đến nhƣ mạch giao tiếp (USB sang UART), mạch nguồn, có sẵn các chân vào/ra để giao tiếp với cảm biến và các thiết bị ngoại vi. Arduino rất đơn giản, dễ sử dụng, dễ code (ngôn ngữ tƣơng tự nhƣ C/C++). Một trong những cái hay nhất của Arduino là nó hỗ trợ rất nhiều thƣ viện, rất tiện lợi. Nếu bạn muốn điều khiển động cơ, sẽ có các mạch công suất tƣơng thích hoàn toàn với Arduino. Nếu bạn muốn điều khiển qua mạng Internet, cũng có một mạch Ethernet/Wifi tƣơng thích hoàn toàn với Arduino. Và còn rất nhiều thứ khác nữa. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 33 Arduino cũng có rất nhiều kích thƣớc khác nhau, phù hợp cho nhiều mục đích sử dụng. Thông dụng nhất hiện nay là Arduino Uno nhỏ gọn dành cho những ai đang bắt đầu học về arduino. II. ARDUINO LÀM ĐƢỢC NHỮNG GÌ? Một số các dự án thú vị đã đƣợc thực hiện bằng Arduino. Xe điều khiển: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 34 Mô hình máy bay 4 cánh: Máy in 3D: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 35 Nhà thông minh: Hệ thống tƣới cây thông minh. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 36 Hiệu ứng LED: III. SƠ LƢỢC VỀ ARDUINO UNO R3 Board Arduino Uno nhỏ gọn và đầy đủ tính năng phù hợp cho những ai mới bắt đầu học, Arduino Uno sử dụng chip Atmega328. Nó có 14 chân digital I/O, 6 chân đầu vào (input) analog, thạch anh dao động 16Mhz. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 37 1. Một số thông số kỹ thuật như sau : Chip ATmega328 Điện áp cấp nguồn 5V Điện áp đầu vào (input) (kiến 7-12V nghị ) Điện áp đầu vào(giới hạn) 6-20V Số chân Digital I/O 14 (có 6 chân điều chế độ rộng xung PWM) Số chân Analog (Input ) 6 DC Current per I/O Pin 40 mA DC Current for 3.3V Pin 50 mA Flash Memory 32KB (ATmega328) với 0.5KB sử dụng bootloader SRAM 2 KB (ATmega328) EEPROM 1 KB (ATmega328) Xung nhịp 16 MHz Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 38 2. Sơ đồ chân của Arduino Uno. • USB (1). Arduino sử dụng cáp USB để giao tiếp với máy tính. Thông qua cáp USB chúng ta có thể Upload chƣơng trình cho Arduino hoạt động, ngoài ra USB còn là nguồn cho Arduino. • Nguồn ( 2 và 3 ). Khi không sử dụng USB làm nguồn thì chúng ta có thể sử dụng nguồn ngoài thông qua jack cắm 2.1mm ( cực dƣơng ở giửa ) hoặc có thể sử dụng 2 chân Vin và GND để cấp nguồn cho Arduino. Bo mạch hoạt động với nguồn ngoài ở điện áp từ 5 – 20 volt. Chúng ta có thể cấp một áp lớn hơn tuy nhiên chân 5V sẽ có mực điện áp lớn hơn 5 volt. Và nếu sử dụng nguồn lớn hơn 12 volt thì sẽ có hiện tƣợng nóng và làm hỏng bo mạch. Khuyết cáo các bạn nên dùng nguồn ổn định là 5 đến dƣới 12 vol. Chân 5V và chân 3.3V (Output voltage) : các chân này dùng để lấy nguồn ra từ nguồn mà chúng ta đã cung cấp cho Arduino. Lƣu ý : không đƣợc cấp nguồn vào các chân này vì sẽ làm hỏng Arduino. GND: chân mass. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 39 • Chip Atmega328. Chip Atmega328 Có 32K bộ nhớ flash trong đó 0.5k sử dụng cho bootloader. Ngoài ra còn có 2K SRAM, 1K EEPROM. • Input và Output ( 4 và 5 ). Arduino Uno có các chân với chức năng input và output sử dụng các hàm pinMode(), digitalWrite() và digitalRead() để điều khiển các chân này (Analog : A0 đến A5) (digital : chân số 0 đến chân số 13). Cũng trên 14 chân này chúng ta còn một số chân chức năng đó là: Serial : chân 0 (Rx ), chân 1 ( Tx). Hai chân này dùng để truyền (Tx) và nhận (Rx) dữ liêu nối tiếp TTL. Chúng ta có thể sử dụng nó để giao tiếp với cổng COM của một số thiết bị hoặc các linh kiện có chuẩn giao tiếp nối tiếp. PWM (pulse width modulation): các chân 3, 5, 6, 9, 10, 11 trên bo mạch có dấu ―~‖ là các chân PWM chúng ta có thể sử dụng nó để điều khiển tốc độ động cơ, độ sáng của đèn… SPI : 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK), các chân này hỗ trợ giao tiếp theo chuẩn SPI. I2C: Arduino hỗ trợ giao tiếp theo chuẩn I2C. Các chân A4 (SDA) và A5 (SCL) cho phép chúng tao giao tiếp giửa Arduino với các linh kiện có chuẩn giao tiếp là I2C • Reset (6): dùng để reset Arduino. Nhƣng đối với những ai mới bắt đầu tìm hiểu về arduino thì rất khó khăn chƣa kể đến là chƣa biết gì về lập trình C, tuy thông tin tài liệu về arduino trên internet là rất nhiều nhƣng thiếu gắn kết thì bộ Ebook này là một một giải pháp tuyệt vời nó ra đời để giúp những ai đang cảm giác thấy khó khăn trong lập trình arduino, nếu ai đang muốn học lập trình arduino nên một lần đọc qua. Nếu có sách không thì cũng chƣa đủ chúng ta cần phải có thực hành, ứng dụng những cái mình học từ lý thuyết thì BỘ KIT TỰ HỌC ARDUINO ra đời và kết Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 40 hợp với EBOOKS này giúp bạn thấy việc học lập trình arduino không còn khó nhƣ ta nghĩ. IV. SƠ LƢỢC BỘ KIT TỰ HỌC ARDUINO 1. Giới thiệu sơ lược về KIT TỰ HỌC: Để giúp các bạn tiếp cận Arduino một cách dễ dàng nhất, dễ hiểu nhất đặc biệt có thể giúp các bạn làm đƣợc những dự án, đề tài,…Thì sự ra đời của Kit Tự Học Arduino ( là bộ cơ bản nhất từ dễ đến khó và Có tài liệu hƣớng dẫn chi tiết kèm theo + CODE + Ebook lập trình điều khiển arduino ) cho ngƣời mới bắt đầu để giúp các bạn học sinh, sinh viên và những ai mới bắt đầu học lập trình điều khiển arduino thoát khỏi cảnh phải lay hoay đi tìm tài liệu để học. 2. Những lợi ích của Kit Tự Học Arduino: a. Tất cả các linh kiện trong bộ tự học này shop đã tạo điều kiện tốt nhất cho ngƣời thực hành ( ví dụ nhƣ led ma trận 8x8 đã đƣợc gắn vào board đồng,…). b. Trên board test mẫu ở hình trên 8 led đơn đã đƣợc kết nối với 8 điện trở 1k và đã đƣa ra chân sẵn, cũng nhƣbiến trở 10k đã đƣa ra 3 chân. c. Có 3 nút nhấn nhỏ đã đƣợc gắn trên một module đã đi mạch sẵn và đã cho ra chân giúp việc kết nối dễ dàng. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 41 d. Dây cắm test có nhiều kích cỡ khác nhau. e. Kết nối giữa arduino và các module khác trong bộ tự học rất dễ dàng. f. Khi bạn mua bộ Kit Tự Học này thì đƣợc tặng kèm file hƣớng dẫn sử dụng Kit + CODE đối với từng module liên quan, các bạn không cần phải đi tìm tài liệu học. g. Trong file hƣớng dẫn sử dụng kit có tất cả hơn 25 bài học cơ bản liên quan, mỗi bài học điều có code mẫu kèm theo. h. Tất cả khách hàng mua kit tự học từ tdhshop đều đƣợc miễn phí dạy 1 buổi online. i. Đƣợc tặng kèm theo 18 ebook tài liệu học arduino bằng tiếng anh. j. Đƣợc tặng kèm theo 2 sổ tay Arduino ( LẬP TRÌNH ĐIỀU KHIỂN ARDUINO V1, V2 và 2 cuốn ebook này đƣợc tổng hợp lại và điều chỉnh cho phù hợp nhất), tổng hợp các lệnh, hàm,…cơ bản trong quá trình lập trình arduino. 3. Mục đích của bộ KIT TỰ HỌC: a. Điều khiển đèn led đơn ( nhấp nháy theo yêu cầu hay chạy theo hiệu ứng). b. Lập trình hiển thị số trên 1 led 7 đoạn. c. Biết lập trình module 4 led 7 đoạn hiển thị thời gian, chữ cái, số,… d. Biết lập trình led mat trận 8x8 hiển thị chữ cái, số, hiệu ứng,… e. Biết cách lấy tín hiệu Analog (tín hiệu tƣơng tự) và tín hiệu Digital (tín hiệu số) từ cảm biến nhiệt độ, cảm biến ánh sáng,… f. Biết cách nối dây và điều khiển role ( để đóng ngắt thiết bị điện). g. Hiển thị đƣợc thông tin trên màn hình LCD. h. Đọc giá trị nhiệt độ hiển thị lên LCD 16X02 thông qua cảm biến nhiệt độ LM35. i. Điều khiển đóng ngắt thiết bị điện dựa vào cài đặt giá trị nhiệt độ. j. Lập trình điều khiển đƣợc động cơ chạy thuận nghịch và tăng giảm tốc độ cho động cơ. k. Lập trình điều khiển đƣợc động cơ sevor. l. Sử dụng remote hồng ngoại điều khiển tắt mở thiết bị điện thông qua role. m. Biết đọc về giá trị cảm biến độ ẩm đất để thực hiện yêu cầu gì đó mà ta cần phải làm. n. Và có nhiều ứng dụng khác trong quá trình thực hành cùng Kit Tự Học Arduino. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 42 4. Một số bộ KIT TỰ HỌC ARDUINO: • Kit Tự Học Arduino Uno R3 Cơ Bản các bạn có thể xem chi tết TẠI ĐÂY. • Kit Tự Học Arduino Uno R3 Nâng Cao các bạn có thể xem chi tết TẠI ĐÂY. • Kit Tự Học Arduino Mega 2560 Cơ Bản các bạn có thể xem chi tết TẠI ĐÂY. • Kit Tự Học Arduino Mega 2560 Nâng Cao các bạn có thể xem chi tết TẠI ĐÂY. Sự khác biệt giữa các KIT TỰ HỌC ARDUINO là số lƣợng bài học và số lƣợng Module. Giữa BỘ KIT loại Uno và Mega khác nhau ở chổ ( Bộ Uno sử dụng board Arduino Uno R3 Còn Bộ Mega sử dụng board Arduino Mê ga 2560). V. CÀI ĐẶT PHẦN MỀM IDE VÀ DRIVER 1. Cài đặt phần mềm Arduino IDE: a. Cài Java Runtime Environment (JRE). Vì Arduino IDE đƣợc viết trên Java nên bạn cần phải cài đặt JRE trƣớc Arduino IDE. Link: http://www.oracle.com/technetwork/java/javase/downloads/jre8downloads-2133155.html Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 43 Bản JRE phổ biến nhất là bản dành cho Windows 32bit (x86) và Windows 64bit (x64) mình đã đánh dấu trong hình. Nhớ chọn "Accept License Agreement". Việc cài đặt diễn ra rất đơn giản và nhanh chóng. b. Cài đặt Arduino IDE: • Bƣớc 1: Truy cập địa chỉ: http://tdhshop.com.vn/tai-phan-men-arduinoide-cap-nhat-phien-ban-moi-nhat Hoặc: https://www.arduino.cc/en/Main/Software Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 44 Bƣớc 2: Sau khi download xong, các bạn bấm chuột phải vào file vừa download arduino-1.8.5-windows.zip và chọn ―Extract here‖ để giải nén. Bƣớc 3: Chạy file arduino.exe động Arduino IDE. trong thƣ mục arduino-1.8.5\ để khởi Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 45 Sau khi chạy file arduino.exe ta có giao diên Arduino IDE: 2. Cài đặt Driver đối với Arduino Uno, mê ga,…: a. Cài đặt Driver: Đầu tiên, các bạn chạy file dpinst-x86.exe (Windows x86) hoặc dpinstamd64.exe (Windows x64) trong thƣ mục driver của file phần mềm IDE mình tải về. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 46 Cửa sổ ―Device Driver Installation Wizard‖ hiện ra, các bạn chọn Next để tiếp tục. Khi có yêu cầu xác nhận cài đặt driver, chọn ―Install‖ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 47 Quá trình cài đặt đã hoàn tất. Bấm ―Finish‖ để thoát. b. Nạp chương trình cho Arduino Uno (mega tương tự): Bƣớc 1: Khởi động Arduino IDE: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 48 Bƣớc 2: Mở chƣơng trình mẫu trên Arduino IDE (Blink) Bƣớc 3: Vào Tools các bạn chọn đúng nhé cái này rất quan trọng. Kết quả ta có thể thấy Led chân số 13 (tích hợp trên board, led màu cam) của Arduino Uno sáng 1 giây và tắt 1 giây. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 49 3. Cài đặt Driver đối với Nano: a. Giới thiệu board arduino Nano. Board Arduino Nano là một trong những phiên bản nhỏ gọn của board Arduino. Arduino Nano có đầy đủ các chức năng và chƣơng trình có trên Arduino Uno do cùng sử dụng MCU ATmega328P. Nhờ việc sử dụng IC dán của ATmega328P thay vì IC chân cắm nên Arduino Nano có thêm 2 chân Analog so với Arduino Uno. b. Cài đặt driver cho Arduino Nano Arduino Nano đƣợc kết nối với máy tính qua cổng Mini - B USB và sử dụng chip CH340 để chuyển đổi USB sang UART thay vì dùng chip ATmega16U2 để giả lập cổng COM nhƣ trên Arduino Uno hay Arduino Mega, nhờ vậy giá thành sản phẩm đƣợc giảm mà vẫn giữ nguyên đƣợc tính năng, giúp Arduino giao tiếp đƣợc với máy tính, từ đó thực hiện việc lập trình. Trƣớc hết chúng ta phải tải driver CH340 cho arduino nano TẠI ĐÂY: Bƣớc 1: Giải nén thƣ mục vừa tải về ⇒ mở thƣ mục CH341SER ⇒khởi động file SETUP.EXE Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 50 Bƣớc 2: Nhấn chọn INSTALL Bƣớc 3: Hoàn tất cài đặt c. Thông số kỹ thuật Arduino Nano: IC chính ATmega328P CH340 IC nạp và giao tiếp UART 5V - DC Điện áp hoạt động Điện áp đầu vào khuyên dùng 7-12V - DC 6-20V - DC Điện áp đầu vào giới hạn 14 (trong đó có 6 chân PWM) Số chân Digital I/O 8 (độ phân giải 10bit, nhiều hơn Arduino Uno 2 chân) Số chân Analog Dòng tối đa trên mỗi chân I/O 40mA 32KB với 2KB dùng bởi bootloader Bộ nhớ flash 2KB SRAM 1KB EEPROM 16MHz Xung nhịp 0.73" x 1.70" Kích thƣớc 45mm Chiều dài Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 51 d. Nạp chương trình cho Arduino Nano: Bƣớc 1: Khởi động Arduino IDE Bƣớc 2: Mở chƣơng trình mẫu trên Arduino IDE (Blink) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 52 Bƣớc 3: Vào Tools các bạn chọn đúng nhé cái này rất quan trọng. Kết quả ta có thể thấy Led chân số 13 (tích hợp trên board, led màu đỏ) của Arduino Nano sáng 1 giây và tắt 1 giây. VI. GIỚI THIỆU PHẦN MỀM ( FRITZING) HỔ TRỢ VIỆC VẼ MẠCH NGUYÊN LÝ 1. Giới thiệu phần mềm Fritzing: Để vẽ một sơ đồ mạch điện ứng dụng hoàn chỉnh, phục vụ cho quá trình học tập và nghiên cứu thì bạn cần có nhiều kinh nghiệm và linh kiện điện tử để thử nghiệm. Một giải pháp hiệu quả cho tình huống này là sử dụng phần mềm Fritzing, bạn sẽ nhanh chóng tạo ra những sơ đồ mạch nguyên lý, sơ đồ lắp đặt có hình ảnh trực quan. Trong quá trình học lập trình Arduino chắc ai cũng đã nhìn thấy những hình ảnh mạch kết nối của Arduino với một số linh kiện nhƣ hình ở dƣới. Đó là phần Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 53 mền Fritzing, hiện tại phần mềm này miễn phí và rất trực quan rất có ích cho ai học lập trình Arduino. 2. Dowload phần mềm Fritzing ( miễn phí): Các bạn click vào links sau nhé https://drive.google.com/open?id=1fijv7fv4aFuKBmK6pkBk9QXZQJHdsCVs Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 54 3. Hướng dẫn sử dụng phần mềm: Kết nối mạch trên Breadboard: Chuyển qua sơ đồ nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 55 B. NGÔN NGỮ LẬP TRÌNH ARDUINO Ngôn ngữ lập trình Arduino có thể đƣợc chia thành ba phần chính: + Hàm chức năng (function). + Giá trị (các biến và các hằng số). + Cấu trúc (structure). I. HÀM CHỨC NĂNG (FUNCTION): Điều khiển board Arduino và thực hiện các phép tính. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 56 1. Hàm nhập xuất Digital I/O: a. digitalWrite(): Miêu tả: Viết một giá trị HIGH hoặc một LOW cho một chân số của arduino. Nếu chân đã đƣợc cấu hình nhƣ một OUTPUT với pinMode(), điện áp của nó sẽ đƣợc thiết lập với giá trị tƣơng ứng: 5V (hoặc 3.3V trên 3.3V) cho HIGH, 0V cho LOW. Nếu chân đƣợc cấu hình nhƣ là một INPUT, digitalWrite()sẽ cho phép ( HIGH) hoặc vô hiệu hóa ( LOW) pullup nội bộ trên chân đầu vào. Nên thiết lập pinMode() để INPUT_PULLUP cho phép các điện trở kéo lên bên trong. Cú pháp: digitalWrite(pin, value); Thông số: pin: Số của chân digital mà bạn muốn thiết đặt. value: HIGH hoặc LOW. Trả về: Không có. Ví dụ: Mã làm cho pin kỹ thuật số 13 OUTPUTvà chuyển đổi nó bằng cách luân phiên giữa HIGHvà LOWở tốc độ một giây. int led =13; void setup() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 57 pinMode(led, OUTPUT); // led đƣợc nối với chân số 13. } void loop() { digitalWrite(led, HIGH); // bật led delay(1000); // dừng chƣơng trình 1 giây digitalWrite(led, LOW); // tắt led delay(1000); // dừng chƣơng trình 1 giây } Ghi chú: Các chân đầu vào tƣơng tự có thể đƣợc sử dụng nhƣ chân kỹ thuật số, đƣợc gọi là A0, A1, v.v ... b. digitalRead(): Miêu tả: Đọc giá trị từ một Chân số đã đƣợc chỉ định, hoặc là HIGH hoặc LOW. Cú pháp digitalRead(pin) Thông số pin: số chân digital bạn muốn đọc. Trả về HIGH hoặc là LOW Ví dụ: int led = 12; // LED kết nối với chân số 12. int nutnhan = 7; // nút nhấn kết nối với chân số 7 int val = 0; // biến để lƣu trữ các giá trị đọc. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 58 void setup () { pinMode (led, OUTPUT); // chân số 12 là đầu ra. pinMode (nutnhan, INPUT); // thiết lập chân số 7 nhƣ đầu vào. } void loop () { val = digitalRead (nutnhan); // đọc các pin đầu vào digitalWrite (led, val); // thiết lập giá trị của LED là giá trị của nút nhấn. } Ghi chú: Nếu chân không đƣợc kết nối với bất cứ thứ gì, digitalRead () có thể trở lại HIGH hoặc LOW (và điều này có thể thay đổi ngẫu nhiên). Các chân đầu vào tƣơng tự có thể đƣợc sử dụng nhƣ chân kỹ thuật số, đƣợc gọi là A0, A1, v.v ... c. pinMode(): Miêu tả: Cấu hình 1 pin quy định hoạt động nhƣ là một đầu vào (INPUT) hoặc đầu ra (OUTPUT). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 59 Cú pháp: pinMode(pin, mode) Thông số: pin: số chân có chế độ bạn muốn thiết lập. mode: INPUT, OUTPUT, Hoặc INPUT_PULLUP. Trả về: Không có. Ví dụ: void setup() { pinMode (12, OUTPUT); // chân số 12 là đầu ra } void loop () { digitalWrite (12, HIGH); delay(1000); digitalWrite (12, LOW); delay(1000); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 60 Ghi chú: Các chân đầu vào tƣơng tự có thể đƣợc sử dụng nhƣ chân số, đƣợc gọi là A0, A1, v.v ... 2. Hàm nhập xuất Analog I/O: a. analogRead() Giới thiệu Nhiệm vụ của analogRead() là đọc giá trị điện áp từ một chân Analog (ADC). Board Arduino Uno có 6 pin từ A0 đến A5 (8 pin trên Mini và Nano, 16 pin trên Mega), bộ chuyển đổi tƣơng tự 10-bit sang số. Điều này có nghĩa là nó sẽ lập bản đồ điện áp đầu vào từ 0 đến 5 volts thành các số nguyên từ 0 đến 1023. Điều này tạo ra độ phân giải giữa các lần đọc: 5 volts / 1024 đơn vị hoặc, 0,0049 volt (4,9 mV) trên một đơn vị. Dải đầu vào và độ phân giải có thể đƣợc thay đổi bằng cách sử dụng Hàm analogRead() cần 100 micro giây để thực hiện. Khi ngƣời ta nói "đọc tín hiệu analog", bạn có thể hiểu đó chính là việc đọc giá trị điện áp. Cú pháp analogRead (pin) ; Thông số pin: Số chân đầu vào tƣơng tự để đọc từ (0 đến 5 trên hầu hết các bo Arduino, 0 đến 7 trên Mini và Nano, 0 đến 15 trên Mega) Trả về int (0 đến 1023). Ví dụ Ví dụ đọc giá trị điện áp trên analogPin và hiển thị nó. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 61 int analogPin = 4; // chân đọc giá trị analog A4 int val = 0; // lƣu giá trị analog đọc về. void setup() { Serial.begin(9600); } // giao tiếp serial void loop() { val = analogRead(analogPin); // đọc giá trị analog ở chân A4 Serial.println(val); // hiển thị ra cửa sổ serial } Ghi chú: Nếu pin đầu vào tƣơng tự không kết nối với bất cứ thứ gì, giá trị trả về bởi analogRead () sẽ dao động dựa trên một số yếu tố (ví dụ: giá trị của các đầu vào analog khác...). b. analogReference () Miêu tả: Cấu hình điện áp tham chiếu đƣợc sử dụng cho đầu vào analog (tức là giá trị đƣợc sử dụng làm đầu vào). Các lựa chọn là: Board Arduino (Uno, Mega, v.v.) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 62 DEFAULT: tham chiếu tƣơng tự mặc định 5 volts or 3.3 volts. INTERNAL: đặt mức điện áp với 1,1 volts trên ATmega168 hoặc ATmega328P và 2,56 volts trên ATmega8 (không dùng trên Arduino Mega). INTERNAL1V1: đặt mức điện áp tối đa 1.1V (chỉ dành cho Arduino Mega) INTERNAL2V56: đặt mức điện áp tối đa 2.56V (Arduino Mega) EXTERNAL: điện áp đƣợc áp dụng cho chân AREF (chỉ từ 0 đến 5V) đƣợc sử dụng làm tham chiếu. Board SAMD của Arduino (Zero, v.v ...) AR_DEFAULT: Đặt lại mức điện áp tối đa 3.3V AR_INTERNAL: Đặt lại mức điện áp tối đa 2.23V AR_INTERNAL1V0: Đặt lại mức điện áp tối đa 1.0V AR_INTERNAL1V65: Đặt lại mức điện áp tối đa 1.65V AR_INTERNAL2V23: Đặt lại mức điện áp tối đa 2.23V AR_EXTERNAL: điện áp đƣợc áp dụng cho chân AREF đƣợc sử dụng làm tham chiếu. Board Arduino SAM (Do) AR_DEFAULT: tham chiếu analog mặc định là 3.3V. Đây là tùy chọn duy nhất đƣợc hỗ trợ cho Due. Cú pháp analogReference(type); Thông số type: một trong các kiểu giá trị sau: DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, hoặc EXTERNAL (xem danh sách các tùy chọn nhƣ trong mô tả). Trả về Không có Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 63 Ghi chú Nếu bạn sử dụng kiểu EXTERNAL cho hàm analogReference thì bạn phải cấp nó một nguồn nằm trong khoảng từ 0-5V, và nếu bạn đã cấp một nguồn điện thỏa mãn điều kiện trên vào chân AREF thì bạn phải gọi dòng lệnh analogReference(EXTERNAL) trƣớc khi sử dụng analogRead(). c. analogWrite() Miêu tả analogWrite() là lệnh xuất ra từ một chân trên mạch Arduino một mức tín hiệu analog (phát xung PWM). Ngƣời ta thƣờng điều khiển mức sáng tối của đèn LED hay điều chỉnh tốc độ động cơ. Tần số của tín hiệu PWM trên hầu hết các chân khoảng 490 Hz. Trên board Uno và các board tƣơng tự, chân 5 và 6 có tần số khoảng 980 Hz. Bạn không cần gọi hàm pinMode() để đặt chế độ OUTPUT cho chân sẽ dùng để phát xung PWM trên mạch Arduino. Cú pháp: analogWrite([chân phát xung PWM], [giá trị xung PWM]); Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tƣơng ứng với mức duty cycle từ 0% đến 100% Trả về Không có. Ví dụ: Đoạn code dƣới có chức năng làm sáng dần một đèn LED đƣợc kết nối vào chân số 2 trên mạch Arduino. int led = 2; void setup() { } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 64 void loop() { for (int i = 0; i <= 255; i++) { analogWrite(led,i); delay(20); } } Đoạn code trên có chức năng làm sáng dần một đèn LED đƣợc kết nối vào chân số 11 trên mạch Arduino. Hay ví dụ đặt đầu ra cho LED tỷ lệ với giá trị đƣợc đọc từ Cảm biến độ ẩm đất: int ledPin = 9; int analogPin = 4; // chân A0 của cảm biến độ ẩm đất đƣợc nối với chân A4 của arduino int val = 0; void setup() { pinMode(ledPin, OUTPUT); } void loop() { val = analogRead(analogPin); analogWrite(ledPin, val / 4); // giá trị analogRead khoảng 0 to 1023, analogWrite giá trị khoảng 0 to 255 } d. analogReadResolution (): Miêu tả analogReadResolution () là một phần mở rộng của Analog cho Arduino Due, Zero và MKR Family. Board Due, Zero và MKR Family có các tính năng ADC 12-bit. Điều này sẽ trả lại các giá trị từ analogRead() 0 đến 4095. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 65 Cú pháp analogReadResolution(bits) Thông số bits: xác định độ phân giải (tính theo bit) của giá trị trả về bởi hàm analogRead(). Bạn có thể đặt giá trị này từ 1 đến 32. Bạn có thể đặt độ phân giải cao hơn 12 nhƣng giá trị trả về analogRead()sẽ bị xấp xỉ. Trả về Không có Mã ví dụ Ví dụ cho thấy cách sử dụng ADC với nhiều độ phân giải khác nhau. void setup() { Serial.begin(9600); } void loop() { analogReadResolution(10); Serial.print("ADC 10-bit (default) : "); Serial.print(analogRead(A0)); analogReadResolution(12); Serial.print(", 12-bit : "); Serial.print(analogRead(A0)); analogReadResolution(16); Serial.print(", 16-bit : "); Serial.print(analogRead(A0)); / analogReadResolution(8); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 66 Serial.print(", 8-bit : "); Serial.println(analogRead(A0)); delay(100); } Ghi chú : Nếu bạn đặt giá trị analogReadResolution() cho một giá trị cao hơn khả năng của board, Arduino sẽ chỉ báo cáo lại ở độ phân giải cao nhất của nó, đệm thêm các bit với số không. e. analogWriteResolution () Miêu tả analogWriteResolution() là một phần mở rộng của Analog cho Arduino Due. analogWriteResolution()đặt độ phân giải của hàm analogWrite(). Nó mặc định là 8 bit (giá trị từ 0-255) để tƣơng thích đƣợc với arduino. Board Due có khả năng phần cứng nhƣ sau: 12 chân mà mặc định là 8-bit PWM, giống nhƣ board AVR. Có thể thay đổi độ phân giải 12-bit. 2 chân với 12-bit DAC (Bộ chuyển đổi Số-sang-tƣơng tự) Bằng cách thiết lập độ phân giải ghi là 12, bạn có thể sử dụng analogWrite()với các giá trị từ 0 đến 4095 để khai thác độ phân giải DAC đầy đủ hoặc để thiết lập tín hiệu PWM mà không cần lăn lên. Zero, có khả năng phần cứng nhƣ sau: 10 chân mà mặc định là 8-bit PWM, giống nhƣ bảng AVR. Có thể thay đổi độ phân giải 12-bit. 1 chân với 10-bit DAC (Bộ chuyển đổi Số-sang-Analog). Bằng cách đặt độ phân giải ghi là 10, bạn có thể sử dụng analogWrite()với các giá trị từ 0 đến 1023 để khai thác độ phân giải DAC đầy đủ Các board MKR có các khả năng phần cứng sau đây: 4 chân mà mặc định là 8-bit PWM, giống nhƣ board AVR. Có thể thay đổi từ 8 (mặc định) sang độ phân giải 12-bit. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 67 1 chân với 10-bit DAC (Bộ chuyển đổi Số-sang-tƣơng tự) Bằng cách đặt độ phân giải cho 12 bit, bạn có thể sử dụng analogWrite()với các giá trị từ 0 đến 4095 cho các tín hiệu PWM; đặt 10 bit trên pin DAC để khai thác độ phân giải DAC đầy đủ 1024 giá trị. Cú pháp analogWriteResolution(bits) Thông số bits: xác định độ phân giải (theo bit) của các giá trị đƣợc sử dụng trong hàm analogWrite(). Giá trị có thể dao động từ 1 đến 32. Nếu bạn chọn độ phân giải cao hơn hoặc thấp hơn khả năng phần cứng của bảng, giá trị đƣợc sử dụng analogWrite()sẽ bị cắt ngắn nếu nó quá cao hoặc có đệm bằng 0 nếu nó quá thấp. Trả về Không có Ví dụ: void setup(){ Serial.begin(9600); pinMode(11, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); } void loop(){ int sensorVal = analogRead(A0); Serial.print("Analog Read) : "); Serial.print(sensorVal); analogWriteResolution(8); analogWrite(11, map(sensorVal, 0, 1023, 0 ,255)); Serial.print(" , 8-bit PWM value : "); Serial.print(map(sensorVal, 0, 1023, 0 ,255)); // on the Due analogWriteResolution(12); analogWrite(12, map(sensorVal, 0, 1023, 0, 4095)); Serial.print(" , 12-bit PWM value : "); Serial.print(map(sensorVal, 0, 1023, 0, 4095)); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 68 analogWriteResolution(4); analogWrite(13, map(sensorVal, 0, 1023, 0, 15)); Serial.print(", 4-bit PWM value : "); Serial.println(map(sensorVal, 0, 1023, 0, 15)); } delay(5); 3. Hàm nhập xuất nâng cao I/O: a. noTone(); Miêu tả Ngừng tạo ra một sóng vuông kích hoạt bởi tone(). Không có hiệu lực nếu không có tone đƣợc tạo ra. Cú pháp noTone(pin) Thông số pin: chân để dừng tone Trả về Không có b. pulseIn () Miêu tả: Đọc thời gian của một xung (HIGH hoặc LOW) trên pin. Ví dụ: nếu giá trị là CAO , pulseIn()đợi cho pin đi CAO , bắt đầu tính thời gian, sau đó đợi cho pin để LOW và dừng thời gian. Trả về thời gian của xung trong các mili giây. Cung cấp và trả về 0 nếu không có xung bắt đầu trong một khoảng thời gian xác định. Hoạt động trên xung từ 10 microseconds đến 3 phút chiều dài. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 69 Cú pháp pulseIn(pin, value) pulseIn(pin, value, timeout) Thông số pin: số pin mà bạn muốn đọc xung. (int) value: loại xung để đọc: HIGH hoặc LOW . (int) timeout(tùy chọn): số microsecond chờ xung bắt đầu; mặc định là một giây (unsigned long) Trả về Thời gian của một xung (trong micro giây) hoặc 0 nếu không có xung bắt đầu trƣớc khoảng thời gian chờ (unsigned long) Ví dụ: Ví dụ tính thời gian của một xung trên pin 9. int pin = 9; unsigned long duration; void setup() { pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); } c. shiftIn(); Cú pháp byte incoming = shiftIn(dataPin, clockPin, bitOrder) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 70 Thông số dataPin: pin để nhập mỗi bit (int) clockPin: chân để bật / tắt tín hiệu báo đọc từ dataPin bitOrder: để thay đổi các bit; hoặc MSBFIRST hoặc LSBFIRST . (Bit quan trọng nhất đầu tiên, hoặc, Bit quan trọng nhất trƣớc tiên) Trả về Giá trị đọc (byte) d. shiftOut(); Miêu tả: shiftOut() có nhiệm vụ chuyển 1 byte (gồm 8 bit) ra ngoài từng bit một. Bit đƣợc chuyển đi có thể đƣợc bắt đầu từ bit nằm bên trái nhất (leftmost) hoặc từ bit nằm bên phải nhất (rightmost). Các bit này đƣợc xuất ra tại chân dataPin sau khi chân clockPin đƣợc pulsed (có mức điện thế là HIGH, sau đó bị đẩy xuống LOW). Lƣu ý: Nếu bạn đang giao tiếp với một thiết bị mà chân clock của nó có giá trị đƣợc thay đổi từ mức điện thế LOW lên HIGH (rising edge) khi shiftOut, thì bạn cần chắc chắn rằng chân clockPin cần đƣợc chạy lệnh này: digitalWrite(clockPin,LOW); Cú pháp shiftOut(dataPin, clockPin, bitOrder, value) Thông số: dataPin: pin sẽ đƣợc xuất ra tín hiệu ( int) clockPin: pin dùng để xác nhận việc gửi từng bit của dataPin (int) bitOrder: một trong hai giá trị MSBFIRST hoặc LSBFIRST. (Bắt đầu từ bit bên phải nhất hoặc Bắt đầu từ bit bên trái nhất) value: dữ liệu cần đƣợc shiftOut (byte) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 71 Chú ý shiftOut() chỉ xuất đƣợc dữ liệu kiểu byte. Nếu bạn muốn xuất một kiểu dữ liệu lớn hơn thì bạn phải shiftOut 2 lần (hoặc nhiều hơn), mỗi lần là 8 bit. Trả về không Ví dụ Đầu tiên, chúng ta cần bật IC 595 lên. Bạn hãy nối mạch nhƣ sau: GND (pin 8) nối đến cực âm (GND) Vcc (pin 16) nối đến chân 5V OE (pin 13) nối đến cực âm (GND) MR (pin 10) nối đến chân 5V /* shiftOut với 8 LED bằng 1 IC HC595 */ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 72 //chân ST_CP của 74HC595 int latchPin = 8; //chân SH_CP của 74HC595 int clockPin = 12; //Chân DS của 74HC595 int dataPin = 11; //Trạng thái của LED, hay chính là byte mà ta sẽ gửi qua shiftOut byte ledStatus; void setup() { //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { //Sáng tuần tự ledStatus = 0;//mặc định là không có đèn nào sáng hết (0 = 0b00000000) for (int i = 0; i < 8; i++) { ledStatus = (ledStatus << 1) | 1;//Đẩy toàn bộ các bit qua trái 1 bit và cộng bit có giá trị là 1 ở bit 0 /** Bắt buộc phải có để shiftOut **/ digitalWrite(latchPin, LOW); //các đèn LED sẽ không sáng khi bạn digital LOW //ShiftOut ra IC shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); digitalWrite(latchPin, HIGH);//các đèn LED sẽ sáng với trạng thái vừa đƣợc cập nhập /** Kết thúc bắt buộc phải có **/ delay(500); // Dừng chƣơng trình khoảng 500 mili giây để thấy các hiệu ứng của đèn LED } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 73 //Tắt tuần tự for (int i = 0;i<8;i++) { ledStatus <<= 1; //Đẩy tất cả các bit qua bên trái 1 bit digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); digitalWrite(latchPin, HIGH); delay(500); } } e. tone(); Giới thiệu Hàm này sẽ tạo ra một sóng vuông ở tần số đƣợc định trƣớc (chỉ nửa chu kỳ) tại một pin digital bất kỳ (analog vẫn đƣợc). Thời hạn của quá trình tạo ra sóng âm có thể đƣợc định trƣớc hoặc nó sẽ phát ra âm thanh liên tục cho đến khi Arduino IDE chạy hàm (noTone). Chân digital đó cần đƣợc kết nối tới một buzzer hoặc một loa để có thể phát đƣợc âm thanh. Lƣu ý rằng, chỉ có thể sử dụng duy nhất mộ hàm tone() trong cùng một thời điểm. Nếu hàm tone() đang chạy trên một pin nào đó, bây giờ bạn lại tone() thêm một lần nữa thì hàm tone() sau sẽ không có hiệu lực. Nếu bạn tone() lên pin đang đƣợc tone() thì hàm tone() sau sẽ thay đổi tần số sóng của pin đó. Trên mạch Arduino Mega, sử dụng hàm tone() thì sẽ can thiệp đến đầu ra PWM tại các chân digital 3 và digital 11. Chú ý: Nếu bạn muốn chơi nhiều cao độ khác nhau trên nhiều pin. Thì trƣớc khi chơi trên một pin khác thì bạn phải noTone() trên pin đang đƣợc sử dụng. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 74 Cú pháp tone(pin, frequency) tone(pin, frequency, duration) Tham số pin: cổng digial / analog mà bạn muốn chơi nhạc (nói cách khác là pin đƣợc kết nối tới loa) frequency: tần số của sóng vuông (sóng âm) duration: thời gian phát nhạc, đơn vị là mili giây (tùy chọn) Trả về Không có 4. Hàm thời gian: a. delay() Sự miêu tả Tạm dừng chƣơng trình cho khoảng thời gian (tính bằng mili giây) đƣợc chỉ định là tham số. (Có 1000 mili giây = 1 giây.) Cú pháp delay(ms) Thông số ms: số mili giây để tạm dừng ( unsigned long) Trả về Không có Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 75 Ví dụ int ledPin = 13; // LED pin 13 void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } b. delayMicroseconds () Miêu tả Tạm dừng chƣơng trình cho khoảng thời gian (tính bằng mili giây) đƣợc chỉ định là tham số. Và cứ mỗi 1000000 micro giây = 1 giây Cú pháp delayMicroseconds(us) Thông số us: số microseconds để tạm dừng ( unsigned int) Trả về Không có Ví dụ int outPin = 7; // chan so 7 void setup() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 76 pinMode(outPin, OUTPUT); } void loop() { digitalWrite(outPin, HIGH); delayMicroseconds(50); digitalWrite(outPin, LOW); delayMicroseconds(50); } Ghi chú: Chức năng này hoạt động rất chính xác trong phạm vi 3 micro giây. Và không thể đảm bảo rằng delayMicroseconds sẽ thực hiện chính xác cho thời gian trễ nhỏ hơn. c. micros() Miêu tả: micros() có nhiệm vụ trả về một số - là thời gian (tính theo micro giây) kể từ lúc mạch Arduino bắt đầu chƣơng trình của bạn. Nó sẽ tràn số và quay số 0 (sau đó tiếp tục tăng) sau 70 phút. Tuy nhiên, trên mạch Arduino 16MHz (ví dụ Duemilanove và Nano) thì giá trị của hàm này tƣơng đƣơng 4 đơn vị micro giây. Lƣu ý: 106 micro giây = 1 giây Tham số Không có Trả về Một số nguyên kiểu unsigned long là thời gian kể từ lúc thƣơng trình Arduino đƣợc khởi động Ví dụ unsigned long time; void setup(){ Serial.begin(9600); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 77 } void loop(){ Serial.print("Time: "); time = micros(); // in ra thời gian kể từ lúc chƣơng trình đƣợc bắt đầu Serial.println(time); // đợi 1 giây trƣớc khi tiếp tục in delay(1000); } d. millis(); Giới thiệu millis() có nhiệm vụ trả về một số - là thời gian (tính theo mili giây) kể từ lúc mạch Arduino bắt đầu chƣơng trình của bạn. Nó sẽ tràn số và quay số 0 (sau đó tiếp tục tăng) sau 50 ngày. Thông số Không có Trả về Một số nguyên kiểu unsigned long là thời gian kể từ lúc thƣơng trình Arduino đƣợc khởi động Ví dụ unsigned long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print("Time: "); time = millis(); // in ra thời gian kể từ lúc chƣơng trình đƣợc bắt đầu Serial.println(time); // đợi 1 giây trƣớc khi tiếp tục in Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 78 delay(1000); } Lưu ý : Các hàm về thời gian trong Arduino gồm millis() và micros() sẽ bị tràn số sau 1 thời gian sử dụng. Với hàm millis() là khoảng 50 ngày. Tuy nhiên, do là kiểu số nguyên không âm (unsigned long) nên ta dễ dàng khắc phục điều này bằng cách sử dụng hình thức ép kiểu. unsigned long time; byte ledPin = 10; void setup() { // khởi tạo giá trị biến time là giá trị hiện tại // của hàm millis(); time = millis(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } void loop() { // Lưu ý các dấu ngoặc khi ép kiểu // đoạn chương trình này có nghĩa là sau mỗi 1000 mili giây // đèn Led ở chân số 10 sẽ thay đổi trạng thái if ( (unsigned long) (millis() - time) > 1000) { // Thay đổi trạng thái đèn led if (digitalRead(ledPin) == LOW) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } // cập nhật lại biến time time = millis(); } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 79 5. Hàm toán học: a. abs() Mô tả Hàm abs có nhiệm vụ trả về giá trị tuyệt đối của một số. Cú pháp abs(x); Tham số x: một số bất kỳ Trả về Nếu x >= 0, thì trả về x còn ngƣợc lại là trả về -x Chú ý cú pháp abs(a--); // nếu bạn nhập nhƣ thế này thì sẽ bị lỗi đấy a--; abs(a); // nhƣng nếu nhập nhƣ thế này thì ổn! Và hãy ghi nhớ là không đƣợc để bất cứ phép tính nào bên trong hàm này, bạn nhé b. constrain() Giới thiệu Bắt buộc giá trị nằm trong một khoảng cho trƣớc. Cú pháp constrain(x, a, b) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 80 Tham số x: giá trị cần xét a: chặn dƣới (a là giá trị nhỏ nhất của khoảng) b: chặn trên (b là giá trị lớn nhất của khoảng) Trả về x: nếu a <= x <= b a: nếu x < a b: nếu x > b Ví dụ int sensVal = analogRead(A2); sensVal = constrain(sensVal, 10, 150); //Giới hạn giá trị sensVal trong khoảng [10,150] c. map() Mô tả map() là hàm dùng để chuyển một giá trị từ thang đo này sang một giá trị ở thang đo khác. Gía trị trả về của hàm map() luôn là một số nguyên. Cú pháp map(val,A1,A2,B1,B2); Trong đó: val là giá trị cần chuyển đổi A1, A2 là giới hạn trên và dƣới của thang đo hiện tại B1,B2 là giới hạn trên và dƣới của thang đo cần chuyển tới Ví dụ //Chuyển đổi 37 độ C sang độ F int C_deg = 37; int F_deg = map(37,0,100,32,212); //F_deg = 98 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 81 d. max() Miêu tả Hàm max có nhiệm vụ trả về giá trị lớn nhất giữa hai biến. Cú pháp max(x, y); Thông số x: số thứ nhất, mọi kiểu dữ liệu đều đƣợc chấp nhận. y: số thứ hai, mọi kiểu dữ liệu đều đƣợc chấp nhận. Trả về Số lớn nhất trong 2 số. Hàm max đƣợc dùng để lấy chặn dƣới (không để giá trị tụt xuống quá một mức quy định nào đó). e. min() Mô tả Hàm min có nhiệm vụ trả về giá trị nhỏ nhất giữa hai biến. Cú pháp min(x, y); Tham số x: số thứ nhất, mọi kiểu dữ liệu đều đƣợc chấp nhận. y: số thứ hai, mọi kiểu dữ liệu đều đƣợc chấp nhận. Trả về Số nhỏ nhất trong 2 số. Hàm min đƣợc dùng để lấy chặn trên (không để giá trị vƣợt quá một mức quy định nào đó). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 82 f. sq() Giới thiệu Hàm sq() đƣợc dùng để tính bình phƣờng của một số bất kì, số này có thể thuộc bất kì kiểu dữ liệu biển diễn số nào. sq() trả về giá trị mà nó tính đƣợc với kiểu dữ liệu giống nhƣ kiểu dữ liệu của tham số ta đƣa vào. Cú pháp sq([số cần tính bình phƣơng]); Ví dụ int binhphuong1 = sq(5); int binhphuong2 = sq(-5); float binhphuong3 = sq(9.9); float binhphuong4 = sq(-9.9); //binhphuong1 = 25 //binhphuong2 = 25 //binhphuong3 = 98.01 //binhphuong4 = 98.01 g. sqrt() Giới thiệu sqrt() là hàm dùng để tính căn bậc 2 của một số bất kì (có thể là số nguyên hoặc số thực tùy ý) và trả về kết quả này. Cú pháp sqrt([số cần tính căn bậc 2]); Ví dụ int v1 = sqrt(9); float v2 = sqrt(6.4); double v3 = sqrt(6.5256); int v4 = sqrt(-9); float v5 = sqrt(-6.4); //v1 = 3 //v2 = 2.53 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 83 //v3 = 2.55 //v4 = 0 //v5 = NaN (tham khảo hàm isnan()) Chú ý Tham số đƣa vào hàm sqrt() có thể là bất kì kiểu dữ liệu biểu diễn số nào. Kết quả trả về của sqrt() đƣợc định nghĩa là kiểu số thực double hoặc NaN nếu tham số đƣa vào là số thực bé hơn 0. 6. Hàm lượng giác: a. cos() Miêu tả Hàm này có nhiệm vụ tính cos một một góc (đơn vị radian). Giá trị chạy trong đoạn [-1,1]. Cú pháp cos(rad) Thông số rad: góc ở đơn vị radian (kiểu float) Trả về cos của góc rad (kiểu double) b. sin() Giới thiệu Hàm này có nhiệm vụ tính sin một một góc (đơn vị radian). Giá trị chạy trong đoạn [-1,1]. Cú pháp sin(rad) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 84 Tham số rad: góc ở đơn vị radian (kiểu float) Trả về sin của góc rad (kiểu double) c. tan() Giới thiệu Hàm này có nhiệm vụ tính tan một một góc (đơn vị radian). Giá trị chạy trong khoảng từ âm vô cùng đến dƣơng vô cùng. Cú pháp tan(rad) Tham số rad: góc ở đơn vị radian (kiểu float) Trả về tan của góc rad (kiểu double) 7. Hàm số ngẫu nhiên: a. random() Mô tả Trả về một giá trị nguyên ngẫu nhiên trong khoảng giá trị cho trƣớc. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 85 Cú pháp random(max+1); random(min,max+1); Trong đó: min và max là giá trị đầu và cuối của khoảng giá trị mà random() trả về. Trả về Giá trị nguyên ngẫu nhiên nằm trong khoảng từ min đến max. Nếu giá trị min không đƣợc đƣa vào thì nó đƣợc hiểu ngầm là 0. Ví dụ int a = random(100); //giá trị a nằm trong khoảng từ 0 đến 99 int b = random(0,11); //giá trị b nằm trong khoảng từ 0 đến 10 b. randomSeed() Mô tả Hàm random() luôn trả về một số ngẫu nhiên trong phạm vi cho trƣớc. Giả sử mình gọi hàm này 10 lần, nó sẽ trả về 10 giá trị số nguyên ngẫu nhiên. Nếu gọi nó n lần, random()sẽ trả về n số. Tuy nhiên những giá trị mà nó trả về luôn đƣợc biết trƣớc (cố định). Bạn hãy chạy thử chƣơng trình sau void setup(){ Serial.begin(9600); } void loop(){ Serial.println(random(100)); delay(200); } Tôi có thể khẳng định rằng 10 giá trị "ngẫu nhiên" đầu tiên bạn nhận đƣợc là: 7, 49, 73, 58, 30, 72, 44, 78, 23, 9,.... Điều này nghe có vẻ không đƣợc "ngẫu nhiên" cho lắm. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 86 Bạn hãy thử chạy chƣơng trình này: void setup(){ Serial.begin(9600); randomSeed(10); } void loop(){ Serial.println(random(100)); delay(200); } Nhận thấy rằng: chuỗi giá trị mà hàm random() trả về đã có sự thay đổi. Tuy nhiên chuỗi này vẫn là chuỗi cố định. Thử thay đổi tham số của lệnh randomSeed() từ 10 sang một số khác, bạn sẽ thấy chuỗi số trả về cũng thay đổi theo nhƣng giá trị xuất ra thì vẫn cố định, dù cho bạn có bấm nút reset trên Arduino thì chuỗi số đƣợc in ra những lẫn sau đều y hệt nhƣ lần đầu tiên chúng đƣợc in ra. Để ý rằng tham số của hàm random() vẫn cố định, dĩ nhiên nếu bạn thay đổi tham số này thì chuỗi ngẫu nhiên trả về sẽ thay đổi theo, nhƣng chúng cũng vẫn là một chuỗi số cố định. Với cùng khoảng giá trị truyền vào hàm random(), hàm randomSeed() quyết định trật tự các giá trị mà random() trả về. Trật tự này phụ thuộc vào tham số mà ta truyền vào randomSeed(). Cú pháp randomSeed(number); Với number là một số nguyên bất kì. Lƣu ý: nếu bạn gọi hàm random() mà không chạy lệnh randomSeed() trƣớc đó, chƣơng trình sẽ mặc định chạy sẵn lệnh randomSeed(0) (tham số là 0). Ví dụ Nếu chạy randomSeed(0), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 7, 49, 73, 58, 30, 72, 44, 78, 23, 9, ... Nếu chạy randomSeed(10), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 70 , 43, 1, 92, 65, 26, 40, 98, 48, 67, ... Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 87 Nếu chạy randomSeed(-46), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 15, 50, 82, 36, 36, 37, 25, 59, 93, 74, ... Nếu chạy randomSeed(159), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 13, 51, 67, 38, 22, 50, 67, 73, 81, 75, ... Nếu chạy randomSeed(159), hàm random(99) sẽ trả về 10 giá trị đầu tiên là: 67, 42, 70, 34, 53, 6, 42, 38, 29, 64, ... 8. Bits và Bytes: a. Bit() Giới thiệu Trả về một số nguyên dạng 2n (2 mũ n). Cú pháp bit(n) Thông số n: số nguyên Trả về số nguyên Ví dụ bit(0); // 2^0 = 1 bit(1); // 2^1 = 2 bit(2); // 2^2 = 4 // cũng có thể viết nhƣ sau 1 << 0 // = 1 1 << 1 // = 2 1 << 2 // = 4 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 88 b. bitClear() Giới thiệu bitClear() sẽ thay giá trị tại một bit xác định của một số nguyên thành 0. Cú pháp bitClear(x, n) Tham số x: một số nguyên thuộc bất cứ kiểu số nguyên nào n: vị trí bit cần ghi. Các bit sẽ đƣợc tính từ phải qua trái, và số thứ tự đầu tiên là số 0. Trả về Không có Ví dụ bitClear(B11110010,1); // B11110000 c. bitRead() Giới thiệu bitRead() sẽ trả về giá trị tại một bit nào đó đƣợc xác định bởi ngƣời lập trình của một số nguyên. Cú pháp bitRead(x, n) Tham số x: một số nguyên thuộc bất cứ kiểu số nguyên nào n: bit cần đọc. Các bit sẽ đƣợc tính từ phải qua trái, và số thứ tự đầu tiên là số 0 Trả về Giá trị của 1 bit (1 hoặc là 0) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 89 Ví dụ bitRead(B11110010,0); // trả về 0 bitRead(B11110010,1); // trả về 1 bitRead(B11110010,2); // trả về 0 //Hàm bitRead có thể viết nhƣ sau B11110010 >> 0 & 1 // = 0 B11110010 >> 1 & 1 // = 1 B11110010 >> 2 & 1 // = 0 d. bitWrite() Giới thiệu bitWrite() sẽ ghi đè bit tại một vị trí xác định của số nguyên. Cú pháp bitWrite(x, n, b) Tham số x: một số nguyên thuộc bất cứ kiểu số nguyên nào n: vị trí bit cần ghi. Các bit sẽ đƣợc tính từ phải qua trái, và số thứ tự đầu tiên là số 0. b: 1 hoặc 0 Trả về Không có Ví dụ bitWrite(B11110010,0,1); // B11110011 bitWrite(B11110010,1,0); // B11110000 bitWrite(B11110010,2,1); // B11110110 //Hàm bitWrite có thể viết nhƣ sau B11110010 | (1 << 0) // = B11110011 B11110010 & ~(1 << 1) // = B11110000 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 90 B11110010 | (1 << 2) // = B11110110 e. bitSet() Giới thiệu bitSet() sẽ thay giá trị tại một bit xác định của một số nguyên thành 1. Cú pháp bitSet(x, n) Tham số x: một số nguyên thuộc bất cứ kiểu số nguyên nào n: vị trí bit cần ghi. Các bit sẽ đƣợc tính từ phải qua trái, và số thứ tự đầu tiên là số 0. Trả về Không có Ví dụ bitSet(B11110010,0); // B11110011 bitSet(B11110010,2); // B11110110 //Hàm bitSet có thể viết nhƣ sau B11110010 | (1 << 0) // = B11110011 B11110010 | (1 << 2) // = B11110110 f. lowByte() Giới thiệu lowByte() là hàm trả về byte cuối cùng (8 bit cuối cùng) của một chuỗi các bit. Một số nguyên bất kì cũng đƣợc xem nhƣ là một chuỗi các bit, vì bất kì số nguyên nào cũng có thể biểu diễn ở hệ nhị phân dƣới dạng các bit "0" và "1". Lƣu ý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 91 lowByte() không nhận giá trị thuộc kiểu dữ liệu số thực. Bạn sẽ gặp lỗi biên dịch nếu cố làm điều này. Cú pháp lowByte([giá trị cần lấy ra 8 bit cuối]); Trả về byte Ví dụ int A = lowByte(0B11110011001100); //A = 0B11001100 = 204; int B = lowByte(511); //B = lowByte(0B111111111) = 255; int C = lowByte(5); //C = lowByte(0B00000101) = 0B101 = 5; g. highByte() Giới thiệu highByte() là hàm trả về một chuỗi 8 bit kề với 8 bit cuối cùng của một chuỗi các bit. Nhƣ vậy, nếu dữ liệu đƣa vào một chuỗi 16bit thì highByte() sẽ trả về 8 bit đầu tiên, nếu dữ liệu đƣa vào là một chuỗi 8bit hoặc nhỏ hơn, highByte() sẽ trả về giá trị 0. Một số nguyên bất kì cũng đƣợc xem nhƣ là một chuỗi các bit, vì bất kì số nguyên nào cũng có thể biểu diễn ở hệ nhị phân dƣới dạng các bit "0" và "1". Lƣu ý: highByte() không nhận giá trị thuộc kiểu dữ liệu số thực. Bạn sẽ gặp lỗi biên dịch nếu cố làm điều này. Cú pháp highByte([giá trị đƣa vào]); Trả về byte Ví dụ int A = highByte(0B1111111100000000); //A = 0B11111111 = 255; int B = highByte(0B10101010); //B = 0 int C = highByte(0B110000000011111111) //C = 0B00000000 = 0 int D = highByte(1023); //D = highByte(0B111111111) = 0B11 = 3 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 92 9. Hàm Ngắt (interrupt) a. interrupts() Giới thiệu Mặc định, Arduino luôn bật các ngắt nên trong phần setup(), bạn không cần gọi hàm này để bật các ngắt. Hàm interrupts() sẽ bật toàn bộ các ngắt đã đƣợc cài đặt. Nếu vì lý do nào đó bạn tắt các ngắt bằng hàm noInterrupts(), bạn sử dụng hàm này để bật lại các ngắt. Cú pháp interrupts(); Thông số Không có Trả về Không có Ví dụ void setup() {} void loop() { noInterrupts(); // tắt các ngắt để chạy // đoạn chƣơng trình yêu cầu cao về thời gian interrupts(); // bật lại các ngắt, các ngắt hoạt động // bình thƣờng trở lại } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 93 b. noInterrupts() Giới thiệu Khi cần chạy các đoạn chƣơng trình yêu cầu chính xác về thời gian, bạn cần tắt các ngắt để Arduino chỉ tập trung vào xử lý các tác vụ cần thiết và chỉ duy nhất các tác vụ này. Các ngắt chạy nền sẽ không đƣợc thực thi sau khi gọi hàm noInterrupts(). Cú pháp noInterrupts(); Thông số không Trả về không Ví dụ void setup() {} void loop() { noInterrupts(); // tắt các ngắt để chạy // đoạn chƣơng trình yêu cầu cao về thời gian interrupts(); // bật lại các ngắt, các ngắt hoạt động // bình thƣờng trở lại } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 94 10. Hàm Ngắt Ngoài: a. attachInterrupt() Giới thiệu Ngắt (interrupt) là những lời gọi hàm tự động khi hệ thống sinh ra một sự kiện. Những sự kiện này đƣợc nhà sản xuất vi điều khiển thiết lập bằng phần cứng và đƣợc cấu hình trong phần mềm bằng những tên gọi cố định. Vì ngắt hoạt động độc lập và tự sinh ra khi đƣợc cấu hình nên chƣơng trình chính sẽ đơn giản hơn. Một ví dụ điển hình về ngắt là hàm millis(). Hàm này tự động chạy cùng với chƣơng trình và trả về 1 con số tăng dần theo thời gian mặc dù chúng ta không cài đặt nó. Việc cài đặt hàm millis() sử dụng đến ngắt và đƣợc cấu hình tự động bên trong mã chƣơng trình Arduino. Vì sao cần phải dùng đến ngắt? Ngắt giúp chƣơng trình gọn nhẹ và xử lý nhanh hơn. Chẳng hạn, khi kiểm tra 1 nút nhấn có đƣợc nhấn hay không, thông thƣờng bạn cần kiểm tra trạng thái nút nhấn bằng hàm digitalRead() trong đoạn chƣơng trình loop(). Với việc sử dụng ngắt, bạn chỉ cần nối nút nhấn đến đúng chân có hỗ trợ ngắt, sau đó cài đặt ngắt sẽ sinh ra khi trạng thái nút chuyển từ HIGH->LOW. Thêm 1 tên hàm sẽ gọi khi ngắt sinh ra. Vậy là xong, biến trong đoạn chƣơng trình ngắt sẽ cho ta biết trạng thái nút nhấn. Số lƣợng các ngắt phụ thuộc vào từng dòng vi điều khiển. Với Arduino Uno bạn chỉ có 2 ngắt, Mega 2560 có 6 ngắt và Leonardo có 5 ngắt. Cú pháp attachInterrupt(interrupt, ISR, mode); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 95 Thông số interrupt: Số thứ tự của ngắt. Trên Arduino Uno, bạn có 2 ngắt với số thứ tự là 0 và 1. Ngắt số 0 nối với chân digital số 2 và ngắt số 1 nối với chân digital số 3. Muốn dùng ngắt bạn phải gắn nút nhấn hoặc cảm biến vào đúng các chân này thì mới sinh ra sự kiện ngắt. Nếu dùng ngắt số 0 mà gắn nút nhấn ở chân digital 4 thì không chạy đƣợc rồi. ISR: tên hàm sẽ gọi khi có sự kiện ngắt đƣợc sinh ra. mode: kiểu kích hoạt ngắt, bao gồm LOW: kích hoạt liên tục khi trạng thái chân digital có mức thấp HIGH: kích hoạt liên tục khi trạng thái chân digital có mức cao. RISING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp thấp sang mức điện áp cao. FALLING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp cao sang mức điện áp thấp. Lƣu ý: với mode LOW và HIGH, chƣơng trình ngắt sẽ đƣợc gọi liên tục khi chân digital còn giữ mức điện áp tƣơng ứng. Trả về không Ví dụ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 96 int ledPin = 12; void tatled() { // tắt đèn led khi nhấn nút, nhả ra led nhấp nháy trở lại digitalWrite(ledPin, LOW); } void setup() { pinMode(ledPin, OUTPUT); pinMode(2, INPUT_PULLUP); // sử dụng điện trở kéo lên cho chân số 2, ngắt 0 attachInterrupt(0, tatled, LOW); } void loop() { // đoạn chƣơng trình này nhấp nháy led sau 500ms digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); } b. detachInterrupt() Giới thiệu Hàm detachInterrupt() sẽ tắt các ngắt đã đƣợc kích hoạt tƣơng ứng với thông số truyển vào. Giả sử sau khi nhấn nút bấm lần đầu tiên đèn led sẽ tắt nhƣng nhấn lần thứ 2 đèn sẽ không tắt nữa. Lúc này cần dùng đến detachInterrupt() để tắt ngắt chúng ta đã tạo ra. Cú pháp detachInterrupt(interrupt); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 97 Thông số interrupt: số thứ tự ngắt (xem thêm ở attachInterrupt() ) Trả về không Ví dụ Đoạn chƣơng trình dƣới đây sẽ bật sáng đèn led và chỉ tắt nó khi nhấn lần đầu tiên, thả ra đèn sẽ sáng lại. Nếu tiếp tục nhấn nữa thì đèn vẫn sáng mà không bị tắt đi. int ledPin = 12; // đèn LED đƣợc kết nối với chân digital 12 boolean daNhan = false; // lƣu giữ giá trị cho biết đã nhấn nút hay chƣa void tatled() { digitalWrite(ledPin, LOW); // tắt đèn led khi còn nhấn nút daNhan = true; // lúc này đã nhấn nút } void setup() { pinMode(ledPin, OUTPUT); // thiết đặt chân ledPin là OUTPUT pinMode(2, INPUT_PULLUP); // sử dụng điện trở kéo lên cho chân số 2, ngắt 0 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 98 attachInterrupt(0, tatled, LOW); // cài đặt ngắt gọi hàm tatled } void loop() { digitalWrite(ledPin, HIGH); // bật đèn led if (daNhan == true) { // Nếu đã nhấn nút thì tắt ngắt đi detachInterrupt(0); } } 11. Hàm Giao tiếp a. Serial() Thư viện Serial được dùng trong việc giao tiếp giữa các board mạch với nhau (hoặc board mạch với máy tính hoặc với các thiết bị khác). Tất cả các mạch Arduino đều có ít nhất 1 cổng Serial (hay còn được gọi là UART hoặc USART). Giao tiếp Serial được thực hiện qua 2 cổng digital 0 (RX) và 1 (TX) hoặc qua cổng USB tới máy tính. Vì vậy, nếu bạn đang sử dụng các hàm của thư viện Serial này, bạn không thể sử dụng các chân digital 0 và digital 1 để làm việc khác được! Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 99 Bạn có thể sử dụng bảng Serial monitor có sẵn trong Arduino IDE để giao tiếp với Arduino qua giao thức Serial. Kích vào biểu tượng Serial Monitor ( ) hoặc nhấn tổ hợp phím Ctrl+Shift+M để mở bảng Serial Monitor, sau đó bạn kích chuột vào bảng chọn như hình dưới để chọn baudrate giống với baudrate được dùng trong quá trình lập trình của bạn. Mặc định là 9600. 12. Xử lý chuỗi: a. Hàm isAlpha() Hàm này kiểm tra xem ký tự đã truyền có phải là chữ cái không. Cú pháp: bool isAlpha(int c) Thông số Kiểu tham trị c: int Trả về Kiểu trả về: bool (true/ false) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 100 Ví dụ 1. int t = 'b'; // kí tự 2. bool c1; 3. int c2; 4. void setup() 5. { 6. Serial.begin(9600); 7. c1 = isAlpha(t); 8. //hoặc c2=isalpha(t); 9. Serial.println(c1); 10. // Serial.println(c2); 11.} 12.void loop() { ; } b. Hàm isAscii() Kiểm tra kí tự đã truyền có thuộc bảng ASCII hay không. Cú pháp: bool isAscii(int c) Kiểu tham trị c: int Kiểu trả về: bool (true/ false) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 101 Bảng tra cứu: c. Hàm isWhitespace() Kiểm tra xem kí tự đã truyền có phải là kí tự cách (‗ ‗) hoặc( ‗\t‘) không . Cú pháp bool isWhitespace(int c) Kiểu tham trị c: int Kiểu trả về: bool (true/ false) Ví dụ int t = ' '; // kí tự “trắng” bool c1; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 102 void setup(){ Serial.begin(9600); c1 = isWhitespace(t); Serial.println(c1); } void loop() { ; } d. Hàm isPrintable(): Hàm này kiểm tra xem ký tự đã truyền có thể in đƣợc không Cú pháp bool isPrintable(int c) Kiểu tham trị c: int Kiểu trả về: bool (true/ false) Ví dụ int t = 'a'; // a là kí tự có thể in (xem lại bảng) bool c1; int c2; void setup(){ Serial.begin(9600); c1 = isPrintable(t); //c2=isprint(t); Serial.println(c1); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 103 //Serial.println(c2); } void loop() { ; } e. Hàm isUpperCase(): Hàm này kiểm tra xem ký tự đã truyền có phải là một chữ hoa không Cấu trúc bool isUpperCase(int c ) Kiểu tham trị c: int Kiểu trả về: bool (true/ false) Ví dụ int t = 'A'; // A là một kí tự viết hoa (xem lại bảng) bool c1; int c2; void setup() { Serial.begin(9600); c1 = isUpperCase(t); //c2=isupper(t); Serial.println(c1); //Serial.println(c2); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 104 void loop() { ; } f. Hàm isHexadecimalDigit() Hàm này kiểm tra xem ký tự đã truyền có phải là ký tự thập lục phân không Cấu trúc bool isHexadecimalDigit(int c) Kiểu tham trị c: int Kiểu trả về: bool (true/ false) Ví dụ int t = 'A'; // A là một kí tự (có giá trị ) thuộc dãy thập lục phân (số Hex)(xem lại bảng) bool c1; int c2; void setup() { Serial.begin(9600); c1 = isHexadecimalDigit(t); // c2=isxdigit(t); Serial.println(c1); // Serial.println(c2); } void loop() { ; } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 105 g. tolower: Hàm này chuyển đổi các chữ cái hoa thành chữ thƣờng Cú pháp int tolower(int c) Kiểu tham trị c: int Kiểu trả về: int Ví dụ int t1 = 'A'; // Đổi chữ A thành a. (xem lại bảng) int t2; void setup() { t2 = tolower(t1); // kết quả t2='a' } void loop() { ; } h. Hàm toupper() Hàm này chuyển đổi các chữ cái thƣờng thành chữ hoa. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 106 Cú pháp int toupper(int c) Kiểu tham trị c: int Kiểu trả về: int Ví dụ int t1 = 'h'; // Đổi chữ h thành H. (xem lại bảng) int t2; void setup() { t2 = toupper(t1); // kết quả t2='H' } void loop() { ; } i. Hàm isLowerCase() Hàm này kiểm tra xem ký tự đã truyền có phải là một chữ thƣờng không Cấu trúc bool isLowerCase(int c) Kiểu tham trị c: int Kiểu trả về: bool (true/ false) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 107 Ví dụ int t = 'a'; // a là chữ thường (không viết in hoa) (xem lại bảng) bool c1; int c2; void setup() { Serial.begin(9600); c1 = isLowerCase(t); //c2=islower(t); Serial.println(c1); //Serial.println(c2); } void loop() { ; } II. GIÁ TRỊ : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 108 1. Hằng số a. Hằng số thực: Giới thiệu Hằng số thực (floating point constants) cũng có cách làm việc và sử dụng tƣơng tự. Khi bạn viết một biểu thức tính toán, giá trị của biểu thức này sẽ đƣợc tính ra và trình biên dịch sẽ thay thế biểu thức này bằng một hằng số thực đã tính ra đƣợc. Điều đó gợi ý rằng trong những chƣơng trình lớn, để giảm thời gian biên dịch, bạn nên tính trƣớc giá trị của những biểu thức thay vì bắt trình biên dịch tính toán. Ví dụ float a = .159; float b = 0.159; // a = b Để biểu thị những hằng số thực có giá trị cực lớn hoặc cực nhỏ, bạn phải sử dụng 2 kí hiệu khoa học là "E" và "e". Hằng số thực Ý nghĩa 10.0 10 2.34E5 2.34 * 105 234000 67e-12 67.0 * 10-12 0.000000000067 Giá trị b. Hằng số nguyên Giới thiệu Hằng số nguyên là những con số đƣợc sử dụng trực tiếp trong chƣơng trình. Theo mặc định, những con số này có kiểu là int (trong pascal thì kiểu int giống nhƣ kiểu integer). Ví dụ if (a >= 10) { a = 0; } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 109 Ở đây 0 và 10 đƣợc gọi là những hằng nguyên. Thông thƣờng, các hằng số nguyên đƣợc biểu thị dƣới dạng thập phân, nhƣng bạn có thể biểu thị chúng trong các hệ cơ số khác nhƣ sau: Hệ cơ số Ví dụ 10 (thập phân) 159 2 (nhị phân) B1111011 bắt đầu bằng 'B' biểu thị bằng 2 chữ số 0 và 1 (hoặc '0B') 8 (bát phân) 0173 bắt đầu bằng '0' biểu thị bằng các chữ số từ 0-7 bắt đầu bằng '0x' biểu thị bằng các chữ số từ 0-9 và kí tự từ A-F (hoặc a-f) 16 (thập lục phân) 0x7B Định dạng Ghi chú biểu thị bằng các chữ số từ 0 đến 9 Hệ thập phân (decimal) là hệ cơ số 10, cũng là hệ cơ số được dùng phổ biến nhất. Ví dụ: int a = 101; // có giá trị là 101 ở hệ thập phân ((1 * 10^2) + (0 * 10^1) + 1) Hệ nhị phân (binary) là hệ cơ số 2, chỉ được biểu thị bởi 2 chữ số "0" và "1", có tiền tố "B" (đôi khi là "0B") đứng đầu Ví dụ: int a = B101; // có giá trị là 5 ở hệ thập phân ((1 * 2^2) + (0 * 2^1) + 1) Các định dạng nhị phân chỉ hoạt động trên byte (8 bit) giữa 0 (B0) và 255 (B11111111). Nếu muốn sử dụng hệ nhị phân trên một số nguyên int (16 bít) thì bạn phải thực hiện quy trình 2 bƣớc nhƣ sau: long myInt = (B11100000 * 256) + B11111111; // myInt = B1110000011111111 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 110 Hệ bát phân (octal) là hệ cơ số 8, chỉ dùng các chữ số từ 0-7 để biểu thị, có tiền tố "0" đứng đầu int a = 0101; // có giá trị là 65 ở hệ thập phân ((1 * 8^2) + (0 * 8^1) + 1) Chú ý: Rất khó để tìm lỗi một cách dễ dàng nếu bạn không cẩn thận hoặc không thành thạo trong việc sử dụng hệ bát phân. Lý do là giả sử bạn muốn khai báo một hằng số nguyên ở hệ thập phân ví dụ 161, nhƣng do chƣa đọc bài này nên bạn "chơi trội" đặt thêm số 0 phía trƣớc. => chƣơng trình dịch hiểu sai hệ số bạn đang sử dụng => sinh ra lỗi logic khiến chƣơng trình chạy sai. Hệ thập lục phân (hexadecimal) là hệ cơ số 16, chỉ dùng các chữ số từ 0-9 và A-F (hoặc a-f) để biểu thị; A đại diện cho 10, B là 11, lên đến F là 15. Các chữ số dùng ở hệ này có tiền tố "0x" đứng trước Ví dụ: int a = 0x101; // có giá trị là 257 trong hệ thập phân ((1 * 16^2) + (0 * 16^1) + 1) Hậu tố U và L Theo mặc định, một hằng số nguyên đƣợc coi là một số nguyên kiểu int với những hạn chế trong giao tiếp giữa các giá trị. Để xác định một hằng số nguyên với một kiểu dữ liệu khác, bạn phải tuân theo quy tắc sau: Dùng 'u' hoặc 'U' để biểu thị kiểu dữ liệu unsigned (không âm). Ví dụ: 33u Dùng 'l' hoặc 'L' để biểu thị kiểu dữ liệu long. Ví dụ: 100000L Dùng 'ul' hoặc 'UL' để biểu thị kiểu dữ liệu unsigned long. Ví dụ: 32767ul Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 111 c. HIGH HIGH là một hằng số có giá trị nguyên là 1 Xét đoạn code ví dụ sau: int led1 = 12; void setup() { pinMode(led1, OUTPUT); digitalWrite(led1, HIGH); } void loop() { } Đoạn code này có chức năng bật sáng đèn led1 nối với chân số 12 trên mạch Arduino (Arduino Nano, Uno R3, Mega 2560, ...). Bạn có thể tải đoạn chƣơng trình này lên mạch Arduino của mình để kiểm chứng. Sau đó, hãy thử tải đoạn chƣơng trình này lên: int led1 = 12; void setup() { pinMode(led1, OUTPUT); digitalWrite(led1, 1); } void loop() { } Sẽ xuất hiện 2 vấn đề: Trong đoạn code thứ 2, "HIGH" đã đƣợc sửa thành "1". Đèn led trên mạch Arduino vẫn sáng bình thƣờng với 2 chƣơng trình khác nhau. Điều này khẳng định "HIGH là một hằng số có giá trị nguyên là 1" đã nêu ở trên. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 112 HIGH là một điện áp lớn hơn 0V Điện áp ở mức HIGH không có giá trị cụ thể nhƣ 3.3V, 5V, 9V, ... mà trong mỗi loại mạch điện, nó có trị số khác nhau và đã đƣợc quy ƣớc trƣớc. Trong các mạch Arduino, HIGH đƣợc quy ƣớc là mức 5V mặc dù 4V vẫn có thể đƣợc xem là HIGH. Ví dụ nhƣ trong mạch Arduino Uno R3, theo nhà sản xuất, điện áp đƣợc xem là ở mức HIGH nằm trong khoảng từ 3V đến 5V. d. LOW LOW là một hằng số có giá trị nguyên là 0 Xét đoạn code ví dụ sau: int led = 12; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } Đoạn code này có chức năng bật sáng đèn led nối với chân số 12 trên mạch Arduino (Arduino Nano, Uno R3, Mega 2560, ...). Sau đó, hãy thử tải đoạn chƣơng trình này lên: int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 113 digitalWrite(led, 0); delay(1000); } Sẽ xuất hiện 2 vấn đề: Trong đoạn code thứ 2, "LOW" đã đƣợc sửa thành "0". Đèn led trên mạch Arduino vẫn sáng bình thƣờng với 2 chƣơng trình khác nhau. Điều này khẳng định "LOW là một hằng số có giá trị nguyên là 0" đã nêu ở trên. LOW là một điện áp lớn hơn 0V Điện áp ở mức LOW không có giá trị cụ thể nhƣ 3.3V, 5V, 9V, ... mà trong mỗi loại mạch điện, nó có một trị số khác nhau nhƣng thƣờng là 0V hoặc gần bằng 0V. Trong các mạch Arduino, LOW đƣợc quy ƣớc là mức 0V mặc dù 0.5V vẫn có thể đƣợc xem là LOW. e. INPUT: Các Chân kỹ thuật số có thể đƣợc sử dụng đƣợc giá trị này. Để thay đổi cách sử dụng một pin, chúng ta sử dụng hàm pinMode(). Cấu hình một pin là INPUT Các pin của Arduino ( Atmega ) đƣợc cấu hình là một INPUT với pinMode ( ) có nghĩa là làm cho pin ấy có trở kháng cao (không cho dòng điện đi ra) . Pin đƣợc cấu hình là INPUT làm việc tiêu thụ năng lƣợng điện của mạch rất nhỏ, nó tƣơng đƣơng với một loạt các điện trở 100 Mega-ôm ở phía trƣớc của pin . Điều này làm cho chúng cực kì hữu ích cho việc đọc một cảm biến, nhƣng không cung cấp năng lƣợng một đèn LED. f. INPUT_PULLUP Các Chân kỹ thuật số có thể đƣợc sử dụng đƣợc giá trị này. Để thay đổi cách sử dụng một pin, chúng ta sử dụng hàm pinMode(). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 114 Cấu hình một pin là INPUT_PULLUP Chip Atmega trên Arduino có nội kéo lên điện trở (điện trở kết nối với hệ thống điện nội bộ) mà bạn có thể truy cập. Nếu bạn không thích mắc thêm một điện trở ở mạch ngoài, bạn có thể dùng tham số INPUT_PULLUP trong pinMode(). Mặc định khi không đƣợc kết nối với một mạch ngoài hoặc đƣợc kết nối với cực dƣơng thì pin sẽ nhận giá trị là HIGH, khi pin đƣợc thông tới cực âm xuống đất thì nhận giá trị là LOW. g. OUTPUT Các Chân kỹ thuật số có thể đƣợc sử dụng đƣợc giá trị này. Để thay đổi cách sử dụng một pin, chúng ta sử dụng hàm pinMode(). Để thiết đặt pin là một OUTPUT, chúng ta dùng pinMode ( ), điều này có nghĩa là làm cho pin ấy có một trở kháng thấp (cho dòng điện đi ra). Điều này có nghĩa, pin sẽ cung cấp một lƣợng điện đáng kể cho các mạch khác . Pin của vi điều khiển Atmega có thể cung cấp một nguồn điện liên tục 5V hoặc thả chìm ( cho điện thế bên ngoài chạy vào ) lên đến 40 mA ( milliamps ). Điều này làm cho chúng hữu ích để tạo năng lƣợng đèn LED nhƣng vô dụng đối với các cảm biến đọc! h. LED_BUILTIN Hầu hết các mạch Arduino đều có một pin kết nối với một LED (led nằm trên mạch) nối tiếp với một điện trở. LED_BUILTIN là một hằng số thay thế cho việc tuyên bố một biến có giá trị điều khiển on-board LED. Hầu hết trên các mạch Arduino, chúng có giá trị là 13 i. true Giới thiệu true là một hằng logic. Bạn cũng có thể HIỂU true là một HẰNG SỐ NGUYÊN mang giá trị là 1. Trong các biểu thức logic, một hằng số hay giá trị của một biểu thức khác 0 đƣợc xem nhƣ là mang giá trị true. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 115 Lưu ý Không đƣợc viết "true" thành TRUE hay bất kì một dạng nào khác. Các giá trị sau là tƣơng đƣơng nhau: true, HIGH, 1 j. false Giới thiệu Trái lại với true, false là một hằng logic có giá trị là phủ định của true (và ngƣợc lại), tức là (!true) = false. Bạn cũng có thể HIỂU false là một hằng số nguyên mang giá trị là 0. Trong các biểu thức logic, một hằng số hay giá trị của một biểu thức bằng 0 đƣợc xem nhƣ là bằng false. Lưu ý Không đƣợc viết "false" thành FALSE hay bất kì một dạng nào khác. Các giá trị sau là tƣơng đƣơng nhau: false, LOW, 0 2. Kiểu dữ liệu: a. void Miêu tả "void" là một từ khóa chỉ dùng trong việc khai báo một function. Những function đƣợc khai báo với "void" sẽ không trả về bất kì dữ liệu nào khi đƣợc gọi. Ví dụ led = 10; void setup() { pinMode(led, OUTPUT); } void loop() { blink(); } void blink() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 116 digitalWrite(led, LOW); delay(3000); digitalWrite(led, HIGH); delay(1000); } Giải thích e. "blink" là một function đƣợc định nghĩa với từ khóa "void", do đó nó không trả về một giá trị nào. Nhiệm vụ của "blink" chỉ là làm nhấp nháy đèn LED ở chân số 13 trên mạch Arduino. f. Bạn có thể thấy rằng những function kiểu này không dùng lệnh "return" để trả về giá trị của function. b. boolean Giới thiệu Một biến đƣợc khai báo kiểu boolean sẽ chỉ nhận một trong hai giá trị: true hoặc false. Và bạn sẽ mất 1 byte bộ nhớ cho điều đó. Lưu ý Những cặp giá trị sau là tƣơng đƣơng nhau. Về bản chất, chúng đều là những hằng số nguyên với 2 giá trị 0 và 1: true - false HIGH - LOW 1-0 Ví dụ: int led = 10; boolean led_status; void setup() { pinMode(led, OUTPUT); led_status = true; // led ở trạng thái bật } void loop() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 117 digitalWrite(led, led_status); // bật đèn, led_status = 1 delay(1000); digitalWrite(led, !led_status); // tắt đèn, !led_status = 0 delay(1000); } c. int: Giới thiệu Kiểu int là kiểu số nguyên chính Arduino. Kiểu int chiếm 2 byte bộ nhớ ! đƣợc dùng trong chƣơng trình Trên mạch Arduino Uno, nó có đoạn giá trị từ -32,768 đến 32,767 (-215 đến 215-1) (16 bit) Trên mạch Arduino Due, nó có đoạn giá trị từ -2,147,483,648 đến 2,147,483,647 (231 đến 231-1) (32 bit) (lúc này nó chiếm 4 byte bộ nhớ) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 118 Ví dụ int ledPin = 10; Cú pháp int var = val; var: tên biến val: giá trị d. unsigned int Giới thiệu Kiểu unsigned int là kiểu số nguyên nằm trong khoảng từ 0 đến 65535 (0 đến 216 1). Mỗi biến mang kiểu dữ liệu này chiếm 2 byte bộ nhớ. Lưu ý Trên Arduino Due, unsigned int có khoảng giá trị từ 0 đến 4,294,967,295 (2 32 - 1) (lúc này nó chiếm 4 byte bộ nhớ). Bạn có thể dễ dàng nhận ra rằng kiểu dữ liệu này không chứa các giá trị âm so với kiểu int. Cú pháp unsigned int [tên biến] = [giá trị]; Ví dụ unsigned int ledPin = 10; Khi một biến kiểu unsigned int đƣợc gán trị vƣợt ngoài phạm vi giá trị (bé hơn 0 hoặc lớn hơn 65525), giá trị của biến này sẽ tự động đƣợc đẩy lên giới hạn trên hoặc giới hạn dƣới trong khoảng giá trị của nó. unsigned int x = 0; // x nhận giá trị trong khoảng từ 0 đến 65535 x=x-1 // x = 0 - 1 = 65535 (giới hạn trên của x) x=x+1 // x = 65535 + 1 = 0 (giới hạn dƣới của x) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 119 e. char Giới thiệu Kiểu dữ liệu này là kiểu dữ liệu biểu diễn cho 1 KÝ TỰ (nếu bạn cần biểu diễn một chuỗi trong chƣơng trình Arduino - bạn cần sử dụng kiểu dữ liệu String). Kiểu dữ liệu này chiếm 1 byte bộ nhớ! Kiểu char chỉ nhận các giá trị trong bảng mã ASCII. Kiểu char đƣợc lƣu dƣới dạng 1 số nguyên byte có số âm (có các giá trị từ -127 128), thay vì thiết đặt một biến kiểu char có giá trị là 'A', bạn có thể đặt là 65. Để hiểu rõ hơn bạn xem ví dụ dƣới đây. Ví dụ char myChar = 'A'; char myChar = 65; // cả 2 cách khai báo đều hợp lệ f. unsigned char Giới thiệu Giống hệt bài giới thiệu về kiểu char. Tuy nhiên kiểu unsigned char lại biểu hiệu một số nguyên byte không âm (giá trị từ 0 - 255). Ví dụ unsigned char myChar = 240; g. byte Giới thiệu Là một kiểu dữ liệu biểu diễn số nguyên nằm trong khoảng từ 0 đến 255. Bạn sẽ mất 1 byte bộ nhớ cho mỗi biến mang kiểu byte Ví dụ byte a = 123; //khai báo biến a mang kiểu byte, có giá trị là 123 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 120 h. word Giới thiệu Giống nhƣ kiểu unsigned int, kiểu dữ liệu này là kiểu số nguyên 16 bit không âm (chứa các giá trị từ 0 đến 65535), và nó chiếm 2 byte bộ nhớ! Ví dụ word a = 2000; i. long Giới thiệu long là một kiểu dữ liệu mở rộng của int. Những biến có kiểu long có thể mang giá trị 32bit từ -2,147,483,648 đến -2,147,483,647. Bạn sẽ mất 4 byte bộ nhớ cho một biến kiểu long. Khi tính toán với số nguyên (biến kiểu int), bạn phải thêm hậu tố "L" phía sau các số nguyên kiểu int để chuyển chúng sang kiểu long. Việc tính toán (cộng, trừ, nhân,...) giữa 2 số thuộc 2 kiểu dữ liệu khác nhau là không đƣợc phép. Ví dụ long a = 10; long b = a + 10L // b = 20. j. unsigned long Giới thiệu Kiểu unsigned long là kiểu số nguyên nằm trong khoảng từ 0 đến 4,294,967,295 (0 đến 232 - 1). Mỗi biến mang kiểu dữ liệu này chiếm 4 byte bộ nhớ. Ví dụ unsigned long time; void setup() { Serial.begin(9600); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 121 void loop() { Serial.print("Time: "); time = millis(); Serial.println(time);//Xuất thời gian lúc chạy hết đoạn lệnh trên delay(1000); } k. short Giới thiệu Giống hệt kiể int, tuy nhiên có điều trên mọi mạch Arduino nó đều chiếm 4 byte bộ nhớ và biểu thị giá trị trong khoảnf -32,768 đến 32,767 (-215 đến 215-1) (16 bit). Ví dụ short ledPin = 13; Cú pháp short var = val; var: tên biến val: giá trị l. float Giới thiệu Để định nghĩa 1 kiểu số thực, bạn có thể sử dụng kiểu dữ liệu float. Một biến dùng kiểu dữ liệu này có thể đặt một giá trị nằm trong khoảng -3.4028235E+38 đến 3.4028235E+38. Nó chiếm 4 byte bộ nhớ. Với kiểu dữ liệu float bạn có từ 6-7 chữ số có nghĩa nằm ở bên mỗi bên dấu ".". Điều đó có nghĩa rằng bạn có thể đặt một số thực dài đến 15 ký tự (bao gồm dấu .) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 122 Lưu ý Để biểu diễn giá trị thực của một phép chia bạn phải 2 số thực chia cho lẫn nhau. Ví dụ: bạn xử lý phép tính 5.0 / 2.0 thì kết quả sẽ trả về là 2.5. Nhƣng nếu mà bạn xử lý phép tính 5 / 2 thì kết quả sẽ là 2 (vì hai số nguyên chia nhau sẽ ra một số nguyên). Ví dụ float myfloat; float sensorCalbrate = 1.117; Cú pháp float var = val; var: tên biến val: giá trị Ví dụ int x; int y; float z; x = 1; y = x / 2; // y sẽ trả về kết quả là 0 z = (float)x / 2.0; //z sẽ có kết quả là 0.5 (bạn nhập 2.0, chứ không phải là 2) m. double Giống hết nhƣ kiểu float. Nhƣng trên mạch Arduino Due thì kiểu double lại chiếm đến 8 byte bộ nhớ (64 bit). Vì vậy hãy cẩn thận khi sử dụng kiểu dữ liệu này! n. array Giới thiệu Array là mảng (tập hợp các giá trị có liên quan và đƣợc đánh dấu bằng những chỉ số). Array đƣợc dùng trên Arduino chính là Array trong ngôn ngữ lập trình C. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 123 Các cách khởi tạo một mảng int myInts[6]; // tạo mảng myInts chứa tối đa 6 phần tử (đƣợc đánh dấu từ 0-5), các phần tử này đều có kiểu là int => khai báo này chiếm 2*6 = 12 byte bộ nhớ int myPins[] = {2, 4, 8, 3, 6}; // tạo mảng myPins chứa 5 phần tử (lần lƣợt là 2, 4, 8, 3, 6). Mảng này không giới hạn số lƣợng phần tử vì có khai báo là "[]" int mySensVals[6] = {2, 4, -8, 3, 2}; // tạo mảng mySensVals chứa tối đa 6 phần tử, trong đó 5 phần tử đầu tiên có giá trị lần lƣợt là 2, 4, -8, 3, 2 char message[6] = "hello"; // tạo mảng ký tự (dạng chuỗi) có tối đa 6 ký tự! Truy cập các phẩn tử trong mảng Chú ý: Phần tử đầu tiên trong mảng luôn đƣợc đánh dấu là số 0. mySensVals[0] == 2, mySensVals[1] == 4, vâng vâng Điều này có nghĩa rằng, việc khai báo một mảng có tối đa 10 phần tử, thì phần tử cuối cần (thứ 10) đƣợc đánh dấu là số 9 int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[9] có giá trị là 11 // myArray[10] sẽ trả về một giá trị "hên xui" nằm trong khoảng giá trị của int Vì vậy, hãy chú ý trong việc truy cập đến giá trị trong mảng, nếu bạn muốn truy cập đến phần tử cuối cùng thì hãy truy đến đến ô giới hạn của mảng - 1. Hãy ghi nhớ rằng, trong trình biên dịch ngôn ngữ C, nó không kiểm tra bạn có truy cập đến một ô có nằm trong bộ nhớ hay không! Nên nếu không cẩn thận trong việc truy cập mảng, chƣơng trình của bạn sẽ mắc lỗi logic và rất khó để tìm lỗi đấy! Gán một giá trị cho một phần tử mySensVals[0] = 10; Đọc một giá trị của một phần tử và gán cho một biến nào đó cùng kiểu dữ liệu x = mySensVals[0]; //10 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 124 Dùng mảng trong vòng lặp Mảng rất thƣờng đƣợc dùng trong vòng lặp (chẳng hạn nhƣ dùng để lƣu các chân digital quản lý đèn led). Trong đó, biến chạy của hàm for sẽ đi hết (hoặc một phần) của mảng, tùy thuộc vào yêu cầu của bạn mà thôi! Ví dụ về việc in 5 phần tử đầu của mảng myPins: int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); } o. string Giới thiệu string tiếng Anh nghĩa là chuỗi. Cách khai báo char Str1[15]; // khai bảo chuỗi có độ dài là 15 ký tự. char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //khai báo chuỗi có độ dài tối đa là 8 ký tự và đặt nó giá trị ban đầu là arduino (7 ký tự). Buộc phải khai báo chuỗi nằm giữa hai dấu nháy đơn nhé! char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};//khai báo chuỗi có độ dài tối đa là 8 ký tự và đặt nó giá trị ban đầu là arduino<ký tự null> (8 ký tự) char Str4[ ] = "arduino";// Chƣơng trình dịch sẽ tự động điều chỉnh kích thƣớc cho chuỗi Str4 này và ngoài ra bạn phải đặt một chuối trong dấu ngoặc kép char Str5[8] = "arduino";// Một cách khai báo nhƣ Str3 char Str6[15] = "arduino"; // Một cách khai báo khác với độ dài tối đa lớn hơn CHÚ Ý: mỗi chuỗi đều cần có 1 ký tự NULL, nếu bạn không khai báo ký tự NULL (\0) ở cuối thì trình biên dịch sẽ tự động thêm vào. Đó là lý do vì sao Str2, Str4 lại có độ dài là 8 nhƣng chỉ chứa một chuỗi 7 ký tự. Ký tự NULL này để làm gì? Nó dùng để trình biên dịch biết điểm dừng của một chuỗi! Nếu không nó sẽ đọc tiếp những phần bộ nhớ khác (mà phần ấy không lƣu chuỗi) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 125 Bạn có thể khai bảo một chuỗi dài nhƣ sau: char myString[] = "This is the first line" " this is the second line" " etcetera" Mảng chuỗi Khi cần phải thao tác với một lƣợng lớn chuỗi (ví dụ nhƣ trong các ứng dụng trả lời ngƣời dùng bằng LCD) thì bạn cần sử dụng một mảng chuỗi. Mà bản chất của chuỗi là mảng các ký tự. Vì vậy để khai báo 1 mảng chuỗi bạn cần sử dụng một mảng 2 chiều! Để khai báo một mảng chuỗi, rất đơn giản: char* myStrings[] = {"I'm number 1", "I'm number 2"}; Chỉ cần thêm dấu * sau chữ char và trong dấu ngoặc vuông phía sau myStrings bạn có thể thiết đặt số lƣợng phần tử tối đa của mảng chuỗi! Ví dụ char* myStrings[]={"This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5","This is string 6"}; void setup(){ Serial.begin(9600); } void loop(){ for (int i = 0; i < 6; i++){ Serial.println(myStrings[i]); delay(500); } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 126 3. Chuyển đổi kiểu dữ liệu a. char() Giới thiệu Hàm char() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu char Cú pháp char(x) Tham số x: là một giá trị thuộc bất kỳ kiểu dữ liệu nào Trả về Giá trị thuộc kiểu char b. byte() Giới thiệu Hàm byte() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu byte Cú pháp byte(x) Tham số x: là một giá trị thuộc bất kỳ kiểu dữ liệu nào Trả về Giá trị thuộc kiểu byte Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 127 c. int() Giới thiệu Hàm int() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu int Cú pháp int(x) Tham số x: là một giá trị thuộc bất kỳ kiểu dữ liệu nào Trả về Giá trị thuộc kiểu int d. word() Giới thiệu Hàm word() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu word. Hoặc ghép 2 giá trị thuộc kiểu byte thành 1 giá trị kiểu word Cú pháp word(x) word(8bitDauTien,8bitSauCung) Tham số x: là một giá trị thuộc bất kỳ kiểu dữ liệu nào 8bitDauTien, 8bitSauCung: là giá trị kiểu byte Trả về Giá trị thuộc kiểu word Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 128 e. long() Giới thiệu Hàm long() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu long Cú pháp long(x) Tham số x: là một giá trị thuộc bất kỳ kiểu dữ liệu nào Trả về Giá trị thuộc kiểu long f. float() Giới thiệu Hàm float() có nhiệm vụ chuyển kiểu dữ liệu của một giá trị về kiểu float Cú pháp float(x) Tham số x: là một giá trị thuộc bất kỳ kiểu dữ liệu nào Trả về Giá trị thuộc kiểu float Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 129 4. Biến hằng, biến tĩnh: a. const - biến hằng Giới thiệu Với một từ khóa "const" nằm trƣớc một khai báo biến, bạn sẽ làm cho biến này thành một biến chỉ có thể đọc "read-only". Ví dụ const float pi = 3.14; float x; // .... x = pi * 2; nó pi = 7; // bạn có thể dụng hằng số pi trong tính toán - vì đơn giản bạn chỉ đọc // lỗi ! bạn không thể thay đổi giá trị của một hằng số Dùng const hay dùng #define ? Để khai báo một biến hằng số (nguyên / thực) hoặc hằng chuỗi thì bạn có thể dùng cả 2 cách đều đƣợc. Tuy nhiên, để khai báo một biến mảng (array) là một hằng số bạn chỉ có thể sử dụng từ khóa const. Và đây là một lý do nữa khiến const đƣợc dùng nhiều và đƣợc ƣa chuộng hơn #define! b. static - biến tĩnh Giới thiệu Biến tĩnh là biến sẽ đƣợc tạo ra duy nhất một lần khi gọi hàm lần đầu tiên và nó sẽ không bị xóa đi để tạo lại khi gọi lại hàm ấy. Đây là sự khác biệt giữa biến tĩnh và biến cục bộ. Biến tĩnh là loại biến lƣỡng tính, vừa có tính chất của 1 biến toàn cục, vừa mang tính chất của 1 biến cục bộ: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 130 Tính chất 1 biến toàn cục: biến không mất đi khi chƣơng trình con kết thúc, nó vẫn nằm trong ô nhớ của chƣơng trình và đƣợc tự động cập nhật khi chƣơng trình con đƣợc gọi lại. Giống nhƣ 1 biến toàn cục vậy. Tính chất 1 biến cục bộ: biến chỉ có thể đƣợc sử dụng trong chƣơng trình con mà nó đƣợc khai báo. Để khai báo bạn chỉ cần thêm từ khóa "static" trƣớc khai báo biến. Xem ví dụ để rõ hơn. Ví dụ void setup(){ Serial.begin(9600); // Khởi tạo cổng Serial ở baudrate 9600 } void loop() { testStatus();// Chạy hàm testStatus delay(500); // dừng 500 giây để bạn thấy đƣợc sự thay đổi } void testStatus() { static int a = 0;// Khi khai báo biến "a" là biến tĩnh // thì duy nhất chỉ có 1 lần đầu tiên khi gọi hàm testStatus // là biến "a" đƣợc tạo và lúc đó ta gán "a" có giá trị là 0 a++; Serial.println(a); // Biến a sẽ không bị mất đi khi chạy xog hàm testStatus // Đó là sự khác biệt giữa biến tĩnh và biến cục bộ! } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 131 III. CẤU TRÚC ( STRUCTURE): 1. Cấu trúc tổng thể: a. setup() và loop() Giới thiệu Những lệnh trong setup() sẽ đƣợc chạy khi chƣơng trình của bạn khởi động. Bạn có thể sử dụng nó để khai báo giá trị của biến, khai báo thƣ viện, thiết lập các thông số,… Sau khi setup() chạy xong, những lệnh trong loop() đƣợc chạy. Chúng sẽ lặp đi lặp lại liên tục cho tới khi nào bạn ngắt nguồn của board Arduino mới thôi. Ví dụ int led = 10; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } Giải thích Khi bạn cấp nguồn cho Arduino, lệnh ―pinMode(led, OUTPUT);” sẽ đƣợc chạy 1 lần để khai báo. Sau khi chạy xong lệnh ở setup(), lệnh ở loop() sẽ đƣợc chạy và đƣợc lặp đi lặp lại liên tục, tạo thành một chuỗi: digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 132 digitalWrite(led, HIGH); delay(1000); …… 2. Toán tử logic: Toán tử and (&&) Ý nghĩa Và or ( || ) Hoặc not ( ! ) Phủ định xor (^) Loại trừ Ví dụ (a && b) trả về TRUE nếu a và b đều mang giá trị TRUE. Nếu một trong a hoặc b là FALSE thì (a && b) trả về FALSE (a || b) trả về TRUE nếu có ít nhất 1 trong 2 giá trị a và b là TRUE, trả về FALSE nếu a và b đều FALSE nếu a mang giá trị TRUE thì (!a) là FALSE và ngƣợc lại (a ^ b) trả về TRUE nếu a và b mang hai giá trị TRUE/FALSE khác nhau, các trƣờng hợp còn lại trả về FALSE 3. Các toán tử so sánh. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 133 4. Cấu trúc điều khiển: a. Câu lệnh if…..else Cú pháp: if ([biểu thức 1] [toán tử so sánh] [biểu thức 2]) { [câu lệnh 1] } else { [câu lệnh 2] } //biểu thức điều kiện Nếu biểu thức điều kiện trả về giá trị TRUE, [câu lệnh 1] sẽ đƣợc thực hiện, ngƣợc lại, [câu lệnh 2] sẽ đƣợc thực hiện. Ví dụ: int a = 0; if (a == 0) { a = 10; } else { a = 1; } // a = 10 Lệnh if không bắt buộc phải có nhóm lệnh nằm sau từ khóa else int a = 0; if (a == 0) { a = 10; } // a = 10 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 134 b. switch / case Mô tả Giống nhƣ if, switch / case cũng là một dạng lệnh nếu thì, nhƣng nó đƣợc thiết kế chuyên biệt để bạn xử ý giá trị trên một biến chuyên biệt.. Ví dụ, bạn có một biến là action sẽ nhận trị từ những module khác qua serial. Nhƣng action sẽ nằm trong một các giá trị nào đó thì lúc này bạn hãy sử dụng switch / case. Ví dụ switch (action) { case "0": //bat led 1 break; case "1": //bat led 2 break; default: // mặc định là không làm gì cả // bạn có thể có default: hoặc không } Cú pháp switch (var) { case label: //đoạn lệnh break; case label: // Đoạn lệnh break; /* case ... more and more */ default: // statements } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 135 Tham số var: biến mà bạn muốn so sánh label: sẽ đem giá trị của biến SO SÁNH BẰNG với nhãn này c. for Giới thiệu Hàm for có chức năng làm một vòng lặp Bây giờ hãy lấy một ví dụ đơn giản nhƣ sau: Tôi muốn xuất 10 chữ số (từ 1 - 10) ra Serial. Nếu bạn chƣa đọc bài này và cũng chƣa biết kiến thức về for, bạn sẽ lập trình nhƣ sau: void setup() { Serial.begin(9600); Serial.println(1); Serial.println(2); Serial.println(3); Serial.println(4); Serial.println(5); Serial.println(6); Serial.println(7); Serial.println(8); Serial.println(9); Serial.println(10); } void loop() { // không làm gì cả; } Đoạn code khá dài và lặp đi lặp lại câu lệnh Serial.println Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 136 Nhƣng sau khi biết về hàm for bạn chỉ cần một đoạn code cực kì ngắn nhƣ sau: void setup(){ Serial.begin(9600); int i; for (i = 1;i<=10;i=i+1) { Serial.println(i); } } void loop(){ } Cấu trúc Nếu bạn chƣa biết về vòng lặp hoặc hàm for, để hiểu đƣợc hàm for, bạn cần nắm đƣợc 4 phần: 1. Hàm for là một vòng lặp có giới hạn - nghĩa là chắc chắn nó sẽ kết thúc (không sớm thi muộn). 2. Nó sẽ bắt đầu từ một vị trí xác định và đi đến một vị trí kết thúc. 3. Cứ mỗi bƣớc xong, nó lại thực hiện một đoạn lệnh 4. Sau đó, nó lại bƣớc đi tiếp, nó có thể bƣớc 1 bƣớc hoặc nhiều bƣớc, nhƣng không đƣợc thay đổi theo thời gian. Bây giờ tôi sẽ nói nó theo một cách khoa học qua cú pháp của hàm for (tôi sẽ chia làm 2 loại để các bạn dễ dàng ứng dụng vào code của mình). For tiến (xuất phát từ một vị trí nhỏ chạy đến vị trí lớn hơn) <vị trí kết thúc> bé hơn <vị trí kết thúc> for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> += <mỗi lần bƣớc mấy bƣớc>) { <đoạn câu lệnh>; } For lùi (xuất phát từ một vị trí lớn chạy về vị trí nhỏ hơn) <vị trí xuất phát> lớn hơn <vị trí kết thúc> for (<kiểu dữ liệu nguyên> <tên thằng chạy> = <vị trí xuất phát>; <tên thằng chạy> <= <vị trí kết thúc>; <tên thằng chạy> -= <mỗi lần lùi mấy bƣớc>) { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 137 <đoạn câu lệnh>; } Và khi đã hiểu đƣợc một cách sâu sắc thì đây là cú pháp chính của hàm For: for (<biến chạy> = <start>;<điều kiện>;<bƣớc>) { //lệnh } d. while Giới thiệu Vòng lặp while là một dạng vòng lặp theo điều kiện, mình không thể biết trƣớc số lần lặp cua nó, nhƣng mình quản lý lúc nào thì nó ngừng lặp! Cú pháp while (<điều kiện>) { //các đoạn lệnh; } Ví dụ int giay = 1; int phut = 1; while (giay < 60) { //Chừng nào day < 60 thì còn chạy (<=60). Khi day == 60 thì đƣợc 1 phút giay += 1; } phut+= 1; e. break Giới thiệu break là một lệnh có chức năng dừng ngay lập tức một vòng lặp (do, for, while) chứa nó trong đó. Khi dừng vòng lặp, tất cả những lệnh phía sau break và ở trong vòng lặp chịu ảnh hƣởng của nó sẽ bị bỏ qua. Ví dụ int a = 0; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 138 while (true) { if (a == 5) break; a = a + 1; } //a = 5 while (true) { while (true) { a++; if (a > 5) break; } a++; if (a > 100) break; } //a = 101 f. continue Giới thiệu continue là một lệnh có chức năng bỏ qua một chu kì lặp trong một vòng lặp (for, do, while) chứa nó trong đó. Khi gọi lệnh continue, những lệnh sau nó và ở trong cùng vòng lặp với nó sẽ bị bỏ qua để thực hiện những chu kì lặp kế tiếp. Ví dụ int a = 0; int i = 0; while (i < 10) { i = i + 1; continue; a = 1; } //a vẫn bằng 0 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 139 g. return Giới thiệu return có nhiệm vụ trả về một giá trị (cùng kiểu dữ liệu với hàm) mà nó đƣợc gọi! Cú pháp return; return value; // cả 2 đều đúng Thông số value: bất kỳ giá trị hoặc một đối tƣợng.. Ví dụ //Hàm kiểm tra giá trị của cảm biến có hơn một ngƣỡng nào đó hay không int checkSensor(){ if (analogRead(0) > 400) { return 1; else{ return 0; } h. goto Giới thiệu Nó có nhiệm vụ tạm dừng chƣơng trình rồi chuyển đến một nhãn đã đƣợc định trƣớc, sau đó lại chạy tiếp chƣơng trình! Cú pháp label: //Khai báo một nhãn có tên là label goto label; //Chạy đến nhãn label rồi sau đó thực hiện tiếp những đoạn chƣơng trình sau nhãn đó Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 140 Thủ thuật Không nên dùng lệnh goto trong chƣơng trình Program hay bất cứ chƣơng trình nào sử dụng ngôn ngữ C. Nhƣng nếu sử dụng một cách khôn ngoan bạn sẽ tối ƣu hóa đƣợc nhiều điều trong một chƣơng trình! Vậy nó hữu ích khi nào, đó là lúc bạn đang dùng nhiều vòng lặp quá và muốn thoát khỏi nó một cách nhanh chóng! Ví dụ for(byte r = 0; r < 255; r++){ for(byte g = 255; g > -1; g--){ for(byte b = 0; b < 255; b++){ if (analogRead(0) > 250){ goto bailout;} //thêm nhiều câu lệnh nữa } } } bailout: 5. Toán tử số học: a. Phép gán(=) Giới thiệu Dùng để gán một giá trị cho một biến. Giá trị nằm trên phải, tên biến nằm bên trái ngăn cách nhau bởi 1 dấu bằng. Ví dụ int sensor; // Khai báo kiểu dữ liệu cho biến sensor là int sensor = analogRead(0); // đặt giá trị cho sensor là giá trị analog tại chân A0 b. Các phép cộng, trừ, nhân, chia trong Arduino Giới thiệu Những phép toán trên có nhiệm vụ thực hiện việc tính toán trong Arduino. Tùy thuộc vào kiểu dữ liệu của các biến hoặc hằng số mà kết quả trả về của nó có kiểu dữ liệu nhƣ thế nào. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 141 Ví dụ y = y + 3; x = x - 7; i = j * 6; r = r / 5; Cú pháp result = value1 + value2; result = value1 - value2; result = value1 * value2; result = value1 / value2; Tham số value1: là một số ở bất kỳ kiểu dữ liệu nào value2: là một số ở bất kỳ kiểu dữ liệu nào c. Phép chia lấy dư% Giới thiệu Phép chia lấy dƣ là phép lấy về phần dƣ của một phép chia các số nguyên. Cú pháp <phần dƣ> = <số bị chia> / <số chia>; Ví dụ x = 7 % 5; x = 9 % 5; x = 5 % 5; x = 4 % 5; // x bây giờ là 2 // x bây giờ là 4 // x bây giờ là 0 // x bây giờ là 4 Tham khảo /* cập nhập lại giá trị trong hàm loop */ int values[10]; int i = 0; void setup() {} Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 142 void loop() { values[i] = analogRead(0); i = (i + 1) % 10; // giá trị của biến i sẽ không bao giờ vƣợt quá 9. } Lưu ý Phép chia lấy dƣ không khả dụng với kiểu dữ liệu float 6. Cú pháp mở rộng a. dấu chấm phẩy ( ; ) Giới thiệu Dùng để kết thúc một dòng lệnh. Ví dụ int ledPin = 13; Thủ thuật Giả sử bạn có quên dấu ";" này thì cũng không có vấn đề to tát lắm, chƣơng trình dịch của Arduino sẽ tự động dò tìm lỗi này và thông báo chính xác dòng bị lỗi! b. {} dấu ngoặc nhọn Giới thiệu Rất đơn giản, {} là một cặp dấu ngoặc nhọn, nên một khi bạn đã mở ngoặc thì phải đóng ngoặc lại cho nó! Nhiệm vụ của nó là cung cấp một cú pháp để gọi những lệnh cho những cấu trúc đặc biệt nhƣ (if, while, for,...) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 143 Cách sử dụng Trong hàm và thủ tục void myfunction(<kiểu dữ liệu> <tham số>){ <lệnh>; } Vòng lặp while (<điều kiện>) { <câu lệnh> } do { <câu lệnh> } while (<điều kiện>); for (<khởi tạo>; <điều kiện>; <bƣớc>) { <câu lệnh> } Lệnh rẻ nhánh if (<điều kiện 1>) { <lệnh 1> } else if (<điều kiện 2>) { <lệnh 2> } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 144 c. Comments - Viết ghi chú trong khi viết code Arduino Giới thiệu Bạn rất khó ghi nhớ từng dòng code một trong một chƣơng trình thật là dài, với những thuật toán phức tạp, vì vậy Arduino đã làm cho bạn một cú pháp để giải quyết vấn đề này, đó là Comments. Comments sẽ giúp bạn ghi chú cho từng dòng code hoặc trình bày nhiệm vụ của nó để bạn hoặc những ngƣời khác có thể hiểu đƣợc chƣơng trình này làm đƣợc những gì. Và comments sẽ không đƣợc Arduino biên dịch nên cho dù bạn viết nó dài đến đâu thì cũng không ảnh hƣởng đến bộ nhớ flash của vi điều khiển. Để comments trong Arduino, bạn có 2 cách. ( // chú thích code ), ( /* chú thích code */ ) Ví dụ /* chƣơng trình trên đƣợc viết bởi Phi Nguyen */ void setup() { pinMode(13, OUTPUT); // chân số 13 là chân OUTPUT } void loop() { digitalWrite(13, HIGH); // bật led trong vòng 3 giây delay(3000); digitalWrite(13, LOW); // tắt led trong vòng 1 giây delay(1000); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 145 d. #define Giới thiệu #define là một đối tƣợng của ngôn ngữ C/C++ cho phép bạn đặt tên cho một hằng số nguyên hay hằng số thực. Trƣớc khi biên dịch, trình biên dịch sẽ thay thế những tên hằng bạn đang sử dụng bằng chính giá trị của chúng. Quá trình thay thế này đƣợc gọi là quá trình tiền biên dịch (pre-compile). Cú pháp #define [tên hằng] [giá trị của hằng] Ví dụ #define pi 3.14 Nếu bạn viết code thế này ... #define pi 3.14 float a = pi * 2.0; // pi = 6.28 thì sau khi pre-compile trƣớc khi biên dịch, chƣơng trình của bạn sẽ nhƣ thế này: #define pi 3.14 float a = 3.14 * 2.0; // a = 6.28 e. #include Giới thiệu #include cho phép chƣơng trình của bạn tải một thƣ viện đã đƣợc viết sẵn. Tức là bạn có thể truy xuất đƣợc những tài nguyên trong thƣ viện này từ chƣơng trình của mình. Nếu bạn có một đoạn code và cần sử dụng nó trong nhiều chƣơng trình, bạn có thể dùng #include để nạp đoạn code ấy vào chƣơng trình của mình, thay vì phải chép đi chép lại đoạn code ấy. Cú pháp #include <[đƣờng dẫn đến file chứa thƣ viện]> Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 146 Ví dụ Giả sử bạn có thƣ mục cài đặt Arduino IDE tên là ArduinoIDE, thƣ viện của bạn có tên là EEPROM (đƣợc lƣu ở \ArduinoIDE\libraries\EEPROM\) Một đoạn code lƣu ở file code.h nằm trong thƣ mục function của thƣ viện EEPROM thì đƣợc khai báo nhƣ sau: 7. Phép toán hợp nhất a. Cộng một 1 đơn vị (++) / trừ một 1 đơn vị (--) Giới thiệu Tăng hoặc trừ một biến đi 1 đơn vị. Cú pháp x++; // tăng x lên 1 giá trị và trả về giá trị cũ của x ++x; // tăng x lên 1 giá trị và trả về giá trị mới của x x-- ; // trừ x lên 1 giá trị và trả về giá trị cũ của x --x ; // trừ x lên 1 giá trị và trả về giá trị mới của x Tham số x: bất kỳ kiểu số nguyên nào (int, byte, unsigned int,...) Trả về Giá trị cũ của biến hoặc giá trị mới đã đƣợc cộng / hoặc bị trừ của biến ấy. Ví dụ x = 2; y = ++x; y = x--; // x bây giờ có giá trị là 3, và y cũng có giá trị là 3 // x bây giờ đã trở lại với giá trị 2, nhƣng y không đổi vẫn là 3 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 147 b. Các phép toán rút gọn += , -= , *= , /= Giới thiệu Cung cấp một số phép toán rút gọn để bạn gõ code trong đẹp hơn. Cú pháp x += y; // giống nhƣ phép toán x = x + y; x -= y; // giống nhƣ phép toán x = x - y; x *= y; // giống nhƣ phép toán x = x * y; x /= y; // giống nhƣ phép toán x = x / y; Tham số x: mọi kiểu dữ liệu y: mọi kiểu dữ liệu hoặc hằng số Ví dụ x = 2; x += 4; // x bây giờ có giá trị là 6 x -= 3; // x bây giờ có giá trị là 3 x *= 10; // x bây giờ có giá trị là 30 x /= 2; // x bây giờ có giá trị là 15 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 148 C. CẤU TRÚC CHƢƠNG VÀ BÀI HỌC LẬP TRÌNH TỪ CƠ BẢN ĐẾN NÂNG CAO I. CẤU TRÚC CHƢƠNG TRÌNH ARDUINO CÁCH THÊM THƢ VIỆN VÀO IDE. VÀ 1. Cấu trúc chương trình Arduino: Trong một chƣơng trình Arduino, bạn cần có tối thiểu 2 hàm hệ thống chính, bắt buộc phải có. Đó là setup() và loop() Hàm setup() và loop() hoạt động nhƣ sau: Những lệnh trong setup() sẽ đƣợc chạy khi chƣơng trình của bạn khởi động. Bạn có thể sử dụng nó để khai báo giá trị của biến, khai báo thƣ viện, thiết lập các thông số,… Sau khi setup() chạy xong, những lệnh trong loop() đƣợc chạy. Chúng sẽ lặp đi lặp lại liên tục cho tới khi nào bạn ngắt nguồn của board Arduino mới thôi. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 149 Quá trình của một chƣơng trình có thể đƣợc miêu tả nhƣ sơ đồ dƣới đây: Ví dụ một chƣơng trình điều khiển led cơ bản: int led = 13; // khai báo chân điều khiển led là chân số 13 của arduino void setup() { //toàn bộ đoạn code nằm trong hàm này chỉ đƣợc chạy duy nhất một lần khi chạy chƣơng trình pinMode(led, OUTPUT); //sẽ đƣợc chạy 1 lần để khai báo chân ra của arduino } void loop() { // lặp lại mãi mãi sau khi chạy xong setup() digitalWrite(led, HIGH); //bật led delay(1000); // bật led trong vòng 1 giây digitalWrite(led, LOW); // tắt led delay(1000); // tắt led trong vòng 1 giây sau đó bật led và lặp lại quá trình. } 2. Hướng dẫn add thư viện cho Arduino IDE: Thƣ viện đóng vai trò vô cùng quan trọng trong việc lập trình điều khiển Ardunio. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 150 Nó cung cấp cho bạn một phƣơng thức cực kỳ đơn giản để giao tiếp giữa các module và arduino. ( ví dụ nhƣ giúp việc giao tiếp giữa Arduino với module thời gian thực DS1307 trở nên dễ dàng hơn rất nhiều) Thƣ viện trong Arduino chứa các mã nguồn có những đặc điểm chung, đƣợc xây dựng thành một gói bao gồm file: examples, .h, .cpp,...Nhằm giúp ngƣời sử dụng giải quyết đƣợc vấn đề nhanh chóng. Một số thƣ viện có sẵn trong chƣơng trình Arduino IDE nhƣ: Sevor, Stepper, EEPROM, Ethernet, SPI,... Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 151 Nhằm giúp ngƣời sử dụng giải quyết đƣợc vấn đề nhanh chóng, trong bài viết này tôi cài thƣ viện I2C làm ví dụ để cài vào thƣ viện cho Arduino IDE. Sau khi tải thƣ viện I2C về với file .zip (Tải tại đây) copy thƣ mục vào đƣờng dẫn sau: ( lƣu ý Arduino IDE chỉ hiểu những file .zip hoặc dạng folder.) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 152 Sau khi tải về và lƣu vào đƣờng dẫn ở trên, Ta vào Sketch Include Library Add sau đó chọn file I2C vừa tải về: Chọn Open để bắt đầu add thƣ viện I2C vào Arduino IDE: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 153 Nếu cửa sổ Arduino IDE báo dòng chữ dƣới đây thì đã cài thành công. Sau khi ài xong ta reset lại Arduino IDE và xem lại thƣ viện I2C đã có trong IDE chƣa. Vậy là OK Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 154 II. BÀI HỌC LẬP TRÌNH ARDUINO TỪ CƠ BẢN ĐẾN NÂNG CAO. 1. Điều khiển LED đơn sáng nhấp nháy. Nội dung chính. Hôm nay, chúng ta sẽ tìm hiểu cách để điều khiển một con đèn led nhấp nháy. Phần cứng ( Trên kit đã tích hợp sẵn chỉ cần nối dây là được) 1 arduino uno, nano,… 1 trở 220 Ohm 1 led đơn Lắp mạch Ở bài này ta điều khiển led đơn sáng nhấp nháy theo yêu cầu của mình. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 155 Hình ảnh thực tế: Code lập trình và giải thích Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Trƣớc tiên, cứ mỗi khi dùng một con LED, chúng ta phải pinMode OUTPUT chân Digital mà ta sử dụng cho con đèn LED. Trong ví dụ, chúng ta sử dụng chân LED là chân digital 12. Nên đoạn code sau cần nằm trong void setup() pinMode(12, OUTPUT); Để bật một con đèn LED, bạn phải digitalWrite HIGH cho chân số 12 (chân Digtal đƣợc kết nối với con LED). Đoạn code này nằm trong void loop() digitalWrite(12,HIGH); Dòng lệnh trên sẽ cấp một điện thế là 5V vào chân số Digital 12. Điện thế sẽ đi qua điện trở 220ohm rồi đến đèn LED (sẽ làm nó sáng mà không bị cháy, ngoài ra bạn có thể các loại điện trở khác <= 10kOhm). Để tắt một đèn LED, bạn sử dụng hàm: digitalWrite(12,LOW); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 156 Lúc này điện thế tại chân 12 sẽ là 0 V => đèn LED tắt. Và để thấy đƣợc trạng thái bật và tắt của đèn LED bạn phải dừng chƣơng trình trong một khoảng thời gian đủ lâu để mắt cảm nhận đƣợc (nói vậy thôi, chứ bạn chỉ cần dừng chƣơng trình trong vài miligiây là thấy đƣợc rồi). Vì vậy, hàm delay đƣợc tạo ra để làm việc này (Dừng hẳn chƣơng trình bao nhiêu mili giây)! code: /* Đoạn code làm nhấp nháy một đèn LED cho trƣớc */ // Hàm setup chạy một lần duy nhất khi khởi động chƣơng trình void setup() { pinMode(12, OUTPUT); } // Hàm loop chạy mãi mãi sau khi kết thúc hàm setup() void loop() { digitalWrite(12, HIGH); // bật đèn led sáng delay(5000); // dừng chƣơng trình trong 5 giây => thây đèn sáng đƣợc 5 giây digitalWrite(12, LOW); delay(2000); // tắt đèn led // dừng chƣơng trình trong 2 giây => thấy đèn tối đƣợc 2 giây } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 157 2. Thay đổi độ sáng của LED đơn. Nội dung chính: Hôm nay chúng sẽ tìm hiểu cách sử dụng các chân digital để xuất giá trị analog và ứng dụng chúng trong việc làm thay đổi độ sáng của đèn (làm mờ đèn). Phần cứng ( được tích hợp sẵn trên kit) nếu không có các bạn chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm breadboard. 1 điện trở (hoặc 220 Ohm hoặc 1kOhm). 1 đèn LED đơn. Lắp mạch Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 158 Hình ảnh thực tế: Lƣu ý những chân digital có dấu ~ phía trƣớc và những chân analog mới hỗ trợ analogWrite, Chương trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int led = 6; // cổng digital mà LED đƣợc nối vào int giatribandau = 0; // mặc định độ sáng của đèn int tanggiatri = 5; // mỗi lần thay đổi độ sáng thì thay đổi với giá trị là bao nhiêu void setup() { // pinMode đèn led là OUTPUT pinMode(led, OUTPUT); } void loop() { //xuất giá trị độ sáng đèn LED Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 159 analogWrite(led, giatribandau); // Đoạn code này có nghĩa nếu độ sáng == 0 hoặc bằng == 255 thì sẽ đổi chiều của biến thay đổi độ sáng. Ví dụ, nếu đèn từ sáng yếu --> sáng mạnh thì fadeAmount dƣơng. Còn nếu đèn sáng mạnh --> sáng yếu thì fadeAmmount lúc này sẽ có giá trị âm if (giatribandau == 0 || giatribandau == 255) { tanggiatri = - tanggiatri ; } //đợi 50 mili giây để thấy sự thay đổi của đèn delay(50); } 3. Điều khiển đèn giao thông. Phần cứng cần chuẩn bị ( nếu sử dụng kit thì được tích hợp sẵn) • Arduino Uno, Nano,… • Breadboard. • Dây cắm breadboard. • 3 điện trở 220 Ohm (hoặc 560 Ohm hoặc 1kOhm). • 3 LED đơn siêu sáng. Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 160 Hình ảnh thực tế: Code lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. // chƣơng trình điều khiển đèn giao thông int red = 8; int yellow = 9; int green = 10; void setup(){ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 161 pinMode(red,OUTPUT); pinMode(yellow,OUTPUT); pinMode(green,OUTPUT); } void loop(){ delay(15000); } void dengiaothong(){ digitalWrite(yellow,LOW); // tat den vang digitalWrite(green,LOW); // tat den xanh digitalWrite(red,HIGH); // bat den do delay(10000);// den đỏ sáng 10 giây. digitalWrite(green,LOW); // tat den xanh digitalWrite(red,LOW); // tat den do digitalWrite(yellow,HIGH); // bat den vang delay(2000); // đèn vàng sáng 2 giây. digitalWrite(yellow,LOW); // tat den vang digitalWrite(red,LOW); // tat den do digitalWrite(green,HIGH); // bat den xanh trong vong 15 giây } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 162 4. Điều khiển Rơ le 5Vdc 1, 2 kênh mức cao. Giới thiệu thiệu chung: Module 1 Relay với opto cách ly nhỏ gọn, có opto và transistor cách ly giúp cho việc sử dụng trở nên an toàn với board mạch chính, mạch đƣợc sử dụng để đóng ngắt nguồn điện công suất AC ( quạt hay đèn,…) hoặc DC. Role 1 kênh ( có 1 role) và 2 kênh ( 2 rơ le) trên thuộc loại kích mức cao. Tiếp điểm đóng ngắt gồm 3 tiếp điểm NC (thƣờng đóng), NO(thƣờng mở) và COM(chân chung) đƣợc cách ly hoàn toàn với board mạch chính. Ở trạng thái bình thƣờng chƣa kích NC sẽ nối với COM, khi có trạng thái kích COM sẽ chuyển sang nối với NO và mất kết nối với NC. Thông số kỹ thuật: Sử dụng điện áp nuôi DC 5V. Relay mỗi Relay tiêu thụ dòng khoảng 80mA. Điện thế đóng ngắt tối đa: AC250V ~ 10A hoặc DC30V ~ 10A. Có đèn báo đóng ngắt trên mỗi Relay. Phần cứng chuẩn bị: Arduino Uno, Nano,… Rơ le 1 ( hoặc 2) kênh mức cao. Dây cắm test board. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 163 Lắp mạch: Code chương trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. // Code này sử dụng cho role mức cao int role = 11; // có thể sử dụng chân khác của arduino để điều khiển rơ le void setup() { pinMode(role, OUTPUT); // role đƣợc khai báo là chân ra } void loop() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 164 digitalWrite(role, HIGH); // bật role trong 10 giay delay(10000); digitalWrite(role, LOW); // tắt role trong 4 giây delay(4000); } Hình ảnh thực tế: 5. Điều khiển Công tắc tơ 3 pha: Giới thiệu công tắc tơ 3 pha: Công tắc tơ là gì?: Công tắc tơ là khí cụ điện để đóng, ngắt thƣờng xuyên các mạch điện động lực, từ xa, bằng tay (thông qua nút bấm) hoặc tự động có công suất lớn. Việc đóng cắt công tắc tơ có thể đƣợc thực hiện bằng nam châm điện, thủy lực hoặc khí nén. Thông thƣờng sẽ sử dụng nam châm điện để đóng cắt công tắc tơ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 165 Cấu tạo công tắc tơ: Bao gồm các bộ phận chính: Cuộn cảm, nam châm điện, lò xo, lõi thép và các tiếp điểm. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 166 Nguyên lý hoạt động công tắc tơ: -Khi cuộn hút công tắc tơ chƣa đƣợc cấp điện, lò xo hồi vị đẩy lõi thép động cách xa khỏi lõi thép tĩnh. Các cặp tiếp điểm chính ở trạng thái mở. - Khi cấp điện vào cuộn hút của công tắc tơ, lõi thép tĩnh hút lõi thép động thắng đƣợc lực đẩy lò xo, từ đó đóng các tiếp điểm lại, đƣa điện đi từ đầu vào Công tắc tơ tới đầu ra công tắc tơ. - Khi ngắt điện cấp vào cuộn hút công tắc tơ, lực hút không còn nữa, lò xo lại đẩy lõi thép động về vị trí ban đầu, các cặp tiếp điểm mở ra, ngắt điện ở đầu ra công tắc tơ. - Ngoài tiếp điểm chính để truyền tải điện 3 pha, công tắc tơ còn có thêm các tiếp điểm phụ để sử dụng trong các mạch điều khiển, mạch logic trung gian. Phần cứng chuẩn bị: Mạch arduino uno, nano, mê ga,… Công tắc tơ LS hàn quốc ( trong bài này sử dụng loại 18A). Module rơ le 5Vdc ( trong bài sử dụng loại kích mức cao). Dây cắm test và một số dây điện dân dụng hoặc công nghiệp. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 167 Lắp mạch: Code chương trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. // Code này sử dụng cho role mức cao int role = 3;// sử dụng chân 3 để điều khiển rơ le đóng ngắt cuộn từ của công tắc tơ void setup() { pinMode(role, OUTPUT); // role đƣợc khai báo là chân ra } void loop() { digitalWrite(role, HIGH); // bật role trong 10 giây cũng nhƣ cấp điện cho cuộn từ 10 s delay(10000); digitalWrite(role, LOW); // tắt role trong 10 giây cũng nhƣ ngắt điện cho cuộn từ 10 s Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 168 delay(10000); } // trong phần sau chúng ta sử dụng nút nhấn để bật tắt role đóng ngắt cuộn từ của công tắc tơ 6. Đọc tín hiệu nút nhấn hiển thị lên serial monitor. Giới thiệu về nút nhấn: Tôi sẽ giới thiệu cho các bạn những loại button ( nút nhấn) phổ biến hiện nay. Nút nhấn tt n là gì? Bạn có thể tìm thấy nó ở mọi thứ trong cuộc sống, chẳng hạn nhƣ cái nút trong bàn phím máy tính của mình,… c l ại tt n: Button có rất nhiều loại, và mỗi loại lại có ứng dụng riêng của nó. Vì vậy, chỉ cần s dụng hợp lý và sáng tạo các loại button - nút bấm, bạn sẽ làm nên những dự án. Nút nhấn thƣờng có 2 loại chính: 2 chân và 4 chân ( thực chất 4 chân giống 2 chân chỉ giúp nó cố định và chắc chắn hơn). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 169 utton (thường ( mm ho c 12mm) Đây là loại button rất phổ biến, loại button này cũng có các kính thƣớc cạnh 6mm, 9mm hoặc 12m. Loại 6mm hay đƣợc dùng trong các dự án nhỏ và loại còn lại dùng cho các dự án lớn hơn. Loại này tuy là 4 chân, nhƣng thực chất cũng chỉ là 2 chân mà thôi, các bạn xem hình dƣới. Ƣu điểm của loại có 4 chân này là nó khá vững và rất khó hƣ! utton dán (button smd Loại này khá là nhỏ, chỉ 2-3mm, vì vậy rât phù hợp cho những mạch yêu cầu về kích thƣớc, bạn có thể tìm thấy nó trên con nano, nó chính là nút reset cho chú Arduino nano. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 170 Nút bấm công nghiệp: Những loại nút bấm này thƣờng đƣợc dùng để chế tạo những đồ trong công nghiệp, hoặc những máy móc to lớn cần bấm nhiều và cần đèn trạng thái. Loại này đôi khi có đèn, đôi khi lại không. Với loại không có đèn thì cũng có 2 chân nhƣ các loại ở trên, còn loại có đèn thì có đến 4 chân (2 chân của button, 1 chân dƣơng và 1 chân âm của led). Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard Điện trở 10 kΩ. Nút nhấn 2 chân hoặc 4 chân (hoặc công tắc tƣơng đƣơng). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 171 Sơ đồ nguyên lí: Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 172 Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int nutnhan = 2; // khai bao chan nut nhấn là chân D2 void setup() { Serial.begin(9600); //Mở cổng Serial ở baudrate 9600 để giao tiếp với máy tính pinMode(button, INPUT); //Cài đặt chân D2 ở trạng thái đọc dữ liệu } void loop() { int buttonStatus = digitalRead(nutnhan); //Đọc trạng thái button Serial.println(buttonStatus); //Xuất trạng thái button delay(200); //Chờ 200ms } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 173 Khi bạn chƣa nhấn nút, chân D2 đƣợc nối với GND qua một điện trở 10 kΩ, do đó lệnh digitalRead(nutnhan) sẽ trả về giá trị 0 (LOW). Khi bạn nhấn nút, chân D2 sẽ đƣợc nối trực tiếp với 5V và nối với GND thông qua 1 điện trở 10kΩ, lệnh digitalRead(nutnhan) sẽ trả về giá trị 1 (HIGH). Khi chƣa nhấn nút, nếu bạn nối chân D2 với GND qua 1 điện trở thì ngƣời ta gọi điện trở này là điện trở pulldown. Trái lại, nếu bạn nối D2 với chân 5V qua một điện trở thì ngƣời ta gọi nó là điện trở pullup. Cách nối ở trên hình sử dụng cách nối điện trở pulldown. Sau khi upload code lên mạch Arduino, bạn bấm Ctrl + Shift + M để mở cửa sổ Serial Monitor để xem trạng thái nút nhấn đƣợc mạch Arduino gửi về máy tính. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 174 Trong câu lệnh: pinMode(button, INPUT); Bạn hãy sửa INPUT thành INPUT_PULLUP rồi tải lại code của bạn lên mạch Arduino. Bạn có thể tháo điện trở 10 kΩ ra và xem kết quả ... Đó là vì trong vi điều khiển ATmega328 của Arduino UNO đã có sẵn điện trở pullup tƣơng tự điện trở pulldown mà bạn đang mắc, tuy nhiên nếu bạn khai báo là INPUT nhƣ mặc định thì nó sẽ không đƣợc sử dụng, trái lại việc khai báo INPUT_PULLUP sẽ kích hoạt điện trở này. 7. Lưu giá trị nút nhấn. Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard Điện trở 10 kΩ. Nút nhấn 2 chân hoặc 4 chân (hoặc công tắc tƣơng đƣơng). Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 175 Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int nutnhan = 2; // định nghĩa chân số 0 là button int t = 0; // khai báo biến int status1; // biến lƣu các trạng thái nút nhấn // viết hàm chống dội boolean chong_doi() { int sta =!digitalRead(nutnhan); // đọc trạng thái nút nhấn } // khởi tạo void setup() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 176 Serial.begin(9600); pinMode(nutnhan,INPUT); } void loop() // vong lap { int buttonState = digitalRead(nutnhan); //Serial.println(buttonState); status1 = chong_doi(); if(status1==true) { { t=!t;// đảo trạng thái } while(status1==true){status1=chong_doi();} } Serial.println(t); } Sau khi upload code lên mạch Arduino, bạn bấm Ctrl + Shift + M để mở cửa sổ Serial Monitor để xem trạng thái nút nhấn đƣợc mạch Arduino gửi về máy tính. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 177 8. Bật tắt LED khi nhấn nút nhấn. Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard Điện trở 10 kΩ. Nút nhấn 2 chân hoặc 4 chân (hoặc công tắc tƣơng đƣơng). 1 trở 220 Ohm hoặc 470 Ohm. 1 led đơn. Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 178 Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int nutnhan = 8; // định nghĩa chân số 0 là button int led = 9, t=0; // khai báo led và biến int status1; // biến lƣu các trạng thái nút nhấn // viết hàm chống dội boolean chong_doi() { int sta =!digitalRead(nutnhan); // đọc trạng thái nút nhấn } // khởi tạo void setup() { Serial.begin(9600); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 179 pinMode(nutnhan,INPUT); pinMode(led,OUTPUT); } void loop() // vong lap { int buttonState = digitalRead(nutnhan); Serial.println(buttonState); status1 = chong_doi(); if(status1==true) { { t=!t; // đảo trạng thái } while(status1==true){status1=chong_doi();} } if(t==1) { digitalWrite(led,HIGH); } else { digitalWrite(led,LOW); } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 180 9. Bật tắt rơ le khi nhấn nút nhấn. Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard Điện trở 10 kΩ. Nút nhấn 2 chân hoặc 4 chân (hoặc công tắc tƣơng đƣơng). 1 rơ le kích mức cao. Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 181 Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int nutnhan = 8; // định nghĩa chân số 0 là button int role = 9, t=0; // khai báo led và biến int status1; // biến lƣu các trạng thái nút nhấn // viết hàm chống dội boolean chong_doi() { int sta =!digitalRead(nutnhan); // đọc trạng thái nút nhấn Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 182 } // khởi tạo void setup() { Serial.begin(9600); pinMode(nutnhan,INPUT); pinMode(led,OUTPUT); } void loop() // vong lap { int buttonState = digitalRead(nutnhan); Serial.println(buttonState); status1 = chong_doi(); if(status1==true) { { t=!t; // đảo trạng thái } while(status1==true){status1=chong_doi();} } if(t==1) { digitalWrite(role,HIGH); } else { digitalWrite(role,LOW); } } TỪ BÀI HỌC NÀY CÁC BẠN CÓ THỂ ĐIỀU KHIỂN ĐƢỢC CÔNG TẮT TƠ THEO Ý MÌNH THÔNG QUA NÚT NHẤN. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 183 10. Lập trình hiển thị led 7 đoạn đơn: Giới thiệu led 7 đoạn đơn: Trƣớc khi vào lập trình, chúng ta hãy cùng đi vào tìm hiểu cấu trúc của LED 7 đoạn. Thực ra cấu trúc của LED 7 đoạn gồm 8 LED đơn, nhìn lên hình trên chắc các bạn cũng thấy gồm có 7 đoạn và một dấu chấm nhỏ, mỗi đoạn và dấu chấm nhỏ đó là một LED đơn. Việc sử dụng LED 7 đoạn chúng ta có thể sử dụng để hiển thị các số, các chữ cái anphabet và nhiều kiểu ký tự khác nhau. Nhƣ trên hình các bạn đã thấy, một LED 7 đoạn đơn gồm 10 chân đó là các chân: a, b, c, d, e, f, g, 2 chân chung và chân dấu chấm tròn (DP). LED 7 đoạn gồm 2 loại đó là dƣơng chung và âm chung. Trong bài học này chúng ta sẽ viết chƣơng trình và tải vào Arduino để hiển thị các số từ 0-9 ( Loại âm chung). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 184 Để LED hiển thị chúng ta phải làm cho 8 LED đơn nhƣ ở trên hiển thị, ví dụ ở đây 8 LED ở đây là các led mang kí tự a, b, c, d, e, f, g và một dấu chấm ở chân cuối. Bây giờ chúng ta thử suy nghĩ nếu chúng ta muốn hiển thị số 0 chúng ta phải làm thế nào? Nhìn vào hình LED hiển thị ở đầu bài chúng ta thấy: Để hiển thị số 0 thì chúng ta phải làm cho các LED đơn a, b, c, d, e, f phải sáng lên, dấu chấm và g phải tắt đi. Nhƣ vậy để tạo số 0 chúng ta phải thể hiện mã code hệ nhị phân (binary) là B111111100. Tƣơng tự đối với số 1 thì có những cái LED nào sáng? Các bạn có thể viết đƣợc mã làm xuất hiện số 1 đƣợc không? Đó là: B01100000. Tƣơng tự đối với các số 2. 3, 4, 5, 6, 7, 9. Để dễ hiểu hơn tôi xin đƣa ra một bảng sau để các bạn dò. Lƣu ý: sáng là 1, tắt là 0. Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây test board. Điện trở 220 Ω. 1 led 7 đoạn đơn. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 185 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn nút nhấn : Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. // Khai báo chân const int G = 8; // G= Arduino chân 8 const int F = 7; // F= Arduino chân 7 const int A = 2; // A = Arduino chân 2 const int B = 3; // B = Arduino chân 3 const int E = 6; // E = Arduino chân 6 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 186 const int D = 5; // D = Arduino chân 5 const int C = 4; // C = Arduino chân 4 const int dp = 9; // dp = Arduino chân 9 const int second = 1000; // thiết lập với mili giây, 1000 milliseconds = 1 second const int digit = 10; // Số ký tự hiển thị10 digits (0 - 9) const int segment = 7; // Số thanh hiển thị trong LED (7) // Định nghĩa những thanh( led đơn) sáng byte digseg[digit][segment] = { { 1,1,1,1,1,1,0 }, // = 0 { 0,1,1,0,0,0,0 }, // = 1 { 1,1,0,1,1,0,1 }, // = 2 { 1,1,1,1,0,0,1 }, // = 3 { 0,1,1,0,0,1,1 }, // = 4 { 1,0,1,1,0,1,1 }, // = 5 { 1,0,1,1,1,1,1 }, // = 6 { 1,1,1,0,0,0,0 }, // = 7 { 1,1,1,1,1,1,1 }, // = 8 { 1,1,1,1,0,1,1 } // = 9 }; void setup() { // Định nghĩa chân xuất tín hiệu OUTPUT ……………………………………………………… writeDigit(digit); delay(second); } delay(4*second); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 187 Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 188 11. Hiển thị chữ cái, số ra module 4 led 7 đoạn. Giới thiệu module 4 led 7 đoạn: Đây là module tốn thời gian của bạn hơi nhiều đấy, module này nhiều chân và có khá là mới mẻ với những bạn nào mới bắt đầu học lập trình arduino. Và tất nhiên, bạn sẽ hiểu đƣợc cách để sử dụng chúng sau này, cho những dự án khác của bạn. Trong bài này tôi sử dụng loại Anode chung ( dƣơng chung). Trƣớc tiên bạn add thƣ viện SevSeg vào IDE. Các bạn tải tại link sau: http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino Chú ý trƣờng hợp bị chồng thƣ viện bạn cài bản IDE 1.0.6 để tránh trƣờng hợp này. Chạy song song 2 phiên bản đều đƣợc. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 189 Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard 1 biến tở 10k. 1 module 4 led 7 đoạn loại dƣơng chung. Dây cắm test board. Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn : Trƣờng hợp trên ta không gắn điện trở cũng đƣợc. Tiếp đến ta nối biến trở 10k vào để tăng giảm độ sáng của led 7 đoạn. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 190 Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include "SevSeg.h" //Include thƣ viện SevSeg SevSeg myDisplay; // Khai báo biến myDisplay là đối tƣợng của thƣ viện SegSev int bientro = A0; void setup() { //Hàm Setup Serial.begin(9600); //Bật cổng Serial ở mức Baudrate là 9600 Serial.println("Ready"); int displayType = COMMON_ANODE; int digit1 = 8; //chân số 8 của arduino nối chân 12 của led 7 đoạn int digit2 = 12; int digit3 = 13; int digit4 = 2; int segA = 9; int segB = 11; int segC = 4; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 191 int segD = 6; int segE = 7; int segF = 10; int segG = 3; int numberOfDigits = 4; // số dấu chấm myDisplay.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP); // Bắt đầu cho phép giao tiếp myDisplay.SetBrightness(100); //điều chỉnh độ sáng của Module LED } void loop(){ myDisplay.DisplayString("AbcD", 0b00001000); // Thể hiện chữ AbcD ra bảng LED, và dãy số 0b00001000 là vị trí dấu chấm. Bạn hãy thử thay những số 0 bằng số 1 hoặc ngƣợc lại để kiểm nghiệm myDisplay.SetBrightness(getBrightness()); //độ sáng } int getBrightness() { // Hàm đọc giá trị độ sáng từ biến trở int value = analogRead(bientro); // Đọc giá trị biến trở và đƣa vào biến value value = map(value,0,1023,0,100); // Chuyển đổi giá trị trong thang đo 0-1023 về thang đo 0 - 100 return value; // Trả về giá trị độ sáng } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 192 12. Lập trình hiển thị module led ma trận 8x8. Giới thiệu module ma trận 8x8: LED MATRIX 8x8 đơn giản chỉ là 64 con LED đƣợc sắp xếp với nhau theo dạng ma trận, thành 8 hàng và 8 cột, tức là 16 chân. Vì mỗi loại LED MATRIX có sơ đồ chân riêng nên các bạn hãy tra cứu datasheet của nó để có thể lắp mạch chính xác . Trong bài viết này mình sử dụng LED matrix " anode ( dƣơng chung) ", có nghĩa là các chân điều khiển hàng của ma trận chính là cực dƣơng của LED. Phần cứng chuẩn bị: ( tất cả được tích hợp trên Kit Tự Học Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard 1 module led ma trận 8x8 loại dƣơng chung. Dây cắm test board. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 193 Lắp mạch( nếu các bạn đã có kit học thì đã lắp sẵn : Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. const int row[8] = { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 194 2, 7, 19, 5, 13, 18, 12, 16 }; const int col[8] = { 6, 11, 10, 3, 17, 4, 8, 9 }; int pixels[8][8]; int count = 1000; char str[] = "FABCDEDCBA"; int ptrChar = 0; const charMapType charBlank = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; //Các bạn để ý những con số 1 nhé. const charMapType heart0 = { {0, 0, 0, 1, 1, 0, 0, 0}, Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 195 {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 1} }; const charMapType heart1 = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; const charMapType heart2 = { …………………………………………………………………………….. digitalWrite(col[thisPin], HIGH); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 196 setupChar(); } void loop() { refreshScreen(); if(count-- == 0){ count = 1000; setupChar(); } } void setupChar(){ char c = str[ptrChar]; int offset = c - 'A'; const charMapType *cMap = charMap[offset]; for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { bool v = (*cMap)[x][y]; if(v){ pixels[x][y] = LOW; }else{ pixels[x][y] = HIGH; } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 197 } ptrChar++; if(ptrChar>=strLen-1){ ptrChar = 0; } } void refreshScreen() { for (int thisRow = 0; thisRow < 8; thisRow++) { digitalWrite(row[thisRow], HIGH); for (int thisCol = 0; thisCol < 8; thisCol++) { int thisPixel = pixels[thisRow][thisCol]; digitalWrite(col[thisCol], thisPixel); if (thisPixel == LOW) { digitalWrite(col[thisCol], HIGH); } } digitalWrite(row[thisRow], LOW); } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 198 13. Hiển thị chữ lên màn hình LCD16x02. Giới thiệu module LCD 16X02: Trong bài này các bạn sẽ tìm cách điều khiển màn hình LCD bằng Arduino mà không sử dụng module I2C LCD. Chỉ cần Arduino bạn có thể điều khiển đƣợc LCD nhƣng lại tốn khá nhiều chân của arduino, Ở phần tiếp theo chúng ta sẽ sử dụng module I2C để giải quyết vấn đề đó. Phần cứng chuẩn bị: ( tất cả được tích hợp trên Kit Tự Học Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard 1 module LCD 16x02. Dây cắm test board. 1 biến trở 10K. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 199 Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây): Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 200 Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <LiquidCrystal.h> //Khai báo thƣ viện cho LCD ( Thƣ viện đã có sẵn) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //noi voi chan LCD LAN LUOT : Rs, E, D4, D5, D6, D7 void setup() { //Thông báo đây là LCD 1602 lcd.print("DIEN – DIEN TU!"); //In ra màn hình lcd dòng chữ DIEN – DIEN TU } void loop() { lcd.setCursor(0, 1); // đặt con trỏ vào cột 0, dòng 1 lcd.print(" TDHShop"); // In ra dong chu } 14. Kết hợp Module I2C với LCD16x02. Giới thiệu module I2C cho LCD: Với module chuyển giao tiếp LCD sang I2C, các bạn chỉ cần 2 chân (SDA và SCL) của Arduino kết nối với 2 chân (SDA và SCL) của module là đã có thể hiển thị thông tin lên LCD. Ngoài ra có thể điều chỉnh đƣợc độ tƣơng phản bởi biến trở Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 201 gắn trên module. Đây chính là Module chuyển giao tiếp I2C Phần cứng chuẩn bị: ( tất cả được tích hợp trên Kit Tự Học Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard 1 module LCD 16x02. 1 module I2C cho LCD. Dây cắm test board. Trƣớc hết ta phải add thƣ viện I2C vào phần mền Arduino IDE. Các bạn tải thƣ viện tại links sau: http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây): Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 202 Lƣu ý : Với các dòng mega các bạn nối chân SCL vào SCL và SDA vào SDA. Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. // sau khi upload chƣơng trình các bạn nhớ chỉnh biến trở xanh trên I2C nhé. // trƣờng hợp sử dụng địa chỉ 0x27 không đƣợc thay bằng 0x3F. // Trên module I2C có biến trở chúng ta hãy điều chỉnh độ sáng của LCD. #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); // lƣu ý ở đây có 2 địa chỉ ( 0x27) hoặc (0x3F) void setup() { lcd.init(); lcd.backlight(); lcd.print("TDHshop.com.vn"); } void loop() { } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 203 15. Đọc giá trị cảm biến quang trở hiển thị lên serial monitor. Giới thiệu cảm biến quang trở: Quang trở là một loại "vật liệu" điện tử rất hay gặp và đƣợc sử dụng trong những mạch cảm biến ánh sáng. Có thể hiểu một cách dễ dàng rằng, quang trở là một loại ĐIỆN TRỞ mà giá trị của nó thay đổi theo cƣờng độ ánh sáng. Nếu đặt ở môi trƣờng có ít ánh sáng hoặc tối thì điện trở của quang trở sẽ tăng cao còn nếu đặt ở ngoài nắng, hoặc nơi có ánh sáng thì điện trở sẽ giảm. Quang trở không phân biệt chân. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 204 Phần cứng chuẩn bị: (được tích hợp trên Kit Tự Học Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. 1 quang trở. 1 điện trở 10K. Dây cắm test board. Lắp mạch( nếu các bạn đã có kit học thì chỉ việc nối dây): Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 205 Bây giờ chúng ta upload chƣơng trình đọc giá trị cảm biến quang trở cho arduino và xem giá trị của quang trở, nhớ là hãy thay đổi độ sáng của môi trƣờng để xem sự thay đổi của quang trở (chẳng hạn bạn lấy bàn tay che ánh sáng chiếu trực tiếp vào qua ng trở chẳng hạn). Lập trình: int quangtro = A5; //Thiết đặt chân analog đọc quang trở void setup() { // Khởi tạo cộng Serial 9600 Serial.begin(9600); } void loop() { int giatriQuangtro = analogRead(quangtro); // đọc giá trị quang trở Serial.println(giatriQuangtro); // Xuất giá trị ra Serial Monitor } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 206 16. Đọc gái trị CB nhiệt độ LM35 hiển thị lên serial monitor. Giới thiệu cảm biến nhiệt độ LM35: Cảm biến nhiệt độ LM35 là một loại cảm biến tƣơng tự rất hay đƣợc ứng dụng trong các ứng dụng đo nhiệt độ thời gian thực ( nhƣng vẫn còn sai số lớn) . Với kích thƣớc nhỏ và giá thành rẻ là một trong những ƣu điểm của nó. Vì đây là cảm biến tƣơng tự (analog sensor) nên ta có thể dễ dàng đọc đƣợc giá trị của nó bằng hàm analogRead(). Nhiệt độ đƣợc xác định bằng cách đo hiệu điện thế ngõ ra của LM35. → Đơn vị nhiệt độ: °C. → Nhiệt độ thay đổi tuyến tính: 10mV/°C Độ chính xác thực tế: 1/4°C ở nhiệt độ phòng và 3/4°C ngoài khoảng 2°C tới 150°C công suất tiêu thụ là 60uA. Cảm biến LM35 hoạt động bằng cách cho ra một giá trị hiệu điện thế nhất định tại chân Vout (chân giữa) ứng với mỗi mức nhiệt độ. Nhƣ vậy, bằng cách đƣa vào chân bên trái của cảm biến LM35 hiệu điện thế 5V, chân phải nối đất, đo hiệu điện thế ở chân giữa bằng các pin A0 trên arduino (giống y hệt cách đọc giá trị biến trở), bạn sẽ có đƣợc nhiệt độ (0-100ºC) bằng công thức: float temperature = (5.0*analogRead(A0)*100.0/1024.0); Với LM35, bạn có thể tự tạo cho mình mạch cảm biến nhiệt độ sử dụng LM35 và tự động ngắt điện khi nhiệt độ vƣợt ngƣỡng tối đa, đóng điện khi nhiệt độ thấp hơn ngƣỡng tối thiểu thông qua module rơ le... Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 207 Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. 1 cảm biến nhiệt độ LM35. Dây cắm test board. Lắp mạch: Hình ảnh thực tế: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 208 int sensorPin = A0; // chân analog kết nối tới cảm biến LM35 void setup() { Serial.begin(9600); //Khởi động Serial ở mức baudrate 9600 // Bạn không cần phải pinMode cho các chân analog trƣớc khi dùng nó } void loop() { //đọc giá trị từ cảm biến LM35 int reading = analogRead(sensorPin); //tính ra giá trị hiệu điện thế (đơn vị Volt) từ giá trị cảm biến float voltage = reading * 5.0 / 1024.0; // cứ mỗi 10mV = 1 độ C. // Vì vậy nếu biến voltage là biến lƣu hiệu điện thế (đơn vị Volt) // thì ta chỉ việc nhân voltage cho 100 là ra đƣợc nhiệt độ! float temp = voltage * 100.0; Serial.println(temp); delay(1000); //đợi 1 giây cho lần đọc tiếp theo } 17. Đọc giá trị CB nhiệt độ DS18B20 hiển thị lên serial monitor. Giới thiệu cảm biến nhiệt độ DS 18B20: Cảm biến nhiệt độ DS18B20 với dãy đo (-55°C đến +125°C) sai số ±0.5°C. Nhiệt độ ít bị chênh lệch hơn so với cảm biến nhiệt độ LM35. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 209 Về căn bản, cảm biến này cũng giống nhƣ LM35, các bạn có thể xem phần cảm biến LM35 ở phần trƣớc. DS18B20 dùng cơ chế truyền tín hiệu 1-Wire. Nôm na với cái cơ chế này, chúng ta có thể đọc nhiều con DS18B20 cùng một lúc trên cùng 1 dây. Sử dụng một chân data với 64bit serial code cho phép chúng ta dùng nhiều con trên cùng 1 chân digial (cơ chế 1-Wire) Có thể cấp nguồn từ 3 - 5.5V Đo từ -55°C đến +125°C sai số ±0.5°C nếu đang trong khoản -10°C đến +85°C Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. 1 cảm biến nhiệt độ DS18b20. 1 điện trở 4.7K. Dây cắm test board. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 210 Lắp mạch: Đối với loại không dây: Đối với loại có dây: Lập trình: Trƣớc khi bắt tay vào lập trình ta cần phải tải hai thƣ viện sau và add vào thƣ viện cho arduino IDE: Thƣ viện thứ 1: OneWire.h Thƣ viện thứ 2: DallasTemperature.h Tải Tại Đây Cách add thƣ viện vào Ardunio IDE: Xem tại đây Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 211 Ta bắt tay vào lập trình sau khi add xong 2 thƣ viện trên. Code chƣơng trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <OneWire.h> #include <DallasTemperature.h> // Chân nối với Arduino #define ONE_WIRE_BUS 2 //Thiết đặt thƣ viện onewire OneWire oneWire(ONE_WIRE_BUS); //Mình dùng thƣ viện DallasTemperature để đọc DallasTemperature sensors(&oneWire); void setup(void) { Serial.begin(9600); sensors.begin(); } void loop(void) { sensors.requestTemperatures(); Serial.print("Nhiet do"); Serial.println(sensors.getTempCByIndex(0)); // Vì chỉ 1cảm biến nên dùng 0 //chờ 1 s rồi đọc giá trị cảm biến delay(1000); } Sau khi upload chƣơng trình xong các bạn mở cổng Serial port xem kết quả nhé. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 212 18. Hiển thị giá trị CB nhiệt độ LM35 lên mà hình LCD. Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. 1 cảm biến nhiệt độ LM35. Dây cắm test board. 1 Module I2C cho LCD. 1 LCD 16x02. Lắp mạch : Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <Wire.h> #include <LiquidCrystal_I2C.h> int sensorPin = A0; // chân analog kết nối tới cảm biến LM35 LiquidCrystal_I2C lcd(0x3F,16,2); void setup() { Serial.begin(9600); //Khởi động Serial ở mức baudrate 9600 lcd.init(); lcd.backlight(); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 213 lcd.print("NHIET DO"); } void loop() { //đọc giá trị từ cảm biến LM35 int reading = analogRead(sensorPin); //tính ra giá trị hiệu điện thế (đơn vị Volt) từ giá trị cảm biến float voltage = reading * 5.0 / 1024.0; // cứ mỗi 10mV = 1 độ C. // Vì vậy nếu biến voltage là biến lƣu hiệu điện thế (đơn vị Volt) float temp = voltage * 100.0; Serial.println(temp); lcd.setCursor(0, 1); lcd.print("T ="); lcd.setCursor(5, 1); lcd.print(temp); delay(1000); //đợi 1 giây cho lần đọc tiếp theo } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 214 19. Đọc giá trị cảm biến mưa hiển thị lên serial monitor. Giới thiệu cảm biến mưa: Chúng ta có thể dễ dàng nhận biết mƣa bằng mắt thƣờng hoặc cảm nhận ở da. Với tƣ tƣởng ấy, các hệ thống điện tử phát hiện mƣa cũng chia ra làm hai loại: thứ nhất là dùng camera để nhận biết và loại thứ hai là dùng cảm biến (tƣơng tự da của con ngƣời). Trong môi trƣờng Arduino, bạn có thể dùng cả 2 cách trên để phát hiện mƣa. Tuy nhiên, để tiết kiệm chi phí và dễ dàng trong việc lập trình, cài đặt, ngƣời ta thƣờng chọn phƣơng pháp thứ hai. Vấn đề về phát hiện mƣa thì cực kì đơn giản, nhƣng để truyền dữ liệu cảm biến mƣa về trung tâm xử lý thì khó hơn đôi chút. Mạch cảm biến mƣa gồm 2 phần: Mạch cảm biến mƣa đƣợc gắn ngoài trời. Mạch điều chỉnh độ nhạy cần đƣợc che chắn. Mạch cảm biến mƣa hoạt động bằng cách so sánh hiệu điện thế của mạch cảm biến nằm ngoài trời với giá trị định trƣớc (giá trị này thay đổi đƣợc thông qua 1 biến trở màu xanh) từ đó phát ra tín hiệu đóng / ngắt rơ le qua chân D0(digital) hoặc AO(analog). Vì vậy, chúng ta dùng một chân digital hoặc analog để đọc tín hiệu từ cảm biến mƣa. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 215 Khi cảm biến khô ráo (trời không mƣa), chân D0 của module cảm biến sẽ đƣợc giữ ở mức cao (5V). Khi có nƣớc trên bề mặt cảm biến (trời mƣa), đèn LED màu đỏ sẽ sáng lên, chân D0 đƣợc kéo xuống thấp (0V). Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). 1 cảm biến mƣa. Lắp mạch : Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int rainSensor = 6; // Chân tín hiệu cảm biến mƣa ở chân digital 6 (arduino) void setup() { pinMode(rainSensor,INPUT);// Đặt chân cảm biến mƣa là INPUT, vì tín hiệu sẽ đƣợc truyền đến cho Arduino Serial.begin(9600);// Khởi động Serial ở baudrate 9600 } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 216 void loop() { int value = digitalRead(rainSensor); //Đọc tín hiệu cảm biến mƣa if (value == HIGH) { // Cảm biến đang không mƣa Serial.println("Khong mua"); } else { Serial.println("Dang mua"); } delay(1000); // Đợi 1 giây cho lần kiểm tra tiếp theo. } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 217 20. Đọc giá trị CB siêu âm SRF 05 hiển thị lên serial monitor. Robot khi ở chế độ tự động, nó phải lấy thông tin của môi trƣờng xung quanh nhƣ: khoảng cách, nhiệt độ, ánh sáng ... Và tiến hành phân tích các dữ liệu đó, cuối cùng ra quyết định phù hợp. Ví dụ nhƣ robot tự tìm đƣờng đi thì nó phải tính đƣợc xem phía trƣớc có vật cản hay không, và tiến hành đi tới hay rẽ sang một hƣớng khác. Bài viết này sẽ hƣớng dẫn bạn đọc hiểu và sử dụng đƣợc một trong những cảm biến khoảng cách phổ biến - SRF05. Giới thiệu cảm biến siêu âm SRF05: Sóng siêu âm là một loại sóng cao tầng mà con ngƣời không thể nghe thấy đƣợc. Tuy nhiên, ta có thể thấy đƣợc sự hiện diện của sóng siêu âm ở khắp mọi nơi trong tự nhiên. Ta có các loài động vật nhƣ dơi, cá heo ... dùng sóng siêu âm để liên lạc với nhau, để săn mồi hay định vị trong không gian. Việc tính toán khoảng cách cũng còn phụ thuộc rất nhiều vào môi trƣờng truyền dẫn, ví dụ nhƣ sóng âm truyền trong môi trƣờng nƣớc hay kim loại sẽ nhanh hơn rất nhiều so với sóng âm đƣợc truyền trong môi trƣờng không khí. Lƣu ý là sóng âm không thể truyền đƣợc trong môi trƣờng chân không. Cảm biến siêu âm SRF05 cũng hoạt động theo nhƣ nguyên tắc ở trên, thiết bị gồm có 2 loa - thu và phát - cùng với 5 chân để kết nối với Arduino, tầm hoạt động tối đa của cảm biến này nằm trong khoảng từ 1 đến 2m. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 218 Chức năng của các chân này nhƣ sau: 1. Vcc: cấp nguồn cho cảm biến. 2. Trigger: kích hoạt quá trình phát sóng âm. Quá trình kích hoạt khi một chu kì điện cao / thấp diễn ra. 3. Echo: bình thƣờng sẽ ở trạng thái 0V, đƣợc kích hoạt lên 5V ngay khi có tín hiệu trả về, sau đó trở về 0V. 4. Gnd: nối với cực âm của mạch 5. OUT: không sử dụng Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO). 1 cảm biến SRF05. Breadboard còn gọi testboard. Dây cắm test board. Lắp mạch : • Vcc: nối với nguồn 5V của Adruino • Gnd: nối với PIN GND. • Trigger: nối với PIN 8. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 219 • Echo: nối với PIN 7. Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 220 Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. const int trig = 8; // chân trig của HC-SR05 const int echo = 7; // chân echo của HC-SR05 void setup() { Serial.begin(9600); // giao tiếp Serial với baudrate 9600 pinMode(trig,OUTPUT); // chân trig sẽ phát tín hiệu pinMode(echo,INPUT); // chân echo sẽ nhận tín hiệu } void loop() { unsigned long duration; // biến đo thời gian int distance; // biến lƣu khoảng cách /* Phát xung từ chân trig */ digitalWrite(trig,0); // tắt chân trig delayMicroseconds(2); digitalWrite(trig,1); // phát xung từ chân trig delayMicroseconds(5); // xung có độ dài 5 microSeconds digitalWrite(trig,0); // tắt chân trig /* Tính toán thời gian */ // Tính khoảng cách đến vật. distance = int(duration/2/29.1); /* In kết quả ra Serial Monitor */ Serial.print(distance); Serial.println("cm"); delay(200); } Giải tích code: Ta biết thời gian âm thanh truyền trong không khí ở 20°C là 344 m/s. Bằng quy tắc tam suất đơn giản ta có thể dễ dàng tính đƣợc sóng âm di chuyển 1 cm trong không khí sẽ mất 1000 / 344 * 100 ~= 29.1. Arduino cung cấp cho ta hàm pulseIn có tác dụng trả về thời gian (tính bằng milisec) kể từ khi hàm này đƣợc gọi cho đến khi có tín hiệu tại PIN chỉ định trƣớc, hay trả về 0 nếu không nhận đƣợc tín hiệu / quá thời gian timeout. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 221 Kết quả hiển thị lên Serial monitor : 21. Đọc giá trị cảm biến độ ẩm đất hiển thị lên LCD16x02. Giới thiệu cảm biến độ ẩm đất: Cảm biến phát hiện độ ẩm đất, bình thƣờng đầu ra của cảm biến độ ẩm đất là digital (D0) và analog (A0), tùy các bạn có thể lựa chọn chân số (digital) hay chân tƣơng tự (analog) để lập trình, Độ nhạy của cảm biến độ ẩm đất có thể điều chỉnh đƣợc (Bằng cách điều chỉnh biến trở màu xanh trên board mạch) cái này chỉ có tác dụng với chân digital (D0). Phần đầu dò đƣợc cắm vào đất để phát hiện độ ẩm, khi độ ầm của đấ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. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 222 Thông số kỹ thuật: Điện áp làm việc 3.3V ~ 5V. Có lỗ cố định để lắp đặt thuận tiện. PCB có kích thƣớc nhỏ 3.2 x 1.4 cm. Sử dung chip LM393 để so sánh, ổn định làm việc. Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn Mạch Arduino (ở đây mình sử dụng Arduino UNO). 1 cảm biến độ ẩm đất. Breadboard còn gọi testboard. Dây cắm test board. 1 rơ le 5VDC Lắp mạch : Trong bài học này ta ứng dụng giá trị cảm biếm độ ẩm đất đọc về để điều khiển đóng ngắt rơ le 5Vdc. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 223 Hình ảnh thực tế: Lập trình : //Chƣơng trình ĐỌC DỮ LIÊU TỪ CẢM BIẾN ĐO ĐỘ ẨM ĐẤT int CBDoAm = A1; //Nối chân ra của cảm biến đo độ ẩm với chân A1 #define role 12 //Chân nối với role 12 float doamdat; //Biến độ ẩm đất void setup() { Serial.begin(9600); //Khai báo các chân pinMode(role,OUTPUT); } void loop() { doamdat=analogRead(CBDoAm); Serial.print("Do am la:"); Serial.print(doamdat); //In ra độ ẩm đất (serial monitor) //Bơm nƣớc khi đất khô( thông qua role) if(doamdat<200) { digitalWrite(role,HIGH); //Bat role de tuoi cay,… Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 224 Serial.println("Tuoi cay"); } //Ngƣng bơm khi đất ƣớt else { digitalWrite(role,LOW); Serial.println("Cay du nuoc"); } delay(1000); } Kết quả hiển thị lên Serial monitor : 22. Đọc giá trị CB dò line hiển thị lên serial monitor và LCD. Giới thiệu cảm biến dò line: Cảm biến dò line có thể dùng để phát hiện line trắng và đen. Mạch sử dụng cảm biến hồng ngoại với khoảng cách phát hiện từ 1~25mm. Có thể điều chỉnh độ nhạy của cảm biến bằng cách điều chỉnh biến trở đƣợc tích hợp sẵn trên module. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 225 Thông số kỹ thuật: • Nguồn cung cấp: 3.3V - 5V. • Dòng điện tiêu thụ: <10mA. • Dải nhiệt độ hoạt động: 0 độ C ~ 50 độ C • Ngõ ra giao tiếp: 3 chân (VCC, GND, OUT) Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn Mạch Arduino (ở đây mình sử dụng Arduino UNO). 1 cảm biến dò line. Breadboard còn gọi testboard. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 226 Dây cắm test board. 1 led đơn. 1 điện trở 220 Ohm. 1 LCD 16x02. 1 I2C cho LCD. Lắp mạch : Lập trình : Code lập trình sẽ đƣợc để trong một file ( file_code) riêng để tránh việc bị lỗi. // CHƢƠNG TRÌNH THỬ ĐẶC TÍNH CỦA CẢM BIẾN DÒ LINE #include <Wire.h> #include <LiquidCrystal_I2C.h> #define den 8 // Sử dụng chân 8 để điều khiển đèn led Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 227 #define tinhieu 2 //Chân S của cảm biến nối với chân 2 trên mạch Arduino int x; //Tên biến chứa giá trị của cảm biến dò đƣờng LiquidCrystal_I2C lcd(0x3F,16,2); // dia chi của i2c lcd void setup() { Serial.begin(9600); //Đƣa dữ liệu lên máy tính để quan sát pinMode(den,OUTPUT); //Định nghĩa chân ra để điều khiển đèn led pinMode(tinhieu,INPUT); //Định nghỉa chân 2 là chân lấy tín hiệu vào của cảm biến lcd.init(); lcd.backlight(); lcd.print("CB DO LINE"); } void loop() { Serial.println(x); lcd.setCursor(0, 1); lcd.print("x ="); lcd.setCursor(5, 1); lcd.print(x); if(x==HIGH) //nếu x=1 (gặp màu đen) thì đèn tắt { digitalWrite(den,LOW); } if(x==LOW) //Nếu x=0 (gặp màu trắng) thì đèn sáng { digitalWrite(den,HIGH); } delay(1000); //Chờ 1 giây để hệ thống đáp ứng } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 228 Hình ảnh thực tế: Kết quả hiển thị lên Serial monitor : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 229 23. Đọc giá trị điện áp khi điều chỉnh biến trở hiển thị lên serial Giới thiệu về biến trở: Biến trở chỉ đơn giản chỉ là một điện trở có thể thay đổi đƣợc trị số. Mạch Arduino không đọc trực tiếp điện trở này mà đọc gián tiếp qua điện áp mà biến trở gây ra. Phần màu vàng là một lớp điện trở. Cây kim màu xanh đƣợc đè chặt xuống phần điện trở này. Giả sử có dòng điện đi từ 1 đến 2 thì nó sẽ phải qua phần màu vàng (đƣợc tô đỏ) và đó chính là điện trở hiện tại của biến trở. Bạn chỉ việc vặn cây kim để tăng giảm độ dài của vùng màu đỏ, qua đó tăng giảm giá trị điện trở. Khi vặn biến trở, ta sẽ làm thay đổi điện trở ở phần màu đỏ và màu vàng (do điện tích của chúng thay đổi), qua đó làm thay đổi điện áp ở chân 2. Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn biến trở 10K Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 biến trở xoay 10K. Lắp mạch : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 230 Lập trình : Code lập trình sẽ đƣợc lƣu trong một file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. void setup() { Serial.begin(9600); //Mở cổng Serial để giap tiếp } void loop() { int value = analogRead(A0); //đọc giá trị điện áp ở chân A0 //(value luôn nằm trong khoảng 0-1023) Serial.println(value); //xuất ra giá trị vừa đọc voltage = map(value,0,1023,0,5000); //chuyển thang đo của value //từ 0-1023 sang 0-5000 (mV) Serial.println(voltage); //xuất ra điện áp (đơn vị là mV) Serial.println(); delay(200); //xuống hàng //đợi 0.2 giây Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 231 } Hình ảnh thực tế: Kết quả hiển thị lên Serial monitor : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 232 24. Hiển thị thời gian thực (DS1307) lên LCD và serial monitor. Giới thiệu về module DS1307: Bài viết này sẽ giới thiệu về giao tiếp I2C trên Arduino và sử dụng module Realtime clock DS1307. Trƣớc tiên bạn cài 3 thƣ viện : Wire ( thƣ viện này đã có sẵn), DS1307 và I2C cho arduino IDE. Các bạn tải thƣ viện tại links sau: http://tdhshop.com.vn/tonghop-cac-thu-vien-cho-arduino Giới thiệu 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(); • 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 beginTransmission() 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". Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 233 • quantity: số lƣợng bytes yêu cầu. Đây là các Timekeeper registers của DS1307, chúng ta sẽ dựa vào bảng này để read/write IC DS1307 qua I2C. Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn biến trở 10K Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 module DS1307. 1 LCD 16x02. 1 I2C cho LCD. Lắp mạch : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 234 Lập trình : Code lập trình sẽ đƣợc lƣu trong một file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <Wire.h> #include "RTClib.h" #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); // 0x3F là địa chỉ của lcd 16x2 void setup () { lcd.init(); lcd.backlight(); // bật đèn nền LCD lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("H:"); lcd.setCursor(0, 1); lcd.print("D:"); Serial.begin(9600); Wire.begin(); Wire.beginTransmission(0x68); // địa chỉ của ds1307 Wire.write(0x07); Wire.write(0x10); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); RTC.adjust(DateTime(__DATE__, __TIME__)); //dòng này nạp 1 lần rồi xóa rồi nạp lại thì thời gian sẽ không bị chạy lại khi mất điện. } } void loop () { lcd.setCursor(4, 0); lcd.print(now.hour(), DEC); // in ra giờ lên LCD lcd.print(":"); lcd.print(now.minute(), DEC); // in ra phút lên LCD lcd.print(":"); lcd.print(now.second(), DEC); // in ra giây lên LCD lcd.print(" "); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 235 Serial.print(now.hour(), DEC); // in ra giờ lên SERIAL Serial.print(":"); Serial.print(now.minute(), DEC); // in ra giờ lên SERIAL Serial.print(":"); Serial.print(now.second(), DEC); // in ra giờ lên SERIAL Serial.print(" "); Serial.print(now.day(), DEC); Serial.print("/"); Serial.print(now.month(), DEC); Serial.print("/"); Serial.print(now.year(), DEC); Serial.print(""); Serial.println(); lcd.setCursor(4, 1); lcd.print(now.day(), DEC); // in ra ngày lên LCD lcd.print("/"); lcd.print(now.month(), DEC); // in ra tháng lên LCD lcd.print("/"); lcd.print(now.year(), DEC); // in ra năm lên LCD lcd.print(""); delay(1000); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 236 Hình ảnh thực tế: Kết quả hiển thị lên Serial monitor : Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 237 25. Hiển thị tốc độ đo bằng Encoder quay lên LCD. Giới thiệu về module Encoder quay: Rotaty Encoder Module trông giống 1 module biến trở nhƣng có ngõ ra dạng xung số. Bằng việc xoay núm vặn, ngõ ra xung của 2 kênh sẽ thay đổi với 1 độ lệch pha xác định (90độ) giúp phân biệt đƣợc chiều xoay. Đếm số lƣợng xung ngõ ra sẽ cho biết vị trí góc xoay, vị trí này là không giới hạn. Đồng thời module cũng cung cấp 1 nút nhấn có thể đƣợc lập trình để trở thành 1 nút reset giá trị đếm. Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 module encoder quay. 1 LCD 16x02. 1 I2C cho LCD. Thông số kỹ thuật: Điện áp cung cấp: 3.3 Độ phân giải 20 xung /vòng. Các chân tín hiệu: +: chân cấp nguồn dƣơng. GND: chân cấp nguồn âm. CLK: phase A. DT: phase B. SW: button Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 238 Để điều khiển số vòng quay hay vận tốc động cơ thì chúng ta nhất thiết phải đọc đƣợc góc quay của motor. Encoder thƣờng bao gồm kênh A, kênh B. Trong hình bạn thấy hãy chú ý một lỗ nhỏ bên phía trong của đĩa quay và một cặp phát - thu dành riêng cho lỗ nhỏ này. Cữ mỗi lần motor quay đƣợc một vòng. Bên ngoài đĩa quay đƣợc chia thành các rãnh nhỏ và một cặp thu-phát khác dành cho các rãnh này. Đây là kênh A của encoder. Mỗi loại encoder có độ phân giải khác nhau, có khi trên mỗi đĩa chĩ có vài rãnh nhƣng cũng có trƣờng hợp đến hàng nghìn rãnh đƣợc chia. Để điều khiển động cơ, bạn phải biết độ phân giải của encoder đang dùng. Độ phân giải ảnh Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 239 hƣởng đến độ chính xác điều khiển và cả phƣơng pháp điều khiển tuy nhiên trên các encoder còn có một cặp thu phát khác đƣợc đặt trên cùng đƣờng tròn với kênh A nhƣng lệch một chút (lệch M+0,5 rãnh), đây là kênh B của encoder. Tín hiệu xung từ kênh B có cùng tần số với kênh A nhƣng lệch pha 90o. Bằng cách phối hợp kênh A và B ngƣời đọc sẽ biết chiều quay của động cơ. Hai kênh A và B lệch pha trong encoder Hình trên thể hiện sự bộ trí của 2 cảm biến kênh A và B lệch pha nhau. Khi cảm biến A bắt đầu bị che thì cảm biến B hoàn toàn nhận đƣợc hồng ngoại xuyên qua, và ngƣợc lại. Hình thấp là dạng xung ngõ ra trên 2 kênh. Xét trƣờng hợp motor quay cùng chiều kim đồng hồ, tín hiệu ―đi‖ từ trái sang phải. Bạn hãy quan sát lúc tín hiệu A chuyển từ mức cao xuống thấp (cạnh xuống) thì kênh B đang ở mức thấp. Ngƣợc lại, nếu động cơ quay ngƣợc chiều kim đồng hồ, tín hiệu ―đi‖ từ phải qua trái. Lúc này, tại cạnh xuống của kênh A thì kênh B đang ở mức cao. Nhƣ vậy, bằng cách phối hợp 2 kênh A và B chúng ta không những xác định đƣợc góc quay (thông qua số xung) mà còn biết đƣợc chiều quay của động. Đối với arduino chúng ta sử dụng ngắt để đọc đƣợc dữ liệu từ encoder. Chúng ta nối kênh A của encoder với 1 ngắt ngoài ( INT2 chẳng hạn) và kênh B với một chân nào đó bất kỳ (không phải chân ngắt). Cứ mỗi lần ngắt ngoài xảy ra, tức có 1 xung xuất hiện trên ở kênh A thì trình phục vụ ngắt ngoài tự động đƣợc Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 240 gọi. Trong trình phục vụ ngắt này chúng ta kiểm tra mức của kênh B, tùy theo mức của kênh B chúng ta sẽ tăng biến đếm xung lên 1 hoặc giảm đi 1. Tuy nhiên, bạn cần phải tính toán rất cẩn thận khi sử dụng phƣơng pháp này. Ví dụ trƣờng hợp encoder có độ phân giải 2000 xung/vòng, motor bạn quay với vận tốc 100 vòng/s thì tần số xung trên kênh A của encode là 2000x100=200KHz, nghĩa là cứ mỗi 5 us ngắt ngoài xảy ra một lần. Tần số ngắt nhƣ thế là quá cao cho AVR, điều này có nghĩa là AVR chỉ tập trung cho mỗi việc ―đếm xung‖, không có đủ thời gian để thực thi các việc khác. Trong bài này, chúng ta chọn độ phân giải của encoder là 20 (20 xung trên mỗi vòng quay, loại encoder đơn giản nhất). Lắp mạch: Lập trình : Code lập trình sẽ đƣợc lƣu trong một file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Trƣớc tiên ta phải add thêm thƣ viện I2C cho arduino IDE. Tải thƣ viện theo link sau: http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino Cách add thƣ viện cho Arduino IDE : http://tdhshop.com.vn/huong-dan-caithu-vien-vao-arduino-ide-ho-tro-cho-viec-lap-trinh Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 241 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,20,4); // Cách nối các chân trên Encoder quay #define encoderPinA 2 // Tƣơng ứng chân DT trên Encoder quay #define encoderPinB 3 // Tƣơng ứng chân CLK trên Encoder quay // Chân + nối nguồn 5V và chân GND nối cực âm volatile int encoderPos = 0; // Cho vị trí đầu bằng 0 int lastReportedPos = 1; // Vị trí cuối bằng 1 static boolean rotating=false; // Quản lý debounce (giống nhƣ là chống nhiễu) // các biến cho trình phục vụ ngắt interrupt boolean A_set = false; boolean B_set = false; //Đo tốc độ int newposition; int oldposition=0; long newtime; long oldtime=0; int vantoc = 0; int sovong = 0; void setup() { lcd.begin(20,4); lcd.init(); lcd.backlight(); pinMode(encoderPinA, INPUT_PULLUP); // INPUT-PULLUP tƣơng đƣơng Mode INPUT và tự động nhận trạng thái HIGH hoặc LOW pinMode(encoderPinB, INPUT_PULLUP); Serial.begin(9600); // chuyển dữ liệu lên cổng Serial Port lcd.setCursor(0,1); lcd.print("SO VONG = "); } // Vòng lặp chính, công việc đƣợc thực hiện bởi trình phục vụ ngắt void loop() { delay(1000); rotating = true; // Khởi động bộ debounce (có thể hiểu nhƣ bộ chống nhiễu) newtime=millis(); detachInterrupt(0); detachInterrupt(1); vantoc = (newposition-oldposition)*60/20; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 242 Serial.print("vantoc="); Serial.println(vantoc,DEC); oldposition=newposition; oldtime=newtime; lcd.clear(); lcd.setCursor(0,0); lcd.print("TOC DO = "); lcd.setCursor(11,0); lcd.print(vantoc); lcd.print(" RPM"); lcd.setCursor(0,1); lcd.print("SO VONG = "); lcd.setCursor(11,1); lcd.print(sovong,DEC); attachInterrupt(0, doEncoderA, CHANGE); attachInterrupt(1, doEncoderB, CHANGE); } // Ngắt khi chuyển trạng thái của A void doEncoderA(){ if ( rotating ) delay (1); // Chờ 1 chút // Kiểm tra việc chuyển đổi trạng thái, xem có thật sự thay đổi trạng thái chƣa if( digitalRead(encoderPinA) != A_set ) { A_set = !A_set; // Cộng 1 nếu có tín hiệu A rồi có tín hiệu B if ( A_set && !B_set ) encoderPos += 1; ganxung += 1; sovong=encoderPos/20; if (ganxung == 42){ganxung=0;} rotating = false; // Không cần debounce nữa cho đến khi đƣợc nhấn lần nữa } } // Ngắt khi thay đổi trạng thái ở B, tƣơng tự nhƣ ở A void doEncoderB(){ if ( rotating ) delay (1); if( digitalRead(encoderPinB) != B_set ) { // Trừ 1 nếu B rồi đến A if( B_set && !A_set ) encoderPos -= 1; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 243 rotating = false; } } Hình ảnh thực tế: 26. Cài đặt và hiển thị nhiệt độ, độ ẩm (DTH11). Bài học này giúp chúng ta áp dụng những bài trƣớc ta đã học, giao tiếp I2C trên Arduino và sử dụng module DTH11, và cách cài đặt nhiệt độ, độ ẩm để đóng ngắt thiết bị theo yêu cầu của chúng ta. Và hiển thị giá trị nhiệt độ độ ẩm lên màn hình LCD16X02. Trƣớc tiên bạn cài 2 thƣ viện : DTH11 và I2C cho arduino IDE. Các bạn tải 2 thƣ viện này tại: http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino Giới thiệu về giao tiếp I2C: I2C là viết tắt của "Inter-Integrated Circuit", một chuẩn giao tiếp đƣợc phát minh bởi Philips‘ semiconductor division (giờ là NXP) nhằm đơn giản hóa việc trao đổi dữ liệu giữa các ICs. Đôi khi nó cũng đƣợc gọi là Two Wire Interface Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 244 (TWI) vì chỉ sử dụng 2 kết nối để truyền tải dữ liệu, 2 kết nối của giao tiếp I2C gồm: SDA (Serial Data Line) và SCL (Serial Clock Line). Có hàng ngàn thiết bị sử dụng giao tiếp I2C, chẳng hạn nhƣ real-time clocks, digital potentiometers, temperature sensors, digital compasses, memory chips, FM radio circuits, I/O expanders, LCD controllers, amplifiers,...Board Arduino của chúng ta có thể kiểm soát tất cả và số lƣợng tối đa trong một thời điểm lên đến 112 thiết bị I2C. Trên board Arduino UNO, SDA là chân analog A4, SCL là chân analog A5. Module DHT11: Thông số kỹ thuật DHT11: DHT11 Là cảm biến nhiệt độ, độ ẩm rất thông dụng hiện nay vì chi phí rẻ và rất dễ lấy dữ liệu thông qua giao tiếp 1-wire ( giao tiếp digital 1-wire truyền dữ liệu duy nhất). Cảm biến đƣợc tích hợp bộ tiền xử lý tín hiệu giúp dữ liệu nhận về đƣợc chính xác mà không cần phải qua bất kỳ tính toán nào. Đặc điểm: o Điện áp hoạt động : 3V - 5V (DC) o Dải độ ẩm hoạt động : 20% - 90% RH, sai số ±5%RH o Dải nhiệt độ hoạt động : 0°C ~ 50°C, sai số ±2°C o Tần số lấy mẫu tối đa: 1 Hz o Khoảng cách truyền tối đa: 10m Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn . Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 module DHT11. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 245 1 LCD 16x02. 1 I2C cho LCD. 2 nút nhấn. 2 điện trở 10K. Dây cắm test board. Sơ đồ nối dây của nút nhấn nhƣ sau: ( ở trên là 3 nút nhấn ghép lại với nhau thành 1 module do shop thiết kế (nhƣ hình ở dƣới), các bạn cũng có thể làm đƣợc, thực hiện giống nhƣ hình sau, với nhiều nút nhấn theo ý muốn của mình). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 246 Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include "DHT.h" // khai bao thu vien dht #include <Wire.h> #include <LiquidCrystal_I2C.h> // thu vien i2c cho lcd //DHT11 #define DHTPIN11 6 // chan du lieu kết nối với chân D6 của arduino #define DHTTYPE11 DHT11 #define minTempC 0 // nhiet do thap nhat có thể thay đổi đƣợc #define maxTempC 100 // nhiet do cao thap nhat có thể thay đổi đƣợc #define startTempC 34 // nhiet do cai ban đầu float setTempC; #define buttonDN 5 #define buttonUP 4 #define role 3 LiquidCrystal_I2C lcd(0x3f,16,2); byte degree[8] = { 0B01110, 0B01010, 0B01110, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000 }; void setup() { Serial.begin(9600); pinMode(buttonDN, INPUT_PULLUP); pinMode(buttonUP, INPUT_PULLUP); pinMode(role, OUTPUT);//KICH ROLAY setTempC = startTempC; setTempC1 = startTempC; dht11.begin(); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 247 void loop() { setTemperature(); setHeater(); displayLCD(); } void displayLCD(){ float t1 = dht11.readTemperature(); lcd.init(); lcd.backlight();// initialize the lcd lcd.clear(); lcd.home (); lcd.setCursor(0,0); lcd.print("T1: "); lcd.setCursor(3,0); lcd.print(round(t1)); lcd.print(""); lcd.write(1); lcd.print("C"); ………………………………… lcd.createChar(1, degree); } void setTemperature() { if (digitalRead(buttonDN)==HIGH){ setTempC++; if(setTempC < minTempC) setTempC = minTempC; } if (digitalRead(buttonUP)==HIGH){ //setTempC += incPlus; setTempC--; if(setTempC > maxTempC) setTempC = maxTempC; } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 248 void setHeater() // chƣơng trình con so sánh giá trị cài đặt với giá trị thực { if ((setTempC) > t1){ digitalWrite(role, LOW); lcd.setCursor(8,1); lcd.print("TAT QUAT"); } else if (setTempC <= (t1)){ digitalWrite(role, HIGH); lcd.setCursor(8,1); lcd.print("MO QUAT"); } } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 249 27. Điều khiển động cơ servo SG90: Động cơ có nhiều loại và biến thể khác nhau, một trong số các biến thể đó là loại động cơ cho phép ta điều khiển tốc độ, góc quay .. hay nói khác đi cho phép ta ra lệnh điều khiển và thực thi lệnh đó một cách cực kì chính xác - đó chính là động cơ servo. Trong bài viết này, ta cùng tìm hiểu cách hoạt động của động cơ servo và cách lập trình hoạt động thông qua Arduino. Giới thiệu về động cơ servo SG90: Động cơ servo cũng đƣợc chia làm nhiều loại, phụ thuộc vào góc quay tối đa của chúng, 2 loại phổ biến hay sử dụng là: Động cơ servo quay 180°: Futaba S3003, MG90[S] ... Động cơ servo quay 360°: MG995, MG996R ... Nhƣ đã đề cập bên trên, động cơ servo là loại động cơ cho phép ta điều khiển một cách cực kì chính xác. Vì vậy, khác với động cơ thông thƣờng ta chỉ cần cấp nguồn cho động cơ là có thể vận hành đƣợc. Động cơ servo yêu cầu ta phải cấp nguồn (2 dây) và nhận điều khiển từ mạch chính (1 dây), mỗi dây thƣờng đƣợc đánh màu nhƣ sau: Đỏ: nhận điện nguồn, tuỳ vào loại động cơ mà giá trị này có thể khác nhau Nâu: nối với cực âm của mạch Vàng: nhận tín hiệu từ mạch điều khiển Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn . Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 250 1 module servo SG90. Lắp mạch: Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <Servo.h> #define SERVO_PIN 9 // chan tin hieu cua servo noi voi chan so 9 arduino Servo gServo; void setup() { gServo.attach(SERVO_PIN); } void loop() { gServo.write(0); delay(1000); gServo.write(90); delay(1000); // điều chỉnh góc xoay của servo. // điều chỉnh góc xoay của servo. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 251 gServo.write(180); // điều chỉnh góc xoay của servo. delay(1000); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 252 28. Điều khiển động cơ bước stepper 28BYJ-48: Động cơ bƣớc là một loại động cơ mà ở đó bạn sẽ có thể quy định chính xác số góc quay và động cơ bƣớc sẽ phải quay. Không giống nhƣ Servo, động cơ bƣớc có thể quay bao nhiêu độ tùy ý và mỗi lần quay nó sẽ quay đƣợc 1 step, 1 step ở đây là bao nhiêu còn phụ thuộc vào động cơ bƣớc của bạn. Ví dụ , động cơ bƣớc của bạn có 72 step thì nó sẽ cần quay 72 step để hoàn thành một vòng quay. Số step này là hằng số, nhƣng bạn có thể dùng công nghệ micro step để "cải thiện" số vòng quay động cơ bƣớc của bạn. Giới thiệu về động cơ bước stepper 28BYJ-48: Động cơ bƣớc sử dụng trong phần này là động cơ bƣớc 4 pha (thực ra là 2 pha đƣợc chia ra làm 2 ở mỗi pha ngay tại vị trí giữa) (gồm 5 dây), 4 trong 5 dây này đƣợc kết nối với 2 cuộn dây trong động cơ và 1 dây là dây nguồn chung cho cả 2 cuộn dây. Mỗi bƣớc của động cơ quét 1 góc 5.625 độ, vậy để quay 1 vòng động cơ phải thực hiện 64 bƣớc. Thông số kỹ thuật: Điện thế hoạt động Số pha Tỉ lệ bánh răng Một bƣớc tƣơng đƣơng Tần số Điện trở trong 5V 4 *64 5.625° (64 bƣớc) 100Hz 50Ω±7%(25℃) Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn . Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 253 1 động cơ bƣớc stepper 28BYJ-48. 1 module điều khiển động cơ bƣớc ULN2003. 1 bộ nguồn ngoài (5V đến 12V) ( trong bài này chúng ta có thể sử dụng nguồn 5Vdc của arduino nhƣng khuyến cáo hạn chế sử dụng để tránh việc hư board arduino). Lắp mạch: Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Động cơ BYJ48 Stepper chỉ có sẵn bộ hộp số và nó cho ta đến *64 (tỉ lệ bánh răng) => nó có đến 64 * 64 = 4096 bƣớc. #define IN1 8 // IN1 nối với chân D8 của arduino #define IN2 9 // IN2 nối với chân D9 của arduino #define IN3 10 // IN3 nối với chân D10 của arduino #define IN4 11 // IN4 nối với chân D11của arduino int Steps = 4096; int cstep = 0; void setup() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 254 Serial.begin(9600); pinMode(IN1, OUTPUT); // các chân IN quy định là các chân ra pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { for(int x=0;x<Steps;x++) { step1(); //delay(1); delayMicroseconds(2500); } delay(1000); } void step1() { //stepp switch(cstep) { case 0: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break; case 1: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); break; case 2: ……………………………… digitalWrite(IN4, LOW); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 255 break; } cstep=cstep+1; if(cstep==8) {cstep=0;} } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 256 29. Bật tắt LED bằng Remote hồng ngoại: Giới thiệu về Remote hồng ngoại: Hầu hết chúng ta đã sử dụng remote hồng ngoại để điều khiển TV, quạt, máy điều hòa,....nhƣng không phải ai cũng biết remote làm việc ra sao. Tín hiệu hồng ngoại là 1 chùm sóng ánh sáng không thể nhìn thấy bằng mắt thƣờng, do đó, bạn không thể thấy ánh sáng khi nhìn vào cái đèn LED nhỏ ở đầu của remote. Ta dùng remote hồng ngoại loại nào cũng đƣợc…. Trên remote có 1 hoặc nhiều LEDs hồng ngoại (IR LED) đƣợc sử dụng để truyền tín hiệu hồng ngoại. Nhìn bên ngoài thì IR LED giống hệt LED thƣờng, nhƣng vì nó phát ra ánh sáng hồng ngoại nên bạn không thể thấy đƣợc ánh sáng của nó bằng mắt thƣờng. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 257 Tín hiệu này sẽ đƣợc nhận bởi 1 bộ thu hồng ngoại đặc biệt và chuyển thành dạng xung điện, sau đó các xung điện này đƣợc chuyển đổi thành dữ liệu đƣợc sử dụng cho các thiết bị điện tử. Nếu bạn tò mò muốn biết ánh sáng hồng ngoại nó nhƣ thế nào, hãy nhấn 1 nút bất kỳ trên remote rồi nhìn vào cái đèn LED ở đầu remote thông qua 1 chiếc camera nhé! Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn . Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 Remote hồng ngoại hoặc remote Tivi,… 1 mắt thu hồng ngoại ( IR receiver loại 36Khz). 1 trở 220 Ohm. 1 led đơn. Mắt thu hồng ngoại: Trong bài viết này mình sử dụng IR receiver loại 36Khz. Vì mỗi loại IR receiver có sơ đồ chân khác nhau nên các bạn nên tham khảo datasheet của nó nhé!!! Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 258 Lắp mạch: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Trƣớc hết các bạn phải add thƣ viện IR remote vào Arduino IDE. Các bạn tải TẠI ĐÂY. Sau khi tải thƣ viện về, bạn mở cửa sổ IDE, các bạn chọn Sketch--->Import Library...---> Add Library....sau đó chọn file .zip mà bạn vừa tải về để có thể sử dụng thƣ viện. Các bạn có thể tham khảo cách add thƣ viện TẠI ĐÂY. Tiếp theo ta upload đoạn code (DOCFILEHEX) sau, các bạn mở cửa sổ Serial và bấm các nút của remote, tùy loại remote sẽ có giá trị trả về khác nhau và các bạn nên ghi lại giá trị file HEX để ta lập trình. Đấy là các giá trị HEX của tín hiệu đƣợc gửi từ remote, thử tất cả các nút của remote các bạn sẽ biết đƣợc IR codes của nó. // Chƣơng trình (CODE) đọc giá trị HEX của từng nút nhấn của Remote hồng ngoại. #include <IRremote.h> // thƣ viện hỗ trợ IR remote const int receiverPin = 8; // chân digital 8 dùng để đọc tín hiệu Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 259 decode_results results; // lƣu giữ kết quả giải mã tín hiệu void setup() { Serial.begin(9600); // serial baudrate 9600 irrecv.enableIRIn(); // start the IR receiver } void loop() { if (irrecv.decode(&results)) // nếu nhận đƣợc tín hiệu { Serial.println(results.value, HEX); // in ra Serial Monitor delay(200); irrecv.resume(); // nhận giá trị tiếp theo } } Sau khi đọc đƣợc từng giá trị file HEX của các nút nhấn, các bạn nên ghi lại. Tiếp theo ta nạp chƣơng trình (dieukhienledbangremote) cho arduino sử dụng remote để bật tắt LED với những giá trị hex ta đã đọc đƣợc ở trên. // bật tắt led ở chân số 12 #include <IRremote.h> // thƣ viện hỗ trợ IR remote const int receiverPin = 8; // chân digital 8 dùng để đọc tín hiệu decode_results results; // lƣu giữ kết quả giải mã tín hiệu const int RED = 12; // LED đỏ /* trạng thái của các LEDs*/ boolean stateRED = false; void setup() { Serial.begin(9600); // serial pinMode(RED, OUTPUT); pinMode(YELLOW, OUTPUT); pinMode(GREEN, OUTPUT); } void translateIR() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 260 switch(results.value) { case 0xFF30CF: stateRED = !stateRED; //ví dụ nhấn số 1(0xFF30CF: g tri hex số 1) digitalWrite(RED, stateRED); break; case 0xFF6897: stateRED = stateYELLOW = stateGREEN = false;//NHAN SO 0 digitalWrite(RED, 0); } } void loop() { if (irrecv.decode(&results)) // nếu nhận đƣợc tín hiệu { translateIR(); Serial.println(results.value, HEX); delay(200); irrecv.resume(); // nhận giá trị tiếp theo } } Các hàm và lệnh trong của thƣ viện IR remote nhƣ: o IRrecv irrecv(receiverPin);: tạo đối tƣợng IRrecv mới có tên là irrecv sử dụng tham số là receiverPin. o decode_results results; : lƣu kết quả giải mã đƣợc o irrecv.enableIRIn(); : bắt đầu giải mã tín hiệu IR o irrecv.decode(&results);: trả về true nếu có tín hiệu đến o irrecv.resume; : đợi tín hiệu IR tiếp theo. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 261 Hình ảnh thực tế: 30. Điều khiển động cơ bằng module L298n: Giới thiệu về Module L298: Trong bài này, tôi sẽ hƣớng dẫn các bạn sử dụng IC L298 đã tích hợp sẵn mạch cầu H, ứng dụng trong việc điều khiển cùng lúc 2 động cơ theo chiều quay bất kì, kết hợp với Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 262 điều xung PWM có thể điều chỉnh tốc độ xoay của động cơ. PWM để cân bằng độ chênh lệch giữa 2 bánh xe. Thông số kỹ thuật: Điện áp điều khiển: +6 V ~ +12 V. L298 gồm các chân: 12V power, 5V power: bên trong mạch có sử dụng IC điều hƣớng dòng điện, hoạt động với điện áp 5V, khi nối nguồn 12V mạch sẽ hoạt động với nguồn 12V, tuy nhiên mạch sẽ điều hƣớng dòng điện. o Điện áp 12V điều khiển động cơ để hoạt động. o Hạ điện áp xuống thành 5V và cấp nguồn cho IC. Nhƣ vậy khi cấp nguồn 9V: động cơ hoạt động với dòng 9V và IC của mạch sẽ hoạt động với điện áp 5V. Việc thiết kế có nhằm điều hƣớng thành 2 điện áp khác nhau giúp IC hoạt động ổn định và tách nguồn riêng biệt với động cơ. Power GND chân này là GND của nguồn cấp cho Động cơ. 2 Jump A enable và B enable, nếu bạn dùng Board để điều khiển động cơ bƣớc thì giữ nguyên. Nếu điều khiển động cơ bình thƣờng thì nối với chân PWM để điều khiển tốc độ. Gồm có 4 chân Input. IN1, IN2, IN3, IN4. Output A: nối với động cơ giảm tốc V1. bạn chú ý chân +, -. Nếu bạn nối ngƣợc thì động cơ sẽ chạy ngƣợc. Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn ). Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 động cơ bƣớc giảm tốc V1 ( màu vàng ) có sẵn trên kit. 1 module L298 nhƣ hình trên. Lắp mạch. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 263 Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #define ENA 8 //enable A on pin 8 #define ENB 3 //enable B on pin 3 #define IN1 7 //IN1 on pin 7 #define IN2 6 //IN2 on pin 6 #define IN3 5 //IN3 on pin 5 #define IN4 4 //IN4 on pin 4 void setup() { pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { motorA(1, 25); //cho motor A chạy 25% tốc độ CHẠY THUẬN delay(5000); //chạy 25% trong 5 s motorA(3, 100); //thắng động cơ A motorB(1, 25); //cho motor B chạy 25% tốc độ. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 264 delay(5000); //chạy 25% trong 5 s motorA(2, 25); // cho motor A chạy 25% tốc độ CHẠY NGHỊCH delay(5000); //let motor A and motor B run for 5 seconds motorB(3, 50); //thắng động cơ B motorA(0, 100); //dừng động cơ A delay(5000); //đợi 5 s } //**************** Motor A control ***************** void motorA(int mode, int percent) { …………………………………………………………………………………… case 2: digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); analogWrite(ENB, duty); break; case 3: digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); analogWrite(ENB, duty); break; } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 265 31. Lập trình module Wifi ESP8266 V1 bằng Uno R3: Giới thiệu về module Wifi ESP8266 V1: ESP8266 là một chip tích hợp cao - System on Chip (SoC), có khả năng xử lý và lƣu trữ tốt, cung cấp khả năng vƣợt trội để trang bị thêm tính năng wifi cho các hệ thống khác hoặc đóng vai trò nhƣ một giải pháp độc lập. Module wifi ESP8266 v1 cung cấp khả năng kết nối mạng wifi đầy đủ và khép kín, bạn có thể sử dụng nó để tạo một web server đơn giản hoặc sử dụng nhƣ một access point. Thông số kỹ thuật: Wifi 802.11 b/g/n Wifi 2.4 GHz, hỗ trợ WPA/WPA2 Chuẩn điện áp hoạt động 3.3V Chuẩn giao tiếp nối tiếp UART với tốc độ Baud lên đến 115200 Có 3 chế độ hoạt động: Client, Access Point, Both Client and Access Point Hỗ trợ các chuẩn bảo mật nhƣ: OPEN, WEP, WPA_PSK, WPA2_PSK, WPA_WPA2_PSK Hỗ trợ cả 2 giao tiếp TCP và UDP Tích hợp công suất thấp 32-bit CPU có thể đƣợc sử dụng nhƣ là bộ vi xử lý ứng dụng SDIO 1.1 / 2.0, SPI, UART Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 266 URXD(RX) — dùng để nhận tín hiệu trong giao tiếp UART với vi điều khiển VCC — đầu vào 3.3V GPIO 0 — kéo xuống thấp cho chế độ upload bootloader RST — chân reset cứng của module, kéo xuống mass để reset GPIO 2 — thƣờng đƣợc dùng nhƣ một cổng TX trong giao tiếp UART để debug lỗi CH_PD — kích hoạt chip, sử dụng cho Flash Boot và updating lại module, nối với mức cao GND — nối với mass UTXD (TX) — dùng để truyền tín hiệu trong giao tiếp UART với vi điều khiển Phần cứng chuẩn bị: (bộ kit đã tích hợp sẵn . Mạch Arduino (ở đây mình sử dụng Arduino UNO). Breadboard còn gọi testboard. Dây cắm test board. 1 Module wifi 8266V1. Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 267 Lập trình : Code lập trình sẽ đƣợc lƣu trong file ( file_code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Arduino Uno gửi lệnh điều khiển (tập lệnh AT) cho ESP8266 cũng bằng giao tiếp UART. Tuy nhiên board Arduino chỉ có 1 chân RX và 1 chân TX cho phép thực hiện giao tiếp UART. Điều đó dẫn đến 2 sự lựa chọn: a. b. Sử dụng chân RX và TX có sẵn trên Arduino để nạp code sau khi nạp code xong thì mới kết nối 2 chân đó với ESP8266. Với phƣơng pháp này bạn phải thêm một khoảng thời gian delay ở hàm setup() để đảm bảo là sau khi kết nối ESP8266 với Arduino, thì ESP8266 vẫn nhận đƣợc đầy đủ các tập lệnh AT từ Arduino. Tuy nhiên, bạn không thể debug qua cổng Serial do cổng này đang đóng vai trò kết nối với ESP8266. Sử dụng SoftwareSerial để giả lập thêm 1 cổng Serial nữa để gửi tập lệnh AT cho ESP8266. Thƣ viện SoftwareSerial đã đƣợc trang bị sẵn trong Arduino IDE nên bạn không cần phải tải thêm. Với cách này thì bạn có thể debug thông qua Serial tuy nhiên code sẽ phức tạp hơn. Ở ví dụ dƣới đây tôi chọn phƣơng án thứ nhất và chọn thời gian delay là 5s để kết nối chân TX và RX của Arduino với chân RX và TX của ESP8266 ngay sau khi nạp code thành công. * Lưu ý : TRONG QUÁ TRÌNH NẠP CODE CÁC BẠN NÊN RÚT DÂY TX VÀ RX RA KHỎI ARDUINO, KHI NẠP CODE XONG TA HÃY CẮM LẠI // Code chƣơng trình bật tắt led chân số 13 của Arduino. #define LED_PIN 13 #define CMD_SEND_BEGIN "AT+CIPSEND=0" #define CMD_SEND_END "AT+CIPCLOSE=0" #define TDHshop_PROTOCOL_HTTP 80 #define TDHshop_PROTOCOL_HTTPS 443 #define TDHshop_PROTOCOL_FTP 21 #define TDHshop_PROTOCOL_CURRENT TDHshop_PROTOCOL_HTTP #define TDHshop_CHAR_CR 0x0D #define TDHshop_CHAR_LF 0x0A Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 268 #define TDHshop_STRING_EMPTY "" #define TDHshop_DELAY_SEED 1000 #define TDHshop_DELAY_1X (1*TDHshop_DELAY_SEED) #define TDHshop_DELAY_2X (2*TDHshop_DELAY_SEED) #define TDHshop_DELAY_3X (3*TDHshop_DELAY_SEED) #define TDHshop_DELAY_4X (4*TDHshop_DELAY_SEED) #define TDHshop_DELAY_0X (5*TDHshop_DELAY_SEED) bool hasRequest = false; void setup() { delay(TDHshop_DELAY_0X); Serial.begin(115200); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); initESP8266(); } void loop() { while(Serial.available()) { …………………………………………………………………………….. void deliverMessage(const String& msg, int dt) { Serial.println(msg); delay(dt); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 269 Hình ảnh thực tế: Sau khi nạp code xong ta nối lại dây TX và RX và mở cổng Serial Monitor để xem arduino gửi lệnh lên ESP8266 nhƣ sau: Tiếp đến trên máy tính hay điện thoại ta kết nối với Wifi có tên TDHshop.com.vn và nhập pass cho nó "123456789" . Tiếp theo mở trình duyệt Web lên và gõ địa chỉ mặc định của ESP8266 là : 192.168.4.1 hiển thị nhƣ sau: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 270 32. Giao tiếp giữa 2 board Arduino với nhau. Giới thiệu: Trong bài này tôi sẽ hƣớng dẫn bạn cách giao tiếp giữa 2 mạch Arduino bất kỳ. Trong nhiều dự án phức tạp thì 1 Arduino thì không thể thực hiện đƣợc, Vì vậy giao tiếp giữa 2 arduino với nhau giúp chúng ta gải quyết đƣợc vấn đề trên. Thư viện hổ trợ việc giao tiếp giữa 2 Arduino: Chúng ta sẽ sử dụng thƣ viện Serial Command để xây dựng các "câu lệnh". Các bạn tải thƣ viện TẠI ĐÂY thƣ viện thứ 13. Cách add thƣ viện các bạn có thểm xem TẠI ĐÂY. Phần cứng chuẩn bị: Mạch Arduino (ở đây mình sử dụng Arduino UNO) (Truyền dữ liệu). Mạch Arduino hoặc Nano,… (ở đây mình sử dụng Arduino UNO) (Nhận dữ liệu). Breadboard còn gọi testboard. Dây cắm test board. 1 led đơn. 1 trở 220Ohm. Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 271 Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Chƣơng trình ( code) upload cho Arduino Truyền lệnh: void setup() { Serial.begin(9600); // Bạn khởi tạo một cổng Serial tại baudrate 9600. } int Step = 0; void loop() { if (Step == 0) { Serial.println("LED_RED 1"); // Đèn đỏ sáng. 1 == HIGH } else if (Step == 1) { Serial.println("LED_RED 0"); // Đèn đỏ tắt . 0 == LOW } Step = (Step + 1) % 2; //Step sẽ tuần tự tuần hoàn các giá trị trong khoảng từ 0 ->1 delay(500); // Dừng 1/2 giây giữa các lần gửi } Chƣơng trình ( code) upload cho Arduino nhận lệnh: #include <SoftwareSerial.h> #include <SerialCommand.h> // Khai báo biến sử dụng thƣ viện Serial Command SerialCommand sCmd; int red = 8; void setup() { Serial.begin(9600); / /Khởi tạo Serial ở baudrate 9600 . pinMode(red,OUTPUT); // Một số hàm trong thƣ viện Serial Command sCmd.addCommand("LED_RED", led_red); // Khi có câu lệnh tên là LED_RED sẽ chạy hàm led_red } void loop() { sCmd.readSerial(); //Bạn không cần phải thêm bất kỳ dòng code nào trong hàm loop này cả Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 272 } // hàm led_red sẽ đƣợc thực thi khi gửi hàm LED_RED void led_red() { //Đoạn code này dùng để đọc TỪNG tham số. Các tham số mặc định có kiểu dữ liệu là "chuỗi" char *arg; arg = sCmd.next(); int value = atoi(arg); // Chuyển chuỗi thành số digitalWrite(red,value); } 33. Điều khiển LED RGB ( LED 3 màu). Giới thiệu: Trong bài này, chúng ta sẽ tìm hiểu cách sử dụng LED RGB (Red Green Blue – Đỏ, Xanh Lá, Xanh Dƣơng). Bạn có thể sử dụng hàm analogWrite của Arduino để điều khiển màu sắc của LED. LED RGB (Đỏ, Xanh lá, Xanh dƣơng) trông giống nhƣ đèn LED thông thƣờng, tuy nhiên, cấu tạo bên trong của LED này thực sự gồm 3 đèn LED, một đỏ, một xanh lá và một xanh dƣơng. Bằng cách điều khiển độ sáng của mỗi LED riêng biệt mà bạn có thể tạo ra màu sắc bất kì mà bạn muốn. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 273 Để thay màu sắc của LED RGB, ta chỉ việc thay đổi độ sáng của từng con diode (led) trong con led rgb. Để thay đổi độ sáng của một con LED ta chỉ việc điều chỉnh điện áp xuất ra con LED, mà để điều chỉnh điện áp xuất ra con LED ta sẽ dùng xung PWM. Lắp mạch: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. const int RED_PIN = 9; // led đỏ const int GREEN_PIN = 10; // led xanh lá const int BLUE_PIN = 11; // led xanh dƣơng int DELAY_TIME = 500; // đơn vị là mili giây void setup() { pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); } void loop() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 274 maucoban(); // Gọi hàm maucoban } void maucoban() { // Tắt toàn bộ các led digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, LOW); delay(DELAY_TIME); // Chỉ bật led đỏ ……………………………………… digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, HIGH); delay(DELAY_TIME); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 275 34. Hiển thị giá trị điện áp khi điều chỉnh biến trở. Giới thiệu: Bài ví dụ này sẽ giới thiệu cho các bạn cách đọc giá trị điện áp gây ra bởi một biến trở. Biến trở chỉ đơn giản chỉ là một điện trở có thể thay đổi đƣợc trị số. Mạch Arduino không đọc trực tiếp điện trở này mà đọc gián tiếp qua điện áp mà biến trở gây ra. Cấu tạo của biến trở: Phần màu vàng là một lớp điện trở. Cây kim màu xanh đƣợc đè chặt xuống phần điện trở này. Giả sử có dòng điện đi từ 1 đến 2 thì nó sẽ phải qua phần màu vàng (đƣợc tô đỏ) và đó chính là điện trở hiện tại của biến trở. Bạn chỉ việc vặn cây kim để tăng giảm độ dài của vùng màu đỏ, qua đó tăng giảm giá trị điện trở. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 276 Phần cứng chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm test breadboard. 1 biến trở 10K . Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 277 Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. void setup() { Serial.begin(9600); //Mở cổng Serial để giap tiếp | tham khảo //Serial } void loop() { //(value luôn nằm trong khoảng 0-1023) //xuất ra giá trị vừa đọc Serial.println(value); int voltage; voltage = map(value,0,1023,0,5000); //chuyển thang đo của value //từ 0-1023 sang 0-5000 (mV) Serial.println(voltage); //xuất ra điện áp (đơn vị là mV) Serial.println(); //xuống hàng delay(200); //đợi 0.2 giây } 35. Đọc giá trị cảm biến báo cháy hiển thị serial monitor. Giới thiệu: Đây là loại cảm biến chuyên dùng để phát hiện lửa , thƣờng đƣợc sử dụng trong hệ thông báo cháy. Tầm phát hiện trong khoảng 80cm, góc quét là 60 độ. Có thể phát hiện lửa tốt nhất là loại có bƣớc sóng từ 760nm - 1100nm. Mạch đƣợc tích hợp IC LM393 so sánh để tạo mức tín hiệu => ta có thể chỉnh độ nhạy bằng biến trở. Thông số kĩ thuật: Nguồn : 3.3V - 5V, 15mA Điên áp ra : 3.3 - 5V, đầu ra có cả analog và Digital. Khoảng cách : 80 cm Góc quét : 60 độ Kích thƣớc : 3.2 x 1.4 cm Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 278 Phần cứng chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm test breadboard. 1 cảm biến báo cháy (CB lửa) . Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 279 Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. //Cách nối dây: chân G nối GND, chân V+ nối nguồn 5V //Chân AO (Analog Output-tín hiệu ra Analog) nối chân A1 //Chân DO (Digital Output - tín hiệu ra on/off) nối chân 4 #define ChanAO 1//Chân A1 là chân để đọc tính hiệu Analog AO #define ChanDO 4//Chân 4 (bên digital) là chân để đọc tín hiệu Digital DO #define baochay 12//Chân để điều khiển đèn led báo cháy float giatriAO;//Biến chứa giá trị Analog AO float giatriDO;//Biến chứa giá trị Digital DO void setup() { Serial.begin(9600); pinMode(ChanDO, INPUT); //Định nghĩa chanDO (chân 4) là chân đọc tính hiệu vào pinMode(baochay,OUTPUT); //Định nghĩa chân báo cháy (chân 12) là chân xuất tín hiệu ra cho đèn led } void loop() { ………………………………………………………………. Serial.print(" Gia tri chan Digital: ");//In giá trị digital ra màn hình Serial.println(giatriDO); if(giatriAO<900)//Điều kiện để phát tín hiệu cháy (do ngƣời dùng tự đặt) { Serial.println("Dang chay");//Báo cháy digitalWrite(baochay,HIGH);//Bật đèn sáng } else//Ngƣợc lại { digitalWrite(baochay,LOW);//Tắt đèn } delay(1000);//Cập nhật giá trị sau 1s } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 280 36. Đọc giá trị CB màu (TCS3200) hiển thị serial monitor. Giới thiệu: Module cảm biến màu TCS3200 là một module cảm biến phát hiện đầy đủ màu sắc, bao gồm cả cảm biến màu TCS3200 với khả năng nhận biết 3 màu cơ bản RGB và 4 đèn LED trắng. Các TCS3200 có thể phát hiện và đo lƣờng gần nhƣ tất cả màu sắc có thể nhìn thấy. Ứng dụng bao gồm kiểm tra đọc dải, phân loại theo màu sắc, cảm biến ánh sáng xung quanh và hiệu chuẩn, và kết hợp màu sắc, đó chỉ là một vài ứng dụng. TCS3200 có các bộ tách sóng quang, có 2 bộ lọc màu sắc là bộ lọc màu đỏ, xanh, hoặc màu xanh, hoặc không có bộ lọc ( rõ ràng). Các bộ lọc của mỗi màu đƣợc phân bố đều khắp các mảng để loại bỏ sai lệch vị trí giữa các điểm màu. Bên trong là một bộ dao động tạo ra đầu ra sóng vuông có tần số là tỷ lệ thuận với cƣờng độ của màu sắc lựa chọn. Thông số kĩ thuật: Điện áp cung cấp: (2.7V đến 5.5V) Chuyển đổi từ cƣờng độ ánh sáng sang tần số với độ phân giải cao. Có khả năng lập trình để nhận biết đầy đủ các màu sắc. Điện năng tiêu thụ thấp. Giao tiếp trực tiếp với vi điều khiển. S0 ~ S1: Dùng để lựa chọn tỉ lệ tần số đầu ra S2 ~ S3: Dùng để lựa chọn kiểu photodiode OUT Pin: Đầu ra tần số. OE Pin: Tần số đầu ra cho phép hoạt động (hoạt động ở mức thấp). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 281 Hỗ trợ đèn LED bổ sung và kiểm soát ánh sáng. Phần cứng chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm test breadboard. 1 cảm biến MÀU (TCS3200) . Nguyên tắc nhận biết màu: TCS3200 có bộ lọc màu, khi lựa chọn một bộ lọc màu nó sẽ cho phép chỉ nhận biết 1 màu và các màu khác sẽ bị chặn. Ví dụ, khi lựa chọn các bộ lọc màu đỏ, Chỉ có ánh sáng tới màu đỏ có thể đƣợc thông qua, màu xanh và màu xanh lá cây sẽ đƣợc ngăn chặn. Vì vậy chúng ta có thể nhận đƣợc cƣờng độ ánh sáng màu đỏ. Tƣơng tự nhƣ vậy, khi lựa chọn các bộ lọc khác mà chúng ta có thể nhận đƣợc ánh sáng màu xanh hoặc màu xanh lá cây. Cách thiết lập màu sắc cho TCS3200: Tần số đầu ra của TCS3200 trong khoảng 2HZ~500KHZ. Tần số đầu ra có dạng xung vuông với tần số khác nhau khi mà màu sắc khác nhau và cƣờng độ sáng là khác nhau. Chúng ta có thể lựa chọn tỉ lệ giữa cừng độ sáng và màu sắc theo bảng sau. Trên module này cũng có chân LED EN đây là chân điều khiển đèn LED để tắt hoặc bật. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 282 Cách thiết lập tần số cho TCS3200: Lắp mạch: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #define S0 4 #define S1 5 #define S2 6 #define S3 7 #define sensorOut 8 int frequency = 0; void setup() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 283 pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorOut, INPUT); // thiet lap tan so 20% digitalWrite(S0,HIGH); digitalWrite(S1,LOW); Serial.begin(9600); } void loop() { digitalWrite(S2,LOW); digitalWrite(S3,LOW); frequency = pulseIn(sensorOut, LOW); ………………………………………………… digitalWrite(S2,LOW); digitalWrite(S3,HIGH); frequency = pulseIn(sensorOut, LOW); Serial.print("B= "); Serial.print(frequency); Serial.println(" "); delay(100); } 37. Đọc giá trị CB chuyển động PIR hiển thị serial monitor. Giới thiệu: PIR là chữ viết tắt của Passive InfraRed sensor (PIR sensor), tức là bộ cảm biến thụ động dùng nguồn kích thích là tia hồng ngoại. Tia hồng ngoại (IR) chính là các tia nhiệt phát ra từ các vật thể nóng. Trong các cơ thể sống, trong chúng ta luôn có thân nhiệt (thông thƣờng là ở 37 độ C), và từ cơ thể chúng ta sẽ luôn phát ra các tia nhiệt, hay còn gọi là các tia hồng ngoại, ngƣời ta sẽ dùng một tế bào điện để chuyển đổi tia nhiệt ra dạng tín hiệu điện và nhờ đó mà có thể làm ra cảm biến phát hiện các vật thể nóng đang chuyển động. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 284 Cảm biến này gọi là thụ động vì nó không dùng nguồn nhiệt tự phát (làm nguồn tích cực, hay chủ động) mà chỉ phụ thuộc vào các nguồn tha nhiệt, đó là thân nhiệt của các thực thể khác, nhƣ con ngƣời, con vật… Trên đây là đầu dò PIR, loại bên trong gắn 2 cảm biến tia nhiệt, nó có 3 chân ra, một chân nối masse, một chân nối với nguồn volt DC, mức áp làm việc có thể từ 3 đến 15V. Góc dò lớn. Để tăng độ nhậy cho đầu dò, Bạn dùng kính Fresnel, nó đƣợc thiết kế cho loại đầu có 2 cảm biến, góc dò lớn, có tác dụng ngăn tia tử ngoại. Nguyên lý làm việc của loại đầu dò PIR như hình sau: Các nguồn nhiệt (với ngƣời và con vật là nguồn thân nhiệt) đều phát ra tia hồng ngoại, qua kính Fresnel, qua kích lọc lấy tia hồng ngoại, nó đƣợc cho tiêu tụ trên 2 cảm biến hồng ngoại gắn trong đầu dò, và tạo ra điện áp đƣợc khuếch đại với transistor FET. Khi có một vật nóng đi ngang qua, từ 2 cảm biến này sẽ cho xuất hiện 2 tín hiệu và tín hiệu này sẽ đƣợc khuếch đại để có biên độ đủ cao và đƣa vào mạch so áp để tác động vào một thiết bị điều khiển hay báo động. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 285 Thông số kĩ thuật: GND – kết nối với mặt đất OUT – kết nối đến một chân digital của Arduino 5V – kết nối với 5V Phần cứng chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm test breadboard. 1 cảm biến chuyển động PIR . 1 Loa hoặc 1 LED đơn. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 286 Lắp mạch: Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int ledPin = 10; // chọn chân 10 báo hiệu LED int inputPin = 2; // chọn ngõ tín hiệu vào cho PIR int val = 0; void setup() { pinMode(ledPin, OUTPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 287 pinMode(inputPin, INPUT); Serial.begin(9600); } void loop() { val = digitalRead(inputPin); // đọc giá trị đầu vào. Serial.print(frequency); Serial.println(" "); delay(100); if (val == HIGH) // nếu giá trị ở mức cao.(1) { digitalWrite(ledPin, HIGH); // LED On } else { digitalWrite(ledPin, LOW); } } 38. Đọc giá trị CB khí gas (MQ2) hiển thị serial monitor. Giới thiệu: Cảm biến khí ga MQ2 là một trong những loại cảm biến đƣợc sử dụng để nhận biết: LPG, i-butan, Propane, Methane , Alcohol, Hydrogen, Smoke và khí ga. Đƣợc thiết kế với độ nhạy cao, thời gian đáp ứng nhanh. Gía trị đọc đƣợc từ cảm biến sẽ đƣợc đọc về từ chân Analog của vi điều khiển. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 288 Thông số kĩ thuật: Nguồn hoạt động: 5VDC Dòng: 150mA Tính hiệu tƣơng tự (analog) Hoạt động trong thời gian dài, ổn định Phần cứng chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm test breadboard. 1 cảm biến khí gas MQ2 . Lắp mạch: Arduino MQ2 A0 VCC GND Aout 5V GND Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 289 void setup() { Serial.begin(9600); //Mở cổng Serial để giap tiếp | tham khảo Serial } void loop() { int value = analogRead(A0); //đọc giá trị điện áp ở chân A0 - chân cảm biến //(value luôn nằm trong khoảng 0-1023) Serial.println(value); //xuất ra giá trị vừa đọc //----------------------------------------------------delay(1000); //đợi 1 giây để bạn kịp tháy serial - (optional) } Để test, bạn có thể dùng hộp quẹt,... và xì hơi ga vào tấm lƣới của nó. 39. Điều khiển thiết bị bằng BLUETOOTH ( HC05 hoặc HC06) ( chỉ áp dụng cho Điện thoại android). Giới thiệu: Kết nối Arduino với các thiết bị, module điện tử khác là 1 việc tƣơng đối dễ dàng, hôm nay tôi sẽ giới thiệu với các bạn cách kết nối Arduino với module Bluetooth và điều khiển nó thông qua điện thoại Android. Các bạn có thể ứng dụng để điều khiển các thiết bị điện trong nhà nhƣ bật tắt đèn, quạt,… Thông số kĩ thuật: Module này gồm 4 chân GND, VCC, TX, RX Khi kết nối bạn chỉ cần nối chân TX với chân 0 và chân RX nối với chân 1 trên Arduino sau đó bạn có thể lập trình gửi và nhận dữ liệu nhƣ 1 cổng Serial thông thƣờng. Module này có 3 loại Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 290 Master, Slave và loại chạy đƣợc cả 2 chế độ Master và Slave, ở ví dụ này tôi sử dụng loại Slave, khi kết nối với điện thoại bạn điền mật khẩu mặc định là: 1234 Phần cứng chuẩn bị: Arduino Uno, nano,… Breadboard. Dây cắm test breadboard. 1 module Bluetooth HC05 Hoặc HC06 loại slave. Lắp mạch: Arduino HC06 Tx Rx GND 5V Rx Tx GND VCC Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 291 Lập trình cho Arduino: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. int LED1 = 5; int LED2 = 6; int LED3 = 7; int chucai = 'g'; void setup() { Serial.begin(9600); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); } void loop() { if(Serial.available()>0){ chucai = Serial.read(); } if(chucai =='a'){ // bật led 1 Serial.println(chucai); digitalWrite(LED1, HIGH); } if(chucai=='b'){ // tắt led 1 Serial.println(chucai); digitalWrite(LED1, LOW); } ……………………………………… } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 292 Viết app điều khiển thiết bị điện bằng luetooth trên điện thoại Andriod: Trong bài viết này tôi xin giới thiệu cách viết app cho điện thoại Andriod bằng appinventor. Giao diện rất đơn giản và dễ sử dụng. Giao diện của Appinventor: (app cho điện thoại đƣợc lƣu trong file code) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 293 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 294 Hình ảnh thực tế: 40. Sử dụng IC Max7219 để điều khiển led ma trận 8x8. Giới thiệu: Với việc sử dụng IC Max7219 việc điều khiển led ma trận 8x8 trở nên dễ dàng hơn và đƣợc hổ trợ bởi những thƣ viện có sẵn. Ta có thể ghép nối nhiều module led 8x8 này lại với nhau. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 295 Thông số kĩ thuật: Module có thể điều khiển 8x8 điểm led chân cathode chung. Điện áp hoạt động: 5V Bên trái của module là chân ngõ vào và bên phải là chân ngõ ra. Phần cứng chuẩn bị: Arduino Uno, nano,… Dây cắm test breadboard. 1 module led 8x8 sử dụng IC MAX7219. Lắp mạch: Arduino Module led 8x8 10 11 13 5V GND CS DIN CLK VCC GND Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <SPI.h> #include <Adafruit_GFX.h> Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 296 #include <Max72xxPanel.h> int pinCS = 10; //ARDUINO ket noi voi MAX_MATRIX7219 //CS ----- PIN10 //DIN ----- PIN11 //CLK ----- PIN13 int numberOfHorizontalDisplays = 1; //số trong Hiển thị theo chiều ngang int numberOfVerticalDisplays = 4; // Số trong hiển thị theo chiều dọc. ………………………………………………… String tape = "NHOM HOC LAP TRINH ARDUINO"; // ký tự muốn truyền lên matrix int wait = 100; // thời gian chạy chữ. int spacer = 1; // khoảng cách cách chữ int width = 5 + spacer; // độ rộng của font là 5 fixel void setup() { matrix.setIntensity(10); // cài đặt giá trị độ tƣơng phản từ 0 đến 15. matrix.setRotation(3); } void loop() { for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) { matrix.fillScreen(LOW); delay(wait); } } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 297 41. Đo Tốc Độ Động Cơ ằng Cảm Biến IR FC03. Giới thiệu: Bài viết hƣớng dẫn cách sử dụng cảm biến đo tốc độ IR FC-03 kết hợp với vòng xoay encoder 15 lỗ, để xác định tốc độ của động cơ DC. Khi có tốc độ, ta có thể thực hiện điều chỉnh tốc độ của động cơ để cho xe chạy thẳng, thông qua mạch L298. Phần cứng chuẩn bị: 1 x Arduino Uno R3. 1 x Cảm biến tốc độ IR FC-03. 1 x Đĩa encoder 15 lỗ. 1 x động cơ. CB tốc độ IR FC03: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 298 Thông số kĩ thuật: 1 x Bộ thu phát ITR9608: Chân số 2 có chứa diode phát tia hồng ngoại, chân số 1 chứa 1 phototransistor để thu nhận tín hiệu hồng ngoại. 1 x IC LM393. VCC: cảm biến chịu đƣợc mức điện áp từ 3.3 - 5V. Chân này đƣợc nối với pin nguồn 5V của Arduino. GND: nối với pin nguồn GND của arduino. DO: chân cho tín hiệu số đi ra của cảm biến (High / Low). AO: chân cho tín hiệu tƣơng tự đi ra từ cảm biến. Chân này tôi không sử dụng. Nguyên lý hoạt động: Khi motor quay thì đĩa encoder quay, lúc này, giá trị ở chân DO của FC-03 chuyển đổi liên tục từ LOW sang HIGH và từ HIGH sang LOW. Nguyên nhân là do khi FC-03 đƣợc cấp điện, diode ở chân số 2 của ITR9608 phát ra tia hồng ngoại, nếu tia hồng ngoại đƣợc truyền thông qua lỗ của đĩa encoder, phototransistor nhận đƣợc tín hiệu và chuyển output của chân DO lên mức HIGH. Ngƣợc lại, khi tia hồng ngoại bị cản bởi đĩa encoder, phototransistor không nhận đƣợc tín hiệu, chân DO đƣợc chuyển về mức LOW. Dựa vào nguyên lý ngày, để lấy đƣợc số vòng quay của động cơ trong một khoảng thời gian, ta chỉ cần đếm số lỗ mà FC-03 bắt đƣợc trong khoảng thời gian đó. Tức là ta sẽ đếm số lần mà pin 2 của Arduino chuyển từ HIGH sang LOW. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 299 Lắp mạch: Arduino Module IR FC03 5VDC GND 2 VCC GND D0 Lập trình: #define PIN_DO 2 volatile unsigned int pulses; float rpm; unsigned long timeOld; #define HOLES_DISC 15 // số lổ trên đĩa encoder void counter() { pulses++; } void setup() { Serial.begin(9600); pinMode(PIN_DO, INPUT); attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);// khởi động interrupt } void loop() { if (millis() - timeOld >= 1000) { detachInterrupt(digitalPinToInterrupt(PIN_DO)); // ngƣng interrupt để thực hiện tính toán rpm = (pulses * 60) / (HOLES_DISC); Serial.println(rpm); timeOld = millis(); pulses = 0; attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING); // } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 300 42. Điều khiển RGB LED sử dụng Module Bluetooth HC05 . Giới thiệu: Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… Breadboard . Dây cắm test board. 1 led 3 màu dƣơng chung ( anode). 3 điện trở 220Ohm. Lắp mạch: Arduino RGB LED Bluetooth HC05 5VDC GND 2 Tx Rx VCC GND D0 VCC GND Rx Tx Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 301 Lập trình cho arduino: #define max_char 12 char message[max_char]; char r_char; byte index = 0; int i; int redPin = 11; // Red RGB pin -> D11 int greenPin = 10; // Green RGB pin -> D10 int bluePin = 9; // Blue RGB pin -> D9 int redValue = 255; int greenValue = 255; int blueValue = 255; void setup() { pinMode(redPin,OUTPUT); pinMode(bluePin,OUTPUT); pinMode(greenPin, OUTPUT); Serial.begin(9600); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 302 void loop() { //while is reading the message while(Serial.available() > 0){ flag = 0; if(index < (max_char-1)){ r_char = Serial.read(); message[index] = r_char; ……………………………… for(i=0; i<12; i++){ message[i] = '\0'; } index=0; } } Lập trình app cho điện thoại Android: File app đƣợc lƣu trong file code kèm theo. Lƣu ý khi dùng điện thoại android kết nối với HC05 với mật khẩu 1234 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 303 43. Làm game với led ma trận 8x8 Max7219 . Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… Breadboard . Dây cắm test board. 1 led ma trận 8x8 max7219. 1 biến trở 1K. Lắp mạch: Biến trở các bạn nối nhƣ hình dƣới. Arduino Module led 8x8 10 12 11 5V GND A0 CS DIN CLK VCC GND Biến trở 1 3 2(chân giữa) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 304 Led ma trận có 8 cột và 8 hàng. Nếu bạn muốn hiển thị một cái gì đó trong ma trận, bạn chỉ cần biết nếu trong một hàng hoặc cột xác định, các đèn LED đang bật hoặc tắt. Ví dụ hiển thị một khuôn mặt Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 305 Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Trƣớc hết ta phải cài thêm thƣ viên LedControl và Timer có kèm theo. #include "LedControl.h" // thƣ viện ledcontrol cần cài cho ide #include "Timer.h" // thƣ viện Timer cần cài cho ide #define POTPIN A0 // chân số 2( chân giữa) biến trở nối với A0 của ardunio byte sad[] = { B00000000, B01000100, B00010000, B00010000, B00000000, B00111000, B01000100, B00000000 }; lc.setRow(0, yball, byte(1 << (xball))); byte padmap = byte(0xFF >> (8 - PADSIZE) << xpad) ; #ifdef DEBUG #endif lc.setRow(0, 7, padmap); } void setup() { pinMode(POTPIN, INPUT); ……………………………………………………. lc.clearDisplay(0); randomSeed(analogRead(0)); #ifdef DEBUG Serial.begin(9600); Serial.println("Pong"); #endif newGame(); ball_timer = timer.every(BALL_DELAY, moveBall); } void loop() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 306 timer.update(); setPad(); debug("LOOSE"); gameOver(); newGame(); } delay(GAME_DELAY); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 307 44. Lập trình với keypad 4x4 . Giới thiệu: Hình trên là sơ đồ nguyên 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ì chúng 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)). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 308 Lắp mạch: Arduino Module keypad 4x4 5 6 7 8 9 10 11 12 R1 R2 R3 R4 C1 C2 C3 C4 Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Trƣớc hết ta cần phải cài thêm thƣ viện Keypad có kèm theo. #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; char keys[rows][columns] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}, }; byte rowPins[rows] = {5, 6, 7, 8}; //Cách nối chân với Arduino byte columnPins[columns] = {9, 10, 11, 12}; //cài đặt thƣ viện keypad Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 309 Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rows, columns); void setup() { Serial.begin(9600);//bật serial, baudrate 9600 …………………………………………………………… } if ((int)keypad.getState() == RELEASED) { key += state; state = 0; //Xuat ket qua len may tinh Serial.println(key); } delay(100); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 310 45. Điều khiển thiết bị bằng module enthernet shiled . Giới thiệu về enthernet shiled: Ethernet shield là một module mở rộng cho arduino, giúp arduino có thể kết nối với internet. Ứng dụng của shield này là truyền nhận thông tin giữa arduino với thiết bị bên ngoài sử dụng internet, shield này đặc biệt hữu ích cho các ứng dụng IoT, điều khiển và kiểm soát hệ thống vì internet luôn liên tục, dữ liệu truyền đi nhanh. Hôm nay tôi sẽ hƣớng dẫn mọi ngƣời cách sử dụng nó để điều khiển thiết bị bằng đƣờng truyền internet. Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… 1 module enthernet shiled. ( phải có cáp mạng LAN RJ45 nối từ Router wifi đến module enthernet shiled ). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 311 Breadboard . Dây cắm test board. 1 điện trở 220 Ohm. 1 led siêu sáng ( từ đó ta có thể chuyển qua bật tắt relay). Lắp mạch: Chụp shield ethernet lên uno hoặc mega nhƣ hình: Ta điều khiển bật tắt đèn led ở chân số D2. Lập trình: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích, thƣ viện Ethernet đã có sẵn trong ide. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 312 #include<SPI.h> // thƣ viện để kết nối shield #include<Ethernet.h> // thƣ viện cho dự án byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // địa chỉ MAC( địa chỉ phần cứng của shield ethernet), cứ để nguyên IPAddress ip(192, 168, 1, 8); // địa chỉ IP của shield, có thể thay đổi tùy ý. EthernetServer server = EthernetServer(80); void setup() { // giá trị port là 80 Serial.begin(9600); while (!Serial) { ; } pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); if (readString.indexOf("button2on") > 0) { digitalWrite(3, HIGH); } if (readString.indexOf("button3off") > 0) { digitalWrite(2 , LOW); } readString = ""; } } Sau khi lắp mạch nhƣ hình trên và ta nạp code bên dƣới và nhập địa chỉ ip ta sẽ thấy giao diện điều khiển hiện ra. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 313 46. Đọc giá trị cảm biến áp suất BM180 . Giới thiệu về BM180: Hôm nay chúng ta cùng tìm hiểu về loại cảm biến đo áp suất BM180. Chuyên dùng trong các dự án về môi trƣờng và nó cũng là một trong những giao tiếp I2C quen thuộc mà trong các bài trƣớc có đề cập đến. Đây là board mạch cảm biến áp suất BMP185 đơn giản, độ chính xác cao, tiết kiệm điện năng. BMP180 có khả năng đo lƣờng áp suất trong khoảng 300 - 1100 hPa với sai số tuyệt đối dƣới 0.02 hPa trong chế độ nâng cao độ phân giải. Cảm biến này hoạt động trong khoảng điện áp 1.8 tới 3.6V và hỗ trợ I/O 5V (Nhà sản xuất khuyên dùng nguồn 3.3V đã lọc sạch, ổn định). Nó đƣợc thiết kế để kết nối trực tiếp với vi điều khiển thông qua cổng giao tiếp I2C. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 314 Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… 1 module cảm biến áp suất BM180. Dây cắm test board. Lắp mạch: Arduino Module BM180 3.3V GND A4 A5 Vin GND SDA SCL Lập trình: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 315 Trƣớc khi upload code các bạn cần cài thêm thƣ viện BM180 cho arduino IDE Tại link sau: http://tdhshop.com.vn/tong-hop-cac-thu-vien-cho-arduino Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <Wire.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor"); while (1) {} } } void loop() { Serial.print("Temperature = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); …………………………………………………….. Serial.print("Real altitude = "); Serial.print(bmp.readAltitude(101500)); Serial.println(" meters"); Serial.println(); delay(500); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 316 Hình ảnh thực tế: Sau khi lắp mạch và nạp chƣơng trình cho arduino ta bật cổng serial moniter để xem kết quả nhƣ hình dƣới nhé. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 317 47. Chạy chữ trên led ma trận 8x8 sử dụng Bluetooth HC05. Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… 1 module Bluetooth hc05. Dây cắm Breadboard . 1 module led 8x8 sử dụng IC max7219. 1 điện thoại sử dụng hệ điều hành android. Lắp mạch: Arduino Module LED 8x8 Bluetooth 5VDC GND 5 6 7 8 9 VCC GND CS CLK DIN VCC GND TX RX Lập trình cho arduino: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Ta cần phải cài thêm thƣ viên MaxMatrix.h đƣợc lƣu trong file code. Lƣu ý trƣớc khi nạp chƣơng trình cho arduino ta không kết nối dây TX, RX với chân số 8, 9 của arduino . Sau khi đã nạp xong chúng ta hãy kết nối lại. #include <MaxMatrix.h> #include <SoftwareSerial.h> #include <avr/pgmspace.h> PROGMEM const unsigned char CH[] = { 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // ! 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // " 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // # Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 318 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $ 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // % 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // & 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // ' 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // ( ………………………………………………………… 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // { 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // | 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // } 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~ }; int dIn = 7; // DIN pin of MAX7219 module int clk = 6; // CLK pin of MAX7219 module int cs = 5; // CS pin of MAX7219 module int maxInUse = 1; // số module MAX7219's kết nối MaxMatrix m(dIn, cs, clk, maxInUse); SoftwareSerial Bluetooth(8, 9); // BluetoothTx – Pin 8, RX – Pin 9 byte buffer[10]; char incomebyte; int scrollSpeed = 100; char text[100] = "Hello "; // test mẫu đoạn chữ Hello int brightness = 15; int count = 0; char indicator; void setup() { m.init(); } while (Bluetooth.available()) { incomebyte = Bluetooth.read(); ……………………………………………………. { if (*s < 32) continue; char c = *s - 32; memcpy_P(buffer, CH + 7 * c, 7); m.writeSprite(col, 0, buffer); m.setColumn(col + buffer[0], 0); col += buffer[0] + 1; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 319 s++; } } Lập trình app Inventor cho điện thoại android. File app được để trong file code kèm theo. Sau khi chúng ta đã cài đặt app cho điện thoại sử dụng hệ điều hành android và tiến hành kết nối Bluetooth của điện thoại với HC05 ( mật khẩu mặt định 1234 ). 48. Điều khiển hiệu ứng RGB LED WS2812b. Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… Dây cắm Breadboard . Breadboard. 1 dãy led WS2812b gồm 10 led. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 320 Giới thiệu led WS2812B: LED RGB WS2812B sử dụng chip WS2812B nên có thể lập trình để điều khiển màu sắc độ sáng. Dễ dàng điều khiển, tƣơng thích với Arduino. Với lớp phủ Silicon bên ngoài có thể chống nƣớc hoàn toàn, đảm bảo an toàn khi sử dụng trong môi trƣờng ẩm ƣớt. Sử dụng điện áp 5 – 12V. Điều tuyệt vời về những LED này là chúng ta có thể kiểm soát ngay cả dải LED chỉ với một chân từ bo mạch Arduino. Lắp mạch: Arduino RGB WS2812b Nguồn riêng GND D7 VCC GND Din (5 VDC) GND Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 321 Lập trình cho arduino: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. Trƣớc hết ta cần cài thêm thƣ viện FastLED, có kèm theo file. Lƣu ý: nên cấp nguồn riêng cho led. #include <FastLED.h> #define LED_PIN 7 #define NUM_LEDS 11 CRGB leds[NUM_LEDS]; void setup() { FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS); } void loop() { for (int i = 0; i <= 10; i++) { leds[i] = CRGB ( 0, 0, 255); FastLED.show(); delay(40); } for (int i = 10; i >= 0; i--) { leds[i] = CRGB ( 255, 0, 0); FastLED.show(); delay(40); } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 322 49. Mô phỏng hệ thống radar bằng cảm biến siêu âm SRF05. Phần cứng chuẩn bị: Mạch Arduino Uno, Nano,… Dây cắm Breadboard . Breadboard. 1 động cơ servo SG90. 1 cảm biến siêu âm srf05. Lắp mạch: Arduino SRF05 SERVO 5VDC GND 12 10 11 VCC GND VCC GND S TRIG ECHO Lập trình cho arduino: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. #include <Servo.h> const int trigPin = 10; const int echoPin = 11; long duration; int distance; Servo myServo; // Tạo đối tƣợng Servo để điều khiển Servo void setup() { pinMode(trigPin, OUTPUT); // Set chân trig là chân OUTPUT pinMode(echoPin, INPUT); // Set chân echo INPUT Serial.begin(9600); myServo.attach(12); // Chân Servo là chân 12 } void loop() { delay(30); Serial.print("."); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 323 } } // Hàm tính khoảng cách bằng siêu âm int calculateDistance(){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); return distance; } Lập trình code cho processing: Trƣớc hết chúng ta cần phải cài phần mềm PROCESSING theo link sau: https://drive.google.com/open?id=1La369RgmlIdG21q869ZbQTJJVsdD0AjB Sau đó ta cài đặt phần mềm Processing vào máy tính. Một phƣơng thức điều khiển arduino bằng máy tính sử dụng ngôn ngữ Java tuy đã xuất hiện từ lâu nhƣng nó rất hữu ích cho các dự án cần về giao diện điều khiển. Giao diện của phần mềm: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 324 Code lập trình trên processing: Code đƣợc lƣu trong file code kèm theo. Trong quá trình chạy code processing cần phải kết nối arduino với máy tính. Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 325 50. Lập trình điều khiển module rơ le bán dẫn SSR . Giới thiệu rơ le bán dẫn SSR: - Relay SSR (Solid State Relay) hay còn gọi là Relay Rắn là loại relay sử dụng cấu trúc bán dẫn thay vì cấu trúc cơ học nên có độ bền và tuổi thọ cao. - Module Relay rắn SSR sử dụng nguồn DC 5V để kích Relay hoạt động đóng ngắt điện thế AC với công suất tối đa 250V 2A, module này chỉ dùng để đóng ngắt nguồn AC, không sử dụng đƣợc để đóng ngắt nguồn DC, trong Relay SSR có tích hợp sẵn opto cách ly (photo triac) nên sử dụng rất an toàn. - Module đƣợc thiết kế nhỏ gọn, ra chân đầy đủ, có led hiển thị trạng thái đóng ngắt, Ứng dụng đóng ngắt nguồn AC cần tần suất đóng ngắt nhiều và tuổi thọ cao. Khắc phục đƣợc những điểm còn hạn chế của role cơ. Thông số kĩ thuật: Số Relay: 1 Điện áp kích: 5VDC. Dòng tiêu thụ: 20mA/1 Relay SSR Điện áp đóng ngắt tối đa: 75 to 240VAC (50/60Hz). Dòng điện đóng ngắt: 0.1 - 2A. Có cách ly: Photo Triac Kích thƣớc: 25*34*25 (L * W * H) Trọng lƣợng: 13 g. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 326 Lắp mạch: Arduino Module role SSR 5VDC GND 6 VCC GND CH1 Lập trình cho arduino: Code lập trình sẽ đƣợc lƣu trong file ( file _code) riêng để tránh việc bị lổi, code bên dƣới chỉ dƣới dạng giải thích. // CHUONG TRINH DIEU KHIEN ROLE SSR BÁN DẪN // Thuộc loại kích mức thấp void setup() { pinMode(6, OUTPUT); } void loop() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 327 digitalWrite(6, HIGH); // TAT ROLE delay(4000); // DOI 4 GIAY digitalWrite(6, LOW); // BAT ROLE delay(2000); // DOI 2 GIAY } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 328 D. IOT ( Internet Of Things ) I. Khái niệm Internet Of Things ( IOT) là gì?. 1. Khái niệm IOT Internet of Things (IoT) - Mạng lƣới vạn vật kết nối Internet là một kịch bản của thế giới, khi mà mỗi đồ vật, con ngƣời đƣợc cung cấp một định danh của riêng mình, và tất cả có khả năng truyền tải, trao đổi thông tin, dữ liệu qua một mạng duy nhất mà không cần đến sự tƣơng tác trực tiếp giữa ngƣời với ngƣời, hay ngƣời với máy tính. IoT đã phát triển từ sự hội tụ của công nghệ không dây, công nghệ vi cơ điện tử và Internet. Nói đơn giản là một tập hợp các thiết bị có khả năng kết nối với nhau, với Internet và với thế giới bên ngoài để thực hiện một công việc nào đó. ( Wikipedia). Hiểu đơn giản, IoT có thể khiến mọi vật giờ đây có thể giao tiếp với nhau dễ dàng hơn và ƣu điểm lớn nhất của ―Thông minh‖ là khả năng phòng ngừa và cảnh báo tại bất kì đâu. 2. Những ứng dụng thực tế trong cuộc sống Những ứng dụng của IoT vào các lĩnh vực trong đời sống là vô cùng phong phú và đa dạng. Chúng ta sẽ cùng điểm qua một số ứng dụng điển hình của IoT: Smart Home - Theo thống kê, smart home là ứng dụng liên quan đến IoT đƣợc tìm kiếm nhiều nhất trên Google. Smart Home là 1 ngôi nhà với rất nhiều tính năng tự động nhƣ bật máy điều không khí khi bạn sắp về tới nhà, tắt đèn ngay khi bạn rời khỏi nhà, mở khóa khi ngƣời thân trong gia đình đang ở cửa nhà, mở garage khi bạn lái xe đi làm về … còn rất nhiều những tính năng giúp nâng cao chất lƣợng cuộc sống khi sử dụng smart home. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 329 Vật dụng mang theo trên ngƣời - Có thể kể đến một số thiết bị nhƣ Dashbon Mask, đây là 1 chiếc smart headphone giúp bạn vừa có thể nghe nhạc với âm thanh có độ trung thực cao vừa có thể xem phim HD với máy chiếu ảo , hoặc AMPL SmartBag ba lô có pin dự phòng có thể sạc điện cho các thiết bị di động, kể cả máy tính. 3. ESP8266 dòng chip đƣợc sử dụng phổ biến nhất hiện nay trong IOT. ESP8266 là dòng chip tích hợp Wi-Fi 2.4Ghz có thể lập trình đƣợc, rẻ tiền đƣợc sản xuất bởi một công ty bán dẫn Trung Quốc: Espressif Systems. Đƣợc phát hành đầu tiên vào tháng 8 năm 2014, đóng gói đƣa ra thị trƣờng dạng Mô dun ESP-01, đƣợc sản xuất bởi bên thứ 3: AI-Thinker. Có khả năng kết nối Internet qua mạng Wi-Fi một cách nhanh chóng và sử dụng rất ít linh kiện đi kèm. Với giá cả có thể nói là rất rẻ so với tính năng và khả năng ESP8266 có thể làm đƣợc. ESP8266 có một cộng đồng các nhà phát triển trên thế giới rất lớn, cung cấp nhiều Module lập trình mã nguồn mở giúp nhiều ngƣời có thể tiếp cận và xây dựng ứng dụng rất nhanh. Hiện nay tất cả các dòng chip ESP8266 trên thị trƣờng đều mang nhãn ESP8266EX, là phiên bản nâng cấp của ESP8266 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 330 4. Module và Board phát triển của ESP8266. ESP8266 cần một số linh kiện nữa mới có thể hoạt động, trong đó phần khó nhất là Anten. Đòi hỏi phải đƣợc sản xuất, kiểm tra với các thiết bị hiện đại. Do đó, trên thị trƣờng xuất hiện nhiều Module và Board mạch phát triển đảm đƣơng hết để ngƣời dùng đơn giản nhất trong việc phát triển ứng dụng. Một số Module và Board phát triển phổ biến: Hiện nay phiên bản sử dụng phổ biến nhất là ESP8266 12E. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 331 5. Giới thiệu về module ESP 12E( NodeMCU V1). NodeMCU v1.0 Lua - ESP8266 ESP12E Sơ đồ chân của ESP12E NodeMCU V1.0 đƣợc phát triển dựa trên Chip WiFi ESP8266EX bên trong Module ESP-12E dễ dàng kết nối WiFi với một vài thao tác. Board còn tích hợp IC CP2102, giúp dễ dàng giao tiếp với máy tính thông qua Micro USB để thao tác với board. Và có sẳn nút nhấn, led để tiện qua quá trình học, nghiên cứu. Với kích thƣớc nhỏ gọn, linh hoạt board dễ dàng liên kết với các thiết bị ngoại vi để tạo thành project, sản phẩm mẫu một cách nhanh chóng. Thông số kỹ thuật: Chip: ESP8266EX WiFi: 2.4 GHz hỗ trợ chuẩn 802.11 b/g/n Điện áp hoạt động: 3.3V Điện áp vào: 5V thông qua cổng USB Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire, trừ chân D0) Số chân Analog Input: 1 (điện áp vào tối đa 3.3V) Bộ nhớ Flash: 4MB Giao tiếp: Cable Micro USB Hỗ trợ bảo mật: WPA/WPA2 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 332 Tích hợp giao thức TCP/IP Lập trình trên các ngôn ngữ: C/C++, Micropython, NodeMCU - Lua 6. Lập trình ESP 12E bằng Arduino IDE. Giới thiệu về ESP826612E: Để bắt đầu với những dự án Wifi các bạn cần ESP8266 với giá thành rẻ, và dễ dàng sử dụng. Đặc biệt ESP8266 12E có thể đƣợc lập trình bằng Arduino IDE. Trƣớc khi bắt đầu những chuỗi dự án với ESP8266, ở bài viết này, mình sẽ chia sẻ cách cài đặt Arduino IDE để nạp code cho ESP8266. Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp. Cài đặt phần mềm arduino IDE và thƣ viện cho esp8266. Sau khi tải phần mềm Arduino IDE, các bạn tiến hành cài đặt nhƣ bình thƣờng và mở chƣơng trình lên. Và các bạn nhớ cài driver cho nó nhé.( file driver có sẵn trong file cài). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 333 Để tiến hành cài đặt thƣ viện và chức năng nạp code cho IDE các bạn làm nhƣ sau: Vào File→ Preferences, vào textbox Additional Board Manager URLs thêm đƣờng link sau vào http://arduino.esp8266.com/stable/package_esp8266com_index.json Click OK để chấp nhận. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 334 Tiếp theo vào Tool→Board→Boards Manager Đợi một lát để chƣơng trình tìm kiếm. Ta kéo xuống và click vào ESP8266 by ESP8266 Community, click vào Install. Chờ phần mềm tự động download và cài đặt. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 335 Hướng dẫn nạp chương trình cho ESP8266 12E: Kết nối mudule ESP8266 -12E vào máy tính. Vào Tool→Board→NodeMCU 1.0, chọn cổng COM tƣơng ứng với module tƣơng ứng. Chọn chế độ nạp Arduino as ISP và chọn cổng COM cho đúng nhé.Vậy là ta đã có môi trƣờng lập trình cho esp8266 rất thân thiện. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 336 Sau khi kết nối ESP8266 với máy tính, các bạn có thể test code ESP8266 ở đây: Code ở dƣới test led trên board esp8266 12E ở chân 13 (D7 ) sáng tắt trong vòng 1 giây. void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // bật led sáng 1 giây delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // tắt led 1 giây delay(1000); // wait for a second } Hình ảnh thực tế: Từ ví dụ đơn giản ở trên ta có thể bắt tay vào học lập trình cho ESP để làm những dự dán IOT có ứng dụng cao. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 337 II. Bài học mẫu cơ bản lập trình cho ESP12E. 1. Bật tắt led theo ý muốn bằng esp8266 12E. Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp ( Trong ví bài viết này tôi sử dụng ESP8266-V12E) 1 breadboard. 1 led. 1 điện trở 220 Ohm. Lắp mạch: Chân ( + ) của led đƣợc nối chân D3 ( tƣơng ứng với chân số GPIO0 ) Chân ( -- ) của led đƣợc nối chân GND của ESP. Lập trình: void setup() { // initialize digital pin 0 ( D3 ) as an output. pinMode(0, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(0, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 338 Hình ảnh thực tế: 2. Bật tắt led bằng nút nhấn ( không lƣu trạng thái). Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp . 1 breadboard. 1 led. 1 điện trở 220 Ohm. 1 nút nhấn 4 chân. Lắp mạch: Chân ( + ) của led đƣợc nối chân D0 ( tƣơng ứng với chân số GPIO16 ) Chân ( -- ) của led đƣợc nối chân GND của ESP. Chân D3 ( chân GPIO0 ) đƣợc nối với nút nhấn nhƣ hình dƣới. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 339 Lập trình: int ledPin = 16; int btnPin = 0; //int ledState = LOW; // LED connected to digital pin 16 ( D0) // BUTTON connected to digital pin 0 ( D3) void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output pinMode(btnPin, INPUT); // sets the digital pin as input digitalWrite(btnPin, HIGH); Serial.begin(115200); } void loop() { if(digitalRead(btnPin)==LOW) { digitalWrite ( ledPin, HIGH); } else { digitalWrite ( ledPin, LOW);} } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 340 3. Bật tắt led bằng nút nhấn (lưu trạng thái). Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp ( Trong ví bài viết này tôi sử dụng ESP8266-V12E) 1 breadboard. 1 led. 1 điện trở 220 Ohm. 1 nút nhấn 4 chân. Lắp mạch: Chân ( + ) của led đƣợc nối chân D0 ( tƣơng ứng với chân số GPIO16 ) Chân ( -- ) của led đƣợc nối chân GND của ESP. Chân D3 ( chân GPIO0 ) đƣợc nối với nút nhấn nhƣ hình dƣới. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 341 Lập trình: //khai báo biến int nutnhan = 0; // định nghĩa chân số GIPO0 là button ( D3 ) int led = 16,t=0; // khai báo led và biến, 16 ( GIPO16) (tuong ung D0) int status1;// biến lƣu các trạng thái nút nhấn // viết hàm chống dội boolean chong_doi()// int char float ngoại trừ void { int sta =!digitalRead(nutnhan); // đọc trạng thái nút nhấn return sta;// khi co nhan nut la true } // khởi tạo void setup() { Serial.begin(9600); pinMode(nutnhan,INPUT); digitalWrite(nutnhan, HIGH); pinMode(led,OUTPUT); } void loop() // vong lap { int buttonState = digitalRead(nutnhan); //Serial.println(buttonState); status1 = chong_doi(); if(status1==true) { { t=!t;// đảo trạng thái } while(status1==true){status1=chong_doi();} } if(t==1) { digitalWrite(led,HIGH); } else { digitalWrite(led,LOW); } Serial.println(t); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 342 Hình ảnh thực tế: 4. Điều khiển relay bằng Esp8266 V_12E. Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp ( Trong ví bài viết này tôi sử dụng ESP8266-V12E) 1 breadboard. 1 relay 5vd (1 hoặc 2) kênh mức cao. Lắp mạch: ESP8266_12E Module Relay 5VDC Vin 5Vdc ( + ) GND GND (--) GIPO16 ( D0) 1 (S) or ( IN1) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 343 Lập trình: // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin 13 as an output. pinMode(13, OUTPUT);// chân điều khiển relay là chân GIPO13 ( D7) } // the loop function runs over and over again forever void loop() { digitalWrite(13, HIGH); // turn the RELAY on delay(5000); // wait for 5 second digitalWrite(13, LOW); // turn the RELAY off delay(2000); // wait for 2 second } Hình ảnh thực tế: Lƣu ý: khi ra làm mô hình thực tế nên có nguồn cấp riêng cho module relay. 5. Hiển thị lên màn hình LCD bằng ESP8266 12E. Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp ( Trong ví bài viết này tôi sử dụng ESP8266-V12E) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 344 1 LCD + I2C Lắp mạch: ESP8266_12E Module LCD + I2C Vin 5Vdc ( + ) GND GND (--) D1 SCL D2 SDA Lập trình: #include "ESP8266WiFi.h" #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x20 for a 16 chars and 2 line display void setup() { lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.print("Hello, world!"); } void loop() { } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 345 6. Đọc giá trị cảm biến nhiệt độ LM35 và gửi lên thingspeak. Cảm biến nhiệt độ LM35 là một loại cảm biến tƣơng tự rất hay đƣợc ứng dụng trong các ứng dụng đo nhiệt độ thời gian thực ( nhƣng vẫn còn sai số lớn) . Với kích thƣớc nhỏ và giá thành rẻ là một trong những ƣu điểm của nó. Vì đây là cảm biến tƣơng tự (analog sensor) nên ta có thể dễ dàng đọc đƣợc giá trị của nó bằng hàm analogRead(). Nhiệt độ đƣợc xác định bằng cách đo hiệu điện thế ngõ ra của LM35. → Đơn vị nhiệt độ: °C. → Nhiệt độ thay đổi tuyến tính: 10mV/°C Độ chính xác thực tế: 1/4°C ở nhiệt độ phòng và 3/4°C ngoài khoảng 2°C tới 150°C công suất tiêu thụ là 60uA. Cảm biến LM35 hoạt động bằng cách cho ra một giá trị hiệu điện thế nhất định tại chân Vout (chân giữa) ứng với mỗi mức nhiệt độ. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 346 Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp ( Trong ví bài viết này tôi sử dụng ESP8266-V12E) 1 breadboard. 1 cảm biến nhiệt độ LM35. Phần mềm : Phần mềm Arduino IDE. Đăng kí 1 tài thoản miễn phí trên thingspeak. Cài đặt trên thingspeak: sau khi đăng kí một tài khoản miễn phí ta đƣợc giao diện nhƣ sau và ta chọn New Channel Sau đó ta thực hiện các thao tác sau: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 347 Và ta đƣợc giao diện nhƣ hình sau: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 348 Và mã Writekey ta lấy từ đây: Lắp mạch: ESP8266_12E LM35 3.3 VCC ( 5V) GND GND (--) A0 OUT Lập trình: #include <ESP8266WiFi.h> String apiWritekey = "VXMLHG2R6DDPUCNT"; // mã Writekey ta thay vào đây const char* ssid = "coffee "; // tên wifi nhà bạn const char* password = "coffee" ;// wifi pasword const char* server = "api.thingspeak.com"; float resolution=3.3/1023; // 3.3 is the supply volt & 1023 is max analog read value WiFiClient client; void setup() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 349 Serial.begin(115200); WiFi.disconnect(); delay(10); WiFi.begin(ssid, password); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("NodeMcu connected to wifi..."); Serial.println(ssid); Serial.println(); } void loop() { float temp = (analogRead(A0) * resolution) * 100; if (client.connect(server,80)) { String tsData = apiWritekey; tsData +="&field1="; tsData += String(temp); tsData += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: "+apiWritekey+"\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(tsData.length()); client.print("\n\n"); // the 2 carriage returns indicate closing of Header fields & starting of data client.print(tsData); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 350 Serial.print("Temperature: "); Serial.print(temp); Serial.println("uploaded to Thingspeak server...."); } client.stop(); Serial.println("Waiting to upload next reading..."); Serial.println(); // thingspeak needs minimum 15 sec delay between updates delay(15000); } Sau khi upload code ta mở cổng serial monitor và thingspeak: và đƣợc kết quả nhƣ sau 7. Điều khiển thiết bị điện bằng webserver. Chuẩn bị phần cứng: 1 x ESP8266 V12 hoặc V12E đã tích hợp sẵn mạch nạp ( Trong ví bài viết này tôi sử dụng ESP8266-V12E) 1 breadboard. 4 Led. 4 điện trở 220 Ohm. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 351 Phần mềm : Phần mềm Arduino IDE. Lắp mạch: ESP8266_12E Led GND GND (--) GIPO0 (D3) LED1 ( + ) GIPO4 (D2) LED2 ( + ) GIPO5 (D1) LED3 ( + ) GIPO16 (D0) LED4 ( + ) Lập trình: #include <ESP8266WiFi.h> const char* ssid = "Truong Phi"; const char* password = "01695304802"; WiFiServer server(80); void setup() { Serial.begin(115200); delay(10); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 352 pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(0, OUTPUT); pinMode(16, OUTPUT); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(0, LOW); digitalWrite(16, LOW); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.print("Use this URL to connect: "); Serial.print("http://"); Serial.print(WiFi.localIP()); Serial.println("/"); } void loop() { // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Wait until the client sends some data Serial.println("new client"); while(!client.available()){ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 353 delay(1); } // Read the first line of the request String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); // Match the request if (request.indexOf("/light1on") > 0) { digitalWrite(5, HIGH); } if (request.indexOf("/light1off") >0) { digitalWrite(5, LOW); } if (request.indexOf("/light2on") > 0) { digitalWrite(4, HIGH); } if (request.indexOf("/light2off") >0) { digitalWrite(4, LOW); } if (request.indexOf("/light3on") >0) { digitalWrite(0, HIGH); } if (request.indexOf("/light3off") > 0) { digitalWrite(0, LOW); } if (request.indexOf("/light4on") > 0) { digitalWrite(16, HIGH); } if (request.indexOf("/light4off") > 0) { digitalWrite(16, LOW); } // Set ledPin according to the request //digitalWrite(ledPin, value); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 354 // Return the response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); // do not forget this one client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head>"); client.println("<meta name='apple-mobile-web-app-capable' content='yes' />"); client.println("<meta name='apple-mobile-web-app-status-bar-style' content='blacktranslucent' />"); client.println("</head>"); client.println("<body bgcolor = \"#f7e6ec\">"); client.println("<hr/><hr>"); client.println("<h4><center> ĐIỀU KHIỂN THIẾT BỊ ĐIỆN BẰNG ESP8266 12E </center></h4>"); client.println("<hr/><hr>"); client.println("<br><br>"); client.println("<br><br>"); client.println("<center>"); client.println("Device 1"); client.println("<a href=\"/light1on\"\"><button>Turn On </button></a>"); client.println("<a href=\"/light1off\"\"><button>Turn Off </button></a><br />"); client.println("</center>"); client.println("<br><br>"); client.println("<center>"); client.println("Device 2"); client.println("<a href=\"/light2on\"\"><button>Turn On </button></a>"); client.println("<a href=\"/light2off\"\"><button>Turn Off </button></a><br />"); client.println("</center>"); client.println("<br><br>"); client.println("<center>"); client.println("Device 3"); client.println("<a href=\"/light3on\"\"><button>Turn On </button></a>"); client.println("<a href=\"/light3off\"\"><button>Turn Off </button></a><br />"); client.println("</center>"); client.println("<br><br>"); client.println("<center>"); client.println("Device 4"); client.println("<a href=\"/light4on\"\"><button>Turn On </button></a>"); client.println("<a href=\"/light4off\"\"><button>Turn Off </button></a><br />"); client.println("</center>"); client.println("<br><br>"); client.println("<center>"); client.println("<table border=\"5\">"); client.println("<tr>"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 355 if (digitalRead(5)) { client.print("<td>Light 1 is ON</td>"); } else { client.print("<td>Light 1 is OFF</td>"); } client.println("<br />"); if (digitalRead(4)) { client.print("<td>Light 2 is ON</td>"); } else { client.print("<td>Light 2 is OFF</td>"); } client.println("</tr>"); client.println("<tr>"); if (digitalRead(0)) { client.print("<td>Light 3 is ON</td>"); } else { client.print("<td>Light 3 is OFF</td>"); } if (digitalRead(16)) { client.print("<td>Light 4 is ON</td>"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 356 } else { client.print("<td>Light 4 is OFF</td>"); } client.println("</tr>"); client.println("</table>"); client.println("</center>"); client.println("</html>"); delay(1); Serial.println("Client disonnected"); Serial.println(""); } Sau khi upload chƣơng trình thành công ta mở cổng serial monitor lên: Từ hình trên ta đƣợc địa chỉ ip để truy cập webserver để điều khiển thiết bị điện là : 192.168.100.11 địa chỉ sẽ khác đi tùy vào router wifi nữa nhé. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 357 Hình ảnh thực tế: Ta nhập địa chỉ ip vào trình duyệt và cho ra giao diện giống hình dƣới. Hình điều khiển thực tế Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 358 8. Điều khiển thiết bị điện bằng wifi và app MIT invertor. Phần mền cần chuẩn bị Phần mềm IDE. App inverter (đƣợc đính kèm trong file code) Phần cứng cần chuẩn bị: 1 ESP8266 12 HOẶC ESP8266 12E. 1 Breadboard. 1 Điện thoại sử dụng hệ điều hành android. Dây test board. 4 Led ( các bạn có thể thay thế bằng relay để đóng ngắt thiết bị điện) 4 Trở 220 Ohm. Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 359 Code chƣơng trình: #include <ESP8266WiFi.h> const char* ssid = "Truong Phi"; //tên wifi const char* password = "xxxxxxxxx"; // password int R1=D1; int R2=D2; int R3=D3; int R4=D4; WiFiServer server(80); //port is 80. void setup() { Serial.begin(115200); delay(10); pinMode(R1, OUTPUT); pinMode(R2, OUTPUT); pinMode(R3, OUTPUT); pinMode(R4, OUTPUT); digitalWrite(R1,HIGH); digitalWrite(R2,HIGH); digitalWrite(R3,HIGH); digitalWrite(R4,HIGH); // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 360 // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.print("Use this URL to connect: "); Serial.print("http://"); Serial.print(WiFi.localIP()); //Gets the WiFi shield's IP address and Print the IP address of serial monitor Serial.println("/"); } void loop() { WiFiClient client = server.available(); if (!client) { return; } Serial.println("new client"); while(!client.available()){ delay(1); } String request = client.readStringUntil('\r'); Serial.println(request); client.flush(); if (request.indexOf("/Relay1On") != -1) { digitalWrite(R1,LOW); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 1 is ON"); client.println("</html>"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 361 client.stop(); delay(1); } if (request.indexOf("/Relay1Off") != -1) { digitalWrite(R1, HIGH); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 1 is OFF"); client.println("</html>"); client.stop(); delay(1); } if (request.indexOf("/Relay2On") != -1) { digitalWrite(R2,LOW); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 2 is ON"); client.println("</html>"); client.stop(); delay(1); } if (request.indexOf("/Relay2Off") != -1) { digitalWrite(R2, HIGH); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 362 client.println("Relay 2 is OFF"); client.println("</html>"); client.stop(); delay(1); } if (request.indexOf("/Relay3On") != -1) { digitalWrite(R3,LOW); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 3 is ON"); client.println("</html>"); client.stop(); delay(1); } if (request.indexOf("/Relay3Off") != -1) { digitalWrite(R3, HIGH); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 3 is OFF"); client.println("</html>"); client.stop(); delay(1); } if (request.indexOf("/Relay4On") != -1) { digitalWrite(R4,LOW); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 363 client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 4 is ON"); client.println("</html>"); client.stop(); delay(1); } if (request.indexOf("/Relay4Off") != -1) { digitalWrite(R4, HIGH); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(""); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("Relay 4 is OFF"); client.println("</html>"); client.stop(); delay(1); } } Cài đặt app cho điện thoại ( Andriod): Viết app mit inverter (có file kèm theo), các bạn nên đăng kí một tài khoản trên web app mit invetor. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 364 Hình ảnh thực tế: Ta mở màn hình serial monitor nên và ta có đƣợc kết quả giống nhƣ dƣới sau mỗi lần ta bật tắt. Hình thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 365 9. Điều khiển thiết bị điện bằng Nodemcu ( esp 12e) và app Blynk. Phần mền cần chuẩn bị Phần mềm IDE. App Blynk các bạn tải trên App Store hoặc CH play đều đƣợc. Phần cứng cần chuẩn bị: 1 ESP8266 12 HOẶC ESP8266 12E. 1 Breadboard. 1 Điện thoại sử dụng hệ điều hành android hoặc ISO. Dây test board. 1 Led ( các bạn có thể thay thế bằng relay để đóng ngắt thiết bị điện) 1 Trở 220 Ohm. Lắp mạch: Chân ( + ) của led đƣợc nối chân D3 ( tƣơng ứng với chân số GPIO0 ) Chân ( -- ) của led đƣợc nối chân GND của ESP. Code chương trình: Trƣớc hết chúng ta phải tải về cài thƣ viện Blynk cho Arduino IDE, thƣ viện đƣợc kèm theo trong file code. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 366 Tiếp đến sau khi đã add thƣ viện blynk cho IDE ta mở code mẫu có sẵn trong thƣ viện nhƣ hình sau: Và ta đƣợc code nhƣ sau: #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = "YourAuthToken"; // token sau khi đăng kí email trên blynk và lập project thì mã token này sẽ đƣợc gửi vào email đăng kí. char ssid[] = "YourNetworkName"; // tên wifi char pass[] = "YourPassword"; // nhập mật khẩu của wifi cần kết nối void setup() { // Debug console Serial.begin(9600); Blynk.begin(auth, ssid, pass); } void loop() Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 367 { Blynk.run(); } Các bước thực hiện như sau: a) Tải app Blynk b) Đăng kí tài khoản trên blynk khi đăng nhập. Sau khi cài app xong và đăng kí 1 tài khoản email và blynk sẽ báo về bạn đã đăng kí thành công. Tiếp đến ta lập 1 project bật tắt led. c) Lập project: Ta chọn New Project Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 368 Ta thực hiện theo thứ tự nhƣ hình dƣới: Hình số 2 khi ta chọn OK thì blynk sẽ gửi về email đăng kí 1 mã token và ta lấy mã đó cho vào code IDE: Tới hình số 6 là ta hoàn thành việc lập app trên Blynk. d) Chỉnh sửa code: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 369 Ta vào email đã đăng kí lấy mã token. #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = "8b77ceab91c5406e99624623d2af0e3c"; char ssid[] = "Truong Phi"; char pass[] = "xxxxxxxx"; void setup() { // Debug console Serial.begin(9600); Blynk.begin(auth, ssid, pass); } void loop() { Blynk.run(); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 370 Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 371 D. HỌC LẬP TRÌNH ARDUINO THÔNG QUA DỰ ÁN 1. Ðo và hiển thị điện áp DC ( 0 – 30Vdc). Phần mền cần chuẩn bị Phần mềm IDE. Phần cứng cần chuẩn bị: 1 board arduino. 1 Breadboard. Dây test board. 1 trở 100k Ohm 1 Trở 10k Ohm. Lắp mạch: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 372 Code chương trình: https://drive.google.com/file/d/1Gruu-UErrMnrlVpTR03U-JiLoevJfmQX/view #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); int analogInput = 0; float vout = 0.0; float vin = 0.0; float R1 = 100000.0; // resistance of R1 (100K) float R2 = 10000.0; // resistance of R2 (10K) int value = 0; int a[5] = {}; void setup() { Serial.begin(9600); pinMode(analogInput, INPUT); lcd.init(); lcd.backlight(); lcd.setCursor(2, 0); lcd.print("DC VOLTMETER"); delay(3000); lcd.clear(); } void loop() { lcd.print("DC Voltmeter"); // read the value at analog input value = analogRead(analogInput); vout = (value * 5) / 1024.0; vin = vout / (R2 / (R1 + R2)); Serial.println(vin); if (vin < 0.09) { vin = 0.0; } lcd.setCursor(0, 1); lcd.print("Voltage V :"); lcd.print(vin); delay(3000); lcd.clear();} Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 373 Hình ảnh thực tế: https://www.youtube.com/watch?v=OYrT0qpt8hI&list=PLHPjOX8mt4YHDi1CKfCdajzDtOJfGwZx&index=2&t=0s 2. Thiết kế xe robot 4 bánh điều khiển bằng điện thoại ( bluethooth) Mục tiêu: Làm xe robot điều khiển bằng điện thoại. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Đăng kí 1 tài khoản miễn phí trên MIT App Inventor 2 . Phần cứng cần chuẩn bị: 1 board arduino uno hoặc nano,... 1 điện thoại sử dụng hệ điều hành andriod. 1 mạch điều khiển động cơ L298N. Dây test board. 1 module bluetooth HC05 hoặc HC06. 4 dộng cơ giảm tốc V1 màu vàng. 4 bánh xe robot. 1m dây điện nhỏ. 1 công tắc on/off. 1 đế 3 pin nối tiếp cho pin 3.7 VDC. 3 pin 3.7VDC. ( Loại pin sạc : 18650 ). 2 cây keo nến. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 374 1 tấm mica 3mm hoặc gỗ (rộng: 11cm, dài : 17cm). Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 375 Arduino L298 HC05 GND GND (--) GND 5V +5VDC VCC 5 ENB 6 IN4 7 11 12 13 2 3 IN3 ENA IN1 IN2 Tx Rx Lắp mô hình: Bƣớc 1: Gắn bánh xe vào động cơ. Bƣớc 2: Dùng keo nến đính động cơ và bánh xe vào khung mica hoặc gỗ. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 376 Hai động cơ cùng 1 phía ta nối dây chung với nhau ( chạy song song ). Như mạch nguyên lý vẽ ở trên. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 377 Bước 4: Ta nối công tắc với cực âm của nguồn. Ðính đế nguồn pin lên thân xe bằng keo nến: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 378 Bước 5: Ðính module L298N lên thân xe và kết nối ( GND GND nguồn ), ( +12V + của nguồn ). Nối dây động cơ vào chân điều khiển động cơ của mạch L298N như sơ đồ nguyên lý ở trên Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 379 Bước 6: Ðính board arduino lên thân xe bằng keo nến và cấp nguồn +5V và gnd từ module L298N như sơ đồ nguyên lý ở trên. Kết nối các chân điều khiển từ board arduino tới module L298N. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 380 Bước 7: Kết module bluetooth hc05 với board arduino. Bước 8: Tải file add điều khiển về điện thoại theo link kèm theo Link tải app duợc luu trong file code Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 381 Sau khi tải về và cài đặt ta đƣợc app như hình dưới. Bước 9: Tải file code chương trình tại link dưới và upload cho board arduino Uno. https://drive.google.com/open?id=1XsbXSouQ2iS1hnTrLrbWpnpy2NImnSaA Bước 10: Lắp 3 pin 3.7V vào đế pin và bật công tắc ON/OFF lên. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 382 Bước 11: Mở bluetooth điện thoại lên và chọn vào nút DÒ để tìm mã thiết bị bluetooth của HC05. Bước 12: Sau khi dò đƣợc mã HC05 ( lưu ý: mỗi bluetooth sẽ có mã khác Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 383 nhau ) ta chọn vào và nhập pass là 1234. Bước 13: Mở app ROBOT_CAR từ điện thoại lên và chọn vào nút Kết nối bluetooth. Sau khi chọn nút kết nối bluetooth sẽ hiện ra cửa sổ như hình dưới và chúng ta Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 384 chọn đúng vào mã của module bluetooth HC05 ( Lưu ý: mỗi bluetooth sẽ có mã khác nhau ) Như vậy là hoàn thành quá trình cài đặt, và có thể điều khiển đƣợc xe robot. 3. Thiết kế mô hình bật tắt đèn AC 220v khi trời tối, sử dụng cảm biến quang trở Mục tiêu: Bật tắt thiết bị đèn AC 220V khi trời tối. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino uno hoặc nano,... Dây test board. 1 module cảm biến quang trở. 1 relay 5Vdc. 1 bóng đèn AC 220V. Lắp mạch nguyên lý: Trường hợp này không cần kết nối với LCD cũng được. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 385 Arduino CB ánh sáng Module relay I2C for LCD GND GND (--) GND GND 5V +5VDC VCC VCC 2 D0 9 IN A4 SDA A5 SCL Code chương trình: #include <Wire.h> // thư viện hổ trợ I2C #include <LiquidCrystal_I2C.h> // thư viện i2c cho LCD LiquidCrystal_I2C lcd(0x27,16,2); // Ðịa chỉ cho i2c cho LCD :0x27 int quangtro = 2; //Thiết đặt chân analog đọc quang trở int relay = 9; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 386 void setup() { lcd.init(); lcd.backlight(); pinMode(quangtro, INPUT); pinMode(relay, OUTPUT); } void loop() { lcd.clear(); int gt = digitalRead(quangtro); // đọc giá trị quang trở lcd.setCursor(0,0); lcd.print("GT Quang Tro:"); lcd.setCursor(15,0); lcd.print(gt); if ( gt == 1) // nếu trời tối thì bật dèn { digitalWrite(relay, HIGH); } else {digitalWrite(relay,LOW);} // trời sáng khi trời sáng delay(500); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 387 4. Thiết kế mô hình tưới cây tự động. Mục tiêu: Bật tắt bơm tưới cây khi đất khô. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Mạch Arduino (hoặc Nano). Breadboard còn gọi testboard 1 module LCD 16x02 + I2C Dây cắm test board. 1 Cảm biến độ ẩm dất. 1 Relay 5Vdc. 1 Bom 12Vdc Lắp mạch nguyên lý: Code chương trình: //Chưong trình ÐỌC DỮ LIÊU TỪ CẢM BIẾN ÐO ÐỘ ẨM ÐẤT #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16, 2); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 388 int CBDoAm = A1; //Nối chân ra của cảm biến do dộ ẩm với chân A1 #define role 12 //Chân nối với role 12 float doamdat; //Biến dộ ẩm dất void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); //Khai báo các chân pinMode(role,OUTPUT); } void loop() { doamdat=analogRead(CBDoAm); lcd.setCursor(0,0); lcd.print("Do am la:"); lcd.setCursor(10,0); lcd.print(doamdat); //In ra dộ ẩm dất (serial monitor) //Bom nƣớc khi dất khô( thông qua role) if(doamdat > 800) { digitalWrite(role,HIGH); //Bat role de tuoi cay,… delay(2000); } else { digitalWrite(role,LOW); } delay(1000); } Hình ảnh thực tế: Sau khi upload chƣơng trình ta đƣợc: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 389 5. Thiết kế mô hình đếm số học sinh trong phòng học.. Mục tiêu: Ðếm số học sinh tự động trong phòng học . Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Mạch Arduino (hoặc Nano). Breadboard còn gọi testboard. 1 module LCD 16x02 + I2C. Dây cắm test board. 2 module cảm biến hồng ngoại ( dò line ) 1 led 5mm. 1 điện trở 220 Ohm. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 390 Arduino CB IR 1 CB IR 2 I2C for LCD LED GND GND (--) GND GND Chân Gnd ( - ) 5V +5VDC VCC VCC 6 out 7 out A4 SDA A5 SCL 3 Chân ( +) Code chương trình: https://drive.google.com/open?id=11sZXBW4QHBffT-LyULQgI1fYuXiUVoIo #include <Wire.h> // thư viện i2c #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); //địa chị của i2c 0x27 int IRin =6; //chân out của cb vào nối chân số 6 của arduino int IRout=7; //chân out của cb ra nối chân số 7của arduino int led = 3; int dem=0; void IRIN() Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 391 { dem++; // tăng biến đếm lên 1 đơn vị lcd.clear(); lcd.setCursor(0,0); lcd.print("So hoc sinh:"); lcd.setCursor(0,1); lcd.print(dem); delay(1000); } void IROUT() { dem--; if (dem < 0 ){dem=0;} lcd.clear(); lcd.setCursor(0,0); lcd.print("So hoc sinh:"); lcd.setCursor(0,1); lcd.print(dem); delay(1000); } void setup(){ lcd.init(); lcd.backlight(); delay(2000); pinMode(IRin, INPUT); pinMode(IRout, INPUT); pinMode(led, OUTPUT); lcd.clear(); // xóa màn hình LCD lcd.setCursor(0,0); lcd.print("So hoc sinh:"); lcd.setCursor(13,0); lcd.print(dem); } void loop() { int gtin = digitalRead(IRin); // đọc giá trị cảm biến hồng ngoại vào. int gtout = digitalRead(IRout); // đọc giá trị cảm biến hồng ngoại ra. if(gtin==0){ IRIN();} if(gtout==0){ IROUT();} Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 392 if(dem<=0) { lcd.clear(); digitalWrite(led, LOW); lcd.clear(); lcd.setCursor(0,0); lcd.print("Khong co HS"); lcd.setCursor(0,1); lcd.print("Tat den"); delay(200); } else digitalWrite(led, HIGH); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 393 6. Thiết kế mô hình bật tắt thiết bị bằng sóng rf 433Mhz. Mục tiêu: Bật tắt thiết bị diện bằng sóng rf 433Mhz sử dụng arduino . Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 2 Mạch Arduino (hoặc Nano). Breadboard còn gọi testboard Dây cắm test board. 1 module relay 4 kênh. 1 module phát rf 433Mhz. 1 module thu rf 433Mhz. 4 nút nhấn loại 4 chân. Bảng mã ASCII: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 394 Lắp mạch nguyên lý: Lắp mạch cho phần phát ( tranmitter ): Lắp mạch cho phần thu ( receiver): Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 395 Code chương trình: https://drive.google.com/file/d/1Oj9pRl-1et3a7tAiS6oeOPnex1XMRVYL/view Code phần thu ( tranmitter): code điều khiển 8 thiết bị Lưu ý : chúng ta cần cài thư viên VirtualWire.h cho IDE trước nhé., thư viện sẽ đƣợc kèm theo trong file code. #include <VirtualWire.h> // thư vien const int buttonPin1 = 2; const int buttonPin2 = 3; const int buttonPin3 = 5; const int buttonPin4 = 6; const int buttonPin5 = 7; const int buttonPin6 = 8; const int buttonPin7 = 9; const int buttonPin8 = 10; void setup() { Serial.begin(9600); Serial.println("setup"); pinMode(buttonPin1, INPUT_PULLUP); // khai báo nút nhấn là input pinMode(buttonPin2, INPUT_PULLUP); pinMode(buttonPin3, INPUT_PULLUP); pinMode(buttonPin4, INPUT_PULLUP); pinMode(buttonPin5, INPUT_PULLUP); pinMode(buttonPin6, INPUT_PULLUP); pinMode(buttonPin7, INPUT_PULLUP); pinMode(buttonPin8, INPUT_PULLUP); vw_set_tx_pin(4); // chân phát tín hiệu là chân số 4 vw_set_ptt_inverted(true); vw_setup(4000); } void loop() { int buttonState1 = 1; // ban dầu gán nút nhấn 1 ở mức cao buttonState1 = digitalRead(buttonPin1); if (buttonState1 == LOW) // nếu nút nhấn 1 ở mức thấp { const char *msg = "A"; // Gán kí tự A Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 396 digitalWrite(13, true); // Flash a light to show transmitting vw_send((uint8_t *)msg, strlen(msg)); //gửi kí tự vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } { int buttonState2 = 1; buttonState2 = digitalRead(buttonPin2); if (buttonState2 == LOW) { const char *msg = "B"; digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } { int buttonState3 = 1; buttonState3 = digitalRead(buttonPin3); if (buttonState3 == LOW) { const char *msg = "C"; digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } { int buttonState4 = 1; buttonState4 = digitalRead(buttonPin4); if (buttonState4 == LOW) { const char *msg = "D"; digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 397 } { int buttonState5 = 1; buttonState5 = digitalRead(buttonPin5); if (buttonState5 == LOW) { const char *msg = "E"; digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } { int buttonState6 = 1; buttonState6 = digitalRead(buttonPin6); if (buttonState6 == LOW) { const char *msg = "F"; digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } { int buttonState7 = 1; buttonState7 = digitalRead(buttonPin7); if (buttonState7 == LOW) { const char *msg = "G"; digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } { int buttonState8 = 1; buttonState8 = digitalRead(buttonPin8); if (buttonState8 == LOW) { const char *msg = "H"; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 398 digitalWrite(13, true); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); Serial.println(*msg); digitalWrite(13, false); delay(1000); } delay(100); } } } } } } } } Code phần thu ( receiver ): #include <VirtualWire.h> int count; void setup() { Serial.begin(9600); Serial.println("setup"); vw_set_rx_pin(4); //chân thu tín hiệu là chân số 4 vw_set_ptt_inverted(true); vw_setup(4000); vw_rx_start(); pinMode(2, OUTPUT); //Relay 1 pinMode(3, OUTPUT); //Relay 2 pinMode(5, OUTPUT); //Relay 3 pinMode(6, OUTPUT); //Relay 4 pinMode(7, OUTPUT); //Relay 5 pinMode(8, OUTPUT); //Relay 6 pinMode(9, OUTPUT); //Relay 7 pinMode(10, OUTPUT); //Relay 8 digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 399 digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(10, HIGH); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { int i; digitalWrite(13, true); Serial.print("Got: "); for (i = 0; i < buflen; i++) { int c = (buf[i]); Serial.print(c); Serial.print(" "); if (c==65 ) { // KÍ TỰ A digitalWrite(2, !digitalRead(2)); } if (c==66 ) { // KÍ TỰ B digitalWrite(3, !digitalRead(3)); } if (c==67 ) { digitalWrite(5, !digitalRead(5)); } if (c==68 ) { digitalWrite(6, !digitalRead(6)); } if (c==69 ) { digitalWrite(7, !digitalRead(7)); } if (c==70 ) { digitalWrite(8, !digitalRead(8)); } if (c==71 ) { digitalWrite(9, !digitalRead(9)); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 400 if (c==72 ) { digitalWrite(10, !digitalRead(10)); } } count++; // Serial.print(count); Serial.println(""); digitalWrite(13, false); } } Hình ảnh thực tế: 7. Thiết kế xe robot 4 bánh điều khiển bằng sóng Wifi ( nodemcu ). Mục tiêu: Điều khiển xe robot 4 bánh bằng sóng wifi sử dụng NodeMCU . Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Đăng kí 1 tài khoản miễn phí trên MIT App Inventor 2 . Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 401 Phần cứng cần chuẩn bị: 1 Mạch Arduino (hoặc Nano). Breadboard còn gọi testboard nhỏ. Dây cắm test board. 1 module L298N. 1 module ESP8266 12E ( NodeMCU ). 1 đế pin 3 loại 3.7 V. 3 pin 3.7V. 1 Công tắc ON/OFF. 4 động cơ giảm tốc v1 màu vàng. 4 bánh xe. 1 tấm mica 5mm ( 11cmx17cm). Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 402 Lắp mô hình: Bƣớc 1: Dùng keo nến đính đông cơ và bánh xe vào khung mica hoặc gỗ. Hai động cơ cùng 1 phía ta nối dây chung với nhau ( chạy song song ). Nhƣ mạch nguyên lý vẽ ở trên. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 403 Bƣớc 2: Đính module L298N lên thân xe và kết nối ( GND GND nguồn dây màu đen), ( +12V + của nguồn pin dây màu đỏ). Nối dây động cơ vào chân điều khiển động cơ của mạch L298N nhƣ sơ đồ nguyên lý ở trên Bƣớc 3: Đính board NodeMCU lên thân xe bằng keo nến và cấp nguồn +5V và gnd từ module L298N nhƣ sơ đồ nguyên lý ở trên. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 404 Bƣớc 4: Upload chƣơng trình cho board NodeMCU ( lƣu ý: cách cài đặt board nodeMCU các bạn xem lại trang 323 nhé. ) File code: https://drive.google.com/open?id=1RUhXB-QuqAqTa51-fleDk_PUfERC7Yfs Trƣớc hết các bạn phải add thƣ viện ESP8266WiFi cho phần mền IDE. Thƣ viện kèm theo code. #define ENA 14 // Enable/speed motors Right GPIO14(D5) #define ENB 12 // Enable/speed motors Left GPIO12(D6) #define IN_1 15 // L298N in1 motors Right GPIO15(D8) #define IN_2 13 // L298N in2 motors Right GPIO13(D7) #define IN_3 2 // L298N in3 motors Left GPIO2(D4) #define IN_4 0 // L298N in4 motors Left GPIO0(D3) #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> String command; int speedCar = 800; int speed_Coeff = 3; // 400 - 1023. const char* ssid = "WIFI Car"; ESP8266WebServer server(80); void setup() { pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN_1, OUTPUT); pinMode(IN_2, OUTPUT); pinMode(IN_3, OUTPUT); pinMode(IN_4, OUTPUT); Serial.begin(115200); // Connecting WiFi Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 405 WiFi.mode(WIFI_AP); WiFi.softAP(ssid); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.on ( "/", HTTP_handleRoot ); server.onNotFound ( HTTP_handleRoot ); server.begin(); } void goAhead(){ digitalWrite(IN_1, LOW); digitalWrite(IN_2, HIGH); analogWrite(ENA, speedCar); digitalWrite(IN_3, LOW); digitalWrite(IN_4, HIGH); analogWrite(ENB, speedCar); } void goBack(){ digitalWrite(IN_1, HIGH); digitalWrite(IN_2, LOW); analogWrite(ENA, speedCar); digitalWrite(IN_3, HIGH); digitalWrite(IN_4, LOW); analogWrite(ENB, speedCar); } void goRight(){ digitalWrite(IN_1, HIGH); digitalWrite(IN_2, LOW); analogWrite(ENA, speedCar); digitalWrite(IN_3, LOW); digitalWrite(IN_4, HIGH); analogWrite(ENB, speedCar); } void goLeft(){ digitalWrite(IN_1, LOW); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 406 digitalWrite(IN_2, HIGH); analogWrite(ENA, speedCar); digitalWrite(IN_3, HIGH); digitalWrite(IN_4, LOW); analogWrite(ENB, speedCar); } void goAheadRight(){ digitalWrite(IN_1, LOW); digitalWrite(IN_2, HIGH); analogWrite(ENA, speedCar/speed_Coeff); digitalWrite(IN_3, LOW); digitalWrite(IN_4, HIGH); analogWrite(ENB, speedCar); } void goAheadLeft(){ digitalWrite(IN_1, LOW); digitalWrite(IN_2, HIGH); analogWrite(ENA, speedCar); digitalWrite(IN_3, LOW); digitalWrite(IN_4, HIGH); analogWrite(ENB, speedCar/speed_Coeff); } void goBackRight(){ digitalWrite(IN_1, HIGH); digitalWrite(IN_2, LOW); analogWrite(ENA, speedCar/speed_Coeff); digitalWrite(IN_3, HIGH); digitalWrite(IN_4, LOW); analogWrite(ENB, speedCar); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 407 void goBackLeft(){ digitalWrite(IN_1, HIGH); digitalWrite(IN_2, LOW); analogWrite(ENA, speedCar); digitalWrite(IN_3, HIGH); digitalWrite(IN_4, LOW); analogWrite(ENB, speedCar/speed_Coeff); } void stopRobot(){ digitalWrite(IN_1, LOW); digitalWrite(IN_2, LOW); analogWrite(ENA, speedCar); digitalWrite(IN_3, LOW); digitalWrite(IN_4, LOW); analogWrite(ENB, speedCar); } void loop() { server.handleClient(); command = server.arg("State"); if (command == "F") goAhead(); else if (command == "B") goBack(); else if (command == "L") goLeft(); else if (command == "R") goRight(); else if (command == "I") goAheadRight(); else if (command == "G") goAheadLeft(); else if (command == "J") goBackRight(); else if (command == "H") goBackLeft(); else if (command == "0") speedCar = 400; else if (command == "1") speedCar = 470; else if (command == "2") speedCar = 540; else if (command == "3") speedCar = 610; else if (command == "4") speedCar = 680; else if (command == "5") speedCar = 750; else if (command == "6") speedCar = 820; else if (command == "7") speedCar = 890; else if (command == "8") speedCar = 960; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 408 else if (command == "9") speedCar = 1023; else if (command == "S") stopRobot(); } void HTTP_handleRoot(void) { if( server.hasArg("State") ){ Serial.println(server.arg("State")); } server.send ( 200, "text/html", "" ); delay(1); } Trƣờng hợp máy tính không nhận cổng COM ( PORT ) thì các bạn phải cài driver CP2102 hoặc CH340 tùy vào chip nạp của NodeMCU cho máy tính nhé. Bƣớc 5: Tải app về cài cho điện thoại andriod. Link tải app đƣợc lƣu trong file code các bạn nhé. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 409 Sau khi tải về và cài đặt ta đƣợc app nhƣ hình dƣới. Bƣớc 6: Lắp 3 pin 3.7V vào đế pin và bật công tắc ON/OFF lên. Bƣớc 7: Dùng điện thoại kết nối với Wifi NodeMCU phát ra có tên “ WIFI Car” Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 410 Bƣớc 8: Sau khi đã kết nối Wifi thành công ta mở app lên và nhập địa chỉ IP mặc định của ESP8266 là: 192.168.4.1 , và ta có thể bắt đầu điều khiển xe robot. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 411 8. Thiết kế mô hình diều khiển bật tắt relay bằng cảm biến TOUCH ( cảm biến điện dung ). Mục tiêu: Bật tắt relay bằng cảm biến diện dụng sử dụng board arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 Mạch Arduino (hoặc Nano). Breadboard còn gọi testboard nhỏ. Dây cắm test board. 1 module relay 5Vdc. 1 module cảm biến diện dung. Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/1JLEig4sqvXRYWREy8VAMo5YiPCPK6OFw/view int touchPin = 2;// chân D0 của cảm biến nối với chân số 2 của arduino. int relay = 3; // relay kết nối với chân số 3 int val = 0; int trangthai = 0; int touched = 0; void setup() { Serial.begin(9600); pinMode(touchPin, INPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 412 pinMode(relay, OUTPUT); } void loop() { val = digitalRead(touchPin); if(val == HIGH && trangthai == LOW){ touched = 1-touched; delay(100); } trangthai = val; if(touched == HIGH){ Serial.println("Light ON"); digitalWrite(relay, LOW); }else{ Serial.println("Light OFF"); digitalWrite(relay, HIGH); } } Hình ảnh thực tế: 9 Gửi thông báo về điện thoại khi có trộm bằng cảm biến chuyển động sử dụng board NodeMCU và app BLYNK. Mục tiêu: Gửi thông báo về điện thoại khi có trộm vào nhà. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 413 Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Cài đặt app blynk vào điện thoại. Phần cứng cần chuẩn bị: 1 Mạch Node MCU. 1 smartphone andriod hoặc IOS. Dây cắm test board. 1 module cảm biến chuyển động. Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/open?id=11sZXBW4QHBffT-LyULQgI1fYuXiUVoIo #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> BlynkTimer timer; char auth[] = "eeVwFO5uuw_9zofrSR0Rc8oELQho54"; // mã token này được gửi vào email của bạn sau khi lập project của blynk. char ssid[] = "Truong Phi"; //Wifi nhà bạn char pass[] = "01695304802"; //Wifi Password int trangthai=0; int led =5; void canhbao() Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 414 { int gtcb = digitalRead(D6); } else if (gtcb==0) { trangthai=0; digitalWrite(5, LOW); } } void setup() { Serial.begin(9600); Blynk.begin(auth, ssid, pass); pinMode(12,INPUT_PULLUP);//D6 pinMode(5,INPUT_PULLUP); timer.setInterval(1000L,canhbao); } void loop() { Blynk.run(); timer.run(); } Upload code cho Nodemcu ( trước khi upload phải chọn giống như hình dưới) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 415 Cài app blynk cho điện thoại: Bƣớc 1: Tải app blynk trên CH play hoặc App Store Bƣớc 2: Mở app lên đăng kí tài khoản miễn phí bằng email sau đó chọn NEW PROJECT. Bƣớc 3: Lập app nhƣ hình dƣới. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 416 Bƣớc 4: Chọn vào nút OK sau đó dùng tay trƣợt theo dấu mũi tên . Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 417 Bƣớc 5: Chọn đến mục nhƣ hình ở dƣới. Bƣớc 6: Chọn vào hình tam giác nhƣ hình dƣới để chuyển qua chế độ online. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 418 Sau khi hoàn thiện app và upload chƣơng trình cho board NodeMCU chúng ta thử test: Tin nhắn gửi về điện thoại thông qua app blynk nhƣ sau: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 419 Hình ảnh thực tế: 10. Điều khiển LED ma trận Max7219 với module WIFI NodeMCU. Mục tiêu: Lập trình chạy chữ led ma trận Max7219 sử dụng module Wifi NodeMCU web server. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 Mạch Node MCU. Dây cắm test board. 1 module led ma trận Max7219 (32x8). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 420 Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/open?id=19k3z4h7CQalLODKQOUCFj8AzO_tVpC7J #include <LEDMatrixDriver.hpp> #include <ESP8266WiFi.h> #include <WiFiClient.h> const char* ssid = "Trinh Quang Nam."; // Thay đôi tên wifi const char* password = "bubu123789"; // Thay đổi pass wifi // TCP server at port 80 will respond to HTTP requests WiFiServer server(80); const uint8_t LEDMATRIX_CS_PIN = 15; // Define LED Matrix dimensions (0-n) - eg: 32x8 = 31x7 const int LEDMATRIX_WIDTH = 31; const int LEDMATRIX_HEIGHT = 7; const int LEDMATRIX_SEGMENTS = 4; // The LEDMatrixDriver class instance LEDMatrixDriver lmd(LEDMATRIX_SEGMENTS, LEDMATRIX_CS_PIN); void displayText ( char * theText) { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 421 if ( myTime + ANIM_DELAY < millis()) { myTime=millis(); drawString(theText, len, x, 0); lmd.display(); // Advance to next coordinate if( --x < len * -8 ) { x = LEDMATRIX_WIDTH; lmd.clear(); } } } ………………….. void drawString(char* text, int len, int x, int y ) { for( int idx = 0; idx < len; idx ++ ) { int c = text[idx] - 32; // stop if char is outside visible area if( x + idx * 8 > LEDMATRIX_WIDTH ) return; // only draw if char is visible if( 8 + x + idx * 8 > 0 ) drawSprite( font[c], x + idx * 8, y, 8, 8 ); } } void drawSprite( byte* sprite, int x, int y, int width, int height ) { // The mask is used to get the column bit from the sprite row byte mask = B10000000; for( int iy = 0; iy < height; iy++ ) { for( int ix = 0; ix < width; ix++ ) { lmd.setPixel(x + (width - ix), y + iy, (bool)(sprite[iy] & mask )); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 422 mask = mask >> 1; } // reset column mask mask = B10000000; } } Sau khi nạp code chƣơng trình cho NodeMCU thì trên màn hình led sẽ xuất hiện địa chỉ IP, ví dụ : 192.168.1.70 Khi đã có địa chỉ IP ta dùng máy tính hay điện thoại ta truy cập vào địa chỉ đó để điều khiển dòng chữ chạy trên led ma trận. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 423 Hình ảnh thực tế: 11. Ðiều khiển tốc độ động cơ bước bằng biến trở sử dụng board Mục tiêu: Ðiều khiển tốc độ động cơ bước bằng biến trở sử dụng board arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 breadboard. 1 driver điều khiển động cơ bước A4988. 1 động cơ bước 1.8 độ / step (0.4A). 1 bộ nguồn (8 – 35Vdc). Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 424 Sơ đồ mạch nối driver A4988 và động cơ bƣớc: ( lƣu ý nếu sử dụng 2 nguồn riêng phải nối chung chân GND của 2 nguồn với nhau ) Code chương trình: https://drive.google.com/file/d/1PdbPYgBmvfzfp2X4cCaeMovt1ewGuxNW/view const int stepPin = 3; const int dirPin = 4; int customDelay,customDelayMapped; void setup() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 425 pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); digitalWrite(dirPin,HIGH); } void loop() { customDelayMapped = speedUp(); // nhận giá trị độ trễ tùy chỉnh // làm cho các xung có độ trễ tùy chỉnh, tùy thuộc vào biến trở xoay, từ dó thay đổi tốc độ động cơ digitalWrite(stepPin, HIGH); delayMicroseconds(customDelayMapped); digitalWrite(stepPin, LOW); delayMicroseconds(customDelayMapped); } int speedUp() { int customDelay = analogRead(A0); // đọc giá trị analog từ biến trở int newCustom = map(customDelay, 0, 1023, 300,4000);// Chuyển các giá trị đọc của //biến trở từ 0 dến 1023 thành các giá trị dộ trễ mong muốn (300 dến 4000) return newCustom; } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 426 12 Đọc giá trị nhiệt độ, độ ẩm hiển thị lên màn hình oled 0.96” và blynk sử dụng board NodeMCU. Mục tiêu: Đọc và hiển thị giá trị nhiệt độ và độ ẩm hiển thị màn hình oled và blynk. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Cài đặt app Blynk cho điện thoại. Phần cứng cần chuẩn bị: 1 board NodeMCU. Dây cắm test board. 1 breadboard. 1 Module dht11. 1 màn hình oled 0.96‖. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 427 Code chương trình: https://drive.google.com/file/d/1oHGKSNTXN-FSvqPlGY8R3EW07s5VwO_H/view?usp=drive_open #include <Wire.h> #include "SSD1306.h" #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> // You should get Auth Token in the Blynk App. char auth[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Your WiFi credentials. char ssid[] = "Trinh Quang Nam."; char pass[] = "bubu123789"; #include <DHT.h> #define DHTPIN 4 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 // OLED display i2C // D3 -> SDA // D5 -> SCL // Initialize the OLED display using Wire library SSD1306 display(0x3C, D3, D5); DHT dht(DHTPIN, DHTTYPE); BlynkTimer timer; void setup(){ Serial.begin(115200); // Initialising the UI will init the display too. display.init(); display.flipScreenVertically(); display.setFont(ArialMT_Plain_16); display.setTextAlignment(TEXT_ALIGN_LEFT); dht.begin(); // initialize dht Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8080); timer.setInterval(1000L, sendSensor); } void displayWeather(){ float h = dht.readHumidity(); // Read temperature as Celsius float t = dht.readTemperature(); // Read temperature as Fahrenheit Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 428 float f = dht.readTemperature(true); if (isnan(h) || isnan(t) || isnan(f)){ display.clear(); // clearing the display display.drawString(5,0, "DHT Failed!"); return; } display.clear(); display.drawString(30, 0, "Weather"); display.drawString(0, 20, "Humidity: " + String(h) + "%\t"); display.drawString(0, 40, "Temp: " + String(t) + "°C"); //Uncomment to get temperature in farenheit //display.drawString(0, 40, "Temp: " + String(f) + "°F"); } void loop(){ Blynk.run(); // Running the blynk code displayWeather(); //Calling back the displayWeather function display.display(); timer.run(); } void sendSensor() { float h = dht.readHumidity(); //Read the humidity float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit if (isnan(h) || isnan(t)) { Serial.println("Failed to read from DHT sensor!"); return; } // You can send any value at any time. // Please don't send more that 10 values per second. Blynk.virtualWrite(V5, h); Blynk.virtualWrite(V6, t); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 429 Cài đặt app Blynk: Bƣớc 1: Tải app blynk trên CH play hoặc App Store Bƣớc 2: Mở app lên đăng kí tài khoản miễn phí bằng email sau đó chọn NEW PROJECT. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 430 Bƣớc 3: Lập app nhƣ hình dƣới. Bƣớc 4: Chọn vào nút OK mã token sẽ đƣợc gửi vào email sau đó dùng tay trƣợt theo dấu mũi tên . Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 431 Bƣớc 5: Chọn đến mục nhƣ hình ở dƣới ( chọn 2 lần ). Bƣớc 6: Chọn vào hình chữ nhật nhƣ hình dƣới và thay đổi thông tin giồng hình. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 432 Bƣớc 7: Chọn vào hình chữ nhật nhƣ hình dƣới và thay đổi thông tin giồng hình. Bƣớc 8: Chọn vào hình tam giác nhƣ hình dƣới để chuyển qua chế độ online Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 433 Hình ảnh thực tế: 13. Thiết kế xe 2 bánh tự cân bằng sử dụng board ardunio. Mục tiêu: Thiết kế mô hình xe 2 bánh tự cân bằng sử dụng board arduino áp dụng luật điều khiển tối ƣu bền vững ( µ tổng hợp ). Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 arduino mega2560. Dây cắm test board. 1bộ khung xe robot 2 bánh cân bằng. 3 tấm mica 5mm ( 7cm x 12 cm ) . 1 module L298n. 1 công tắc ON/OFF. 8 trục dồng 5cm. Khung xe robot 2 bánh:( Lưu ý: chúng ta có thể thay bánh xe loại có ma sát tốt hơn ) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 434 Board Arduino mega 2560: Module điều khiển động cơ L298n: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 435 Cảm biến góc nghiêng ( mpu 6050): Nguồn ( 3 pin 3.7V ) và đế 3 pin 3.7V mắc nối tiếp: Một số phụ kiện khác như: tấm mica, công tắc, dây cắm test và 8 trục đồng 5 cm. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 436 Lắp mạch nguyên lý: Code chương trình: (code hoàn chỉnh link kèm theo) https://drive.google.com/file/d/1bMTQRZUwvafHIAA1piCfH6gLgI15_5kj/view #include <Wire.h> #include "Kalman.h" // Source: https://github.com/TKJElectronics/KalmanFilter #include <avr/io.h> #include <avr/interrupt.h> Kalman kalmanX; Kalman kalmanY; int motor1 = 9; // pin PWM motor 1 int motor2 = 10; // pin PWM motor 2 int dir1PinL = 4; int dir2PinL = 5; int dir1PinR = 6; int dir2PinR = 7; int EnPhaseA = 2; // Pin encoder phase A int EnPhaseB = 3; // Pin encoder phase B double Error; double PreError = 0; double Blance = 180.0887; // gia tri cân bằng mặcđịnh Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 437 unsigned long lastTime; double gyroXrate; //theta dot int TimerCount = 0; int Button = 0; int Run = 0; //Run or not run volatile long Pulse =0, PrePulse = 0, DeltaPulse =0; float Distance =0; // m float a = 1; //0.2; float Velocity = 0; // (m/s) float Diameter = 0.07; // 70cm //các hệ số K cần tìm bằng cách chạy file matlab kèm theo. float K1 = 40; float K2 = -0.0030; float K3 = 1.8764; float K4 = 0.2; float Output_H = 0; int Output_H_1 =0, Output_H_2 = 0; int16_t accX, accY, accZ; int16_t tempRaw; int16_t gyroX, gyroY, gyroZ; double accXangle, accYangle; double temp; double gyroXangle, gyroYangle; double compAngleX, compAngleY; double kalAngleX, kalAngleY; uint32_t timer; uint8_t i2cData[14]; // Buffer for I2C data void setup() { pinMode(EnPhaseA, INPUT); pinMode(EnPhaseB, INPUT); digitalWrite(2,LOW); digitalWrite(3,LOW); attachInterrupt(0, UpdateRotation, RISING); pinMode(18, INPUT_PULLUP); //=====================Khai bao dk motor ====================================// pinMode(motor1,OUTPUT); pinMode(dir1PinL,OUTPUT); pinMode(dir2PinL,OUTPUT); pinMode(motor2,OUTPUT); pinMode(dir1PinR,OUTPUT); pinMode(dir2PinR,OUTPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 438 //=================== Giao tiep I2C va loc Kalmal==============================// Serial.begin(115200); Wire.begin(); i2cData[0] = 7; i2cData[1] = 0x00; filtering, 8 KHz sampling while(i2cRead(0x75,i2cData,1)); if(i2cData[0] != 0x68) { Serial.print(F("Error reading sensor")); while(1); } delay(100); // Wait for sensor to stabilize while(i2cRead(0x3B,i2cData,6)); accX = ((i2cData[0] << 8) | i2cData[1]); accY = ((i2cData[2] << 8) | i2cData[3]); compAngleX = accXangle; compAngleY = accYangle; } Hình ảnh thực tế: ( bánh xe đƣợc thay loại có ma sát tốt hơn ) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 439 14. Thiết kế mô hình hẹn giờ bật tắt thiết bị sử dụng module DS1307 và arduino. Mục tiêu: Thiết kế mô hình hẹn giờ bật tắt thiết bị sử dụng module ds1307 và arduino hiển thị lên màn hình LCD. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 arduino. Dây cắm test board. 1 module DS1307. 1 LCD16x02. 1 module I2C cho LCD. 1 trở 220 Ohm. 1 led don 5mm. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 440 Code chương trình: https://drive.google.com/file/d/15dgJIvK6DbXV7FInyFCdF7r4k0SQHNDO/view?usp=drive_open #include <Wire.h> // thư viện I2C #include<EEPROM.h> // Thư viện EEPROM #include <RTClib.h> #include <LiquidCrystal_I2C.h> byte degree[8] = { 0B01110, 0B01010, 0B01110, 0B00000, 0B00000, 0B00000, 0B00000 }; RTC_DS1307 RTC; LiquidCrystal_I2C lcd(0x27,16,2); // dịa chỉ của I2C int temp,inc,hours1,minut,add=11; int next=12; // nút nhấn chuyển sang trang thái khác. int INC=11; // nút nhấn tang giờ hoặc phút int set_mo=10; // nút nhấn set mở thiết bị int set_tat=9; // nút nhấn set tắt thiết bị #define buzzer 13 // chân dều khiển thiết bị hoặc loa. int HOUR,MINUT,SECOND; void setup() { Serial.begin(9600); Wire.begin(); RTC.begin(); lcd.backlight(); lcd.begin(16,2); lcd.init(); lcd.createChar(1, degree); pinMode(INC, INPUT); pinMode(next, INPUT); pinMode(set_mo, INPUT); pinMode(set_tat, INPUT); pinMode(buzzer, OUTPUT); digitalWrite(next, HIGH); digitalWrite(set_mo, HIGH); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 441 digitalWrite(INC, HIGH); digitalWrite(set_tat, HIGH); digitalWrite(buzzer, 0); lcd.setCursor(0,0); lcd.print("Real Time Clock"); lcd.setCursor(0,1); lcd.print("Circuit Digest "); delay(2000); if(!RTC.isrunning()) { RTC.adjust(DateTime(__DATE__,__TIME__)); // upload code lần đầu các bạn mở dòng code này sau dó upload code lại 1 lần nữa thì xóa dòng code này đi nhé. } } void loop() { int temp=0,val=1,temp4; DateTime now = RTC.now(); if(digitalRead(set_mo) == 0) { lcd.setCursor(0,0); lcd.print(" Set ON "); delay(2000); defualt(); time(); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(" Alarm time "); lcd.setCursor(0,1); lcd.print(" has been set "); delay(2000); } if(digitalRead(set_tat) == 0) { lcd.setCursor(0,0); lcd.print(" Set OFF "); delay(2000); defualt(); time(); delay(1000); //cài đặt thời gian bật thiết bị //cài đặt thời gian tắt thiết bị Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 442 lcd.clear(); lcd.setCursor(0,0); lcd.print(" Alarm time "); lcd.setCursor(0,1); lcd.print(" has been set "); delay(2000); } lcd.clear(); // xóa màn hình LCD lcd.setCursor(0,0); lcd.print("Time:"); // in dòng chữ Time ở cột 0 và hàng 0 lcd.setCursor(6,0); lcd.print(HOUR=now.hour(),DEC); // in giờ ở cột 6 và hàng 0 lcd.print(":"); lcd.print(MINUT=now.minute(),DEC); lcd.print(":"); lcd.print(SECOND=now.second(),DEC); lcd.setCursor(0,1); lcd.print("Date: "); lcd.print(now.day(),DEC); lcd.print("/"); lcd.print(now.month(),DEC); lcd.print("/"); lcd.print(now.year(),DEC); match(); match1(); delay(500); } void defualt() { lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); } void time() { int temp=1,minuts=0,hours=0,seconds=0; while(temp==1) // trường hợp temp bằng 1 { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 443 if(digitalRead(INC)==0) // nếu nút INC được nhấn thì tăng biến giờ lên 1 đơn vị { HOUR++; if(HOUR==24) { HOUR=0; } while(digitalRead(INC)==0); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Set Alarm Time "); //lcd.print(x); lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); delay(100); if(digitalRead(next)==0) { hours1=HOUR; EEPROM.write(add++,hours1); temp=2; while(digitalRead(next)==0); } } while(temp==2) // trường hợp temp bằng 2 { if(digitalRead(INC)==0) // nếu nút INC được nhấn thì tăng biến phút lên 1 đơn vị { MINUT++; if(MINUT==60) {MINUT=0;} while(digitalRead(INC)==0); } // lcd.clear(); lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 444 lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); delay(100); if(digitalRead(next)==0) { minut=MINUT; EEPROM.write(add++, minut); temp=0; while(digitalRead(next)==0); } } delay(1000); } void match()// chương trình con bật thiết bị { int tem[23]; for(int i=11;i<23;i++) { tem[i]=EEPROM.read(i); } if(HOUR == tem[11] && MINUT == tem[12]) // biến giờ lưu vị trí 11, phút ở 12 { digitalWrite(buzzer, HIGH);// bật thiết bị lên khi đúng giờ cài đặt } } void match1()// chương trình con tắt thiết bị { int tem1[23]; for(int j=11;j<23;j++) { tem1[j]=EEPROM.read(j); } if(HOUR == tem1[13] && MINUT == tem1[14]) { digitalWrite(buzzer, LOW); } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 445 Hình ảnh thực tế: 15. Thiết kế mô hình xe 4 bánh diều khiển bằng sóng Wifi sử board NodeMCU và app Blynk ( công cụ Joystick ). Mục tiêu: Thiết kế xe 4 bánh diều khiển bằng sóng wifi sử dụng board nodeMCU và app blynk ( công cụ joystick ). Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Cài dặt app blynk vào diện thoại. Phần cứng cần chuẩn bị: 1 Mạch Node MCU. 1 smartphone andriod hoặc IOS. Dây cắm test board. 1 module cảm biến chuyển dộng. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 446 Lắp mô hình: Lắp mô hình hoàn toàn giống với bài số 7. Code chương trình: https://drive.google.com/file/d/1BQ2tpaSQP5w26wbO-0e4ETn2sQxPdnEg/view #define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = "xxxxxxxxxxxxxxxxxx"; // mã token này duợc gửi vào email của bạn sau khi dang kí 1 project của blynk Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 447 // Your WiFi credentials. char ssid[] = "Trinh Quang Nam."; //tên wifi nhà bạn char pass[] = "bubu123789"; //mật khẩu BlynkTimer timer; const byte L298N_A_pin = D5; // GPI05-- ENA const byte L298N_A_In1_pin = D8; //GPI04 const byte L298N_A_In2_pin = D7; //GPI0 const byte L298N_B_In3_pin = D4; // GPI02 const byte L298N_B_In4_pin = D3; // GPIO14 const byte L298N_B_pin = D6; //GPI12 -- ENB byte SolSinyal = 0; byte SagSinyal = 0; byte ArkaLamba = 0; void motorSpeed(int prmA, byte prmA1, byte prmA2, int prmB, byte prmB1, byte prmB2) { analogWrite(L298N_A_pin,prmA); analogWrite(L298N_B_pin,prmB); digitalWrite(L298N_A_In1_pin,prmA1); digitalWrite(L298N_A_In2_pin,prmA2); digitalWrite(L298N_B_In3_pin,prmB1); digitalWrite(L298N_B_In4_pin,prmB2); } BLYNK_WRITE(V0) { int x = param[0].asInt(); int y = param[1].asInt(); // x = -2 -1 0 1 2 // Y = -2 -1 0 1 2 if (y>=0) { ArkaLamba = 0; // digitalWrite(Led4_pin,LOW); } else { ArkaLamba = 1; SolSinyal = 1; SagSinyal = 1; } if ((x==0) && (y==0)) /// stop { motorSpeed(0,LOW,LOW,0,LOW,LOW); SolSinyal = 0; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 448 SagSinyal = 0; } else if ((x==0) && (y>0)) { if (y==1){ motorSpeed(700,HIGH,LOW,700,HIGH,LOW); } // turn right else { motorSpeed(900,HIGH,LOW,900,HIGH,LOW); } SolSinyal = 0; SagSinyal = 0; } else if ((y==0) && (x>0)) { motorSpeed(900,HIGH,LOW,900,LOW,HIGH); // tiến SagSinyal = 1; } else if ((y>0) && (x>0)) { motorSpeed(900,HIGH,LOW,700,LOW,LOW); SagSinyal = 1; } else if ((y==0) && (x<0)) { motorSpeed(900,LOW,HIGH,900,HIGH,LOW); // rẻ trái SolSinyal = 1; } else if ((y>0) && (x<0)) { } void setup() { Serial.begin(115200); pinMode(L298N_A_In1_pin,OUTPUT); pinMode(L298N_A_In2_pin,OUTPUT); pinMode(L298N_B_In3_pin,OUTPUT); pinMode(L298N_B_In4_pin,OUTPUT); digitalWrite(L298N_A_In1_pin,LOW); digitalWrite(L298N_A_In2_pin,LOW); digitalWrite(L298N_B_In3_pin,LOW); digitalWrite(L298N_B_In4_pin,LOW); Blynk.begin(auth, ssid, pass); timer.setInterval(1000L, sendTemps); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 449 void sendTemps() { } void loop() { Blynk.run(); timer.run(); } Upload code cho Nodemcu ( truớc khi upload phải chọn giống như hình duới) Cài app blynk cho diện thoại: Bước 1: Tải app blynk trên CH play hoặc App Store Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 450 Bước 2: Mở app lên đăng kí tài khoản miễn phí bằng email sau dó chọn NEW PROJECT. Bước 3: Chọn vào nút OK sau đó dùng tay trượt theo dấu mũi tên . Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 451 Bước 4: Chọn đến mục như hình ở dưới. Bước 5: Click vào joystick ta chỉnh sửa giống như hình dưới. Chọn vào hình tam giác để hoàn thành app. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 452 Bước 6: Bật công tắc nguồn cho xe và app đã kết nối với Wifi và chúng ta có thể điều khiển xe chạy tiến lùi ,… 16. Thiết kế mô hình xe robot 3 bánh tự hành sử dụng board ardunio. Mục tiêu: Thiết kế mô hình xe robot tự hành sử dụng board arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 arduino. Dây cắm test board. 1 module l298n. 1 động cơ servo 9g. 1 module SRF05 (cảm biến khoảng cách). 1 khung xe 3 bánh hoặc 4 bánh. 1 dế 3 pin ( 3.7 V ). 3 viên pin 18650 ( 3.7 V) , Có thể dùng pin 9V. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 453 2 cây keo nến. Lắp mạch nguyên lý: Arduino L298n SRF05 Servo GND GND (--) GND Dây nâu 5V 3 +5VDC IN1 VCC Dây đỏ 11 5 IN2 IN3 6 A1 A5 10 IN4 Nguồn pin Trig Echo Dây màu cam gnd 12+ Gnd ( - ) (+) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 454 Lắp mô hình: Lắp mô hình khung xe 3 bánh như hình dưới Lắp động cơ servo và cảm biến khoảng cách như hình sau ( dùng keo nến để kết nối cảm biến và servo ) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 455 Lắp mô hình hoàn chỉnh sau khi kết nối dây dẫn như sơ đồ nguyên lý: ( dùng keo nến để dính các khối lên khung xe ) Code chương trình: https://drive.google.com/file/d/1gjxq1g_s6jDvJ36MWWXu-fFIC8KrQgq9/edit #include <Servo.h> //thư viện điều khiển động cơ servo #include <NewPing.h> //thư viện hổ trợ cảm biến khoang cach srf05 cần phải cài //our L298N control pins const int LeftMotorForward = 11;// IN2 const int LeftMotorBackward = 3;// IN1 const int RightMotorForward = 6;// IN4 const int RightMotorBackward = 5;// IN3 #define trig_pin A1 //A1 #define echo_pin A2 //A2 #define maximum_distance 200 // Khoảng cách tối đa 20 cm boolean goesForward = false; int distance = 100; int vel = 150; NewPing sonar(trig_pin, echo_pin, maximum_distance); Servo servo_motor; void setup(){ pinMode(RightMotorForward, OUTPUT); pinMode(LeftMotorForward, OUTPUT); pinMode(LeftMotorBackward, OUTPUT); pinMode(RightMotorBackward, OUTPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 456 servo_motor.attach(10); servo_motor.write(90); delay(2000); distance = readPing(); delay(100); distance = readPing(); delay(100); distance = readPing(); delay(100); distance = readPing(); delay(100); // chân diều khiển dộng co servo 10 } void loop(){ int distanceRight = 0; int distanceLeft = 0; delay(50); if (distance <= 20){ moveStop(); delay(300); moveBackward(); delay(400); moveStop(); delay(300); distanceRight = lookRight(); delay(300); distanceLeft = lookLeft(); delay(300); if (distance >= distanceLeft){ turnRight(); moveStop(); } else{ turnLeft(); moveStop(); } } else{ moveForward(); } distance = readPing(); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 457 int lookRight(){ servo_motor.write(10); delay(500); int distance = readPing(); delay(100); servo_motor.write(90); return distance; } int lookLeft(){ servo_motor.write(170); delay(500); int distance = readPing(); delay(100); servo_motor.write(90); return distance; delay(100); } int readPing(){ delay(70); int cm = sonar.ping_cm(); if (cm==0){ cm=250; } return cm; } void moveStop(){ // xe dừng analogWrite(RightMotorForward, LOW); analogWrite(LeftMotorForward, LOW); analogWrite(RightMotorBackward, LOW); analogWrite(LeftMotorBackward, LOW); } void moveForward(){ // xe chạy tiến if(!goesForward){ goesForward=true; analogWrite(LeftMotorForward, vel); analogWrite(RightMotorForward, vel); analogWrite(LeftMotorBackward, LOW); analogWrite(RightMotorBackward, LOW); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 458 } void moveBackward(){ //xe chạy lùi goesForward=false; analogWrite(LeftMotorBackward, vel); analogWrite(RightMotorBackward, vel); analogWrite(LeftMotorForward, LOW); analogWrite(RightMotorForward, LOW); } void turnRight(){ // xe rẻ phải analogWrite(LeftMotorForward, vel); analogWrite(RightMotorBackward, vel); digitalWrite(LeftMotorBackward, LOW); digitalWrite(RightMotorForward, LOW); delay(500); analogWrite(LeftMotorForward, vel); analogWrite(RightMotorForward, vel); analogWrite(LeftMotorBackward, LOW); analogWrite(RightMotorBackward, LOW); } void turnLeft(){ // xe rẻ trái analogWrite(LeftMotorBackward, vel); analogWrite(RightMotorForward, vel); analogWrite(LeftMotorForward, LOW); analogWrite(RightMotorBackward, LOW); delay(500); analogWrite(LeftMotorForward, vel); analogWrite(RightMotorForward, vel); analogWrite(LeftMotorBackward, LOW); analogWrite(RightMotorBackward, LOW); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 459 17. Ðiều khiển góc quay động cơ buớc bằng nút nhấn sử dụng board arduino. Mục tiêu: Ðiều khiển góc quay dộng co bƣớc bằng nút nhấn sử dụng board arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 breadboard. 1 driver điều khiển động cơ bước A4988. 1 động cơ bước 1.8 độ / step (0.4A). 1 bộ nguồn (8 – 35Vdc). 3 nút nhấn 4 chân. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 460 Sơ đồ mạch nối driver A4988 và động cơ bước: ( lưu ý nếu sử dụng 2 nguồn riêng phải nối chung chân GND của 2 nguồn với nhau ) Code chương trình: https://drive.google.com/file/d/19lBEAcOHlYqC1s7VhJEFaJjQK5p6e-JB/view const int stepPin = 5; const int dirPin = 2; const int enPin = 8; const int b1 = A1; // nút nhấn 1 const int b2 = A2; // nút nhấn 2 const int b3 = A3; // nút nhấn 3 int currentAngle = 0; int angle = 0; // góc quay float stepPerAngle = 1.8; // full step = 1.8 int numstep; void setup() { Serial.begin(9600); // tốc độ baud 9600 pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 461 pinMode(enPin,OUTPUT); digitalWrite(enPin,LOW); digitalWrite(dirPin,HIGH); pinMode(b1, INPUT); // khai báo chân nút nhấn là chân vào pinMode(b2, INPUT); pinMode(b3, INPUT); digitalWrite(b1,HIGH); digitalWrite(b2,HIGH); digitalWrite(b3,HIGH); } void loop() { int n; if( digitalRead(b1) == 0){ // nếu nút nhấn b1 được nhấn thì gán góc quay là 0 độ angle = 0; } else if( digitalRead(b2) == 0){ // nếu nút b2 được nhấn thì gán góc quay là 90 độ angle = 90; } else if( digitalRead(b3) == 0){ // nếu nút b3 được nhấn thì gán góc quay là 270 độ angle = 270; } if( currentAngle != angle ){ if( currentAngle < angle){ digitalWrite(dirPin,HIGH); // quay theo chiều thuận n = angle - currentAngle; numstep = n / stepPerAngle; // số step cần phải quay } else if( currentAngle > angle){ digitalWrite(dirPin,LOW); // quay theo chiều thuận n = currentAngle - angle; if( angle == 0){ n =currentAngle; } numstep = n / stepPerAngle; // số step cần quay của động cơ bước } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 462 for(int x = 0; x < numstep; x++) { digitalWrite(stepPin,HIGH); delayMicroseconds(1000); // ta có thể thay dòng số này để chỉnh tốc độ quay digitalWrite(stepPin,LOW); delayMicroseconds(1000); //// ta có thể thay dòng số này để chỉnh tốc độ quay } currentAngle = angle; } delay(500); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 463 18. Thiết kế xe robot 4 bánh điều khiển bằng giọng nói sử dụng board arduino. Mục tiêu: Thiết kế xe robot diều khiển bằng giọng nói. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Ðăng kí 1 tài khoản miễn phí trên MIT App Inventor 2 . Phần cứng cần chuẩn bị: ( Tuong tự với xe cấp dộ 1 ) 1 board arduino uno hoặc nano,... 1 điện thoại sử dụng hệ điều hành andriod. 1 mạch điều khiển động cơ L298N. Dây test board. 1 module bluetooth HC05 hoặc HC06. 4 động cơ giảm tốc V1 màu vàng. 4 bánh xe robot. 1m dây điện nhỏ. 1 công tắc on/off. 1 đế 3 pin nối tiếp cho pin 3.7 VDC. 3 pin 3.7VDC. ( Loại pin sạc : 18650 ). 2 cây keo nến. 1 tấm mica 3mm hoặc gỗ (rộng: 11cm, dài : 17cm). Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 464 Arduino L298n HC05 GND GND (--) GND 5V 5 +5VDC ENB VCC 6 7 IN4 IN3 11 12 13 ENA IN1 IN2 2 3 Tx rx 12+ (nối từ pin) GND (--) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 465 Lắp mô hình: tương tự như xe robot 4 bánh ở trên Bước 1: Hình dưới là xe robot hoàn thành. Bước 2: Tải file code chương trình tại link dưới và upload code cho board arduino uno. https://drive.google.com/open?id=1Vr8l2zLYUlkjwy-CvCevN-MVMtpem8qf Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 466 Bước 3: Tải file add điều khiển về điện thoại theo link kèm theo https://drive.google.com/open?id=1Pd_XTz5B63SznwV78hnHK80d3lp16jnK Sau khi tải về và cài đặt ta đƣợc app như hình dưới. Bước 4: Lắp pin vào xe robot và bật công tắc ON/OFF lên, trường hợp đã gắn cảm biến dò line lên xe chúng ta không cần phải gỡ ra. Bước 5: Kết nối bluetooth của xe robot và điện thoại, mở bluetooth của điện thoại lên và dò tên bluetooth của xe và pass của bluetooth thường là 1234. Sau dó mở app điều khiển xe robot lên. Sau khi chọn nút bluetooth sẽ hiện ra cửa sổ như hình dƣới và chúng ta chọn đúng Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 467 vào mã của module bluetooth HC05 ( Lưu ý: mỗi bluetooth sẽ có mã khác nhau) Khi màn hình app xuất hiện chữ connected có nghia việc kết nối đã thành công. Bước 6: Chọn vào nút speak something dể điều khiển bằng giọng nói. Chọn vào nút speak something để điều khiển bằng giọng nói. Và bạn có thể thêm tính năng hoặc thay đổi từ trong file code. + Ði thẳng với : "Go" + Rẻ trái : "Turn left" + Rẻ phải: "Turn Right" + Rẻ phải: "stop" Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 468 19. Thiết kế mô hình mở cửa tự dộng sử dụng module RC522 và board arduino ( nhà thông minh). Mục tiêu: Thiết kế mô hình mở cửa tự động sử dụng module RC522 và board arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 module thẻ tử RC522. 1 động cơ servo 9g. 1 loa 5Vdc. 1 led dỏ 5mm. 1 led xanh 5mm. 2 trở 220 Ohm. 1 cây keo nến. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 469 Arduino MFRC522 SERVO LOA GND GND (--) Dây nâu GND (-) Dây đỏ 5V 3.3V 3.3V 11 12 MOSI MISO 13 10 9 SCK SDA(SS) RST 6 5 Dây cam Dƣơng + Code chương trình: Bước 1: Add thư viện MFRC522 cho phần mền IDE ( 1.6.8 trở lên). Ta chọn Sketch Inlude Library Manage Libraries. Trong quá trình cài thư viện thì máy tính phải kết nối INTERNET. Bước 2: Sau khi cài thư viện MFRC522 cho IDE và đã kết nối mạch như hình vẽ ở trên, ta upload code sau để đọc UID của thẻ từ. https://drive.google.com/open?id=1iinyGb4RBwrTxz7sMFkTEDhfQF2gjAYY #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // chân Reset nối với chân số 9 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 470 #define SS_PIN 10 // chân SS nối với chân số 10 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 mfrc522.PCD_DumpVersionToSerial(); Reader details Serial.println(F("Quet ma UID cua the...")); } void loop() { if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); } Bước 3: Sau khi upload code ta mở serial monitor lên và đƣa thẻ từ vào board MFRC522. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 471 Ta lưu lại mã UID : DA AC F3 0B Bước 3: Chỉnh sửa lại code sau( thay mã UID thẻ của bạn ) và upload cho board arduino. https://drive.google.com/open?id=1qiMmkY0g5pDIayn7mIM_OLpf3Jjfk-KH #include <SPI.h> // THU VIEN SPI #include <MFRC522.h> // THU VIEN RC522 #include <Servo.h> // THU VIEN DK DONG CO SERVO #define SS_PIN 10 // DINH DỊA CHỈ CHO RC522 #define RST_PIN 9 // chan reset int ledxanh = 2; int leddo =3; int loa = 5; MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. Servo myServo; void setup() { Serial.begin(9600); SPI.begin(); // khoi dong SPI mfrc522.PCD_Init(); // Initiate MFRC522 myServo.attach(6); //servo pin CHAN NOI ARDUINO myServo.write(0); //servo O do Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 472 Serial.println("Put your card to the reader..."); Serial.println(); pinMode(ledxanh,OUTPUT); pinMode(leddo,OUTPUT); pinMode(loa,OUTPUT); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.print("UID tag :"); String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Message : "); content.toUpperCase(); if (content.substring(1) == "DA AC F3 0B")// thay mã UID thẻ của bạn ở dây { Serial.println("Ma hop le"); Serial.println(); delay(500); digitalWrite(ledxanh, HIGH); myServo.write(180); delay(2000); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 473 myServo.write(0); digitalWrite(ledxanh, LOW); } else { Serial.println(" khong hop le"); digitalWrite(leddo, HIGH); digitalWrite(loa, HIGH); delay(1000); digitalWrite(leddo, LOW); digitalWrite(loa, LOW); } } Bước 4: Trường hợp thẻ hợp lệ động cơ servo quay mở cửa và đèn xanh sáng, ngược lại động cơ servo không quay cửa dóng , đèn đỏ sáng và đồng thời loa kêu. Trường hợp này các bạn có thể cải tiến bằng then cửa từ, khi áp dụng thực tế nhé. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 474 20. Thiết kế mô hình hiển thị giờ, nhiệt dộ và dộ ẩm lên module led matrix 32x8 sử dụng board arduino. Mục tiêu: Thiết kế mô hình hiển thị giờ, nhiệt dộ và dộ ẩm ( dht11) lên module led matrix 32x8 sử dụng arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 module ds1307. 1 module dht11. 3 nút nhấn 4 chân. 3 trở 10K. 1 module led ma trận 32x8 max 7219. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 475 Arduino LED MATRIX GND (--) DS1307 DHT11 GND GND (-) 5V 2 VCC VCC VCC+ OUT 11 10 DIN CS 13 A4 A5 CLK GND NÚT NHẤN SDA SCL 3 4 5 N1 N2 N3 Code chương trình: Các bạn lưu ý trong file download về có 4 file thư viện các bạn phải add 4 file thư viện dó vào phần mền IDE mới sử dụng đƣợc code nhé. Link tải code: https://drive.google.com/file/d/1G_PFGn6-oZbDLjdBD93BRXPy4q1lUllE/view # define USE_DS1307 #include <MD_Parola.h> // thu viện duợc dính kèm trong file code #include <MD_MAX72xx.h> #include <SPI.h> #include <Wire.h> #include <MD_DS1307.h> #include "DHT.h" #define DHTPIN 2 // chân dọc tín hiệu của dht 11 là chân số 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); #include "Font.h" #define HARDWARE_TYPE MD_MAX72XX::FC16_HW #define MAX_DEVICES 4 // với 4 là 1 module max7219 #define CLK_PIN 13 #define DATA_PIN 11 #define CS_PIN 10 MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); volatile boolean buttonA = false; volatile boolean buttonB = false; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 476 volatile boolean buttonC = false; int StateOfbuttonA = 0; int StateOfbuttonB = 0; int StateOfbuttonC = 0; int NewStateOfbuttonA = 0; int NewStateOfbuttonB = 0; int NewStateOfbuttonC = 0; int temp; int Humi; int Mode = 0; int contrast = 0; int SPEED_TIME = 75; #define PAUSE_TIME 0 #define MAX_MESG 20 char szTime[9]; // hh:mm char szsecond[4]; // ss char szMesg[MAX_MESG+1] = ""; uint8_t degC[] = { 6, 3, 3, 56, 68, 68, 68 }; // Deg C char *mon2str(uint8_t mon, char *psz, uint8_t len) { static const __FlashStringHelper* str[] = { F("Jan"), F("Feb"), F("Mar"), F("Apr"), F("May"), F("Jun"), F("Jul"), F("Aug"), F("Sep"), F("Oct"), F("Nov"), F("Dec") }; strncpy_P(psz, (const char PROGMEM *)str[mon-1], len); psz[len] = '\0'; void setup(void) { dht.begin(); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); P.begin(3); P.setInvert(false); P.setZone(2, 0, 3); P.setZone(1, 1, 3); P.setZone(0, 4, 1); P.setFont(1, numeric7Se); P.setFont(0, numeric7Seg); P.displayZoneText(1, szTime, PA_LEFT, SPEED_TIME, PAUSE_TIME, PA_PRINT, Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 477 PA_NO_EFFECT); P.displayZoneText(0, szsecond, PA_LEFT, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT); P.displayZoneText(2, szMesg, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_SCROLL_LEFT); P.addChar('$', degC); RTC.control(DS1307_CLOCK_HALT, DS1307_OFF); RTC.control(DS1307_12H, DS1307_OFF); getTime(szTime); } void loop(void) { P.setIntensity(contrast); NewStateOfbuttonA = digitalRead(3); NewStateOfbuttonB = digitalRead(4); NewStateOfbuttonC = digitalRead(5); buttonAisPressed(); buttonBisPressed(); buttonCisPressed(); if (buttonA) { if (Mode == 0 ) { buttonA = false; contrast++; if (contrast >= 51 ) { contrast = 50; } } else if (Mode == 1 ) { buttonA = false; Mode = 0; } else if (Mode == 2 ) { buttonA = false; RTC.h++; if (RTC.h >= 24 ) { RTC.h = 0; } RTC.writeTime(); } else if (Mode == 3 ) { buttonA = false; RTC.m++; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 478 if (RTC.m >= 60 ) { RTC.m = 0; } RTC.writeTime(); } else if (Mode == 4 ) { buttonA = false; RTC.s = 0; RTC.writeTime(); } else if (Mode == 5 ) { buttonA = false; RTC.dow++; if (RTC.dow >= 8 ) { RTC.dow = 1; } RTC.writeTime(); P.displayReset(2); } else if (Mode == 6 ) { buttonA = false; RTC.dd++; if (RTC.dd >= 32 ) { RTC.dd = 1; } RTC.writeTime(); } else if (Mode == 7 ) { buttonA = false; RTC.mm++; if (RTC.mm >= 13 ) { RTC.mm = 1; } RTC.writeTime(); } else if (Mode == 8 ) { buttonA = false; RTC.yyyy++; if (RTC.yyyy >= 2035 ) { RTC.yyyy = 2015; } RTC.writeTime(); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 479 } } else if (buttonB) { buttonB = false; Mode++; P.displayReset(2); if (Mode >= 9 ) { Mode = 0; } } if (buttonC) { if (Mode == 0 ) { buttonC = false; contrast--; if (contrast <= 0 ) { contrast = 0; } } else if (Mode == 1 ) { buttonC = false; Mode = 0; } else if (Mode == 2 ) { buttonC = false; RTC.h--; if (RTC.h <= 0 ) { RTC.h = 23; } RTC.writeTime(); } else if (Mode == 3 ) { buttonC = false; RTC.m--; if (RTC.m <= 0 ) { RTC.m = 59; } RTC.writeTime(); } else if (Mode == 4 ) { buttonC = false; RTC.s = 0; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 480 RTC.writeTime(); } else if (Mode == 5 ) { buttonC = false; RTC.dow--; if (RTC.dow <= 0 ) { RTC.dow = 7; } RTC.writeTime(); P.displayReset(2); } else if (Mode == 6 ) { buttonC = false; RTC.dd--; if (RTC.dd <= 0 ) { RTC.dd = 31; } RTC.writeTime(); } else if (Mode == 7 ) { buttonC = false; } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 481 21. Thiết kế mô hình hẹn giờ bật tắt thiết bị điện sử dụng module DS3231 và arduino. Mục tiêu: Thiết kế mô hình hẹn giờ bật tắt thiết bị điện sử dụng module DS3231 và arduino hiển thị lên màn hình LCD. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 module ds3231. 1 module Relay 5Vdc. 3 nút nhấn 4 chân. 1 màn hình LCD 16X02 + I2C. 1 bóng đèn DC12V hoặc bóng led. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 482 Arduino I2C for LCD DS3231 RELAY GND GND (--) GND DC (-) 5V A4 VCC SDA VCC SDA DC+ A5 8 SCL SCL NÚT NHẤN IN(S) 10 11 12 N1 N2 N3 Code chương trình: https://drive.google.com/open?id=1FuG1ra_OMJ-9AgYCIwovOHT23rVv-uL5 #include <Wire.h> // Thư viện I2C #include<EEPROM.h> // Thư viện EEPROM #include <DS3231.h> // Thư viện DS3231 #include <LiquidCrystal_I2C.h> DS3231 clock; RTCDateTime dt; LiquidCrystal_I2C lcd(0x27,16,2); // Địa chỉ I2C int temp,inc,hours1,minut,add=11; int next=10; // Nút nhân 1 int INC=11; // Nút nhân 2 int set_mad=12; // Nút nhân 3 #define den 8 // relay nối với chân số 8 int HOUR,MINUT,SECOND; void setup() { Serial.begin(9600); // tốc độ baud 9600 Wire.begin(); clock.begin(); lcd.backlight(); lcd.begin(16,2); lcd.init(); pinMode(INC, INPUT); // biến INC được khai báo là chân vào pinMode(next, INPUT); pinMode(set_mad, INPUT); pinMode(den, OUTPUT); digitalWrite(den, HIGH); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 483 digitalWrite(next, HIGH); digitalWrite(set_mad, HIGH); digitalWrite(INC, HIGH); lcd.setCursor(0,0); lcd.print("CAI DAT GIO"); lcd.setCursor(0,1); lcd.print("Circuit Digest "); delay(2000); clock.setDateTime(__DATE__, __TIME__);// lưu ý dòng này nạp code lần đầu như //code này, sau đó nạp lại 1 lần nữa nhưng bỏ dòng này đi } void loop() { dt = clock.getDateTime(); int temp=0,val=1,temp4; if(digitalRead(set_mad) == 0) // set thời gian tắt thiết bị { lcd.setCursor(0,0); lcd.print(" Set Alarm "); delay(2000); defualt(); time(); delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(" THOI GIAN NGAT "); lcd.setCursor(0,1); lcd.print(" DA SAN SANG "); delay(2000); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Time:"); lcd.setCursor(6,0); lcd.print(HOUR= dt.hour); lcd.print(":"); lcd.print(MINUT= dt.minute); lcd.print(":"); lcd.print(SECOND= dt.second); lcd.setCursor(0,1); lcd.print("Date: "); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 484 lcd.print( dt.day); lcd.print("/"); lcd.print( dt.month); lcd.print("/"); lcd.print( dt.year); match(); delay(200); } void defualt() { lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); } void time() { int temp=1,minuts=0,hours=0,seconds=0; while(temp==1) { if(digitalRead(INC)==0) { HOUR++; if(HOUR==24) { HOUR=0; } while(digitalRead(INC)==0); } lcd.clear(); lcd.setCursor(0,0); lcd.print("Set Alarm Time "); //lcd.print(x); lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); delay(100); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 485 if(digitalRead(next)==0) { hours1=HOUR; EEPROM.write(add++,hours1); temp=2; while(digitalRead(next)==0); } } while(temp==2) { if(digitalRead(INC)==0) { MINUT++; if(MINUT==60) {MINUT=0;} while(digitalRead(INC)==0); } // lcd.clear(); lcd.setCursor(0,1); lcd.print(HOUR); lcd.print(":"); lcd.print(MINUT); lcd.print(":"); lcd.print(SECOND); delay(100); if(digitalRead(next)==0) { minut=MINUT; EEPROM.write(add++, minut); temp=0; while(digitalRead(next)==0); } } delay(1000); } void match() { int tem[23]; for(int i=11;i<23;i++) { tem[i]=EEPROM.read(i); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 486 } if(HOUR == tem[11] && MINUT == tem[12]) // Kiểm tra giờ và phút hiện tại // có bằng giờ và phút cài chưa để tắt thiết bị điện { beep(); } } void beep() { digitalWrite(den, LOW); } Hình ảnh thực tế: 22. Thiết kế mô hình cài đặt và hiển thị nhiệt độ sử dụng cảm biến PT100 và board arduino. Mục tiêu: Thiết kế mô hình cài đặt và hiển thị nhiệt độ sử dụng cảm biến PT100 và board arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 487 Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 breadboard. 1 module PT100. 1 module Relay 5Vdc. 2 nút nhấn 4 chân. 2 điện trở 10k. 1 màn hình LCD 16X02 + I2C. 1 bóng đèn DC12V hoặc bóng led. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 488 Arduino I2C for LCD PT100 RELAY GND GND (--) GND DC (-) 5V A4 VCC SDA VCC DC+ A5 A0 SCL NÚT NHẤN S 8 4 5 8 N1 N2 Code chương trình: https://drive.google.com/file/d/1JXbzdO5uGwVINNNTUjdgxtkCypM16j-z/view #include <Wire.h> #include <LiquidCrystal_I2C.h> // Thƣ viện i2c cho lcd LiquidCrystal_I2C lcd(0x27,16,2); //đại chỉ i2c 0x27 unsigned long time1 = 0; const int analogInPin = A0; // chân tín hiệu của pt100 nối với chân A0 const int SensorValueLow = 463; const int SensorValueDiff = 36; const int TempValueDiff = 42; const int TempValueLow = 9; int sensorValue = 0; double Temp = 0; #define minTempC 0 #define maxTempC 150 #define startTempC 29 // giá trị nhiệt độ cài ban đầu float setTempC; #define buttonDN 5 // chân nút nhấn 1 nối chân số 4 #define buttonUP 4 // chân nút nhấn 2 nối chân số 5 #define role 8 // chân relay nối chân số 8 #define coi 3 byte degree[8] = { // dòng này để hiển thị kí tự độ C 0B01110, 0B01010, 0B01110, 0B00000, 0B00000, Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 489 0B00000, 0B00000, 0B00000 }; void setup() { Serial.begin(9600); pinMode(buttonDN, INPUT_PULLUP); pinMode(buttonUP, INPUT_PULLUP); pinMode(role, OUTPUT); //chân kích tắt mở relay pinMode(coi, OUTPUT); //còi báo digitalWrite(coi,HIGH); setTempC = startTempC; } void loop() { sensorValue = analogRead(analogInPin); Temp = sensorValue-SensorValueLow; Temp = Temp/SensorValueDiff; Temp = Temp*TempValueDiff; Temp = Temp+TempValueLow; Temp = Temp - 32; setTemperature(); setHeater(); displayLCD(); } void displayLCD(){ lcd.init(); // khởi động lcd lcd.backlight();// bật tắt màn hình LCD lcd.clear(); lcd.home (); Serial.print("C = "); Serial.println(Temp); lcd.setCursor(0,0); lcd.print("NHIET DO: "); lcd.setCursor(10,0); lcd.print(Temp); lcd.print(""); lcd.write(1); lcd.print("C"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 490 lcd.setCursor(0,1); lcd.print("CAI : "); lcd.setCursor(5,1); lcd.print(round(setTempC)); lcd.print(""); lcd.write(1); lcd.print("C"); lcd.createChar(1, degree); } void setTemperature() { if (digitalRead(buttonDN)==HIGH){ // Trường hợp nút nhấn được nhấn setTempC++; // tăng giá trị cài lên 1 đơn vị if(setTempC < minTempC) setTempC = minTempC; } if (digitalRead(buttonUP)==HIGH){ setTempC--;// giảm giá trị cài lên 1 đơn vị if(setTempC > maxTempC) setTempC = maxTempC; } } void setHeater() { if ((setTempC) > (Temp + 0.5 ) ) { digitalWrite(role, LOW); lcd.setCursor(11,1); lcd.print("DONG"); //delay(10000); } else if ((setTempC) <= (Temp - 0.5)){ digitalWrite(role, HIGH); //digitalWrite(coi, LOW); beep(); lcd.setCursor(11,1); lcd.print("NGAT"); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 491 } void beep() { // còi kêu khi nhiệt độ cài nhỏ hơn nhiệt độ hiện tại digitalWrite(coi, LOW); delay(800); digitalWrite(coi, HIGH); delay(800); } Hình ảnh thực tế: 23. Thiết kế mô hình hiển thị giờ lên màn hình LCD 16X02 chữ lớn không sử module thời gian thực. Mục tiêu: Thiết kế mô hình hiển thị giờ lên màn hình LCD 16x02 chữ lớn không sử dụng module thời gian thực. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 492 Dây cắm test board. 1 breadboard. 3 nút nhấn 4 chân. 3 điện trở 10 K. 1 màn hình LCD 16X02 + I2C. Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/1tM17LmEDlNicUrqmBby5ahCli2Pf0dLs/view #include <Wire.h> #include <LiquidCrystal_I2C.h> // Thư viện i2c cho lcd LiquidCrystal_I2C lcd(0x27,16,2); // địa chỉ i2c 0x27 hoặc 0x3f int s,m,h,a,d,state,state1,state2,dg,cnt; void setup() { lcd.init(); // khởi động i2c lcd lcd.backlight(); // bat tat man hinh lcd // gán cho mỗi phân đoạn là 1 số ghi lcd.createChar(1,bar1); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 493 lcd.createChar(2,bar2); lcd.createChar(3,bar3); lcd.createChar(4,bar4); lcd.createChar(5,bar5); lcd.createChar(6,bar6); lcd.createChar(7,bar7); lcd.createChar(8,bar8); state=1; state1=1; state2=1; pinMode(8,INPUT); pinMode(9,INPUT); pinMode(10,INPUT); s=0; m=0; h=0; a=0; } void custom0(int col) { //sử dụng các phân đoạn để hiên thị số 0 lcd.setCursor(col, 0); lcd.write(2); lcd.write(8); lcd.write(1); lcd.setCursor(col, 1); lcd.write(2); lcd.write(6); lcd.write(1); } void custom1(int col) { lcd.setCursor(col,0); lcd.write(32); lcd.write(32); lcd.write(1); lcd.setCursor(col,1); lcd.write(32); lcd.write(32); lcd.write(1); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 494 void custom2(int col) { lcd.setCursor(col,0); lcd.write(5); lcd.write(3); lcd.write(1); lcd.setCursor(col, 1); lcd.write(2); lcd.write(6); lcd.write(6); } void custom3(int col) { lcd.setCursor(col,0); lcd.write(5); lcd.write(3); lcd.write(1); lcd.setCursor(col, 1); lcd.write(7); lcd.write(6); lcd.write(1); } void custom4(int col) { lcd.setCursor(col,0); lcd.write(2); lcd.write(6); lcd.write(1); lcd.setCursor(col, 1); lcd.write(32); lcd.write(32); lcd.write(1); } void custom5(int col) { lcd.setCursor(col,0); lcd.write(2); lcd.write(3); lcd.write(4); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 495 lcd.setCursor(col, 1); lcd.write(7); lcd.write(6); lcd.write(1); } void custom6(int col) { lcd.setCursor(col,0); lcd.write(2); lcd.write(3); lcd.write(4); lcd.setCursor(col, 1); lcd.write(2); lcd.write(6); lcd.write(1); } void custom7(int col) { lcd.setCursor(col,0); lcd.write(2); lcd.write(8); lcd.write(1); lcd.setCursor(col, 1); lcd.write(32); lcd.write(32); lcd.write(1); } void custom8(int col) { lcd.setCursor(col, 0); lcd.write(2); lcd.write(3); lcd.write(1); lcd.setCursor(col, 1); lcd.write(2); lcd.write(6); lcd.write(1); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 496 void loop() { if(digitalRead(8)&&state==1){// chuyển qua chế độ chỉnh lại giờ phút cnt++; state=0; if(cnt>3){ cnt=0; } }else if(!digitalRead(8)&&state==0){ state=1; } if(digitalRead(9)&&state1==1){ // tăng giờ hoặc phút dg=1; state1=0; }else if(!digitalRead(9)&&state1==0){ state1=1; } if(digitalRead(10)&&state2==1){// // giảm giờ hoặc phút dg=-1; state2=0; }else if(!digitalRead(10)&state2==0){ state2=1; } d=m%10; printNumber(d, 10); d=m/10; printNumber(d, 7); lcd.setCursor(14, 0); if(a){ // nếu a lớn hớn 0 lcd.print("AM"); }else{ lcd.print("PM"); } if(cnt==0){ s++; lcd.setCursor(6, 0); lcd.print(" "); lcd.setCursor(6, 1); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 497 lcd.print(" "); delay(500); lcd.setCursor(6, 0); lcd.print("."); lcd.setCursor(6, 1); lcd.print("."); delay(500); } } Hình ảnh thực tế: 24. Thiết kế mô hình bật tắt thiết bị điện bằng máy tính thông qua phần mền processing và arduino. Mục tiêu: Thiết kế mô hình bật tắt thiết bị điện bằng máy tính thông qua phần mền processing và arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Cài đặt phần mền processing: https://processing.org/download/ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 498 Phần cứng cần chuẩn bị: 1 board arduino. Dây cắm test board. 1 module relay 5vdc 1 kênh mức cao. Lắp mạch nguyên lý: Code cho arduino: https://drive.google.com/open?id=1a-6G1jfviXPpGtS_ApRg7J4pyIu6m7wF void setup() { pinMode(8, OUTPUT); // den pinMode(9, OUTPUT); // quạt pinMode(10, OUTPUT); //tivi Serial.begin(9600); } void loop(){ if(Serial.available()){ //chờ tín hiệu đƣợc gửi đến serial char val = Serial.read(); if(val == 'd'){ //if d digitalWrite(8, HIGH); //turn on dèn } if(val == 'q'){ //if q Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 499 digitalWrite(9, HIGH); //turn on quat } if(val == 't'){ //if t digitalWrite(10, HIGH); //turn on tivi } if(val == 'f'){ //if f digitalWrite(8, LOW); //turn off all led digitalWrite(9, LOW); digitalWrite(10, LOW); } } } Code cho processing: https://www.youtube.com/watch?v=trVfFPGALwk&list=PLHPjOX8mt4YHDi1CKfCdajzDtOJfGwZx&index=28 Sau khi cài đặt phần mền processing các bạn mở file code lên. import controlP5.*; //các bạn cần phai add thƣ viện controlP5 import processing.serial.*; Serial port; ControlP5 cp5; PFont font; void setup(){ size(300, 450); //Kích thƣớc giao diện rộng và cao printArray(Serial.list()); port = new Serial(this, "COM23", 9600); // các bạn cần chú ý đến cổng COM thay cho đúng nhé cp5 = new ControlP5(this); font = createFont("calibri light bold", 20); cp5.addButton("QUAT") //"QUẠT" is the name of button .setPosition(100, 50) .setSize(120, 70) //(width, height) .setFont(font); cp5.addButton("DEN") //"ĐÈN" is the name of button .setPosition(100, 150) .setSize(120, 70) //(width, height) .setFont(font) ; cp5.addButton("TIVI") //"TIVI" is the name of button .setPosition(100, 250) .setSize(120, 70) //(width, height) .setFont(font) ; cp5.addButton("ALLOFF") //"alloff" is the name of button .setPosition(100, 350) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 500 .setSize(120, 70) .setFont(font) ; //(width, height) } void draw(){ //same as loop in arduino background(100, 0 , 0); //lets give title to our window fill(0, 255, 0); //chỉnh màu text (r, g, b) textFont(font); text("ĐIỀU KHIỂN THIẾT BỊ ĐIỆN", 20, 30); // ("text", x coordinate, y coordinat) } void QUAT(){ port.write('d'); } void DEN(){ port.write('q'); } void TIVI(){ port.write('t'); } void ALLOFF(){ port.write('f'); } Trƣớc khi sử dụng code này ta phải mở phần mền processing lên và cần cài thƣ viện controlP5 và phần mền processing. Sketch import Library Add Library Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 501 Và chúng ta lƣu ý trƣớc khi chạy file code của processing các bạn phải chọn cổng COM cho đúng nhé ( cổng COM mà board arduino đang kết nối với máy tính ). Và chọn vào dấu tam giác để chạy ra giao diện điều khiển. Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 502 25. Thiết kế mô hình xe robot 4 bánh điều khiển bằng sóng RF thông qua module RF24L01 và board arduino. Mục tiêu: Thiết kế mô hình xe robot 4 bánh điều khiển bằng sóng RF thông qua module RF24L01 và board arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 2 board arduino uno hoặc nano,... Dây cắm test board. 1 module JoyStick. 2 module RF24L01. 1 đế 3 pin 3.7 V mắc nối tiếp. 3 pin 3.7 V. 1 module L298N. 1 khung xe 4 bánh. 1 pin 9V. 1 Jack pin 9V. Lắp mạch nguyên lý phần phát: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 503 Lắp mạch nguyên lý phần thu: Arduino NRF24L01 L298N GND GND (--) GND 3.3V 5V VCC 9 8 CSN CE 11 12 13 3 5 2 4 6 7 MOSI MISO SCK 5V+ ENA ENB IN1 IN2 IN3 IN4 12+ ( Pin ) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 504 Code cho phần phát: https://drive.google.com/open?id=1a-6G1jfviXPpGtS_ApRg7J4pyIu6m7wF Trƣớc khi upload các bạn cần add thƣ viện NRF24L01 vào phần mền IDE nhé kèm theo trong file code. #include <SPI.h> // thư viện chuẩn SPI #include <nRF24L01.h> #include <RF24.h> // Thu viện RF24L01 RF24 radio(8,9); // CE, CSN const byte address[6] = "00001";// địa chỉ char xyData[32] = ""; String xAxis, yAxis; void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); } void loop() { xAxis = analogRead(A1); // đọc giá trị analoag trục x của joystick yAxis = analogRead(A0); // đọc giá trị analoag trục y của joystick // gửi giá trị analog của trục x xAxis.toCharArray(xyData, 5); radio.write(&xyData, sizeof(xyData)); // gửi giá trị analog của trục y yAxis.toCharArray(xyData, 5); radio.write(&xyData, sizeof(xyData)); delay(20); } Code cho phần thu: #include <SPI.h> // thư viện chuẩn giao tiếp SPI #include <nRF24L01.h> #include <RF24.h> // Thư viện nrf24l01 #define enA 3 // chân ena nối với chân số 3 của arduino #define in1 2 // chân in1 nối với chân số 2 của arduino #define in2 4 // chân in2 nối với chân số 4 của arduino #define enB 5 // chân enb nối với chân số 5 của arduino #define in3 6 // chân in3 nối với chân số 6 của arduino #define in4 7 // chân in4 nối với chân số 7 của arduino Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 505 RF24 radio(8, 9); // CE, CSN const byte address[6] = "00001"; // địa chỉ rf char receivedData[32] = ""; int xAxis, yAxis; int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { radio.read(&receivedData, sizeof(receivedData)); // đọc dữ liệu mà mạch phát gửi tới xAxis = atoi(&receivedData[0]); // chuyển đổi dữ liệu sang dạng số nguyên (trục x) delay(10); radio.read(&receivedData, sizeof(receivedData)); yAxis = atoi(&receivedData[0]);// chuyển đổi dữ liệu sang dạng số nguyên (trục y) delay(10); } if (yAxis < 460) { // xe chạy lùi khi y < 460 digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); motorSpeedA = map(yAxis, 460, 0, 0, 255);// chuyển đổi giá trị analog trục y của joy gửi về tƣơng ứng với tốc độ độ của động cơ ( 460 -- 0 ; 0---- 255) motorSpeedB = map(yAxis, 460, 0, 0, 255); } else if (yAxis > 550) { // xe chạy tiến digitalWrite(in1, LOW); digitalWrite(in2, HIGH); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 506 digitalWrite(in3, LOW); digitalWrite(in4, HIGH); motorSpeedA = map(yAxis, 550, 1023, 0, 255); motorSpeedB = map(yAxis, 550, 1023, 0, 255); } else { motorSpeedA = 0; motorSpeedB = 0; } if (xAxis < 460) { // chuyển đổi giá trị analog trục x của joy gửi về tương ứng với tốc độ độ của động cơ ( 470 -- 0 ; 0---- 255) int xMapped = map(xAxis, 460, 0, 0, 255); // xe rẻ trái motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } } if (xAxis > 550) { // chuyển đổi giá trị analog trục x của joy gửi về tương ứng với tốc độ độ của động cơ ( 550-----1023 ; 0---- 255) int xMapped = map(xAxis, 550, 1023, 0, 255); // xe rẻ phải motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } } if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 507 } analogWrite(enA, motorSpeedA); analogWrite(enB, motorSpeedB); } Hình ảnh thực tế: 26. Thiết kế mô hình xe robot 3 bánh dò line và tránh vật cản sử dụng board arduino. Mục tiêu: Thiết kế mô hình xe robot 3 bánh dò line và tránh vật cản sử dụng board arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino uno hoặc nano,... Dây cắm test board. 1 module cảm biến khoảng cách SRF05. 3 module cảm biến dò line. 1 đế 3 pin 3.7 V mắc nối tiếp. 3 pin 3.7 V. 1 module L298N. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 508 Lắp mạch nguyên lý: Arduino L298N GND GND (--) 5V ENA 5+ 5 ENB IN1 6 3 IN2 IN3 IN4 11 12 4 7 8 Cảm biến khoảng cách(SRF05) GND CB dò line VCC VCC GND (-) Trig Echo OUTL OUTS OUTR Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 509 Code chương trình: https://drive.google.com/open?id=13-dbSzfZrSZNO0lV6SLxOPYJOidD5Ezn int stop_distance = 12;// Khoảng cách phát hiện vật cản //Kết nối SRF 05 OR 04 const int trigPin = 11; // kết nối chân trig với chân 11 arduino const int echoPin = 12; // kết nối chân echo với chân 12 arduino //L298 kết nối arduino const int motorA1 = 3; // kết nối chân IN1 với chân 3 arduino const int motorA2 = 4; // kết nối chân IN2 với chân 4 arduino const int motorAspeed = 5; // kết nối chân ENA với chân 5 arduino const int motorB1 = 7; // kết nối chân IN3 với chân 7 arduino const int motorB2 = 8; // kết nối chân IN4 với chân 8 arduino const int motorBspeed =6; // kết nối chân ENB với chân 6 arduino //kết nối của 3 cảm biến hồng ngoại (dò line ) const int L_S =9; // cb dò line trái const int S_S =2; // cb dò line giữa const int R_S =10; //cb dò line phải int left_sensor_state;// biến lƣu cảm biến hồng ngoại line trái int s_sensor_state; // biến lƣu cảm biến hồng ngoại line giữa int right_sensor_state;// biến lƣu cảm biến hồng ngoại line phải long duration; // int distance; // biến khoảng cách void setup() { pinMode(L_S,INPUT); // chân cảm biến khai báo là đầu vào pinMode(R_S,INPUT); pinMode(S_S,INPUT); pinMode(motorA1, OUTPUT); pinMode(motorA2, OUTPUT); pinMode(motorB1, OUTPUT); pinMode(motorB2, OUTPUT); pinMode(motorAspeed, OUTPUT); pinMode(motorBspeed, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); analogWrite(motorAspeed, 120); // tốc độ động cơ a ban đầu 120 ( 0 - 255) analogWrite(motorBspeed, 120);// tốc độ động cơ b ban đầu 120 ( 0 - 255) delay(3000); } void loop() { digitalWrite(trigPin, LOW); delayMicroseconds(2); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 510 digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance= duration*0.034/2; Serial.print("Distance: "); Serial.println(distance); left_sensor_state = digitalRead(L_S); s_sensor_state = digitalRead(S_S); right_sensor_state = digitalRead(R_S); if ((digitalRead(L_S) == 0)&&(digitalRead(S_S) == 1)&&(digitalRead(R_S) == 0)){forword();}// đi tiến if ((digitalRead(L_S) == 1)&&(digitalRead(S_S) == 1)&&(digitalRead(R_S) == 0)){turnLeft();} // rẻ trái if ((digitalRead(L_S) == 1)&&(digitalRead(S_S) ==0)&&(digitalRead(R_S) == 0)) {turnLeft();} // rẻ trái if ((digitalRead(L_S) == 0)&&(digitalRead(S_S) == 1)&&(digitalRead(R_S) == 1)){turnRight();} // rẻ phải if ((digitalRead(L_S) == 0)&&(digitalRead(S_S) == 0)&&(digitalRead(R_S) == 1)){turnRight();}// rẻ phải if ((digitalRead(L_S) == 1)&&(digitalRead(S_S) == 1)&&(digitalRead(R_S) == 1)){Stop();} // stop if(distance < stop_distance) // nếu khoảng cách nhỏ hơn giới hạn { digitalWrite (motorA1,HIGH);// cho xe robot chạy lùi 1 đoạn digitalWrite(motorA2,LOW); digitalWrite (motorB1,LOW); digitalWrite(motorB2,HIGH); delay(200); analogWrite (motorAspeed, 0); analogWrite (motorBspeed, 0); delay(200); digitalWrite (motorA1,HIGH);// cho xe robot re phai digitalWrite(motorA2,LOW); digitalWrite (motorB1,HIGH); digitalWrite(motorB2,LOW); analogWrite (motorAspeed, 90); analogWrite (motorBspeed, 90); delay(400); digitalWrite (motorA1,LOW); //cho xe robot ĐI THẲNG1 1 đoạn digitalWrite(motorA2,HIGH); digitalWrite (motorB1,HIGH); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 511 digitalWrite(motorB2,LOW); analogWrite (motorAspeed, 90); analogWrite (motorBspeed, 90); delay(600); digitalWrite (motorA1,LOW);// cho xe robot re trái 1 đoạn có thể thay đổi digitalWrite(motorA2,HIGH); digitalWrite (motorB1,LOW); digitalWrite(motorB2,LOW); analogWrite (motorAspeed, 110); analogWrite (motorBspeed, 110); delay(1000); /////////////////// digitalWrite (motorA1,LOW); //cho xe robot ĐI THẲNG digitalWrite(motorA2,HIGH); digitalWrite (motorB1,HIGH); digitalWrite(motorB2,LOW); analogWrite (motorAspeed, 100); analogWrite (motorBspeed, 100); delay(300); //////////////////////// digitalWrite (motorA1,LOW); //cho xe robot rẻ trái digitalWrite(motorA2,HIGH); digitalWrite (motorB1,LOW); digitalWrite(motorB2,LOW); analogWrite (motorAspeed, 100); analogWrite (motorBspeed, 100); delay(500); digitalWrite (motorA1,LOW); //cho xe robot ĐI THẲNG digitalWrite(motorA2,HIGH); digitalWrite (motorB1,HIGH); digitalWrite(motorB2,LOW); analogWrite (motorAspeed, 90); analogWrite (motorBspeed, 90); while(left_sensor_state == LOW){ left_sensor_state = digitalRead(L_S); s_sensor_state = digitalRead(S_S); right_sensor_state = digitalRead(R_S); Serial.println("in the first while"); } } } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 512 void forword(){ // chương trình con xe robot đi tiến digitalWrite (motorA1,LOW); digitalWrite(motorA2,HIGH); digitalWrite (motorB1,HIGH); digitalWrite(motorB2,LOW); } void turnRight(){ digitalWrite (motorA1,LOW); digitalWrite(motorA2,LOW); digitalWrite (motorB1,HIGH); digitalWrite(motorB2,LOW); } void turnLeft(){ digitalWrite (motorA1,LOW); digitalWrite(motorA2,HIGH); digitalWrite (motorB1,LOW); digitalWrite(motorB2,LOW); } void Stop(){ digitalWrite (motorA1,LOW); digitalWrite(motorA2,LOW); digitalWrite (motorB1,LOW); digitalWrite(motorB2,LOW); } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 513 27. Thiết kế mô hình truyền dữ liệu cảm biến qua máy tính thông qua giao tiếp MODBUS RTU . Mục tiêu: Thiết kế mô hình truyền dữ liệu cảm biến qua máy tính thông qua chuẩn MODBUS RTU sử dụng đƣờng truyền RS 485. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Cài đặt phần mền hổ trợ Modbus slave. https://www.modbustools.com/download.html Phần cứng cần chuẩn bị: 1 board arduino uno hoặc nano,... Dây cắm test board và 1 breadboard. 1 module LCD 16x02 và 1 I2C for LCD.. 1 module cảm biến dò line. 1 module cảm biến độ ẩm đất. 1 module RS 485. 1 module USB to RS – 485. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 514 Code chương trình: https://drive.google.com/open?id=1Cc5BHu2lC05RtE73LJb7kafJuxBvf3tx #include <ModbusMaster.h> //thư viện modbus #include <Wire.h> // thư viện i2c để hiển thị LCD #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // địa chỉ i2c lcd là 0x27 #define DE 3 // chân DE được nối với chân số 3 arduino #define RE 2 // chân RE được nối với chân số 2 arduino ModbusMaster node; void preTransmission() { digitalWrite(RE, 1); //Đưa chân RE lên mức cao digitalWrite(DE, 1); // Đưa chân DE lên mức cao } void postTransmission() { digitalWrite(RE, 0); digitalWrite(DE, 0); } void setup() { lcd.init(); lcd.backlight();// bật tắt màn hình LCD lcd.print("Arduino VN"); delay(3000); lcd.clear(); lcd.print(""); lcd.setCursor(0,1); lcd.print("Giao tiep Modbus"); delay(3000); lcd.clear(); pinMode(RE, OUTPUT); pinMode(DE, OUTPUT); pinMode(4,INPUT);// Chân cảm biến hồng ngoại được nối với chân số 4 arduino digitalWrite(RE, 0);//Đưa chân RE xuống mức thấp digitalWrite(DE, 0);//Đưa chân DE xuống mức thấp Serial.begin(115200); //tốc độ baud 115200 Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 515 node.begin(1, Serial); //Slave có ID là 1 node.preTransmission(preTransmission); node.postTransmission(postTransmission); } void loop() { float value = analogRead(A0);// Gán giá trị cb độ ẩm đất cho biến value node.writeSingleRegister(0x40000,value); // lưu giá trị cảm biến đó vào thanh ghi có địa chỉ 0x40000 lcd.setCursor(0,0); lcd.print("GTCBD :"); lcd.print(value); int gtcb= digitalRead(4); // đọc giá trị cảm biến hồng ngoại lưu vào biến gtcb if (gtcb == 1) { node.writeSingleRegister(0x40001,1);// lưu giá trị cảm biến đó vào thanh ghi có địa chỉ 0x40001 lcd.setCursor(0,1); lcd.print("CBHN: 1"); } else { node.writeSingleRegister(0x40001,0); // lưu giá trị cảm biến đó vào thanh ghi có địa chỉ 0x40001 lcd.setCursor(0,1); lcd.print("CBHN: 0"); } } Sau khi các bạn upload chƣơng trình cho board arduino các bạn mở phần mền Modbus RTU lên: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 516 Tiếp đến ta chọn vào mục Connection connect Register later: Các bạn có thể xem video hƣớng dẫn tại link dƣới nhé: https://www.youtube.com/watch?v=RK8c6305zmU& Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 517 28. Thiết kế mô hình đo dòng điện AC/DC sử dụng module ACS712 và board arduino . Mục tiêu: Thiết kế mô hình đo dòng điện AC/DC sử dụng module ACS712 và board arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino uno hoặc nano,... Dây cắm test board và 1 breadboard. 1 module LCD 16x02 và 1 I2C for LCD.. 1 module ACS 712. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 518 Code chương trình: https://drive.google.com/open?id=1J4bzGVP3vwVRqDv1yiXqh6GktS-3Por0 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); float hesodc= 0.063; // he so mv/A của dòng điện dc float hesoac = 0.055; // he so mv/A của dòng điện ac int vonglap = 100; //số vòng lặp const int chancongtac = 7; int gtct = 0; void setup() { Serial.begin(9600); lcd.init(); lcd.backlight(); pinMode(chancongtac, INPUT); // chan cong tac de chon che do do dong AC/DC digitalWrite(chancongtac, HIGH); // ban dau ta gán giá trị công tắc ở mức cao chucnang(); } void chucnang() { lcd.clear(); lcd.setCursor(4,0); lcd.print("DO DONG DIEN"); } void loop() { gtct = digitalRead(chancongtac); delay(200); if (gtct == HIGH) { float volt; float dongdct = 0; for (int i = 0; i < vonglap; i++) { volt = analogRead(A0) * 5.0 / 1023.0; dongdct += (volt - 2.4955) /hesodc; } float dongdc = (dongdct / vonglap); if ( (dongdc < 0.100) && (dongdc > -0.100) ) { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 519 lcd.clear(); lcd.setCursor(1,0); lcd.print("DO DONG DIEN"); lcd.setCursor(6,1); lcd.print("DC"); delay(1000); } else { lcd.clear(); lcd.setCursor(1,0); lcd.print("DO DONG DC"); lcd.setCursor(0,1); lcd.print("I= "); lcd.print(dongdc,3); Serial.println( dongdc); lcd.print(" A"); delay(1000); } } else //Pulsador { float volt; float get_corriente(); float dongact=get_corriente();//dong dien ac float dongac=dongact*0.707; float congsuat=dongac*221.2; // cong suat dien ac if ( (dongact < 0.100) && (dongact > -0.100) ) { lcd.clear(); lcd.setCursor(2,0); lcd.print("DO DONG DIEN"); lcd.setCursor(6,1); lcd.print("AC"); delay(1000); } else { lcd.clear(); lcd.setCursor(0,0); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 520 lcd.print("I= "); lcd.print(dongact,3); lcd.print(" A"); lcd.setCursor(14,0); lcd.print("AC"); lcd.setCursor(0,1); lcd.print("P= "); lcd.print(congsuat,3); lcd.print(" W"); delay(1000); } } } float get_corriente() { float volt; float dongact=0; long tiempo=millis(); float Imax=0; float Imin=0; while(millis()-tiempo<500) { volt = analogRead(A1) * (5.0 / 1023.0);// chuyen doi gia tri analog sang dien ap dongact=0.9*dongact+0.1*((volt-2.4955)/hesoac); //dong dien ac duoc do if(dongact>Imax)Imax=dongact; if(dongact<Imin)Imin=dongact; } return((Imax-Imin)/2); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 521 Hình ảnh thực tế: Các bạn có thể xem video hƣớng dẫn tại đậy: https://www.youtube.com/watch?v=XtYnv1l2dNo 29. Thiết kế mô hình điều khiển độ sáng của đèn led ứng dụng giải thuật PID và sử dụng board arduino . Mục tiêu: Thiết kế mô hình điều khiển độ sáng của led ứng dụng giải thuật PID và board arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino uno hoặc nano,... Dây cắm test board và 1 breadboard. 1 module cảm biến ánh sáng. 1 bóng led đơn 5 li. 1 điện trở 220 Ohm. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 522 Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/open?id=1oPijj0fApEB9VXa8Y7DgKwHqar8VeLz1 #include <PID_v1.h> // thư viện pid double Setpoint ; // điểm đặt double Input; // giá trị đầu vào của cam biến ánh sáng double Output ; // giá trị đầu ra là tín hiệu điều khiển bóng đèn led double Kp=0.5, Ki=10, Kd=0.4; // các thông số kp,ki,kd các bạn có thể thay đổi PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); void setup() { Serial.begin(9600); Setpoint = 240; // giá trị đặt là 240 , giá trị này các bạn có thể thay đổi myPID.SetMode(AUTOMATIC); myPID.SetTunings(Kp, Ki, Kd); } void loop() { Input = map(analogRead(1), 0, 1024, 0, 255); // giá trị chuyển đổi từ 0--1024 tương ứng 0---255 myPID.Compute(); analogWrite(6,Output); //chân điều khiển độ sáng của led. Serial.print(Input); Serial.print(" "); Serial.println(Setpoint); delay(500); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 523 Hình ảnh thực tế: Các bạn có thể xem video hƣớng dẫn tại đậy: https://www.youtube.com/watch?v=nQLftptT664&list=PLHPjOX8mt4YHDi1CKfCdajzDtOJfGwZx&index=34 30. Thiết kế mô hình điều khiển thiết bị điện thông qua giao thức (MQTT) và board NodeMCU. Mục tiêu: Thiết kế mô hình điều khiển thiết bị điện thông qua giao thức (MQTT) và board NodeMCU. MQTT (Message Queuing Telemetry Transport) là một giao thức gởi dạng publish/subscribe sử dụng cho các thiết bị [IoT] với băng thông thấp, độ tin cậy cao và khả năng đƣợc sử dụng trong mạng lƣới không ổn định. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Tạo một tài khoản trên Ubidots: https://industrial.ubidots.com. Cần phải add thƣ viện kèm theo trong file code vào phần mền IDE. Phần cứng cần chuẩn bị: 1 Mạch Node MCU. Dây cắm test board. 1 module Relay 5Vdc. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 524 Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/1bY6mSySriczP3oyHUPQHJHxjPAYLAfyy/view /* * MQTT (Message Queuing Telemetry Transport) là một giao thức gởi dạng publish/subscribe sử dụng cho các thiết bị [IoT] với băng thông thấp, độ tin cậy cao và khả năng đƣợc sử dụng trong mạng lƣới không ổn định. * */ #include "UbidotsMicroESP8266.h" #define DEVICE "control_relay" // Tên mà các bạn đặt ở mục device #define VARIABLE "relay" // tên biến điều khiển #define TOKEN "BBFF-PuMLmLq4yb4Bm9cMOZsCb6UGcJXK9f" // mã token trong mục API sau khi ta đăng tài khoản ở Ubidots #define WIFISSID "Trinh Quang Nam." // tên wifi #define PASSWORD "bubu123789" // pass Ubidots client(TOKEN); float Valor_Temperatura = 0; void setup() { Serial.begin(115200); client.wifiConnection(WIFISSID, PASSWORD); pinMode(5, OUTPUT); // điều khiển relay ở chân số 5 digitalWrite(5, 0); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 525 } void loop() { float Valor_Led = client.getValueWithDevice(DEVICE, VARIABLE); if (Valor_Led != ERROR_VALUE){ Serial.print(F(">>>>>>>>> Bien dieu khien: ")); Serial.println(Valor_Led); }else{ Serial.println(F("Error")); } if (Valor_Led==0.00){digitalWrite(5, 1);}// nếu là nhận giá trị là 0 là tắt relay if (Valor_Led==1.00){digitalWrite(5, 0);}// nếu là nhận giá trị là 1 là bật relay client.sendAll(false); delay(5000); } Cài đặt app trên Ubidots: Sau khi các bạn đã tạo thành công 1 tài khoản trên Ubidots, Các bạn làm theo các bƣớc sau - Trên thanh công cụ: Devices Devices Add new devicesBlank Devices. - Trong mục Blank Devices:Ta đặt tên cho mục Devices name ( ví dụ: control_relay). - Sau khi tạo mục control_relay Add Variable Raw. - Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 526 - Ta đặt tên biến là relay , các bạn có thể đặt tùy ý nhƣng phải sữa code nhé. - Tiếp đến trên thanh công cụ ta chọn mục DATADashboards Add New Dashboards , ta đặt tên tùy úy phần này sẽ không liên quan đến code. - Tiếp đến trong mục Add new widget Swtich Add Variables control_relay relay chọn vào dấu tick. - Xong bƣớc này các bạn có thể điều khiển thiết bị điện thông qua internet. Link video hƣớng dẫn : https://www.youtube.com/watch?v=zkIOdb8Wfpo&list=PLHPjOX8mt4YHDi1CKfCdaj zDtOJfGwZx&index=37 Giao diện sau khi hoàn thành nhƣ trên. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 527 Hình ảnh thực tế: 31. Thiết kế mô hình hiển thị vị trí lên màn hình LCD sử dụng board arduino và GPS neo6. Mục tiêu: Thiết kế mô hình hiển thị vị trí lên màn hình LCD sử dụng board arduino và GPS neo6. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Add thƣ viện GPS vào phần mền IDE, thƣ viện kèm trong file code. Phần cứng cần chuẩn bị: 1 Mạch Arduino. Dây cắm test board. 1 module LCD 16X02. 1 Module I2C cho LCD. 1 Module GPS Neo6,. 1 Ăng ten cho GPS. Lắp mạch nguyên lý: Các bạn lƣu ý mạch GPS này cần để bên ngoài để bắt đƣợc sóng rồi mới đem vô nhé. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 528 Code chương trình: https://drive.google.com/open?id=1Vt1bWYsTKiW3kGtJq2sWI5R6L8Z2QB4h #include <Wire.h> // thư viện i2c #include <LiquidCrystal_I2C.h> #include <SoftwareSerial.h> #include <TinyGPS++.h>// Thư viện gps LiquidCrystal_I2C lcd(0x27,16,2);// địa chỉ I2C float lattitude,longitude; // vi độ , kinh độ SoftwareSerial gpsSerial(8,9);//rx-9,tx -8 TinyGPSPlus gps; void setup(){ Serial.begin(9600); // tốc độ baud lcd.init(); lcd.backlight(); gpsSerial.begin(9600); lcd.print(" GPS "); delay(2000); lcd.clear(); } void loop(){ while(1) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 529 { while (gpsSerial.available() > 0) /// chờ khi nào có tín hiệu của gps { gps.encode(gpsSerial.read()); } if (gps.location.isUpdated()) { Serial.print("LAT="); Serial.println(gps.location.lat(), 6); // in ra màn hình máy tính Vĩ độ Serial.print("LONG="); Serial.println(gps.location.lng(), 6);// in ra màn hình máy tính Kinh độ lattitude=gps.location.lat(); longitude=gps.location.lng(); break; } } Serial.print("LATTITUDE="); Serial.println(lattitude,6); Serial.print("LONGITUDE="); Serial.println(longitude,6); lcd.print("VD ");lcd.print(lattitude,6);// in ra màn hình LCD VĨ ĐỘ lcd.setCursor(0, 1); lcd.print("KD ");lcd.print(longitude,6);// in ra màn hình LCD Kinh ĐỘ } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 530 32. Thiết kế mô hình lọc nhiễu cho cảm biến trong các dự án liên qua đến arduino. Mục tiêu: Thiết kế mô hình lọc nhiễu cho cảm biến trong các dự án liên quan đến arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Add thƣ viện Kalman vào phần mền IDE, thƣ viện kèm trong file code. Phần cứng cần chuẩn bị: 1 Mạch Arduino. Dây cắm test board. 1 module cảm biến độ ẩm đất. Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/1NW7Ub7-rVoFkkkXGxEEjQnzNLnbn7ddq/view #include <SimpleKalmanFilter.h> SimpleKalmanFilter bo_loc(2, 2, 0.001); float e; // nhiễu tự tạo cho thay cho nhiễu bên ngoài tác động vào // khi áp dụng vào thực tiễn các bạn bỏ nhiễu tự tạo này nhé. float s; // giá trị đo được (có thêm nhiễu) Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 531 float s_kalman; // giá trị được lọc nhiễu void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); // lưu giá trị cảm biến độ ẩm đất randomSeed(millis()); e = (float)random(-10, 10); // nhiễu tự điều chỉnh s = sensorValue + e; // giá trị thực tế cộng với nhiễu Serial.print(s); Serial.print(","); s_kalman = bo_loc.updateEstimate(s); // giá trị cảm biến sau khi lọc bởi Kalman Serial.print(s_kalman); Serial.println(); } Sau khi upload code xong chúng ta mở Serial Monitor lên: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 532 Hình ảnh thực tế: Đƣờng màu xanh là tín hiệu cảm biến bị nhiễu còn đƣờng màu đỏ là tín hiệu cảm biến sau khi đƣợc lọc bởi bộ lọc Kalman. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 533 33. Thiết kế mô hình điều khiển thiết bị điện và hiển thị giá trị cảm biến lên internet thông qua giao thức (MQTT) và board NodeMCU. Mục tiêu: Thiết kế mô hình điều khiển thiết bị điện và hiển thị giá trị cảm biến lên internet thông qua giao thức (MQTT) và board NodeMCU. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Tạo một tài khoản trên Ubidots: https://industrial.ubidots.com. Cần phải add thƣ viện kèm theo trong file code vào phần mền IDE. Trong bài 30. Phần cứng cần chuẩn bị: 1 Mạch Node MCU. Dây cắm test board. 1 module Relay 2 kênh 5Vdc. 1 module cảm biến độ ẩm đất. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 534 Code chương trình: https://drive.google.com/open?id=1NLmaul0gxaOGs-8bUeKNrQCviEEBK0_p #include "UbidotsMicroESP8266.h" #define DEVICE "control_relay" // Tên mà các bạn đặt ở mục device #define VARIABLE "relay1" // tên biến điều khiển #define VARIABLE1 "relay2" // tên biến điều khiển #define ID_CB "5dca1e911d84721bcd348591" // id của biến #define TOKEN "BBFF-5CfT7R2cxtNU9GhUP8PtOVN1Jk5S1" // mã token trong mục API sau khi ta đăng tài khoản ở Ubidots #define WIFISSID "Trinh Quang Nam." // tên wifi #define PASSWORD "bubu123789" // pass Ubidots client(TOKEN); int cb = A0; int gtcb = 0; void setup() { Serial.begin(115200); client.wifiConnection(WIFISSID, PASSWORD); pinMode(cb, INPUT); pinMode(5, OUTPUT); // điều khiển relay ở chân số 5 digitalWrite(5, 0); pinMode(16, OUTPUT); // điều khiển relay ở chân số 16 digitalWrite(16, 0); } void loop() { int gtcb = analogRead(cb); float Valor_Led = client.getValueWithDevice(DEVICE, VARIABLE); float Valor_Led1 = client.getValueWithDevice(DEVICE, VARIABLE1); if (Valor_Led != ERROR_VALUE){ Serial.print(F(">>>>>>>>> Bien dieu khien: ")); Serial.println(Valor_Led); }else{ Serial.println(F("Error")); } if (Valor_Led==0.00){digitalWrite(5, 1);}// nếu là nhận giá trị là 0 là tắt relay } if (Valor_Led==1.00){digitalWrite(5, 0);}// nếu là nhận giá trị là 1 là bật relay } if (Valor_Led1==2.00){digitalWrite(16, 1);}// nếu là nhận giá trị là 0 là tắt relay } if (Valor_Led1==3.00){digitalWrite(16, 0);} client.add(ID_CB, gtcb); client.sendAll(false); delay(2000);} Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 535 Cài đặt app trên Ubidots: - Cài đặt giống ở bài số 30, ở bài này chúng ta thêm mục cảm biến độ ẩm đất để hiển thị lên app. Trong mục: Devices Add Variable Raw Đặt tên là CBDOAMDAT nhƣ hình dƣới - Ta copy ID của cảm biến độ ẩm đất thay vào dòng này của file code: #define ID_CB "5dca1e911d84721bcd348591" // id của biến Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 536 - Tiếp đến ta chọn Data Dashboards Phần đóng ngắt relay các bạn làm giống ở bài 30, ở phần này trình bày cách hiển thị giá trị cảm biến. Sau khi click vào dấu + ta chọn mục Gauge Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 537 Tiếp theo ta chọn Add Variables Tiếp theo ta chọn các mục nhƣ hình dƣới: Nhƣ vậy chúng ta đã cài đặt xong app. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 538 Hình ảnh thực tế: 34. Thiết kế mô hình điều khiển đóng ngắt relay bằng SMS thông qua module sim800l và arduino. Mục tiêu: Thiết kế mô hình điều khiển đóng ngắt relay bằng SMS thông qua module sim800l và arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: 1 board arduino . Dây cắm test board. 1 module Relay 1 kênh 5Vdc. 1 module sim800l. 1 module ổn áp L2596 3A. 1bộ nguồn ( 9 – 12V ) 2A trở lên. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 539 Code chương trình: https://drive.google.com/open?id=1gPmRFBUhnHW8LR_fzlp3aVbZF29gcz22 #include <SoftwareSerial.h> SoftwareSerial mySerial(10,11); // tx - 10 ; rx - 11 char incomingByte; String inputString; int relay = 12; //chân kích relay được nối với chân 12 arduino void setup() { pinMode(relay, OUTPUT); //khai báo relay là output digitalWrite(relay, HIGH); //tắt relay Serial.begin(9600); mySerial.begin(9600); while(!mySerial.available()){ mySerial.println("AT"); delay(1000); Serial.println("Connecting..."); // kết nối } Serial.println("Connected!"); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 540 mySerial.println("AT+CMGF=1"); // khởi động chức năng SMS delay(1000); mySerial.println("AT+CNMI=1,2,0,0,0"); delay(1000); mySerial.println("AT+CMGL=\"REC UNREAD\""); // đọc tin nhắn } void loop() { if(mySerial.available()){ delay(100); // Serial Buffer while(mySerial.available()){ incomingByte = mySerial.read(); inputString += incomingByte; } delay(10); Serial.println(inputString); inputString.toUpperCase(); if (inputString.indexOf("OFF") > -1){ digitalWrite(relay, HIGH);// kích mức thấp tƣơng úng HIGH } if (inputString.indexOf("ON") > -1){ digitalWrite(relay, LOW);// kích mức thấp tƣơng úng LOW } delay(50); //Delete Messages if (inputString.indexOf("OK") == -1){ mySerial.println("AT+CMGDA=\"DEL ALL\""); delay(1000);} inputString = ""; } } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 541 35. Thiết kế mô hình điều khiển đóng ngắt relay thông qua Webserver sử dụng board ESP32. Mục tiêu: Thiết kế mô hình điều khiển đóng ngắt relay thông qua webserver sử dụng board ESP32. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Add tool board ESP32 cho phần mền IDE: File Preferences URLs , ta dán link này vào mục URLs nhé: https://dl.espressif.com/dl/package_esp32_index.json Tool Board Board manager ta gõ từ ( ESP32 ) Chọn install Phần cứng cần chuẩn bị: 1 board node ESP32 . Dây cắm test board. 1 Test board. 1 module Relay 2 kênh 5Vdc. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 542 Code chương trình: https://drive.google.com/open?id=13t6cRCHss_Mk68epZiRJEZF_7DQPLd1k #include <WiFi.h> #include <WebServer.h> const char* ssid = "ESP32IOT"; // tên wifi const char* password = "123456789"; // pass IPAddress local_ip(192,168,1,1); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); WebServer server(80); uint8_t LED1pin = 12; bool LED1status = LOW; uint8_t LED2pin = 14; bool LED2status = LOW; void setup() { Serial.begin(115200); pinMode(LED1pin, OUTPUT); pinMode(LED2pin, OUTPUT); WiFi.softAP(ssid, password); WiFi.softAPConfig(local_ip, gateway, subnet); delay(100); server.on("/", handle_OnConnect); server.on("/led1on", handle_led1on); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 543 server.on("/led1off", handle_led1off); server.on("/led2on", handle_led2on); server.on("/led2off", handle_led2off); server.onNotFound(handle_NotFound); server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); if(LED1status) {digitalWrite(LED1pin, HIGH);} else {digitalWrite(LED1pin, LOW);} if(LED2status) {digitalWrite(LED2pin, HIGH);} else {digitalWrite(LED2pin, LOW);} } void handle_OnConnect() { LED1status = LOW; LED2status = LOW; Serial.println("GPIO4 Status: OFF | GPIO5 Status: OFF"); server.send(200, "text/html", SendHTML(LED1status,LED2status)); } void handle_led1on() { LED1status = HIGH; Serial.println("GPIO4 Status: ON"); server.send(200, "text/html", SendHTML(true,LED2status)); } void handle_led1off() { LED1status = LOW; Serial.println("GPIO4 Status: OFF"); server.send(200, "text/html", SendHTML(false,LED2status)); } void handle_led2on() { LED2status = HIGH; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 544 Serial.println("GPIO5 Status: ON"); server.send(200, "text/html", SendHTML(LED1status,true)); } void handle_led2off() { LED2status = LOW; Serial.println("GPIO5 Status: OFF"); server.send(200, "text/html", SendHTML(LED1status,false)); } void handle_NotFound(){ server.send(404, "text/plain", "Not found"); } String SendHTML(uint8_t led1stat,uint8_t led2stat){ String ptr = "<!DOCTYPE html> <html>\n"; ptr +=".button-on:active {background-color: #2980b9;}\n"; ptr +=".button-off {background-color: #34495e;}\n"; ptr +=".button-off:active {background-color: #2c3e50;}\n"; ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n"; ptr +="</style>\n"; ptr +="</head>\n"; ptr +="<body>\n"; ptr +="<h1>ESP32 Web Server</h1>\n"; ptr +="<h3>Control Relay</h3>\n"; if(led1stat) {ptr +="<p>RELAY1 Status: ON</p><a class=\"button button-off\" href=\"/led1off\">OFF</a>\n";} else {ptr +="<p>RELAY1 Status: OFF</p><a class=\"button button-on\" href=\"/led1on\">ON</a>\n";} if(led2stat) {ptr +="<p>RELAY2 Status: ON</p><a class=\"button button-off\" href=\"/led2off\">OFF</a>\n";} else {ptr +="<p>RELAY2 Status: OFF</p><a class=\"button button-on\" href=\"/led2on\">ON</a>\n";} ptr +="</body>\n"; ptr +="</html>\n"; return ptr; } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 545 Hình ảnh thực tế: 36. Thiết kế mô hình hiển thị vị trí tọa độ lên màn hình LCD sử dụng module GPS NEO6 và arduino. Mục tiêu: Thiết kế mô hình hiển thị vị trí tọa độ lên màn hình LCD sử dụng module GPS NEO6 và arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. 1 Test board. 1 module GPS NEO6. 1 module LCD + I2C cho LCD. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 546 Code chương trình: https://drive.google.com/file/d/1Vt1bWYsTKiW3kGtJq2sWI5R6L8Z2QB4h/view #include <Wire.h> // thư viện i2c #include <LiquidCrystal_I2C.h> #include <SoftwareSerial.h> #include <TinyGPS++.h>// Thư viện gps LiquidCrystal_I2C lcd(0x27,16,2);// địa chỉ I2C float lattitude,longitude; // vi độ , kinh độ SoftwareSerial gpsSerial(8,9);//rx-9,tx -8 TinyGPSPlus gps; void setup(){ Serial.begin(9600); // tốc độ baud lcd.init(); lcd.backlight(); gpsSerial.begin(9600); lcd.print(" GPS "); delay(2000); lcd.clear(); } void loop(){ while(1) { while (gpsSerial.available() > 0) /// chờ khi nào có tín hiệu của gps Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 547 { gps.encode(gpsSerial.read()); } if (gps.location.isUpdated()) { Serial.print("LAT="); Serial.println(gps.location.lat(), 6); // in ra màn hình máy tính Vĩ độ Serial.print("LONG="); Serial.println(gps.location.lng(), 6);// in ra màn hình máy tính Kinh độ lattitude=gps.location.lat(); longitude=gps.location.lng(); break; } } Serial.print("LATTITUDE="); Serial.println(lattitude,6); Serial.print("LONGITUDE="); Serial.println(longitude,6); lcd.print("VD ");lcd.print(lattitude,6);// in ra màn hình LCD VĨ ĐỘ lcd.setCursor(0, 1); lcd.print("KD ");lcd.print(longitude,6);// in ra màn hình LCD Kinh ĐỘ } // Lưu ý GPS để bên ngoài để bắt sóng. Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 548 37. Thiết kế mô hình điều khiển thiết bị điện bằng SMS sử dụng module sim 800l và arduino. Mục tiêu: Thiết kế mô hình điều khiển thiết bị điện bằng SMS sử dụng module sim 800l và arduino. Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. 1 Test board. 1 module sim 800l. 1 module Relay 1 kênh 5Vdc. 1 module L2596 ( hạ áp xuồng 4.2V dc cấp cho module sim ). Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 549 Code chương trình: https://drive.google.com/file/d/1gPmRFBUhnHW8LR_fzlp3aVbZF29gcz22/view #include <SoftwareSerial.h> SoftwareSerial mySerial(10,11); // tx - 10 ; rx - 11 char incomingByte; String inputString; int relay = 12; //chân kích relay được nối với chân 12 arduino void setup() { pinMode(relay, OUTPUT); //khai báo relay là output digitalWrite(relay, LOW); //tắt relay Serial.begin(9600); mySerial.begin(9600); while(!mySerial.available()){ mySerial.println("AT"); delay(1000); Serial.println("Connecting..."); // kết nối } Serial.println("Connected!"); mySerial.println("AT+CMGF=1"); // khởi động chức năng SMS delay(1000); mySerial.println("AT+CNMI=1,2,0,0,0"); delay(1000); mySerial.println("AT+CMGL=\"REC UNREAD\""); // đọc tin nhắn tới } void loop() { if(mySerial.available()){ delay(100); // Serial Buffer while(mySerial.available()){ incomingByte = mySerial.read(); inputString += incomingByte; } delay(10); Serial.println(inputString); inputString.toUpperCase(); if (inputString.indexOf("OFF") > -1){// nếu nội dụng tin nhắn OFF thì bật relay digitalWrite(relay, HIGH);// kích mức thấp tương úng HIGH } if (inputString.indexOf("ON") > -1){ Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 550 digitalWrite(relay, LOW);// kích mức thấp tương úng LOW } delay(50); //Delete Messages if (inputString.indexOf("OK") == -1){ mySerial.println("AT+CMGDA=\"DEL ALL\""); delay(1000);} inputString = ""; } } Hình ảnh thực tế: 38. Thiết kế mô hình điều khiển đảo chiều động cơ bƣớc stepper 1.8/step sử dụng nút nhấn và arduino. Mục tiêu: Thiết kế mô hình điều đảo chiều động cơ bƣớc sử dụng nút nhấn và arduino. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 551 Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. 1 Test board. 1 module driver A4988. 1 biến trở 10K. 3 nút nhấn 4 chân. 3 điện trở 10k. 1 động cơ bƣớc 1.8/step 1A. 1 bộ nguồn cung cấp nguồn cho driver A4988 ( 8 – 35Vdc). Lắp mạch nguyên lý: Lắp mạch driver A4988, arduino và động cơ step. 3 nút nhấn lần lƣợt đƣợc nối với các chân 8, 9, 10 của arduino. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 552 Code chương trình: https://drive.google.com/file/d/1ITzT67yeydJrIURw5KPlj_9FQ2IyYt9E/view const int stepPin = 3; // chân step của board a4988 nối với chân số 3 arduino const int dirPin = 4; int sta = 8; // nút nhấn strat / stop int thuan = 9; // nút nhấn chạy thuận int nghich = 10; // nút nhấn chạy nghịch int customDelay,customDelayMapped; int t = 0; // khai báo biến int m = 0; // khai báo biến int status1;// biến lưu các trạng thái nút nhấn boolean chong_doi()// int char float ngoại trừ void { int sta1 =digitalRead(sta); // đọc trạng thái nút nhấn return sta1;// khi co nhan nut la true } void setup() { // Sets the two pins as Outputs pinMode(stepPin,OUTPUT); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 553 pinMode(dirPin,OUTPUT); pinMode(sta,INPUT); pinMode(thuan,INPUT); pinMode(nghich,INPUT); pinMode(6, OUTPUT); //Enable digitalWrite(6,LOW); // digitalWrite(dirPin,HIGH); } void loop() { status1 = chong_doi(); if(status1==true) { { t=!t;// đảo trạng thái } while(status1==true){status1=chong_doi();} } customDelayMapped = speedUp(); // nhận giá trị độ trễ tùy chỉnh int gtthuan = digitalRead(thuan); int gtnghich = digitalRead(nghich); if ( gtthuan == 1) {m=1;} if ( gtnghich == 1) {m=2;} // làm cho các xung có độ trễ tùy chỉnh, tùy thuộc vào biến trở xoay, từ đó thay đổi tốc độ động cơ if (( t==1)&&(m==1)){// chạy thuận digitalWrite(dirPin,HIGH); digitalWrite(stepPin, HIGH); delayMicroseconds(customDelayMapped); digitalWrite(stepPin, LOW); delayMicroseconds(customDelayMapped); } if (( t== 1)&&(m==2)) {// chạy nghich digitalWrite(dirPin,LOW); digitalWrite(stepPin, HIGH); delayMicroseconds(customDelayMapped); digitalWrite(stepPin, LOW); delayMicroseconds(customDelayMapped); } if (t==0) { digitalWrite(dirPin,0); digitalWrite(stepPin, 0); m=0; } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 554 } int speedUp() { int customDelay = analogRead(A0); // đọc giá trị cảm biến int newCustom = map(customDelay, 0, 1023, 300,4000);// Chuyển các giá trị đọc của chiết áp từ 0 đến 1023 thành các giá trị độ trễ mong muốn (300 đến 4000) return newCustom; } Hình ảnh thực tế: 39. Thiết kế mô hình điều khiển tốc độ động cơ sử dụng module driver BTS7960 và arduino. Mục tiêu: Thiết kế mô hình điều khiển tốc độ động cơ sử dụng module driver BTS7960 và arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 555 1 Test board. 1 module driver BTS7960. 1 biến trở 10K. 1 động cơ DC 2A. 1 bộ nguồn cung cấp nguồn cho driver ( 7 – 24Vdc). Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/14wY-Lt2dQph6r8U6OAnX2yGqtATlxE_V/view #define RPWM 3 // define pin 3 for RPWM pin (output) #define R_EN 4 // define pin 2 for R_EN pin (input) #define R_IS 5 // define pin 5 for R_IS pin (output) #define LPWM 6 // define pin 6 for LPWM pin (output) #define L_EN 7 // define pin 7 for L_EN pin (input) #define L_IS 8 // define pin 8 for L_IS pin (output) #define CW 1 // chạy nghịch #define CCW 0 //chạy thuận #define debug 1 int customDelay,tocdo; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 556 #include <RobojaxBTS7960.h> RobojaxBTS7960 motor(R_EN,RPWM,R_IS, L_EN,LPWM,L_IS,debug); void setup() { Serial.begin(9600);// tốc dộ baud motor.begin(); } void loop() { tocdo = speedUp(); motor.rotate(tocdo,CCW); } int speedUp() { int customDelay = analogRead(A0); int newCustom = map(customDelay, 0, 1023, 0,50);// Chuyển các giá trị đọc của chiết áp từ 0 đến 1023 thành các giá trị độ trễ mong muốn (0 đến 50) return newCustom; } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 557 40. Thiết kế mô hình điều khiển động cơ bƣớc 1.8/step sử dụng module driver TB6600 và arduino. Mục tiêu: Thiết kế mô hình điều khiển động cơ sử dụng module driver TB6600 và arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. 1 Test board. 1 module driver TB6600. 1 động cơ bƣớc 1.8/step. 1 bộ nguồn cung cấp nguồn cho driver ( 9– 42Vdc). Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 558 Code chương trình: https://drive.google.com/file/d/1VXUFoaVDx18hfvd262o2eOvoK8RbOlVi/view const int stepPin = 3; //PUL const int dirPin = 2; // DIR const int enPin = 8; //ena void setup() { pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); pinMode(enPin,OUTPUT); digitalWrite(enPin,LOW); } void loop() { digitalWrite(dirPin,HIGH); // cho đông cơ quay theo chiều thuận for(int x = 0; x < 200; x++) { // CHẠY 1 VÒNG 200 STEP / 1.8 ĐỘ = 360, S1 S2 ON, S3 OFF digitalWrite(stepPin,HIGH); delayMicroseconds(500); digitalWrite(stepPin,LOW); delayMicroseconds(500); Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 559 } delay(1000); digitalWrite(dirPin,LOW); //thay đổi chiều quay for(int x = 0; x < 200; x++) { digitalWrite(stepPin,HIGH); delayMicroseconds(500); digitalWrite(stepPin,LOW); delayMicroseconds(500); } delay(1000); } Hình ảnh thực tế: 41. Thiết kế mô hình điều khiển thiết bị điện dựa vào giá trị cảm biến ánh sáng và đồng thời gửi tin nhắn về điện thoại. Mục tiêu: Thiết kế mô hình điều khiển thiết bị điện dựa trên giá trị cảm biến ánh sáng và đồng thời gửi tin nhắn về điện thoại. Phần mền cần chuẩn bị : Cài đặt phần mềm arduino IDE. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 560 Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3 hoặc mê ga 2560. 1 Test board. 1 module sim800l. 1 module cảm biến ánh sáng ( quang trở ). 1 module hạ áp L2596. 1 module relay 1 kênh 5Vdc. Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/1lD16u0_-8S4vjG1xf0BNnI3T1OmOL7-t/view #include <SoftwareSerial.h> SoftwareSerial sim(10, 11);// tx 10 -- rx 11 int _timeout; String _buffer; int gtcb; int led = 8;// RELAY được bật tắt ở chân số 8 của arduino int cbas = 4; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 561 String number = "0815345816"; //-> các bạn thay đổi số điện thoại ở đây. void setup() { delay(5000); //delay for 7 seconds to make sure the modules get the signal Serial.begin(9600); pinMode(cbas, INPUT); pinMode(led, OUTPUT); _buffer.reserve(50); Serial.println("Sistem Started..."); sim.begin(9600); delay(1000); } //boolean khigas = true; void loop() { gtcb = digitalRead(cbas); Serial.println(gtcb); if (gtcb == 1) { delay(1000); if (gtcb == 1){ digitalWrite(led, HIGH); // callNumber(); SendMessage(); } } else {digitalWrite(led, LOW); } } void SendMessage() { sim.println("AT+CMGF=1"); delay(1000); //Serial.println ("Set SMS Number"); sim.println("AT+CMGS=\"" + number + "\"\r"); delay(1000); String SMS = "troi toi"; sim.println(SMS); delay(100); sim.println((char)26); delay(1000); _buffer = _readSerial(); } String _readSerial() { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 562 _timeout = 0; while (!sim.available() && _timeout < 12000 ) { delay(13); _timeout++; } if (sim.available()) { return sim.readString(); } } void callNumber() { sim.print (F("ATD")); sim.print (number); sim.print (F(";\r\n")); _buffer = _readSerial(); Serial.println(_buffer); } Hình ảnh thực tế: 42. Thiết kế mô hình điều khiển góc quay động cơ bƣớc bằng cảm biến ánh sáng khi trời tối hoặc trời sáng. Mục tiêu: Thiết kế mô hình điều khiển góc quay động cơ bƣớc bằng cảm biến ánh sáng khi trời tối hoặc trời sáng. Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 563 Phần mền cần chuẩn bị Cài dặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. 1 Test board. 1 module driver A4988. 1 động cơ bƣớc 1.8/step. 1 module cảm biến ánh sáng. 1 bộ nguồn cung cấp nguồn cho driver ( 8– 35Vdc). Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/19Ao8sUt9mb8Lgdy3q1sVsyzRP8pnjD4O/view const int stepPin = 11; const int dirPin = 12; const int enPin = 10; int cbas = 3; Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 564 int t = 0; void setup() { Serial.begin(9600); pinMode(stepPin,OUTPUT); pinMode(dirPin,OUTPUT); pinMode(enPin,OUTPUT); pinMode(cbas,INPUT); digitalWrite(enPin,LOW); digitalWrite(dirPin,HIGH); } void loop() { int gtcb = digitalRead(cbas); Serial.println(gtcb); if (( gtcb==1)&&(t==0)){ digitalWrite(dirPin,HIGH); for(int x = 0; x < 1200; x++) // 1.8/ step --> 200 quay 1 vòng { digitalWrite(stepPin,HIGH); delayMicroseconds(1000); digitalWrite(stepPin,LOW); delayMicroseconds(1000); } t=1; } if (( gtcb==0)&&(t==1)){ digitalWrite(dirPin,LOW); for(int x = 0; x < 1200; x++) { digitalWrite(stepPin,HIGH); delayMicroseconds(1000); digitalWrite(stepPin,LOW); delayMicroseconds(1000); } t=0; } } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 565 43. Thiết kế mô hình đo tốc độ động cơ hiển thị lên màn hình LCD sử dụng encorder quay và board arduino. Mục tiêu: Thiết kế mô hình đo tốc độ động cơ và hiển thị lên màn hình LCD. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3. 1 Test board. 1 module driver BTS7960. 1 động cơ DC. 1 biến trở 10k. 1 module LCD và I2C cho LCD. 1 module encorder quay. 1 bộ nguồn cung cấp nguồn cho driver ( 7 – 24Vdc). Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 566 Lắp mạch nguyên lý: Code chương trình: https://drive.google.com/file/d/1_1oyWzK93MsGQGrxd2xvhp3qywYehz5S/view #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); #define RPWM 9 // define pin 9 for RPWM pin (output) #define R_EN 4 // define pin 2 for R_EN pin (input) #define R_IS 5 // define pin 5 for R_IS pin (output) #define LPWM 6 // define pin 6 for LPWM pin (output) #define L_EN 7 // define pin 7 for L_EN pin (input) #define L_IS 8 // define pin 8 for L_IS pin (output) #define CW 1 //do not change #define CCW 0 //do not change #define debug 1 //change to 0 to hide serial monitor debugging information or set to 1 to view int customDelay,tocdo; #include <RobojaxBTS7960.h> RobojaxBTS7960 motor(R_EN,RPWM,R_IS, L_EN,LPWM,L_IS,debug); // Cách nối các chân trên Encoder quay #define encoderPinA 2 // Tƣơng ứng chân DT trên Encoder quay Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 567 #define encoderPinB 3 // Tƣơng ứng chân CLK trên Encoder quay // Chân + nối nguồn 5V và chân GND nối cực âm unsigned long time2 = 0; volatile int encoderPos = 0; // Cho vị trí đầu bằng 0 int lastReportedPos = 1; // Vị trí cuối bằng 1 static boolean rotating=false; // Quản lý debounce (giống như là chống nhiễu) // các biến cho trình phục vụ ngắt interrupt service routine vars boolean A_set = false; boolean B_set = false; //int tocdo; unsigned long timeold = 0; int newposition; int oldposition=0; long newtime; long oldtime=0; int vantoc = 0; int ganvantoc = 0; int ganxung = 0; int sovong = 0; void setup() { // Serial.begin(9600); lcd.init(); lcd.backlight(); motor.begin(); pinMode(encoderPinA, INPUT_PULLUP); // INPUT-PULLUP tương đương Mode INPUT và tự động nhận trạng thái HIGH hoặc LOW pinMode(encoderPinB, INPUT_PULLUP); // Chân encoder trên ngắt 0 (chân 2) attachInterrupt(0, doEncoderA, CHANGE); // Chân encoder trên ngắt 1 (chân 3) attachInterrupt(1, doEncoderB, CHANGE); Serial.begin(9600); // chuyển dữ liệu lên cổng Serial Port lcd.setCursor(0,1); // lcd.print("SO VONG = "); } // Vòng lặp chính, công việc đƣợc thực hiện bởi trình phục vụ ngắt void loop() { tocdo = speedUp(); motor.rotate(tocdo,CCW);// run motor with 100% speed if ( (unsigned long) (millis() - time2) > 1000 ) { Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 568 rotating = true; // Khởi động bộ debounce (có thể hiểu như bộ chống nhiễu) newtime=millis(); newposition=encoderPos; detachInterrupt(0); detachInterrupt(1); vantoc = (newposition-oldposition)*60/20; Serial.print("vantoc="); Serial.println(vantoc,DEC); oldposition=newposition; oldtime=newtime; lcd.clear(); lcd.setCursor(0,0); lcd.print("TOC DO = "); lcd.setCursor(11,0); lcd.print(vantoc); lcd.print(" RPM"); //lcd.setCursor(0,1); //lcd.print("SO VONG = "); lcd.setCursor(11,1); //lcd.print(sovong,DEC); attachInterrupt(0, doEncoderA, CHANGE); attachInterrupt(1, doEncoderB, CHANGE); time2 = millis(); } } // Ngắt khi chuyển trạng thái của A void doEncoderA(){ // debounce if ( rotating ) delay (1); // Chờ 1 chút // Kiểm tra việc chuyển đổi trạng thái, xem có thật sự thay đổi trạng thái chưa if( digitalRead(encoderPinA) != A_set ) { // debounce một lần nữa A_set = !A_set; // Cộng 1 nếu có tín hiệu A rồi có tín hiệu B if ( A_set && !B_set ) encoderPos += 1; ganxung += 1; sovong=encoderPos/20; //if (ganxung == 42){ganxung=0;} rotating = false; // Không cần debounce nữa cho đến khi được nhấn lần nữa } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 569 } // Ngắt khi thay đổi trạng thái ở B, tương tự như ở A void doEncoderB(){ if ( rotating ) delay (1); if( digitalRead(encoderPinB) != B_set ) { B_set = !B_set; // Trừ 1 nếu B rồi đến A if( B_set && !A_set ) encoderPos -= 1; rotating = false; } } int speedUp() { int customDelay = analogRead(A0); int newCustom = map(customDelay, 0, 1023, 2,14);// Chuyển các giá trị đọc của chiết áp từ 0 đến 1023 thành các giá trị độ trễ mong muốn (300 đến 4000) return newCustom; } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 570 44. Thiết kế mô hình bật tắt thiết bị điện sử dụng cảm biến vân tay và board arduino. Mục tiêu: Thiết kế mô hình bật tắt thiết bị điện sử dụng cảm biến vân tay và board arduino. Phần mền cần chuẩn bị Cài đặt phần mềm arduino IDE. Phần cứng cần chuẩn bị: Dây cắm test board. 1 board arduino uno R3 hoặc nano. 1 Test board. 1 module cảm biến vân tay R307. 1 module relay 1 kênh 5Vdc. Lắp mạch nguyên lý: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 571 Code chương trình: https://drive.google.com/file/d/10BchIJCM3I-77F46nZhBDuIWFCrNtt6s/view Trƣớc hết các bạn add thƣ viện sau vào IDE: thƣ viện Adafruit-Fingerprint-SensorLibrary-master kèm theo trong file code ở trên Cách lấy dấu vân tay các bạn làm theo nhƣ video sau: https://youtu.be/MwzgEcaqPIY Sau đây là file code để bật tắt thiết bị sau khi lấy dấu vân tay thành công. #include <Adafruit_Fingerprint.h> int electronic_lock = 12; SoftwareSerial mySerial(2, 3);// Tx, Rx Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); void setup() { pinMode(12, OUTPUT); Serial.begin(9600); while (!Serial); delay(100); // set the data rate for the sensor serial port finger.begin(57600); if (finger.verifyPassword()) { Serial.println("Found fingerprint sensor"); } else { Serial.println("Did not find fingerprint sensor"); while (1) { delay(1); } } finger.getTemplateCount(); Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" template(s)"); Serial.println("Waiting for valid finger..."); } void loop() { getFingerprintIDez(); delay(50); } Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802 572 int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; // found a match! Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); digitalWrite(electronic_lock, HIGH);// mở khóa hay thiết bị điện theo yêu cầu nếu đúng dấu vân tay delay(1500); digitalWrite(electronic_lock, LOW); Serial.println("Unlocked"); return finger.fingerID; } Hình ảnh thực tế: Tài liệu biên soạn bởi Phi Nguyen và một số tài liệu được tham khảo từ arduino.cc và cộng đồng arduino Web: tdhshop.com.vn Email: tdhshop1991@gmail.com hotline: 0395 304 802