Professional Documents
Culture Documents
Iot
Iot
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:
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);
}
#DEFINE PIR_PIN 2
#DEFINE SERVO_PIN 9
#DEFINE LED_PIN 13
#DEFINE TEMP_SENSOR A0
#DEFINE TRIG_PIN 11
#DEFINE ECHO_PIN 12
// 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.
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);
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);
} }
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