Bằng cách kết hợp giữa vi điều khiển ESP8266 và các cảm bi n, hế ệ thống này mang lại khả năng tự động hóa và điều chỉnh quá trình tưới cây dựa trên điều ki n th c tệ ự ế, giúp tiết kiệm
Trang 13
BÁO CÁO
ĐỀ TÀI: THIẾT KẾ HỆ THỐNG TƯỚI TIÊU
MÔN: HỆ THỐNG TỰ ĐỘNG HÓA SỐ
GIẢNG VIÊN: Lớp:
Hà Nội, 09/05/2024
Trang 22
Lời mở đầu
Đầu tiên, nhóm em xin chân thành gửi lời cảm ơn tới tất cả các cá nhân, tổ chức đã hỗ trợ, giúp đỡ nhóm em trong suốt quá trình học tập, nghiên cứu đề tài này Sự quan tâm, giúp đỡ của thầy cô, bạn bè là nguồn động viên quý giá Em xin gửi lời cảm ơn sâu sắc, người đã chia sẻ những kiến thức quý báu trong quá trình học tập của chúng em Điều này đã giúp chúng em hoàn thành đề tài nghiên cứu của mình
Một lần nữa em xin chân thành cảm ơn thầy - người đã hỗ trợ, quan tâm và hướng dẫn nhóm em hoàn thành báo cáo
Không thể tránh khỏi những thiếu sót, nhóm mong nhận được những phản hồi quý báu từ các thầy cô để nâng cao kiến thức và nâng cao nhận thức của mình về lĩnh vực này
Nhóm em xin chân thành cảm ơn!
Trang 32.2:Tìm ểu hi các thiết b ị trên mô hình 5
2.4:Thuật toán điều khi n ể 9
2.4.1:Giới thiệu v b ề ộ điều khiển PID 9
2.4.2: Lưu đồ thuật toán PID 1
2.4.3: ng d ng b Ứ ụ ộ điều khiển PID vào điều khiển độ ẩm đất 2
2.4.4: Xác định hệ số của bộ điều khiển PID 3
2.5.Cài đặt viết code: 4và2.5.1: Code ESP8266 4
2.5.2: Code STM32 6
2.6.Đấu nối linh ện 8ki2.7 K t ế luận chương II 8
Chương III: Kết quả 10
3.1 Sản phẩm thự ế 10c t 3.2 Hướng d n s dẫ ử ụng 10
3.3 K t ế luận chương III 11
Kết luận chung 11
Tài liệu tham kh o 12ả
Trang 4Với việc tưới cây truyền thống, việc theo dõi và điều chỉnh lượng nước tưới thường gặp ph i nhiả ều khó khăn Đôi khi, việc đo lường độ ẩm đất và xác định thời gian tưới không đảm bảo chính xác, dẫn đến lãng phí tài nguyên nước và thiếu chăm sóc đúng đắn cho cây trồng
Đây là lúc mà hệ ống IoT tưới cây trở nên quan trọ th ng Bằng cách kết hợp giữa vi điều khiển ESP8266 và các cảm bi n, hế ệ thống này mang lại khả năng tự động hóa và điều chỉnh quá trình tưới cây dựa trên điều ki n th c tệ ự ế, giúp tiết kiệm tài nguyên và đảm bảo sự phát triển kh e m nh cỏ ạ ủa cây trồng Hãy cùng khám phá chi tiế ề ệ thống này và t v hcách nó có thể giải quyết các vấn đề liên quan đến việc quản lý và chăm sóc cây cối trong thời đại hiện đại này
1.2: Ứng dụng thực tế của hệ thống
Hệ thống IoT tưới cây tích hợp ESP8266 và STM32 đại diện cho sự kết hợp độc đáo gi a hai n n tữ ề ảng công nghệ m nh mạ ẽ để ạ t o ra m t giộ ải pháp tưới cây thông minh và hi u qu Bệ ả ằng cách tích hợp vi điều khi n STM32 v i khể ớ ả năng xử lý mạnh mẽ và vi điều khiển ESP8266 có khả năng kết nối internet, hệ thống này không chỉ có khả năng điều khiển tưới cây một cách chính xác và linh hoạt mà còn cung cấp khả năng truy cập t ừ xa và quản lý thông qua mạng internet
Hệ thống này cho phép người dùng thiế ập và điềt l u chỉnh các thông số tưới cây như lịch trình, thời lượng và tần suất tướ ựa trên nhiều yếu t i d ố khác nhau như điều kiện thời tiết, độ ẩm đất và nhu cầu cụ ể c a t ng loth ủ ừ ại cây trồng Bằng cách tích hợp c m biả ến và các chức năng phân tích dữ liệu thông minh, hệ thống có khả năng tự động điều chỉnh việc tưới cây để đảm bảo sự phát triển và sinh trưởng tối ưu của cây trồng
1.3: K t lu n ếậ chương I
Với sự kế ợp ct h ủa ESP8266 và STM32, hệ thống IoT tưới cây này không chỉ mang lại s n lự tiệ ợi và linh hoạt cho người dùng mà còn đóng góp vào việc tối ưu hóa sử ụng tài dnguyên và bảo vệ môi trường trong hoạt động nông nghiệp và chăm sóc cây cối Việc tích hợp vi điều khiển STM32 cho phép hệ thống xử lý các tác vụ điều khiển và quản lý một cách mạnh mẽ và chính xác Trong khi đó, vi điều khiển ESP8266 mang lại khả năng kết nối internet và điều khi n t xa, mể ừ ở ra các khả năng quản lý và giám sát h ệ thống t b t k ừ ấ ỳ đâu, bất kỳ lúc nào
Trang 55
Chương II:Xây dựng hệ thống 2.1: Tổng quan về mô hình
Hình 2.1: Vi điều khiển STM32F103C8T6
- Vi điều khiển STM32F103C8T6 là một vi điều khi n d a ể ự trên kiến trúc ARM M3 Nó thuộc vào dòng vi điều khiển STM32F1 của STMicroelectronics, được phát triển dựa trên công nghệ 32-bit ARM
Cortex Đặc điểm k ỹ thuật chính của vi điều khi n STM32F103C8T6 bao gể ồm:
Trang 66 B x ộ ử lý ARM Cortex-M3 32-bit với tốc độ ối đa t 72 MHz B nhộ ớ Flash tích hợp 64 KB cho lưu trữ chương trình và 20 KB RAM cho lưu
trữ d ữ ệu li Có các giao diện ngoại vi như UART, SPI, I2C, GPIO, ADC và PWM, cho phép
kết nối và giao tiếp với các thiết bị ngoại vi khác nhau. Hỗ trợ tương thích nguồn điện từ 2.0V đến 3.6V, giúp tăng tính linh hoạt trong
thiết kế vi mạch. B chuyộ ển đổi ADC 12-bit với tốc độ ấ l y m u tẫ ối đa 1 Msps (mẫu trên giây). Cung cấp các tính năng điều khiển năng lượng để tiết kiệm năng lượng và mở
rộng tu i th pin ổ ọ Hỗ ợ tr giao thức giao tiếp USB 2.0 Hỗ ợ tr các chức năng bảo mật và mã hóa phần cứng
2.2.2: ESP8266
- ESP8266 là một module Wi-Fi nh gỏ ọn và mạnh mẽ được phát triển b i Espressif ởSystems Nó kết hợp vi điều khiển chính dựa trên kiến trúc Xtensa LX106 và một giao di n Wi-ệ Fi tích hợp, cung c p khấ ả năng kết n i mố ạng không dây cho các ứng dụng nhúng
- Đặc điểm k ỹ thuật chính của ESP8266 bao gồm: Vi điều khi n Xtensa LX106 32-bit v i tể ớ ốc độ xung nhịp có thể lên đến 160 MHz B nh ộ ớ Flash tích hợp cho lưu trữ chương trình, thường là 512 KB hoặc 4 MB Giao di n Wi-Fi chu n IEEE 802.11 b/g/n, hệ ẩ ỗ trợ chế độ Access Point (AP) và
Station (STA) Hỗ trợ các giao thức mạng TCP/IP và các giao thức truyền thông nổ ếng như i ti
MQTT, HTTP, và WebSocket Có các giao diện ngoại vi như GPIO, SPI, I2C, UART và ADC, cho phép kết nối
và giao tiếp với các thiết bị ngoại vi khác nhau. Hỗ ợ tr chế độSleep và Deep Sleep để tiết kiệm năng lượng Cung cấp các tính năng bảo mật như mã hóa SSL/TLS và chứng thực mạng
Trang 77 Hình 2.2: Mô đun ESP8266
- Mạch điều khiển động cơ L298 là một mạch tích hợp được sử dụng để điều khiển động cơ DC và động cơ bước (stepper motor) trong các ứng dụng nhúng Nó cung cấp khả năng điều khiển hướng, tốc độ và độ mạnh yếu của động cơ
- Đặc điểm k ỹ thuật chính của mạch điều khiển động cơ L298 bao gồm: Hỗ ợ tr động cơ DC với dòng điệ ối đa lên đến 2A và động cơ bướn t c với dòng
điện tối đa lên đến 2A/phase Điện áp hoạt động từ 5V đến 35V Có hai kênh đầu ra độc lập, mỗi kênh điều khiển một động cơ. Hỗ ợ tr kiểm soát hướng quay với chế Forward (tiđộ ến) và Reverse (lùi). Cung cấp kh ả năng điều khi n tể ốc độ thông qua kỹ thuật PWM (Pulse Width
Modulation) Có các chân điều khiển đơn giản để kết nối với vi điều khiển như Arduino hoặc
Raspberry Pi
Hình 2.3: Mạch điều khiển động cơ L298
2.2.4: M t s thi t b ộ ốếị khác
Hình 2.5: Cảm biến độ ẩ m
Trang 88 Hình 2.6: Mô tơ DC bơm nước
2.3: Sơ đồ khối
Hệ thống ch y th cạ ử ủa chúng ta bao gồm: vi điều khiển STM32, vi điều khi n ESP8266, ểmạch điều khiển động cơ L298, ả c m biến độ ẩm, máy bơm mini và hệ thống ng dố ẫn nước STM32 là bộ xử lý trung tâm và ESP8266 đóng vai trò như một Webserver Hai vi điều khiển này giao tiếp với nhau qua chuẩn Uart.Ngoài ra STM32 còn có vai trò gần giống như một bi n t nế ầ , và đầu ra được ắn vào động cơ thông qua mạch điềg u khiển Web
sever Giao diện
web
Động cơ bơm nước DC và h ệ thống ống dẫn Vi điều khi n ể
ESP8266
Vi điều khi n ểSTM32
Mạch điều khi n ểL298N
C m bi n ả ếđộ ẩm
Trang 99 L298N C m biả ến độ ẩm g n v i STM32, ắ ớ với c m biả ến độ ẩm, nếu đầu ra của nó là dạng dòng điện 4-20mA và vi điều khiển STM32 của chúng ta cũng có mộ ổng vào analog t cAI2 (Analog Input 2) 4-20mA, ta có thể k t n i c m bi n tr c ti p vế ố ả ế ự ế ới STM32 mà không cần s d ng mử ụ ột bộ ến đổi tín hiệ bi u.
2.4: Thuật toán điều khi n ể
2.4.1: Gi i thi u v b ớệề ộ điều khi n PID ể
- PID là viết t t c a "Proportional-Integral-ắ ủ Derivative", là một trong những phương pháp điều khiển phổ biến nhất trong lĩnh vực tự động hóa và điều khiển Phương pháp này được sử d ng rụ ộng rãi trong các hệ thống điều khiển để điều chỉnh động cơ, máy móc, h ệ thống nhiệt độ, và nhiề ứu ng dụng khác
Proportional (P): Ph n t l (P) cầ ỉ ệ ủa điều khi n PID phể ản ứng v i sai s hi n tớ ố ệ ại giữa giá trị đặt trước (setpoint) và giá trị đo được Càng lớn h s t lệ ố ỉ ệ, điều khi n ểs ph n ng m nh mẽ ả ứ ạ ẽ hơn đối với sự sai lệch này
Integral (I): Phần tích phân (I) của PID đóng vai trò trong việc loại bỏ sai số dài hạn Nó tích lũy và điều chỉnh điều khi n dể ựa trên tổng lỗi tích phân qua thời gian Phần này giúp loại bỏ hiệu ứng của sai số không đố ứng xung quanh giá i xtrị setpoint
Derivative (D): Phần đạo hàm (D) đối phó với tốc độ thay đổi của sai số Nó giúp ổn định h ệ thống và tránh overshoot (quá tín hiệu setpoint) hoặc ổn định h ệ thống nếu có sự ến đổi nhanh chóng bi
Bằng cách kết h p ba phợ ần này, điều khiển PID có thể ả c i thi n sệ ự ổn định và đáp ứng của hệ thống điều khiển, giúp hệ thống duy trì giá trị setpoint mong muốn một cách chính xác và ổn định
Hình 2.7: Cấu trúc của hệ thống điều khiển PID Trong đó:
Ysp: Tín hiệu đặt e (t): Sai số y (t): Tín hiệu thực tế
Kp: Hệ s t l ố ỉ ệKi: Hệ s ố tích phânKd: Hệ s ố vi phân
Trang 102.4.2: Lưu đồ thuật toán PID
Trang 112
2.4.3: Ứng d ng b ụộ điều khiển PID vào điều khiển độ ẩm đất
Đặt: u(t) e (t)
(-)
Mô hình hệ thống -Việc ứng d ng bụ ộ điều khiển PID vào điều khiển độ ẩm đất là một ứng d ng ph biụ ổ ến trong lĩnh vực nông nghiệp và tự động hóa hệ thống thủy canh, nhà kính, và các ứng dụng liên quan đế trồng cây Điền u khiển độ ẩm đất là một y u t quan trế ố ọng để đảm b o s ả ự phát triển và sản xuất hiệu qu cả ủa cây trồng
- Cách bước thiết lập một bộ điều khiển PID điều khiển độ ẩm đất:
1 Thiế ật l p hệ thống đo lường: Để áp dụng điều khiển PID vào điều khiển độ ẩm đất, trư c tiên cớ ần thi t l p h th ng cảm biến hoặc cảm biế ậ ệ ố ến để đo lường độ ẩm đất Cảm biến độ ẩm thường được sử dụng để đo lường nồng độ nước trong đất.2 Xác định setpoint và phản hồi: Người điều khi n cể ần xác định mức độ ẩm mục
tiêu (setpoint) mà mình muốn duy trì trong đất cho cây trồng cụ thể Bộ điều khi n PID sể ẽ so sánh giá trị độ ẩm đo đượ ừ ảc t c m bi n vế ới setpoint để xác định s ự sai lệch và điều chỉnh điều khi n ể bơm nướ để đạc t đư c đ ẩợ ộ m mong mu n ố3 Thiế ật l p b ộ điều khiển PID: Sau khi có dữ liệu đo và setpoint, bộ điều khiển PID
cần được thi t l p vế ậ ới các thông số t lỉ ệ, tích phân và đạo hàm phù hợp Các thông s ố này sẽ ảnh hưởng đến hi u suệ ất và ổn định của hệ thống điều khi n ể4 Hoạt động c a b ủ ộ điều khi n: B ể ộ điều khi n PID s ể ẽ liên tục đọc giá trị độ ẩm đ t ấ
t c m biừ ả ến, so sánh với setpoint, và tự động điều chỉnh các thiết bị như hệ thống tưới nước để duy trì độ ẩm đất ở mức mong muốn Các chỉ thị điều khiển như mức nước trong h ệ thống tưới nước sẽ được điều ch nh t ỉ ự động để duy trì độ ẩm đấ ởt mức mong muốn
Máy tính
Bộ điều khi n ể Vi xử lý ( STM32)
Thiết bị điều khiển
độ ẩm
( C m biảến độ ẩm )
Y (t)
Trang 123
Sau khi l y m u d ấ ẫ ữ liệu, chúng ta sẽ ử ụng công cụ Matlab Identification toolbox để s dxác định mô hình của hệ thống
- Công cụ Matlab Idenfication Toolbox sẽ tính toán và đưa ra hàm truyền của hệthông như hình:
- Ta thu đươc độ kh p giớ ữa mô hình tính toán và hệ thống thực:
Trang 134 -Ta xấp x ỉ đối tượng v ề khâu quán tính bậc 2:
𝐺(𝑠) = 29.1911 + 18.907𝑠𝑒
−1.201𝑠= 29.191(1 +18.907𝑠)(1 + 1.201𝑠)- Sau khi tính toán các tham số PID bằng phương pháp Zieghler-Nichols ta thu được b ng sau: ả
Công thức tham số Giá trị tham số
𝐾𝑝=1.2𝑇𝑘𝐿 = 0.6471 𝑇𝐼= 2𝐿 = 2.402 𝑇𝐷= 0.5𝐿 = 0.6005
k = 29.191 T = 18.907 L = 1.201
-Để chuẩn b ị cho việc nạp chương trình vào các vi điều khiển thì ta cần phải cài đ t ặmột số ph n mầ ềm để tiến hành việc nạp chương trình như : ARDUINO IDE, STM32 CubeProgrammer, và một số drive chocác linh kiện
2.5.1: Code ESP8266
#defineBLYNK_TEMPLATE_NAME"MAY BOM"
#defineBLYNK_AUTH_TOKEN"NcKeD_wUkJC2KZ2TC5R5qh0O2Xn6faYU"
#defineBLYNK_PRINT Serial #include<ESP8266WiFi.h>
#include<BlynkSimpleEsp8266.h>
// Set password to "" for open networks.
char ssid[] = "Diamond A"; char pass[] = "88888888";
#include<SoftwareSerial.h>
SoftwareSerial mySerial(D5, D6); // RX, TX
#defineHUMI V0#defineBLYNK_TEMPLATE_ID"TMPL6ixYDepI1"
#defineHMIN V1 #defineHMAX V2 #defineRUNMODE V3 #defineSPEEDV4int speed; int hmin=30; int hmax=90; bool runMode; unsigned long timeSendData=millis();
voidsetup() {
Trang 145
mySerial begin.(9600); Blynk begin.(BLYNK_AUTH_TOKEN, ssid, pass); }
voidloop() { Blynk run.(); if(millis()-timeSendData>1000){ String data = String(speed)+ +";"String(hmin)+ +";"String(hmax)+ +";"String(runMode); mySerial println.(data);
Serial println.(data); timeSendData=millis(); }
if(mySerial available.()> ){0
String data = mySerial.readStringUntil('\n'); int adcValue = getValue(data,';',0toInt(); int speed = getValue(data,';',1toInt(); Serial println.("ADC VALUE:"+String(adcValue)); Serial println.("SPEED:"+String(speed)); Serial println.("==========================="); Blynk virtualWrite.(HUMI,adcValue);
} }
BLYNK_CONNECTED() { Blynk syncAll.(); }
BLYNK_WRITE(SPEED){ speed = param.asInt(); }
BLYNK_WRITE(HMIN){ hmin = param.asInt();}
BLYNK_WRITE(HMAX){ hmax = param.asInt();}
BLYNK_WRITE(RUNMODE){ runMode = param.asInt();}
String getValue(String data, char separator, index){ int int found = ; 0
int strIndex[] = { 0, -1}; int maxIndex = data length.() - ; 1
for ( i = ; i <= maxIndex && found <= index; i++) { int0
if (data.charAt(i) == separator || i == maxIndex) { found++;
strIndex[0] = strIndex[1] + 1
strIndex[1] = (i == maxIndex) ? i+1 : i; }
}
Trang 156
}
2.5.2: Code STM32
#include<SoftwareSerial.h>
SoftwareSerial mySerial(PA10, PA9); // Khai báo và cấu hình giao tiếp Serial Software trên chân PA10 (RX) và PA9 (TX)
unsigned long timeReadSensor = millis(); // Biến lưu thời gian để đọc cảm biến
#defineout1 PA1 // Định nghĩa chân điều khiển đầu ra 1
#defineout2 PA2 // Định nghĩa chân điều khiển đầu ra 2
#defineadcPin PA0 // Định nghĩa chân đầu vào analog
#defineledMode PA3 // Định nghĩa chân điều khiển LED
int speed; // Tốc độ của máy bơm
int hmin; // Giá trị độ ẩm tối thiểu
int hmax; // Giá trị độ ẩm tối đa
bool runMode; // Chế độ hoạt động của máy bơm
double integral = 0; // Thuật ngữ tổng hợp
double prevError = ;0 // Sai số trước đó
double input; // Đầu vào của PID
double output; // Đầu ra của PID
double setpoint; // Giá trị mục tiêu cho PID
#include<PID_v1.h>
double Kp = 0.6471; // Hằng số Proportional của PID
double Ki = 2.402; // Hằng số Integral của PID
double Kd = 0.6005; // Hằng số Derivative của PID
PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT); // Khởi tạo đối tượng PID với các hằng số đã cho
voidsetup() { mySerial begin.(9600); // Khởi động giao tiếp Serial với baudrate 9600
pinMode(out1, OUTPUT); // Cấu hình chân điều khiển đầu ra 1 là đầu ra
pinMode(out2, OUTPUT); // Cấu hình chân điều khiển đầu ra 2 là đầu ra
pinMode(adcPin, INPUT); // Cấu hình chân đầu vào analog là đầu vào
pinMode(ledMode, OUTPUT); // Cấu hình chân điều khiển LED là đầu ra
myPID SetMode.(AUTOMATIC); // Đặt PID vào chế độ tự động
myPID SetSampleTime.(1000); // Thiết lập thời gian mẫu của PID là 1000 ms
myPID SetOutputLimits.(0255); // Đặt giới hạn đầu ra cho PID từ 0 đến 255
}
voidloop() { if (millis() - timeReadSensor > 1000) { // Nếu đã đủ thời gian đọc cảm biến
int adcValue = analogRead(adcPin); // Đọc giá trị từ cảm biến analog
adcValue = map(adcValue, 01023, , 0 100); // Chuyển đổi giá trị analog thành phần trăm độ ẩm
input = adcValue; // Đặt giá trị đầu vào cho PID là giá trị đọc từ cảm biến
setpoint = hmax; // Đặt giá trị mục tiêu của PID là giá trị độ ẩm tối đa