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

Luận văn môn ứng dụng máy tính trong đo lường và điểu khiển giám sát nhiệt độ , độ ẩm môi trường, độ ẩm đất và điều khiển thiết bị trong nông nghiệp

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 (1.71 MB, 37 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
ĐẠI HỌC CÔNG NGHỆ

BÀI TẬP LỚN
ỨNG DỤNG MÁY TÍNH TRONG ĐO LƯỜNG VÀ ĐIỀU
KHIỂN
ĐỀ TÀI : Giám sát nhiệt độ , độ ẩm môi trường, độ ẩm đất
và điều khiển thiết bị trong nơng nghiệp

GVHD:

Hồng Văn Mạnh

Sinh viên thực hiện:

Hà Nội, năm 2021

1


NHIỆM VỤ TỪNG THÀNH VIÊN
Họ và tên

Nhiệm vụ

Mức độ hoàn
thành

Đào Thành Lộc

Thiết kế cơ sở dữ liệu, giao diện điều


khiển qua máy tính, lập trình điều
khiển cho thiết bị

100%

Phạm Văn Lực

Thiết kế mạch nguyên lý, mạch
PCB, đấu nối phần cứng

100%

Nguyễn Thị Nga

Thiết kế ứng dụng điều khiển qua
thiết bị di động (Smartphone)

100%

ĐÁNH GIÁ ĐIỂM TỪNG THÀNH VIÊN
-

Điểm giảng viên đánh giá:................................................................................
Nhận xét của giảng viên:..................................................................................
..........................................................................................................................
Điểm từng thành viên:
+ Đào Thành Lộc:.............................................................................................
+ Phạm Văn Lực:..............................................................................................
+ Nguyễn Thị Nga:...........................................................................................
Giảng viên

Hoàng Văn Mạnh

2


MỤC LỤC

3


Mục lục hình ảnh

LỜI MỞ ĐẦU
Hiện nay, cách mạng cơng nghiệp 4.0 đang là xu thế phát triển trên thế giới, đi
cùng với đó lĩnh vực IOT (Vạn vật internet - Internet of things) là thành phần không
thể thiếu. Đối với các nước phát triển, nền công nghiệp của họ đã có thể được quản lý,
giám sát và hoạt động hầu hết bằng máy móc mà chỉ tốn rất ít nhân công. Dần dần,
lĩnh vực tưởng chừng chỉ phù hợp với các ngành công nghiệp này đã lan sang cả các
ngành nông nghiệp. Ở nhiều nước, nền nông nghiệp của họ đã đi theo một hướng phát
triển mới đó là nơng nghiệp chính xác hoặc canh tác chính xác, đó là kỹ thuật áp dụng
đúng số lượng đầu vào (nước, phân bón, thuốc trừ sâu…) vào đúng vị trí và thời điểm
để tăng cường sản xuất và nâng cao chất lượng nông sản.
Ở Việt Nam, nông nghiệp chủ yếu vẫn phụ thuộc 90% vào thời tiết, khí hậu tức là
vẫn thụ động trước những biến cố mà thiên nhiên gây ra cho cây trồng của mình. Nhận
thức được vấn đề đó, chúng em đã lựa chọn đề tài “Nghiên cứu, tích hợp hệ thống
mạng cảm biến trong nơng nghiệp” với hi vọng sẽ có thể sẽ phát triển một hệ thống
nông nghiệp thông minh công nghệ cao.

4



PHẦN 1: CƠ SỞ LÝ THUYẾT LIÊN QUAN
1.1 Vi điều khiển ATMEGA16
1.1.1 Kiến trúc vi điều khiển

AVR là họ vi điều khiển 8 bit theo công nghệ mới, với những tính năng rất
mạnh được tích hợp trong chip của hãng Atmel theo cơng nghệ RISC, nó mạnh
ngang hàng với các họ vi điều khiển 8 bit khác như PIC, Pisoc. Do ra đời muộn hơn
nên họ vi điều khiển AVR có nhiều tính năng mới đáp ứng tối đa nhu cầu của người
sử dụng, so với họ 8051 89xx sẽ có độ ổn định, khả năng tích hợp, sự mềm dẻo
trong việc lập trình và rất tiện lợi.
*Tính năng mới của họ AVR
- Giao diện SPI đồng bộ
- các đường dẫn vào ra (I/O) lập trình được
- Giao tiếp I2C
- Bộ biến đổi ADC10 bit
- Các kênh băm xung PWM
- Các chế độ tiết kiệm năng lương như sleep….
- Một bộ định thời Watchdog
- 3 bộ timer/Counter 16 bit
- 1 bộ so sánh analog
- Bộ nhớ EEPROM
- Giao tiếp USART/VV
1.1.2 Giới thiệu vi điều khiển Atmega 16
Atmelga16 có đầy đủ tính năng của họ AVR, về giá thành so với các loại khác
thì giá thành là vừa phải khi nghiên cứu và làm các công việc ứng dụng tới vi điều
khiển. Tính năng:
- Bộ nhớ 16 K (flash) – 512 byte (EEPROM) – 1 K (SRAM)
- Đóng vỏ 40 chân , trong đó có 32 chân vào ra dữ liệu chia làm 4 PORT A,B,C,D.
Các chân này đều có chế độ pull_up resistors.

- Giao tiếp SPI – Giao tiếp I2C. – Có 8 kênh ADC 10 bit
- 1 bộ so sánh analog. – 4 kênh PWM
- 2 bộ timer/ counter 8 bit.1 bộ timer/counter1 16 bit
- 1 bộ định thời WatchDog
- 1 bộ truyền nhận UART lập trình được.
Mơ tả các chân
- VCC và GND 2 chân cấp nguồn cho vi điều khiển hoạt động
- Reset đây là chân reset cứng khởi động lại mọi hoạt động của hệ thống
- 2 chân XTAL1,XTAL2 các chân tạo bộ dao động ngoài cho vi điều khiển, các chân
này được nối với thạch anh (haysuwr dụng lạo 16 M ), tụ gốm (22p)
- Chân Vret thường nối lên 5V(VCC), nhưng khi sử dụng bộ ADC thì chân này
được sử dụng làm điện thế so sánh, khi chân này phải cấp cho nó điện áp cố định
5


Phần mềm lập trình Atmelstudio
1.2 Cơ sở dữ liệu Firebase
- Firebase là gì?

Firebase là một nền tảng để phát triển ứng dụng di động và trang web, bao gồm
các API đơn giản và mạnh mẽ mà không cần backend hay server.
Firebase là dịch vụ cơ sở dữ liệu hoạt động trên nền tảng đám mây – cloud. Kèm
theo đó là hệ thống máy chủ cực kỳ mạnh mẽ của Google. Chức năng chính là giúp
người dùng lập trình ứng dụng bằng cách đơn giản hóa các thao tác với cơ sở dữ
liệu.
Cụ thể là những giao diện lập trình ứng dụng API đơn giản. Mục đích nhằm
tăng số lượng người dùng và thu lại nhiều lợi nhuận hơn.
Đặc biệt, còn là dịch vụ đa năng và bảo mật cực tốt. Firebase hỗ trợ cả hai nền
tảng Android và IOS. Không có gì khó hiểu khi nhiều lập trình viên chọn Firebase
làm nền tảng đầu tiên để xây dựng ứng dụng cho hàng triệu người dùng trên toàn

thế giới
- Firebase Realtime Database:
Khi đăng ký một tài khoản trên Firebase để tạo ứng dụng, bạn đã có một cơ sở
dữ liệu thời gian thực. Dữ liệu bạn nhận được dưới dạng JSON. Đồng thời nó cũng
ln được đồng bộ thời gian thực đến mọi kết nối client.
Đối với các ứng dụng đa nền tảng, tất cả các client đều sử dụng cùng một cơ sở
dữ liệu. Nó được tự động cập nhật dữ liệu mới nhất bất cứ khi nào các lập trình viên
phát triển ứng dụng. Cuối cùng, tất cả các dữ liệu này được truyền qua kết nối an
toàn SSL có bảo mật với chứng nhận 2048 bit.
Trong trường hợp bị mất mạng, dữ liệu được lưu lại ở local, vì thế khi có mọi
sự thay đổi nào đều được tự động cập nhật lên Server của Firebase. Bên cạnh đó,
đối với các dữ liệu ở local cũ hơn với Server thì cũng tự động cập nhật để được dữ
liệu mới nhất.

6


Hình 1:Reatime Database

- Ưu điểm khi dùng Firebase là gì?

Từ các cách thức hoạt động phía trên, chắc hẳn bạn đã nhận thấy sơ lược những lợi
ích mà Firebase mang lại cho cộng đồng lập trình nói chung và các lập trình viên
xây dựng ứng dụng nói riêng.
Cụ thể hơn, các lợi ích này bao gồm:
• Triển khai ứng dụng nhanh chóng
• Bảo mật
• Sự ổn định
- Nhược điểm của Firebase là gì?
“Firebase” chính là phần Realtime Database, đúng hơn chỉ là phần Database.

Cơ sở dữ liệu của họ được tổ chức theo kiểu trees, parent-children, không phải là
kiểu Table nên những ai đang quen với SQL có thể sẽ gặp khó khăn từ mức đơi chút
tới khá nhiều.
1.3 Lập trình giao diện với ngơn ngữ C #
- C# là ngơn lập trình hướng đối tượng được phát triển bởi Microsoft,Microsoft
phát triển C# dựa trên C++ và java. C# được miêu tả là ngơn ngữ có sự cân
bằng giữa C++.Visual Basic .Delphi và java
- C# được thiết kế chủ yếu bởi Anders kiến trúc sư phần mềm nổi tiếng với các
sản phẩm Turbo Pascal, Delphi,J++.WFC
- C# theo một hướng nào đó là ngơn ngữ lập trình phản ánh trực tiếp nhất đến

NET Framework mà tất cả chương trình.NET chạy và nó phụ thuộc mạnh mẽ
vào Framwork này.Mọi dữ liệu cơ sở đều là đối tượng được cấp phát và hủy
7


bỏ bời trình dọn rác và nhiều kiểu trừu tượng khác nhau như calss… phản
ánh rõ rang những đặc trung của.Net runtime
- So sánh với C và C++ .Ngôn ngữ C# bị giới hạn và được nâng cao ở một vài
đặc điểm nào đó , nhưng khơng bao giờ gồm các giới hạn sau
• Các con trỏe chỉ có thể được sử dụng trong các chế độ khơng an tồn. Hầu hết

các đối tượng được tham chiếu an toàn và các phép tính đề được kiểm tra
tràn bộ đệm.Các con trỏe được gọi bằng cách tham chiếu
• Các đối tượng khơng thể được giải phóng tường minh
• Chỉ có đơn khế thừa, nhưng có thể cài đặt nhiều interface trừu tượng . Chức
năng này làm đơn giản hóa sự thực thi của thời gian thực thi
• Cú pháp khaibaos mảng khác nahu
• Kiểu thứ tự được thay thế bằng tên miền khơng gian
• C# khơng có tiêu bản

• Có them properties, các phương pháo có thẻ gọi các properties để truy cập dữ
liệu
• Có thêm properties
• Có reflection

8


PHẦN 2: NỘI DUNG THỰC HIỆN
2.1 Thành phần hệ thống
2.1.1 Vi điều khiển Atmega16
Thông số kĩ thuật:
- Flash (Kbytes): 16 Kbytes
- Pin Count: 44
- Tần số thường hoạt động (MHz): 16 MHz
- CPU: 8-bit AVR
- Max I/ O Pins: 32
Vi điều khiển ATMEGA16 hiệu suất cao, công suất thấp Atmel 8-bit AVR
RISC dựa trên kết hợp 16KB bộ nhớ flash có thể lập trình, 1KB SRAM, 512B
EEPROM, một 10-bit A / D chuyển đổi 8-kênh, và một giao diện JTAG cho on-chip
gỡ lỗi. Thiết bị hỗ trợ thông lượng của 16 MIPS ở 16 MHz và hoạt động giữa 4,55,5 volt.
Vi điều khiển ATMEGA16 thực hiện hướng dẫn trong một chu kỳ đồng hồ duy
nhất, các thiết bị đạt được thông lượng gần 1 MIPS mỗi MHz, cân bằng điện năng
tiêu thụ và tốc độ xử lý.

Hình 2: Sơ đồ chân Atmega16

2.1.2 Node MCU8266
9



- Giới thiệu Node Mcu8266
ESP8266 là một mạch vi điều khiển có thể giúp chúng ta điều khiển các thiết bị điện

tử. Thêm vào đó nó được tích hợp wi-fi 2.4GHz có thể dùng cho lập trình.

Hình 3: ESP8266 NODE MCU

- Thơng số kỹ thuật
• 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 ( tương đương cáp sạc điện thoại )
Hỗ trợ bảo mật: WPA/WPA2
Tích hợp giao thức TCP/IP
Lập trình trên các ngơn ngữ: C/C++, Micropython,…

10



2.1.3 Cảm biến độ ẩm đất và bộ chuyển đổi
- Cảm biến độ ẩm đất: Hai đầu đo của cảm biến được cắm vào đất để phát hiện độ
ẩm. Dùng dây nối giữa cảm biến và module chuyển đổi. Thông tin về độ ẩm đất sẽ
được đọc về và gởi tới module chuyển đổi.

Hình 4: Cảm biến độ ẩm đất

- Bộ chuyển đổi: Module chuyển đổi có cấu tạo chính gồm một IC so sánh
LM393, một biến trở , 4 điện trở dán 100 ohm và 2 tụ dán. Biến trở có chức năng định
ngưỡng so sánh với tín hiệu độ ẩm đất đọc về từ cảm biến. Ngưỡng so sánh và tín hiệu
11


cảm biến sẽ là 2 đầu vào của IC so sánh LM393. Khi độ ẩm thấp hơn ngưỡng định
trước, ngõ ra của IC là mức cao (1), ngược lại là mức thấp (0).

Hình 4: Cảm biến độ ẩm đất

- Đặc điểm:
- Điện áp hoạt động: 3.3V-5V
- Kích thước PCB: 3cm * 1.6cm
- Led báo hiệu
• Led đỏ báo nguồn
• Led xanh báo mức độ ẩm ở pin DO

Mô tả các pin trên module:
Pin
VCC
GND

DO
AO

Mơ tả
3.3 – 5V
GND
Đầu ra tín hiệu số
Đầu ra tín hiệu tương tự

- Ứng dụng: Cảm biến độ ẩm đất có thể được sử dụng cho các ứng dụng nông
nghiêp, tưới nước tự động cho các vườn cây khi đất khô, hoặc dùng trong các ứng
dụng của hệ thống nhà thông minh.
2.1.4 Cảm biến nhiệt độ, độ ẩm DHT11
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 tốn nào.
12


Hình 5: Cảm biến nhiệt độ DHT11

Thơng số kỹ thuật
-

Đ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.


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:
-

Gửi tin hiệu muốn đo (Start) tới DHT11, sau đó DHT11 xác nhận lại.
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.
2.2 Thiết kế mạch hệ thống
Trong đề tài lần này chúng em sử dụng phần mềm Altium để thiết kế mạch và
tạo file PCB phục vụ cho việc in mạch theo các khối như sau:

13


2.2.1 Khối vi điều khiển

Hình 6: Khối vi điều khiển

2.2.2 Khối nguồn

Hình 7: Khối nguồn

14


2.2.3 Khối relay

Hình 8 : Khối Relay


2.2.4 Khối nút nhấn

Hình 9: Khối nút nhấn

2.2.5 Mạch mô phỏng 3D và mạch thực tế:
- Giới thiệu phần mềm thiết kế mạch Altium:

15


Altium ngày nay đang là một trong những phần mềm vẽ mạch điện tử mạnh và
được ưa chuộng ở Việt Nam.Ngoài việc hỗ trợ tốt cho hoạt động vẽ mạch,Altium cịn
hỗ trợ tốt trong việc quản lý mạch,trích xuất file thống kê linh kiện.
Altium Designer cung cấp một ứng dụng kết hợp tất cả công nghệ và chức năng
cần thiết cho việc phát triển sản phẩm điện tử hoàn chỉnh, như thiết kế hệ thống ở mức
bo mạch và FPGA, phát triển phần mềm nhúng cho FPGA và các bộ xử lý rời rạc, bố
trí mạch in (PCB)… Altium Designer thống nhất tồn bộ các q trình lại và cho phép
bạn quản lý được mọi mặt quá trình phát triển hệ thống trong mơi trường tích hợp duy
nhất. Khả năng đó kết hợp với khả năng quản lý dữ liệu thiết kế hiện đại cho phép
người sử dụng Altium Designer tạo ra nhiều hơn những sản phẩm điện tử thông minh,
với chi phí sản phẩm thấp hơn và thời gian phát triển ngắn hơn.

-

Mô phỏng mạch 3D:

16


Hình 10: Hình ảnh 3D của mạch điều khiển


17


-

Mạch thực tế:

Hình 11: Hình ảnh thực tế của mạch đk

2.3 Chương trình nạp cho Vi điều khiển
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <avr/interrupt.h>

volatile int dem = 0;
volatile int dem1 = 0;

#define DHT11_PIN PD2
uint8_t c=0,I_RH,D_RH,I_Temp,D_Temp,CheckSum;

18


// USART
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


/////////////////////////////////////////////////////////////////////////////////////////////////
void UART_init(long USART_BAUDRATE)
{
UCSRB |= (1 << RXEN) | (1 << TXEN) | (1<< RXCIE);/* Turn on transmission and
reception */
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);/* Use 8-bit character sizes */
UBRRL = BAUD_PRESCALE;

/* Load lower 8-bits of the baud rate value */

UBRRH = (BAUD_PRESCALE >> 8);

/* Load upper 8-bits*/

sei();
}
unsigned char UART_RX()
{
while(!(UCSRA&(1<return UDR;
}
void UART_TxChar(char ch)
{
while (! (UCSRA & (1<
/* Wait for empty transmit buffer*/

UDR = ch ;
}


void UART_SendString(char *str)
{
unsigned char j=0;

while (str[j]!=0)

/* Send string till null */

{
UART_TxChar(str[j]);
j++;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
void Request()

/* Microcontroller send start pulse/request */

{
DDRD |= (1<
19


PORTD &= ~(1<
/* set to low pin */

_delay_ms(30);


/* wait for 20ms */

PORTD |= (1<
}

int Response()
{
DDRD &= ~(1<_delay_us(39);
if((PIND & (1<return 1;
_delay_us(80);
if(!(PIND & (1<return 1;
_delay_us(80);
}

uint8_t Receive_data()

/* receive data */

{
for (int q=0; q<8; q++)
{
while((PIND & (1<_delay_us(30);
if(PIND & (1<c = (c<<1)|(0x01);


/* then its logic HIGH */

else

/* otherwise its logic LOW */

c = (c<<1);
while(PIND & (1<}
return c;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void ADC_Init()
{
//DDRA = (1<
/* Make ADC port as input */

ADCSRA = 0x87;

/* Enable ADC, fr/128 */

}

20


int ADC_Read()
{
ADMUX = 0x40;


/* Vref: Avcc, ADC channel: 0 */

ADCSRA |= (1<
/* start conversion */

while ((ADCSRA &(1<ADCSRA |=(1<
/* set the ADIF bit of ADCSRA register */

return(ADCW);

/* return the ADCW */

}
void controlsw()
{
if((PIND&(1<{
while((PIND&(1<PORTA ^=(1<}
if((PIND&(1<{
while((PIND&(1<PORTA ^=(1<}
if((PIND&(1<

{
while((PIND&(1<PORTA ^=(1<}
if((PIND&(1<{
while((PIND&(1<PORTD ^=(1<}
Request();

/* send start pulse */

if (Response()!=1)
{

I_RH=Receive_data(); /* store first eight bit in I_RH */

21


D_RH=Receive_data();

/* store next eight bit in D_RH */

I_Temp=Receive_data();

/* store next eight bit in I_Temp */

D_Temp=Receive_data();


/* store next eight bit in D_Temp */

CheckSum=Receive_data();/* store next eight bit in CheckSum */

}

}
int main(void)
{
DDRA = 0B11111110;
DDRB = 0xff;
DDRD = 0B10000000;
TCCR0 = (1<< CS00) | (1<< CS01); // PRE = 64
TCNT0 = 130 ;
TIMSK |=(1<sei();
UART_init(9600);

//UART_SendString("\n\t Echo Test ");
char data1[5];
char data2[5];
char data3[5];
char data4[5];
char data5[5];
ADC_Init();

/* initialize the ADC */

char array[5];

int adc_value;
float moisture;
PORTA |= (1<PORTD |= (1<_delay_ms(100);
while(1)
{
controlsw();
adc_value = ADC_Read();

/* Copy the ADC value */

22


moisture = (adc_value*5*100.00)/1023.00; /* Calculate moisture in % */
if (dem > 2000)
{
UART_SendString("N1,");
itoa(moisture,data1,10);
UART_SendString(data1);
UART_SendString(",");
_delay_ms(10);
itoa(moisture,data3,10);
UART_SendString(data3);
UART_SendString(",");
_delay_ms(10);
itoa(moisture,array,10);
UART_SendString(array);
UART_SendString(",");

UART_SendString("11#");
UART_SendString("\n\r");
_delay_ms(100);
dem = 0;
}

if (dem1 > 800)
{
if((PINA&(1<< PA5)) == 0)
{

UART_SendString("N2,");
UART_SendString("10,");
}
else
{

UART_SendString("N2,");
UART_SendString("11,");
}

if((PINA&(1<< PA6)) == 0)
{

23


UART_SendString("20,");
}
else

{

UART_SendString("21,");
}

if((PINA&(1<< PA7)) == 0)
{

UART_SendString("30,");
}
else
{
UART_SendString("31,");
}

if((PIND&(1<< PD7)) == 0)
{
UART_SendString("40#\n\r");
}
else
{
UART_SendString("41#\n\r");
}
dem1 = 0;

}

}

_delay_ms(100);

}

ISR(USART_RXC_vect)

24


{
char pc = UDR;
switch (pc)
{
case '1':
_delay_ms(50);
PORTA &=~(1<break;
case '2':
_delay_ms(50);
PORTA |=(1<break;
case '3':
_delay_ms(50);
PORTA &=~(1<break;
case '4':
_delay_ms(50);
PORTA |=(1<break;
case '5':
_delay_ms(50);
PORTD &=~(1<

break;
case '6':
_delay_ms(100);
PORTD |=(1<break;

default:
_delay_ms(500);
break;
}
}

ISR(TIMER0_OVF_vect)
{
TCNT0 = 130;

25


×