BỘ GIÁO DỤC VÀ ĐẠO TẠO ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA CƠ KHÍ CHẾ TẠO MÁY MÔN HỌC VI XỬ LÝ BÁO CÁO ĐỀ TÀI ĐO ĐỘ ẨM NHIỆT ĐỘ VÀ CẢM BIẾN ÁNH SÁNG HIỂN THỊ LÊN LCD, ĐIỀU KHIỂN BẬT TẮT MOTOR, ĐÈN Giáo viên hướng dẫn THẦY NGUYỄN THANH NGHĨA Sinh viên thực hiện Nguyễn Hảo Anh 19146151 Lê Nguyễn Quốc Trung 19146288 Đỗ Xuân Phương 15146086 MỤC LỤC PHẦN 1 MỞ ĐẦU 2 1 1 Lý do chọn đề tài 2 1 2 Mục tiêu 2 1 3 Giới hạn đề tài 2 PHẦN 2 CƠ SỞ 3 2 1 PIC16F887 3 2 1 1 Tổng quát về cấu trúc c.
CƠ SỞ
PIC16F887
2.1.1 Tổng quát về cấu trúc của PIC16F887
PIC16F877A là một vi điều khiển 40 chân phổ biến, thường được sử dụng trong các dự án và ứng dụng nhúng Vi điều khiển này có ba bộ định thời, bao gồm hai bộ định thời 8 bit, giúp tối ưu hóa hiệu suất trong các ứng dụng điều khiển.
Bộ định thời 16 Bit hỗ trợ nhiều giao thức giao tiếp như nối tiếp, song song và I2C Vi điều khiển PIC16F877A có khả năng xử lý cả ngắt chân phần cứng và ngắt bộ định thời, mang lại tính linh hoạt cao trong việc phát triển ứng dụng.
5 Port xuất/nhập (A, B, C, D, E) tương ứng 33 chân ra
2 Bộ định thời 8bit Timer 0 và Timer 2
1 Bộ định thời 16bit Timer 1, có thể hoạt động ở chế độ tiết kiệm năng lượng (SLEEP MODE) với nguồn xung clock ngoài
2 Bộ Capture/ Compare/ PWM (Bắt Giữ/ So Sánh/ Điều Biến Xung)
1 Bộ biến đổi Analog to Digital 10 bit, 8 ngõ vào
2 Bộ so sánh tương tự (Compartor)
1 Bộ định thời giám sát (Watch Dog Timer)
1 Cổng giao tiếp song song 8bit
Chế độ tiết kiệm năng lượng (Sleep Mode)
Nạp trương trình bằng cổng nối tiếp (ICSP™) (In-Circuit Serial Programming™ -)
Tập lệnh gồm 35 lệnh có độ dài 14 bit
Tần số hoạt động tối đa 20 MHz
2.1.2 Sơ đồ chân của PIC16F887
2.1.3 Một số phần mềm lập trình cho vi điều khiển PIC
Hiện nay, có nhiều phần mềm lập trình cho vi điều khiển PIC, trong đó nổi bật nhất là CCS C Compiler, Mikro C Pro for PIC, MPLAB X IDE và HITECH.
LCD 16x2
Thiết bị hiển thị LCD (Liquid Crystal Display) được ứng dụng rộng rãi trong nhiều lĩnh vực của vi điều khiển LCD nổi bật với khả năng hiển thị đa dạng các ký tự, bao gồm chữ, số và ký tự đồ họa, mang lại sự trực quan cho người sử dụng Ngoài ra, LCD dễ dàng tích hợp vào mạch ứng dụng thông qua nhiều giao thức giao tiếp khác nhau, tiêu tốn ít tài nguyên hệ thống và có giá thành phải chăng.
LCD 16×2 được sử dụng để hiển thị trạng thái hoặc các thông số
• LCD 16×2 có 16 chân trong đó 8 chân dữ liệu (D0 – D7) và 3 chân điều khiển (RS, RW, EN)
• 5 chân còn lại dùng để cấp nguồn và đèn nền cho LCD 16×2
• Các chân điều khiển giúp ta dễ dàng cấu hình LCD ở chế độ lệnh hoặc chế độ dữ liệu
• Chúng còn giúp ta cấu hình ở chế độ đọc hoặc ghi
LCD 16×2 có thể sử dụng ở chế độ 4bit hoặc 8bit tùy theo ứng dụng ta đang làm
Trong 16 chân của LCD được chia ra làm 3 dạng tín hiệu như sau: Các chân cấp nguồn: Chân số 1 là chân nối mass (0V), chân thứ 2 là Vdd nối với nguồn +5V Chân thứ 3 dùng để chỉnh contrast thường nối với biến trở
Chân điều khiển trong mạch bao gồm chân số 4 (RS) để lựa chọn thanh ghi, chân R/W để điều khiển quá trình đọc và ghi, và chân E để cho phép dạng xung chốt.
Các chân dữ liệu D7÷D0: Chân số 7 đến chân số 14 là 8 chân dùng để trao đổi dữ liệu giữa thiết bị điều khiển và LCD
Cảm biến nhiệt độ và độ ẩm DHT22
Cảm biến DHT22 là thiết bị đo nhiệt độ và độ ẩm môi trường, sử dụng giao tiếp 1 Wire giúp kết nối dễ dàng với vi điều khiển Với kích thước nhỏ gọn, chất lượng tốt, cảm biến này nổi bật với độ bền và độ ổn định cao, phù hợp cho nhiều ứng dụng.
Dòng sử dụng: 2.5mA max (khi truyền dữ liệu) Đo tốt ở độ ẩm 0-100%RH với sai số 2-5% Đo tốt ở nhiệt độ -40 to 80°C sai số ±0.5°C
Tần số lấy mẫu tối đa 0.5Hz (2 giây 1 lần)
Kích thước 27mm x 59mm x 13.5mm (1.05" x 2.32" x 0.53")
2.3.3 Kích thước và sơ đồ chân
2.3.4 Mô tả cách thức hoạt động
Cảm biến sử dụng công nghệ thu thập tín hiệu kỹ thuật số và cảm biến độ ẩm độc quyền, đảm bảo tính ổn định và độ tin cậy cao Các phần tử cảm biến được liên kết với chip đơn 8 bit.
Tất cả các cảm biến của mô hình này đều được hiệu chuẩn và bù nhiệt độ trong buồng hiệu chuẩn chính xác Hệ số hiệu chuẩn được lưu trữ dưới dạng chương trình trong bộ nhớ OTP, và khi cảm biến phát hiện, nó sẽ trích xuất hệ số từ bộ nhớ này.
Khi vi điều khiển gửi tín hiệu khởi động, cảm biến sẽ chuyển trạng thái và bắt đầu quá trình thu thập dữ liệu Sau khi vi điều khiển kết thúc việc gửi tín hiệu khởi động, cảm biến sẽ phản hồi với dữ liệu 40bit, bao gồm thông tin về độ ẩm và nhiệt độ tương đối Nếu không nhận được tín hiệu khởi động từ vi điều khiển, cảm biến sẽ không cung cấp tín hiệu phản hồi Tín hiệu khởi động là điều kiện cần thiết để cảm biến gửi dữ liệu về độ ẩm.
Cảm biến sẽ chuyển sang trạng thái chờ sau khi hoàn tất quá trình thu thập dữ liệu nếu không nhận được tín hiệu từ vi điều khiển Ban đầu, bus dữ liệu ở mức điện áp cao, và khi giao tiếp bắt đầu, vi điều khiển sẽ kéo bus dữ liệu xuống thấp trong khoảng 1 đến 10 ms để cảm biến có thể nhận diện tín hiệu Sau đó, vi điều khiển sẽ đưa bus dữ liệu trở lại mức cao và chờ phản hồi từ cảm biến trong khoảng 20 đến 40 ms.
Khi cảm biến phát tín hiệu khởi động, bus dữ liệu sẽ giảm xuống mức thấp khoảng 80 às để tạo tín hiệu phản hồi Sau đó, bus dữ liệu của cảm biến được nâng lên 80 às để chuẩn bị gửi dữ liệu đi.
Khi cảm biến gửi tín hiệu đến vi điều khiển, mỗi bit được truyền với mức điện áp thấp kéo dài 50 µs, trong khi độ dài của mức điện áp cao sau đó sẽ xác định giá trị “0” hoặc “1”.
Quang trở
Quang trở, hay còn gọi là điện trở quang, photoresistor, photocell, là linh kiện được chế tạo từ chất liệu đặc biệt có khả năng thay đổi điện trở khi tiếp xúc với ánh sáng Nó hoạt động dựa trên nguyên lý quang dẫn, cho phép giá trị điện trở thay đổi theo cường độ ánh sáng Quang trở thường được ứng dụng trong các mạch cảm biến ánh sáng, đèn đường, hệ thống báo động ánh sáng, và đồng hồ ngoài trời.
Quang trở gồm các màng kim loại được đấu nối với nhau thông qua các đầu cực
Quang trở chủ yếu được cấu tạo từ Cadmium Sulphide (CdS), một chất quang dẫn có khả năng hấp thụ ánh sáng Khi không có ánh sáng chiếu vào, CdS thường chứa rất ít hoặc không có các hạt electron.
Linh kiện này được thiết kế để tối ưu hóa diện tích tiếp xúc với hai màng kim loại, đồng thời được bảo vệ trong một hộp nhựa cho phép tiếp xúc với ánh sáng Điều này giúp linh kiện có khả năng cảm nhận sự thay đổi của cường độ ánh sáng một cách hiệu quả.
Quang trở là một loại chất bán dẫn có điện trở rất cao, thường lên đến vài MΩ trong bóng tối và không có tiếp giáp Khi có ánh sáng chiếu vào, điện trở của quang trở giảm xuống còn từ một đến vài trăm Ω.
Khi ánh sáng chiếu vào quang trở, electron được giải phóng, dẫn đến việc tăng độ dẫn điện Phản ứng của quang trở với các loại sóng photon khác nhau phụ thuộc vào loại chất bán dẫn được sử dụng.
Module điều khiển động cơ L298N
Module điều khiển động cơ L298N sử dụng chip cầu H, cho phép điều khiển tốc độ và chiều quay của động cơ DC một cách dễ dàng Ngoài ra, module này còn có khả năng điều khiển một động cơ bước lưỡng cực Mạch cầu H của IC L298N hoạt động hiệu quả trong khoảng điện áp từ 5V đến 35V.
Module L298N có tích hợp một IC nguồn 78M05 để tạo ra nguồn 5V để cung cấp cho các thiết bị khác
• 1 DC motor 1 “+” hoặc stepper motor A+
• 2 DC motor 1 “-” hoặc stepper motor A-
Khi sử dụng nguồn trên 12V, hãy tháo jumper 12V ra Jumper này có chức năng cung cấp nguồn cho IC ổn áp để tạo ra nguồn 5V Nếu nguồn vượt quá 12V, IC nguồn sẽ bị cháy.
• 4 Cắm dây nguồn cung cấp điện áp cho motor vào đây từ 6V đến 35V
• 5 Cắm chân GND của nguồn vào đây
• 6 Ngõ ra nguồn 5V, nếu jumper đầu vào không rút ra
Chân Enable của Motor 1 được sử dụng để cung cấp xung PWM cho động cơ Nếu sử dụng VDK, cần rút jumper và cắm chân PWM vào vị trí này Chân này giữ nguyên khi sử dụng với động cơ bước.
Chân Enable của Motor 2 được sử dụng để cấp xung PWM cho motor; nếu sử dụng VDK, hãy rút jumper và cắm chân PWM vào đây Chân này cần giữ nguyên khi làm việc với động cơ bước.
• 13 DC motor 2 “+” hoặc stepper motor B+
• 14 DC motor 2 “-” hoặc stepper motor B-
• OUT 1, OUT 2 là hai đầu ra tương ứng khi kết nối động cơ 1
• OUT 3, OUT 4 là hai đầu ra tương ứng khi kết nối động cơ 2
Mạch điều khiển bao gồm các chân ENA, IN1, IN2, IN3, IN4 và ENB, có chức năng điều khiển hai động cơ được kết nối với các vị trí OUT 1, 2 và OUT 3, 4 tương ứng.
• ENB: Có chức năng điều khiển tốc độ động cơ khi kết nối vào hai vị trí OUT 3, OUT 4
• ENA: Có chức năng điều khiển tốc độ động cơ khi kết nối vào hai vị trí OUT 1, OUT 2
• IN1, IN2, IN3, IN4: Là chân kết nối tín hiệu với VĐK như Arduino,… để điều khiển động cơ xoay
Nguyên tắc hoạt động của IN1, IN2, IN3 và IN4 dựa trên sự chênh lệch tín hiệu đầu vào Khi IN1 và IN2 có tín hiệu khác nhau, động cơ sẽ dừng hoặc quay tùy thuộc vào mức cao/thấp của tín hiệu (có hai trường hợp: IN1 cao, IN2 thấp hoặc IN1 thấp, IN2 cao) Nếu tín hiệu vào IN1 bằng IN2, động cơ sẽ dừng quay Tương tự, cặp tín hiệu IN3 và IN4 hoạt động theo nguyên tắc giống như vậy.
Tóm tắt qua chức năng các chân của L298:
• 4 chân INPUT: IN1, IN2, IN3, IN4 được nối lần lượt với các chân 5, 7, 10,
12 của L298 Đây là các chân nhận tín hiệu điều khiển
• 4 chân OUTPUT: OUT1, OUT2, OUT3, OUT4 (tương ứng với các chân INPUT) được nối với các chân 2, 3, 13, 14 của L298 Các chân này sẽ được nối với động cơ
Hai chân ENA và ENB trong mạch L298 được sử dụng để điều khiển hoạt động của các mạch cầu H Khi chân ENA hoặc ENB ở mức logic “1” (kết nối với nguồn 5V), mạch cầu H sẽ hoạt động, ngược lại, nếu ở mức logic “0”, mạch cầu H sẽ không hoạt động.
• Driver: L298N tích hợp hai mạch cầu H
• Dòng tối đa cho mỗi cầu H là: 2A
• Điện áp của tín hiệu điều khiển: +5 V ~ +7 V
• Dòng của tín hiệu điều khiển: 0 ~ 36Ma
• Công suất hao phí: 20W (khi nhiệt độ T = 75 °C)
• Công suất tối đa: 25W 1 cầu (lưu ý công suất = dòng điện x điện áp nên áp cấp vào càng cao, dòng càng nhỏ, công suất có định 25W)
2.5.5 Đấu nối mạch điều khiển động cơ DC L298N Điều khiển chiều quay với L298:
• Khi ENA = 0: Động cơ không quay với mọi đầu vào.
- INT1 = 1; INT2 = 0: động cơ quay thuận.
- INT1 = 0; INT2 = 1: động cơ quay nghịch.
- INT1 = INT2: động cơ dừng ngay tức thì.
(tương tự với các chân ENB, INT3, INT4).
THIẾT KẾ MẠCH
Sơ đồ khối
Lưu đồ giải thuật
Thiết kế proteus
Chương trình
#define LCD_RS_PIN PIN_E0
#define LCD_RW_PIN PIN_E1
#define LCD_ENABLE_PIN PIN_E2
#fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO
To read data from the DHT22 temperature and humidity sensor connected to PIN_A1, the code initializes necessary variables and defines a function called `start_signal()` This function configures the DHT22_PIN as an output, sets it low for 25 milliseconds, then sets it high for 25 microseconds before switching it back to input mode The messages for displaying temperature and relative humidity are initialized as "Temp = 00.0 C" and "RH = 00.0 %", respectively, while timeout and data variables for temperature and humidity are also declared.
} short check_response(){ set_timer1(0); // Set Timer1 value to 0
25 setup_timer_1(T1_INTERNAL | T1_DIV_BY_2); // Start Timer1 with internal clock source + 2 prescaler while(!input(DHT22_PIN) && get_timer1() < 100); // Wait until
DHT22_PIN becomes high (cheking of 80às low time response) if(get_timer1() > 99) // If response time > 99àS ==>
Response error return 0; // Return 0 (Device has a problem with response) else{ set_timer1(0); // Set Timer1 value to 0 while(input(DHT22_PIN) && get_timer1() < 100); // Wait until
DHT22_PIN becomes low (cheking of 80às high time response) if(get_timer1() > 99) // If response time > 99àS ==>
Response error return 0; // Return 0 (Device has a problem with response) else return 1; // Return 1 (response OK)
{ unsigned int8 i, _data = 0; if(Time_out) break; for(i = 0; i < 8; i++)
26 set_timer1(0); // Set Timer1 value to 0 while(!input(DHT22_PIN)) // Wait until DHT22_PIN becomes high if(get_timer1() > 100)
{ // If low time > 100 ==> Time out error (Normally it takes 50às)
} set_timer1(0); // Set Timer1 value to 0 while(input(DHT22_PIN)) // Wait until DHT22_PIN becomes low if(get_timer1() > 100)
{ // If high time > 100 ==> Time out error (Normally it takes 26-28às for 0 and 70às for 1)
} if(get_timer1() > 50) // If high time > 50 ==> Sensor sent
1 bit_set(_data, (7 - i)); // Set bit (7 - i)
27 setup_oscillator(OSC_8MHZ); // Set the internal oscillator to 8MHz setup_timer_1(T1_DISABLED); // Disable Timer1 lcd_init(); // Initialize LCD module lcd_putc('\f'); // Clear LCD while(TRUE)
Start_signal(); // Send start signal to the sensor if(check_response())
{ // Check if there is a response from sensor (If OK start reading humidity and temperature data)
RH_byte1 = Read_Data(); // read RH byte1
RH_byte2 = Read_Data(); // read RH byte2
T_byte1 = Read_Data(); // read T byte1
T_byte2 = Read_Data(); // read T byte2
Checksum = Read_Data(); // read checksum setup_timer_1(T1_DISABLED); // Disable Timer1 if(Time_out)
{ // If there is a time out in reading lcd_putc('\f'); // LCD clear lcd_gotoxy(5, 1); // Go to column 5 row 1 lcd_putc("Time out!"); // Display "Time out!"
{ // If there is no time out if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)){
Temp = (Temp 0X8000)
The code snippet initializes and formats temperature and relative humidity values for display It calculates and assigns the temperature digits to the `message1` array, ensuring proper representation, while checking if the relative humidity (`RH`) equals 1000 to set the corresponding value in `message2` The degree symbol is added to the temperature message, and the cursor is positioned on the LCD screen before displaying the formatted temperature message.
29 lcd_gotoxy(1, 2); // Go to column 1 row 2 printf(lcd_putc, message2); // Display message2
{ lcd_putc('\f'); // LCD clear lcd_gotoxy(1, 1); // Go to column 1 row 1 lcd_putc("Checksum Error!");
If the DHT22 sensor does not respond, the LCD will display a message indicating the issue The display will be cleared, and the text "No response" will appear on the first line, with "from the sensor" shown on the second line.
{ output_high(IN1); output_low(IN2);
{ output_high(IN4); output_low(IN3);
{ output_low(IN4); output_low(IN3);
OUTPUT_HIGH(OUTD); //ÐEN ON
OUTPUT_LOW(OUTD); //DEN OFF