You are on page 1of 23

Giới thiệu 01

Mục đích dự án 02
Thành phần linh kiện 03
Chi tiết thiết kế 04
Kết luận 05
Trong kỷ nguyên số hóa đang bùng
nổ hiện nay, Internet of Things (IoT)
đã trở nên không thể thiếu trong việc
định hình tương lai của sự kết nối. Với
khả năng tích hợp internet vào trong
cuộc sống hàng ngày thông qua các
thiết bị thông minh, IoT đang mở ra
một chương mới cho sự tiện lợi, hiệu
quả và tự động hóa trong mọi khía
cạnh từ công việc cho đến giải trí
Mục đích
Mô phỏng lại chuồng nuôi tự động nhằm chăm sóc
thú cưng một cách tối ưu và tiện lợi

Chức năng
Đo nhiệt độ trong chuồng và hiển thị lên màn hình LCD.
Nhận diện sự có mặt của thú cưng trong chuồng và hiển
thị đèn tín hiệu LED
Nhận diện khoảng cách của thức ăn còn trong chuồng, khi
gần hết hệ thống sẽ mở cửa khay để cung cấp thức ăn.
Arduino Uno R3 là một bảng mạch vi điều khiển
nguồn mở dựa trên vi điều khiển Microchip
ATmega328 được phát triển bởi Arduino.cc. Bảng
mạch được trang bị các bộ chân đầu vào/ đầu
ra Digital và Analog có thể giao tiếp với các
bảng mạch mở rộng khác nhau
II. LCD 16x2 (I2C)
* LCD 16x2:

LCD 16×2 được sử dụng để hiển


thị trạng thái hoặc các thông
số
* Module I2C LCD:

LCD có quá nhiều nhiều chân gây khó


khăn trong quá trình đấu nối và chiếm
dụng nhiều chân trên vi điều khiển,
Module I2C LCD ra đời để giải quyết
vấn đề này
Servo SG90 là một servo thu nhỏ, với một số kích thước rất nhỏ gọn để có thể tích hợp trong
các dự án mà không gian là quan trọng. Ngoài ra, nó tiết kiệm và dễ sử dụng, với nhu cầu
năng lượng rất thấp, vì vậy nó cũng có thể được sử dụng trong các ứng dụng nhúng, IoT hoặc
các ứng dụng tiêu thụ thấp khác
Cảm biến siêu âm UltraSonic HY-SRF05 được sử dụng để nhận biết khoảng cách từ vật thể đến
cảm biến nhờ sóng siêu âm, cảm biến có thời gian phản hồi nhanh, độ chính xác cao, phù hợp cho
các ứng dụng phát hiện vật cản, đo khoảng cách bằng sóng siêu âm
V. CẢM BIẾN HỒNG NGOẠI PIR HC SR501
Cảm biến thân nhiệt chuyển động PIR (Passive
infrared sensor) HC-SR501 được sử dụng để
phát hiện chuyển động của các vật thể phát
ra bức xạ hồng ngoại (con người, con vật, các
vật phát nhiệt,…), cảm biến có thể chỉnh được
độ nhạy để giới hạn khoảng cách bắt xa gần
cũng như cường độ bức xạ của vật thể mong
muốn, ngoài ra cảm biến còn có thể điều
chỉnh thời gian kích trễ (giữ tín hiệu bao lâu
sau khi kích hoạt) qua biến trở tích hợp sẵn
VI. CẢM BIẾN NHIỆT ĐỘ LM35
LM35 là một cảm biến nhiệt độ
tương tự, điện áp ở đầu ra của
cảm biến tỷ lệ với nhiệt độ tức
thời và có thể dễ dàng được
xử lý để có được giá trị nhiệt
độ bằng oC
Lưu ý khi lắp đặt

Khi lắp đặt, hãy chú ý đến cực của các linh kiện điện tử như LED và cảm biến nhiệt độ
Điện trở được sử dụng với LED để giới hạn dòng điện, bảo vệ LED khỏi hỏng do dòng
điện cao
Cảm biến siêu âm có hai chân là TRIGGER và ECHO, nơi TRIGGER sẽ phát tín hiệu siêu
âm và ECHO sẽ nhận lại tín hiệu phản hồi, từ đó đo được khoảng cách
Việc sử dụng breadboard giúp việc kết nối dễ dàng hơn và có thể tháo lắp linh kiện
một cách tiện lợi
#INCLUDE <SERVO.H>
CODE CHO CHƯƠNG TRÌNH
VOID LOOP() { FLOAT READDISTANCE() {
#INCLUDE <WIRE.H> INT MOTIONDETECTED = DIGITALREAD(PIR_PIN); DIGITALWRITE(TRIG_PIN, LOW);
#INCLUDE <LIQUIDCRYSTAL_I2C.H> FLOAT TEMPERATURE = READTEMPERATURE(); DELAYMICROSECONDS(5);
FLOAT DISTANCE = READDISTANCE();
#DEFINE PIR_PIN 2 DIGITALWRITE(TRIG_PIN, HIGH);
#DEFINE SERVO_PIN 9 DELAYMICROSECONDS(10);
DISPLAYTEMPERATURE(TEMPERATURE);
#DEFINE LED_PIN 13 DIGITALWRITE(TRIG_PIN, LOW);
#DEFINE TEMP_SENSOR A0
// XÁC ĐỊNH CẦN BỔ SUNG THỨC ĂN NẾU KHOẢNG CÁCH NHỎ HƠN GIỚI HẠN UNSIGNED LONG DURATION = PULSEIN(ECHO_PIN, HIGH);
#DEFINE TRIG_PIN 11
#DEFINE ECHO_PIN 12 IF (DISTANCE > DISTANCE_MAX_CM) { FLOAT DISTANCE_CM = DURATION / 2.0 / 29.1;
NEEDREFILL = TRUE; RETURN DISTANCE_CM;
// CONSTANTS FOR TEMPERATURE CALIBRATION AND DISTANCE }
}
CONST FLOAT TEMP_MIN = 0;
CONST FLOAT TEMP_MAX = 40; // NHIỆT ĐỘ TỐI ĐA CHO MÔI TRƯỜNG SỐNG // NẾU CÓ CHUYỂN ĐỘNG, NHIỆT ĐỘ TRONG KHOẢNG CHO PHÉP VÀ CẦN BỔ SUNG THỨC ĂN
CONST FLOAT DISTANCE_MAX_CM = 100; // KHOẢNG CÁCH ĐỂ QUYẾT ĐỊNH THỨC ĂN SẮP IF (MOTIONDETECTED == HIGH) { VOID DISPLAYTEMPERATURE(FLOAT TEMPERATURE) {
HẾT VÀ CẦN BỔ SUNG DIGITALWRITE(LED_PIN, HIGH); LCD_1.SETCURSOR(2, 0);
LCD_1.PRINT("NHIET DO (C) : ");
// OBJECTS INITIALIZATION
IF (NEEDREFILL && TEMPERATURE >= TEMP_MIN && TEMPERATURE <= TEMP_MAX) { LCD_1.SETCURSOR(4, 1);
SERVO MYSERVO;
MOVESERVO();
LIQUIDCRYSTAL_I2C LCD_1(0X27, 16, 2); LCD_1.PRINT(TEMPERATURE);
}
}
BOOL NEEDREFILL = FALSE; // BIẾN ĐỂ KIỂM TRA XEM CẦN BỔ SUNG THỨC ĂN HAY KHÔNG
} ELSE {
DIGITALWRITE(LED_PIN, LOW);
VOID SETUP() { } VOID MOVESERVO() {
PINMODE(LED_PIN, OUTPUT); MYSERVO.WRITE(180);
PINMODE(TEMP_SENSOR, INPUT); DISPLAYSENSORREADINGS(DISTANCE, TEMPERATURE); DELAY(500);
PINMODE(PIR_PIN, INPUT); DELAY(50); MYSERVO.WRITE(0);
PINMODE(TRIG_PIN, OUTPUT); }
PINMODE(ECHO_PIN, INPUT);
}

MYSERVO.ATTACH(SERVO_PIN); VOID DISPLAYSENSORREADINGS(FLOAT DISTANCE, FLOAT TEMPERATURE) {


FLOAT READTEMPERATURE() {
INT TEMPVALUE = ANALOGREAD(TEMP_SENSOR); SERIAL.PRINT("DISTANCE READING: ");
LCD_1.INIT();
LCD_1.BACKLIGHT();
FLOAT REALTEMP = (((TEMPVALUE/1024.0) * 5.0)-.5)*100; SERIAL.PRINT(DISTANCE);
RETURN REALTEMP; SERIAL.PRINT(" CM, ");
SERIAL.BEGIN(9600); } SERIAL.PRINT("TEMPERATURE: ");
} SERIAL.PRINT(TEMPERATURE);
SERIAL.PRINTLN(" DEGREE CELSIUS ");
}
PHÂN TÍCH
A. KHAI BÁO:
#INCLUDE <SERVO.H>
#INCLUDE <WIRE.H>
#INCLUDE <LIQUIDCRYSTAL_I2C.H>

#DEFINE PIR_PIN 2
#DEFINE SERVO_PIN 9
#DEFINE LED_PIN 13
#DEFINE TEMP_SENSOR A0
#DEFINE TRIG_PIN 11
#DEFINE ECHO_PIN 12

// CONSTANTS FOR TEMPERATURE CALIBRATION AND DISTANCE


CONST FLOAT TEMP_MIN = 0;
CONST FLOAT TEMP_MAX = 40; // NHIỆT ĐỘ TỐI ĐA CHO MÔI TRƯỜNG SỐNG
CONST FLOAT DISTANCE_MAX_CM = 100; // KHOẢNG CÁCH ĐỂ QUYẾT ĐỊNH THỨC ĂN SẮP HẾT VÀ
CẦN BỔ SUNG

// OBJECTS INITIALIZATION
SERVO MYSERVO;
LIQUIDCRYSTAL_I2C LCD_1(0X27, 16, 2);
BOOL NEEDREFILL = FALSE; // BIẾN ĐỂ KIỂM TRA XEM CẦN BỔ SUNG THỨC ĂN HAY KHÔNG
b. Hàm setup()
void setup() {
pinMode(LED_PIN, OUTPUT); // Cấu hình pin LED là OUTPUT để có thể kiểm soát trạng thái bật/tắt của
LED.
pinMode(TEMP_SENSOR, INPUT); // Cấu hình pin cảm biến nhiệt độ là INPUT để đọc giá trị từ cảm
biến.
pinMode(PIR_PIN, INPUT); // Cấu hình pin cảm biến PIR (cảm biến chuyển động) là INPUT để nhận
biết có sự chuyển động hay không.
pinMode(TRIG_PIN, OUTPUT); // Cấu hình pin TRIG của cảm biến khoảng cách siêu âm là OUTPUT,
dùng để gửi tín hiệu siêu âm.
pinMode(ECHO_PIN, INPUT); // Cấu hình pin ECHO của cảm biến khoảng cách siêu âm là INPUT, để
nhận tín hiệu phản hồi từ siêu âm.

myservo.attach(SERVO_PIN); // Kết nối đối tượng servo với pin điều khiển servo đã được định nghĩa.

lcd_1.init(); // Khởi tạo màn hình LCD.


lcd_1.backlight(); // Bật đèn nền cho màn hình LCD để dễ đọc thông tin hiển thị.

Serial.begin(9600); // Khởi động giao tiếp nối tiếp với tốc độ baud 9600. Điều này cho phép chương
trình gửi dữ liệu qua cổng nối tiếp đến máy tính, hữu ích cho việc gỡ lỗi và hiển thị thông tin.
}
C. HÀM LOOP()
VOID LOOP() {
INT MOTIONDETECTED = DIGITALREAD(PIR_PIN);
FLOAT TEMPERATURE = READTEMPERATURE();
FLOAT DISTANCE = READDISTANCE();

DISPLAYTEMPERATURE(TEMPERATURE);
IF (DISTANCE > DISTANCE_MAX_CM) {
NEEDREFILL = TRUE;
}
IF (MOTIONDETECTED == HIGH) {
DIGITALWRITE(LED_PIN, HIGH);

IF (NEEDREFILL && TEMPERATURE >= TEMP_MIN && TEMPERATURE <= TEMP_MAX) {


MOVESERVO();
}
} ELSE {
DIGITALWRITE(LED_PIN, LOW);
}

DISPLAYSENSORREADINGS(DISTANCE, TEMPERATURE);
DELAY(50);
}
d. Các phương thức được định nghĩa:
float readTemperature() { void moveServo() {
int tempValue = analogRead(TEMP_SENSOR); myservo.write(180);
float realTemp = (((tempValue/1024.0) * 5.0)-.5)*100; delay(500);
return realTemp; myservo.write(0);
} }

float readDistance() { void displaySensorReadings(float distance, float


digitalWrite(TRIG_PIN, LOW);
temperature) {
delayMicroseconds(5);
Serial.print("Distance reading: ");
digitalWrite(TRIG_PIN, HIGH);
Serial.print(distance);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
Serial.print(" cm, ");
unsigned long duration = pulseIn(ECHO_PIN, HIGH); Serial.print("Temperature: ");
float distance_cm = duration / 2.0 / 29.1; Serial.print(temperature);
return distance_cm; Serial.println(" Degree Celsius ");
} }

void displayTemperature(float temperature) {


lcd_1.setCursor(2, 0);
lcd_1.print("Nhiet Do (C) : ");
lcd_1.setCursor(4, 1);
lcd_1.print(temperature);
}
Trong dự án này, chúng ta đã thiết kế và xây dựng một hệ thống tự động phân phối thức ăn
dựa trên các dữ liệu đo được từ cảm biến nhiệt độ, cảm biến chuyển động PIR, và cảm biến
khoảng cách siêu âm. Hệ thống sử dụng một bộ vi điều khiển Arduino để tích hợp và xử lý tín
hiệu từ các cảm biến, điều khiển một động cơ servo để thực hiện việc mở cửa bể thức ăn, và
một màn hình LCD để hiển thị thông tin nhiệt độ và khoảng cách

Qua quá trình thực hiện, dự án đã đạt được các mục tiêu sau:
Tích hợp thành công các cảm biến với Arduino để thu thập dữ liệu về môi trường xung
quanh.
Sử dụng màn hình LCD để hiển thị thông tin về nhiệt độ trong chuồng.
Tự động phân phối thức ăn dựa trên sự phát hiện chuyển động của động vật và mức
độ cần thiết để bổ sung thức ăn, thông qua việc kiểm soát động cơ servo.
Phát hiện sự hiện diện của thú nuôi thông qua đèn LED

You might also like