Tải bản đầy đủ (.docx) (40 trang)

MSP430G2553 Giao tiếp DHT11 điều khiển mô hình giám sát nhiệt độ và độ ẩm hệ thống thông gió (CÓ CODE MẪU VÀ SƠ ĐỒ CHI TIẾT)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.15 MB, 40 trang )

bo

Bộ giáo dục và đào tạo
Trường Đại Học Cần Thơ

ĐỒ ÁN VI XỬ LÝ
Tên đề tài: Thiết kế và điều khiển mô hình giám sát nhiệt độ và độ ẩm hệ
thống thông gió trong nhà kho

Giáo viên hướng dẫn : Trần Hữu Danh




PHỤ LỤC
1. MỤC TIÊU VÀ GIỚI HẠN ĐỀ TÀI CẦN ĐẠT ĐƯỢC
2. MÔ HÌNH HỆ THỐNG THÔNG QUA SƠ ĐỒ KHỐI
3. PHÂN TÍCH VÀ LỰA CHỌN LINH KIỆN
4. LƯU ĐỒ CHƯƠNG TRÌNH DIỀU KHIỂN
5. SƠ ĐỒ NGUYÊN LÝ
6. MẠCH IN
7. TỔNG KẾT ĐỀ TÀI


£ NỘI DUNG BÁO CÁO
1. MỤC TIÊU VÀ GIỚI HẠN ĐỀ TÀI CẦN ĐẠT
ĐƯỢC
_Mục tiêu:Thiết kế và điều khiển được mô hình đo nhiệt độ và đô ẩm của hệ thống
thông gió trong nhà kho và hiển thị kết quả đo được trên LCD.
_Giới hạn :
_Chọn và sử dụng linh kiện hợp lý nhất, tránh lãng phí tài nguyên


_Thiết kế phải sử dụng được chức năng phần cứng tích hợp trong MSP430
hiện có để có thể tối ưu nhất định trong thiết kế phần cứng của hệ thống.
_ Nhiệt độ và độ ẩm đọc được có thể có sai số không quá 5%


2. MÔ HÌNH HỆ THỐNG THÔNG QUA SƠ ĐỒ
KHỐI

LED

Cảm biến nhiệt độ độ ẩm DHT11

Bộ xử lý trung tâm MSP
430G2553

Phím điều khiễn tự đông

3. PHÂN TÍCH VÀ LỰA CHỌN LINH KIỆN


MSP430G2553 loại 20 chân

Hiển thị LCD












Ngõ vào:
Chân SCK kết nối với chân P1.1 của MSP430G2553
Chân DT kết nối với chân P1.2 của MSP430G2553
Ngõ ra: Dữ liệu
Chân P1.4 kết nối với D4 của LCD
Chân P1.5 kết nối với D5 của LCD
Chân P1.6 kết nối với D6 của LCD
Chân P1.7 kết nối với D7 của LCD

 Vi điều khiển MSP430G2553 thực hiện điều khiển toàn bộ
quá trình chuyển đổi từ tín hiệu lực đo được thành dữ liệu số
thể hiện trung thực nhất và giao tiếp với các thiết bị khác để
trao đổi thông tin





Thông số kỹ thuật và ưu điểm của msp430g2553



-Low Supply-Voltage Range: 1.8 V to 3.6 V




- Cấu trúc sử dụng nguồn thấp giúp kéo dài tuổi thọ của Pin (siêu tiết kiệm
điện):



+Duy trì 0.1µA dòng nuôi RAM.



+Chỉ 0.8µA real-time clock.



+230 µA/ MIPS.



-Bộ tương tự hiệu suất cao cho các phép đo chính xác



-Bộ giám sát điện áp nguồn.



-16 bit RISC CPU cho phép được nhiều ứng dụng, thể hiện một phần ở kích
thước Code lập trình.




+Thanh ghi lớn nên loại trừ được trường hợp tắt nghẽn tập tin khi đang làm
việc.



+Thiết kế nhỏ gọn làm giảm lượng tiêu thụ điện và giảm giá thành.



+Tối ưu hóa cho những chương trình ngôn ngữ bậc cao như C, C++Tối ưu hóa
cho những chương trình ngôn ngữ bậc cao như C, C++



-Có 7 chế độ định địa chỉ.



-Khả năng ngắt theo véc tơ lớn.
+ Trong lập trình cho bộ nhớ Flash cho phép thay đổi Code một cách linh
hoạt, phạm vi rộng, bộ nhớ Flash còn có thể lưu lại như nhật ký của dữ liệu.



-Tần số bên trong lên đến 16 MHz với bốn chế độ tần số được hiệu chỉnh



-Crystal 32 kHz




-Năm chế độ tiết kiệm năng lượng





DHT11
Hình ảnh







Thông tin cơ bản
Điện áp hoạt động: 3V - 5V (DC)
Dãi độ ẩm hoạt động: 20% - 90% RH, sai số ±5%RH
Dãi nhiệt độ hoạt động: 0°C ~ 50°C, sai số ±2°C
Khoảng cách truyển tối đa: 20m

DHT11 Là cảm biến 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.





Sơ đồ kết nối của DHT11:







Nguyên lý hoạt động:
Để có thể giao tiếp với DHT11 theo chuẩn 1 chân vi xử lý thực
hiện theo 2 bước:
o Gửi tin hiệu muốn đo (Start) tới DHT11, sau đó DHT11 xác
nhận lại.
o Khi đã giao tiếp được với DHT11, Cảm biến sẽ gửi lại 5 byte
dữ liệu và nhiệt độ đo được.
Bước 1 gửi tín hiệu start

MCU thiết lập chân DATA là Output, kéo chân DATA xuống 0 trong
khoảng thời gian >18ms. Trong Code mình để 25ms. Khi đó
DHT11 sẽ hiểu MCU muốn đo giá trị nhiệt độ và độ ẩm.
+ MCU đưa chân DATA lên 1, sau đó thiết lập lại là chân đầu vào.
+ Sau khoảng 20-40us, DHT11 sẽ kéo chân DATA xuống thấp.
Nếu >40us mà chân DATA ko được kéo xuống thấp nghĩa là ko
giao tiếp được với DHT11.
+ Chân DATA sẽ ở mức thấp 80us sau đó nó được DHT11 kéo nên
cao trong 80us. Bằng việc giám sát chân DATA, MCU có thể biết
được có giao tiếp được với DHT11 ko. Nếu tín hiệu đo được
DHT11 lên cao, khi đó hoàn thiện quá trình giao tiếp của MCU với
DHT.








Đọc giá trị trên DHT11
DHT11 sẽ trả giá trị nhiệt độ và độ ẩm về dưới dạng 5 byte.
Trong đó:
+ Byte 1: giá trị phần nguyên của độ ẩm (RH%)
+ Byte 2: giá trị phần thập phân của độ ẩm (RH%)
+ Byte 3: giá trị phần nguyên của nhiệt độ (TC)
+ Byte 4 : giá trị phần thập phân của nhiệt độ (TC)
+ Byte 5 : kiểm tra tổng.
+ Nếu Byte 5 = (8 bit) (Byte1 +Byte2 +Byte3 + Byte4) thì
giá trị độ ẩm và nhiệt độ là chính xác, nếu sai thì kết quả đo
không có nghĩa.
+ Đọc dữ liệu:
Sau khi giao tiếp được với DHT11, DHT11 sẽ gửi liên tiếp 40
bit 0 hoặc 1 về MCU, tương ứng chia thành 5 byte kết quả của
Nhiệt độ và độ ẩm.
+ Đọc dữ liệu:
Sau khi giao tiếp được với DHT11, DHT11 sẽ gửi liên tiếp 40
bit 0 hoặc 1 về MCU, tương ứng chia thành 5 byte kết quả của
Nhiệt độ và độ ẩm.
+ Bit 0:







Sau khi tín hiệu được đưa về 0, ta đợi chân DATA của MCU được DHT11 kéo
lên 1. Nếu chân DATA là 1 trong khoảng 26-28 us thì là 0, còn nếu tồn tại
70us là 1. Do đó trong lập trình ta bắt sườn lên của chân DATA, sau đó delay


50us. Nếu giá trị đo được là 0 thì ta đọc được bit 0, nếu giá trị đo được là 1
thì giá trị đo được là 1. Cứ như thế ta đọc các bit tiếp theo.







LCD 16x2
Hình ảnh




Sơ đồ chân



4.



4.LƯU ĐỒ CHƯƠNG TRÌNH DIỀU KHIỂN
BẮT ĐẦU

ĐẶT VÀ ĐIỀU CHỈNH NGƯỠNG NHIỆT ĐỘ VÀ ĐỘ
ẨM CHO PHÉP
KHỞI TẠO LCD
HIỂN THỊ THÔNG TIN ĐỀ TÀI
HIỂN THỊ NHIỆT ĐỘ VÀ ĐỘ ẦM MÀ CẢM BIẾN DO
ĐƯỢC

So sánh nhiệt đô và độ ẩm đo đươc> nhiệt
độ và độ ẩm set

Nhiệt độ> nhiệt độ set

Loa kêu

Độ ẩm > độ ẩm set

Còi báo

Nhiệt độ,độ ẩm> nhiệt độ ,độ
ẩm set

Led chớp tắt

Nhiệt độ độ ẩm< nhiệt
độ độ ẩm set

Không báo



Kết nối (SỬ DỤNG ARDUINO VÀ ESP8266)
ESP8266 Sensor
5V

Vcc

GND

GND

GPIO04

OUT

Source code test
#include <DHT.h>
//DHT config
#define DHTPIN 16
// what digital pin we're connected to
#define DHTTYPE DHT11
// DHT 11
//#define DHTTYPE DHT22
// DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21
// DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);

dht.begin();
}
void loop() {
float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (isnan(temp) || isnan(humi)) {
Serial.println("Failed to read from DHT sensor!");
return;
} else {


Serial.printf("Nhiet do %s - Do am %s\r\n",
String(temp, 1).c_str(),
String(humi, 1).c_str());
}
delay(500);
}
#include <DHT.h>
//DHT config
#define DHTPIN 4
// what digital pin we're connected to
#define DHTTYPE DHT11
// DHT 11
//#define DHTTYPE DHT22
// DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21
// DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);

dht.begin();
}
void loop() {
float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (isnan(temp) || isnan(humi)) {
Serial.println("Failed to read from DHT
sensor!");
return;
}else{
Serial.printf("Nhiet do %s - Do am %s\r\n",
String(temp, 1).c_str(), String(humi, 1).c_str());
}
delay(500);
}


Kết nối cảm biến DHT11 với mạch Arduino
DHT11
GND
Vcc
Signal

Arduino UNO R3
GND
5V
D2

Lập trình
1. // Gọi thư viện DHT11

2. #include "DHT.h"
3.
4. const int DHTPIN = 2;
mạch Arduino

//Đọc dữ liệu từ DHT11 ở chân 2 trên

5. const int DHTTYPE = DHT11;
là DHT11 và DHT22

//Khai báo loại cảm biến, có 2 loại

6.
7. DHT dht(DHTPIN, DHTTYPE);
8.
9. void setup() {
10.

Serial.begin(9600);

11.

dht.begin();

// Khởi động cảm biến

12. }
13.
14. void loop() {
15.


float h = dht.readHumidity();

//Đọc độ ẩm

16.

float t = dht.readTemperature(); //Đọc nhiệt độ

17.
18.

Serial.print("Nhiet do: ");

19.

Serial.println(t);

20.

Serial.print("Do am: ");

//Xuất nhiệt độ


21.

Serial.println(h);

//Xuất độ ẩm


23.

Serial.println();

//Xuống hàng

24.

delay(1000);

//Đợi 1 giây

22.

25. }

. Kết hợp đọc nhiệt độ độ - độ ẩm và xuất ra màn hình
26. #include <DHT.h>
27. #include <Wire.h>
28. #include <LiquidCrystal_I2C.h>
29.
30. LiquidCrystal_I2C lcd(0x27,16,2);
31.
32. const int DHTPIN = 2;
33. const int DHTTYPE = DHT11;
34. DHT dht(DHTPIN, DHTTYPE);
35.
36. byte degree[8] = {
37.

0B01110,
38.
0B01010,
39.
0B01110,
40.
0B00000,
41.
0B00000,
42.
0B00000,
43.
0B00000,
44.
0B00000
45. };
46.
47. void setup() {
48.
lcd.init();
49.
lcd.backlight();
50.
51.
lcd.print("Nhiet do: ");
52.
lcd.setCursor(0,1);
53.
lcd.print("Do am: ");
54.

55.
lcd.createChar(1, degree);
56.
57.
dht.begin();
58. }
59.
60. void loop() {
61.
float h = dht.readHumidity();
62.
float t = dht.readTemperature();
63.
64.
if (isnan(t) || isnan(h)) { // Kiểm tra xem thử việc đọc
giá trị có bị thất bại hay không. Hàm isnan bạn xem tại đây


65.
}
66.
else {
67.
lcd.setCursor(10,0);
68.
lcd.print(round(t));
69.
lcd.print(" ");
70.
lcd.write(1);

71.
lcd.print("C");
72.
73.
lcd.setCursor(10,1);
74.
lcd.print(round(h));
75.
lcd.print(" %");
76.
}
77. }
78. /*


MSP430G2553

#include <msp430g2553.h>
#include <intrinsics.h>
#include <string.h>
#include <stdio.h>

typedef unsigned char uchar;

union reg
{ unsigned char _byte;
struct bit
{
unsigned char b0:1;
unsigned char b1:1;

unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
} _bit;
};

union reg* P2_dir=(union reg*)0x2a;
union reg* P2_out=(union reg*)0x29;
union reg* P2_sel=(union reg*)0x2e;
union reg* P2_in=(union reg*)0x28;
union reg* P2_ren=(union reg*)0x2f;


union reg* P1_sel=(union reg*)0x26;
union reg* P1_dir=(union reg*)0x22;
union reg* P1_out=(union reg*)0x21;
union reg* P1_in=(union reg*)0x20;
union reg* P1_ren=(union reg*)0x27;

#define MCLK_F 1

// frequency of Master Clock in MHz

/* Function Set definitions */
#define FOUR_BIT 0x2C /* 4-bit Interface

*/


#define LINES_5X7 0x38 /* 5x7 characters, multiple line */

/*note:
EIGHT_BIT 0x3C == 8-bit Interface
LINE_5X7 0x30 == 5x7 characters, single line
LINE_5X10 0x34 == 5x10 characters */

/* Display ON/OFF Control definitions */
#define DON

0x0F /* Display on

*/

#define DOFF

0x0B /* Display off

*/

#define CURSOR_ON 0x0F /* Cursor on

*/

#define CURSOR_OFF 0x0D /* Cursor off

*/

#define BLINK_ON


0x0F /* Cursor Blink */

#define BLINK_OFF 0x0E /* Cursor No Blink */

/* Cursor or Display Shift definitions */
#define SHIFT_CUR_LEFT

/*note:

0x04 /* Cursor shifts to the left */


SHIFT_CUR_RIGHT 0x05 == Cursor shifts to the right
SHIFT_DISP_LEFT 0x06 == Display shifts to the left
SHIFT_DISP_RIGHT 0x07 == Display shifts to the right */

#define LCD_RS

P1_out -> _bit.b0

#define LCD_RS_DIR
#define LCD_EN

P1_dir -> _bit.b0
P1_out -> _bit.b1

#define LCD_EN_DIR

P1_dir -> _bit.b1


// This driver just help you to "write" LCD, not to read LCD "status".
// So that, you must pull your pin LCD_RW to GND (0V).
#define LCD_DATA_4

P1_out -> _bit.b2

#define LCD_DATA_4_DIR P1_dir -> _bit.b2
#define LCD_DATA_5

P1_out -> _bit.b3

#define LCD_DATA_5_DIR P1_dir -> _bit.b3
#define LCD_DATA_6

P1_out -> _bit.b4

#define LCD_DATA_6_DIR P1_dir -> _bit.b4
#define LCD_DATA_7

P1_out -> _bit.b5

#define LCD_DATA_7_DIR P1_dir -> _bit.b5

void lcd_delay_us (unsigned long t)
{
int i;
for (i = t; i>0; i-- )
__delay_cycles(MCLK_F);
}

void lcd_delay_ms (unsigned long t)
{
int i;
for (i = t; i>0; i-- )


__delay_cycles(MCLK_F*1000);
}

void lcd_put_byte(unsigned char rs, unsigned char data)
{
LCD_RS = 0;
if(rs) LCD_RS = 1;
lcd_delay_us(20);
LCD_EN = 0;

// send the high nibble
if (data&BIT4) LCD_DATA_4 = 1;
else LCD_DATA_4 = 0;
if (data&BIT5) LCD_DATA_5 = 1;
else LCD_DATA_5 = 0;
if (data&BIT6) LCD_DATA_6 = 1;
else LCD_DATA_6 = 0;
if (data&BIT7) LCD_DATA_7 = 1;
else LCD_DATA_7 = 0;

lcd_delay_us(20);
LCD_EN = 1;
lcd_delay_us(20);
LCD_EN = 0;


// send the low nibble
if (data&BIT0) LCD_DATA_4 = 1;
else LCD_DATA_4 = 0;
if (data&BIT1) LCD_DATA_5 = 1;
else LCD_DATA_5 = 0;
if (data&BIT2) LCD_DATA_6 = 1;


else LCD_DATA_6 = 0;
if (data&BIT3) LCD_DATA_7 = 1;
else LCD_DATA_7 = 0;

lcd_delay_us(20);
LCD_EN = 1;
lcd_delay_us(20);
LCD_EN = 0;
}

void lcd_init(void)
{
// Set all signal pins as output
LCD_RS_DIR = 1;
LCD_EN_DIR = 1;
LCD_DATA_4_DIR = 1;
LCD_DATA_5_DIR = 1;
LCD_DATA_6_DIR = 1;
LCD_DATA_7_DIR = 1;

LCD_RS = 0;

LCD_EN = 0;
lcd_delay_ms(200);

// delay for power on

// reset LCD
lcd_put_byte(0,0x30);
lcd_delay_ms(50);
lcd_put_byte(0,0x30);
lcd_delay_ms(50);
lcd_put_byte(0,0x32);
lcd_delay_ms(200);

// delay for LCD reset


lcd_delay_ms(2);

// wait for LCD

lcd_put_byte(0,FOUR_BIT & LINES_5X7);
lcd_delay_ms(2);

// Set LCD type

// wait for LCD

lcd_put_byte(0,DOFF&CURSOR_OFF&BLINK_OFF);
lcd_delay_ms(2);


// wait for LCD

lcd_put_byte(0,DON&CURSOR_OFF&BLINK_OFF);
lcd_delay_ms(2);

// clear display and move cursor to home

// wait for LCD

lcd_put_byte(0,SHIFT_CUR_LEFT);
lcd_delay_ms(2);

// cursor shift mode

// wait for LCD

lcd_put_byte(0,0x01);
lcd_delay_ms(2);

// clear display and move cursor to home

// wait for LCD

}

void lcd_clear(void)
{
lcd_put_byte(0,0x01);
lcd_delay_ms(2);


// display on

// wait for LCD

lcd_put_byte(0,0x01);
lcd_delay_ms(2);

// display off

// display off

// wait for LCD

}

void lcd_gotoxy(unsigned char col, unsigned char row)
{
unsigned char address;


×