Mạch in sau khi gắn linh kiện
Hình 4.6 Mạch điện hồn chỉnh 4.4 Lập trình hệ thống
4.4.1 Giới thiệu phần mềm Arduino
IDE (Integrated Development Environment) ngun văn là mơi trường tích hợp dùng để phát triển phần mềm, nó cũng tương tự như những phần mềm bình thường khác nhưng mục đích của IDE là dùng để viết mã nguồn.
IDE không chỉ đơn giản là dùng để viết mã nguồn không mà bản thân nó cịn kèm theo các cơng cụ hỗ trợ khác như trình biên dịch (Compiler), trình thơng dịch (Interpreter), cơng cụ kiểm tra lỗi (Debugger), định dạng hoặc highlight mã nguồn, tổ chức thư mục chứa mã nguồn, tìm kiếm mã nguồn, ...v.v.
Arduino là một nền tảng nguyên mẫu (mã nguồn mở) dựa trên nền phần mềm và phần cứng dễ sử dụng. Nó bao gồm một bo mạch - thứ mà có thể được lập trình (đang đề cập đến vi điều khiển) và một phần mềm hỗ trợ gọi là Arduino IDE (Mơi trường phát triển tích hợp cho Arduino), được sử dụng để viết và nạp từ mã máy tính sang bo mạch vật lý.
Bạn có thể điều khiển các chức năng của bo mạch của mình bằng cách nạp các tập lệnh đến vi điều khiển trên bo mạch. Thông qua phần mềm hỗ trợ là Arduino IDE.
Hơn nữa, phần mềm Arduino IDE sử dụng phiên bản giản thể của C++, làm việc học lập trình nó trở nên dễ dàng hơn rất nhiều.
Viện Điện tử Viễn Thông
3.1.7.1 Cài đặt Arduino IDE
Bước 1: Dowload trực tiếp phần mềm Arduino tại trang chủ
Link: h ttps://w ww.a rduino.cc/en/Main/So ftw are
Bước 2: Cài đặt và chạy file vừa tải xuống
Giao diện Arduino IDE
Hình 4.8 Giao diện Arduino IDE
Vùng lệnh: Bao gồm các lệnh trên menu ( File, Edit, Sketch, Tools, Help). Phía dưới là
các icon cho phép sử dụng nhanh các chức năng thường dùng của IDE. Chức năng của các icon:
Viện Điện tử Viễn Thơng
Vùng viết chương trình:
Thiết lập (Void Setup): Phần này dùng để thiết lập cho một chương trình Arduino IDE. Phần này dùng để thiết lập các tốc độ truyền dữ liệu, kiểu chân là chân ra hay chân vào…
Vòng lặp (Void loop ): Dùng để viết các lệnh trong chương trình để mạch Arduino thực hiện các nhiệm vụ mà chúng ta mong muốn.
Cài đặt cấu hình cho Arduino IDE:
Bước 1: Tải package cho NodeMCU vào Arduino IDE:
Từ màn hình chính chọn File → Preferences, thêm đường dẫn bên dưới vào mục Addition Boards Manager URLs.
Link: http://arduino.esp8266.com/stable/package_esp8266com_index.json
Hình 4.9 Tải package cho NodeMCU
Bước 2: Tải thư viện hỗ trợ.
Từ màn hình chính chọn Tool→ Board→ Board managers. Tại thanh tìm kiếm của hộp thoại Board Managers nhập vào esp8266, chọn Install để tiến hành tải và cài đặt thư viện.
Hình 4.10 Hộp thoại Board Manager
Bước 3: Chọn Tool→ board → ESP 8266 boards → NodeMCU 0.9
Viện Điện tử Viễn
Thông Bước 4: Vào menu chọn → Tool →port →chọn cổng COM để kết nối với máy
tính
Hình 4.12 Chọn cổng kết nối
4.4.2 Lưu đồ giải thuật
Bắt đầu
Khởi tao Module cảm biến mưa, cảm biến DHT-11
á trị nhiệt độ độ ẩm lên màn hình LCD, gửi
Đọc giá trị cảm biến nhiệt độ độ ẩm
Máy bơm
Tắt
Kết thúc Tắt máy bơm
Hình 4.13 Lưu đồ giải thuật của khối xử lí
Ban đầu ta sẽ khởi taọ LCD 16x2. Sau đó ta tiến hành đọc dữ liệu từ cảm biến nhiệt độ độ ẩm, tiếp theo những thông tin của cảm biến DHT-11 sẽ được xuất giá trị lên màn hình LCD 16x2 đồng thời gửi thơng tin lên app android. Trong lúc đó nếu trạng thái của máy bơm đang tắt thì kết thúc. Cịn trong trường hợp máy bơm đang bật gặp trời mưa (nhận biết thơng qua cảm biến mưa) thì máy bơm sẽ tự động tắt.
Viện Điện tử Viễn Thông
Bắt đầu
Khởi tạo Module Node MCU. Kết nối wifi với người dùng
Gửi dữ liệu lên FireBase
Kết thúc
Hình 4.14 Lưu đồ gửi dữ liệu
Sau khi nhận được thông tin dữ liệu từ cảm biến nhiệt độ độ ẩm DHT 11,khởi tạo module Node MCU sẽ kết nối với wifi người dùng và gửi dữ liệu lên Firebase.
4.4.3 MIT App Inventor
MIT App Inventor dành cho Android là một ứng dụng web nguồn mở ban đầu được cung cấp bởi Google và hiện tại được duy trì bởi Viện Cơng nghệ Massachusetts (MIT).
Nền tảng cho phép nhà lập trình tạo ra các ứng dụng phần mềm cho hệ điều hành Android (OS). Bằng cách sử dụng giao diện đồ họa, nền tảng cho phép người dùng kéo và thả các khối mã (blocks) để tạo ra các ứng dụng có thể chạy trên thiết bị Android.
Hình 4.15 Giao diện MIT App Inventor
Những tính năng có trên MIT App Inventor là:
Cho phép xây dựng nhanh chóng những thành phần cơ bản (components) của một ứng dụng Android: Nút bấm, nút lựa chọn, chọn ngày giờ, ảnh, văn bản, thơng báo, kéo trượt, trình duyệt web.
Sử dụng nhiều tính năng trên điện thoại: Chụp ảnh, quay phim, chọn ảnh, bật video hoặc audio, thu âm, nhận diện giọng nói, chuyển lời thoại thành văn bản, dịch.
Hỗ trợ xây dựng game bằng các components: Ball, Canvas, ImageSprite.
Cảm biến: đo gia tốc (AccelerometerSensor), đọc mã vạch, tính giờ, con quay hồi chuyển (gyroscopeSensor), xác định địa điểm (locationSensor), NFC, đo tốc độ (pedometer), đo khoảng cách xa gần với vật thể (proximitySensor).
Kết nối: Danh bạ, email, gọi điện, chia sẻ thông qua các ứng dụng mạng xã hội khác trên thiết bị, nhắn tin, sử dụng twitter qua API, bật ứng dụng khác,
bluetooth, bật trình duyệt.
Lưu trữ: đọc hoặc lưu tệp txt, csv, sử dụng FusiontablesControl, tạo cơ sở dữ liệu đơn giản trên điện thoại hoặc trên đám mây thông qua server tự tạo hoặc Firebase.
Điều khiển robot thông qua LegoMindstorms.
Mua bán trong ứng dụng, Floating button, Báo thức, cảm biến ánh sáng, kết nối
Viện Điện tử Viễn Thơng
Nhược điểm của app Inventor là:
Lập trình viên chưa thể sử dụng mọi tính năng của Android và việc này phụ thuộc vào khi nào mở rộng mới có tính năng bạn cần có được tạo ra. Khuyết điểm này chỉ có thể khắc phục bằng cách tự xây dựng mở rộng cho App Inventor.
Do ứng dụng được phát triển trên server của MIT, giới hạn dung lượng của mỗi project chỉ là 5mb.
Mặc dù có những nhược điểm như vậy, nhưng MIT App Iventor vẫn là một nền tảng mạnh mẽ giúp những ai mới bắt đầu lập trình trên Android có thể tạo ra được những ứng dụng hoàn thiện. Những ưu điểm trên của MIT app hoàn tồn phù hợp với đề tài. Kết quả thu được
Hình 4.16 Giao diện chính của phần mềm
Chức năng của phần mềm:
On pump: Bật máy bơm. Off pump: Tắt máy bơm.
Actual Humi: Độ ảm hiện tại.
Set temp/humi : Điều kiện nhiệt độ/độ ẩm để máy bơm tự động bật.
Set time: hẹn giờ bật máy bơm nếu như đạt đủ điều kiện nhiệt độ và độ ẩm hiện tại nhỏ hơn nhiệt độ và độ ẩm cài đặt.
Rain Status: thời tiết hiện tại
Viện Điện tử Viễn Thông
Chương V: KẾT QUẢ
Trong suốt 15 tuần nghiên cứu và thi công cùng với sự hướng dẫn của giáo viên thì đồ án “Mạch tưới cây tự động” cũng đã được hồn thành. Đây là chương trình bày kết quả đã làm được từ đó đưa ra những nhận xét và đánh giá đề tài.
5.1 Kết quả thu được
5.1.1 Sử dụng module ESP8266 Node MCU
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ử. Điều đặc biệt của nó, đó là sự kết hợp của module Wifi tích hợp sẵn bên trong con vi điều khiển chính. Hiện nay, ESP8266 rất được giới nghiên cứu tự động hóa Việt Nam ưa chuộng vì giá thành cực kỳ rẻ (chỉ bằng một con Arduino Nano), nhưng lại được tích hợp sẵn Wifi, bộ nhớ flash 8Mb.
5.1.2 Sử dụng cảm biến
Trong quá quá trình thực hiện đề tài, bản thân đã co thêm được nhiều kiến thức về các loại cảm biến, nguyên lí hoạt động cũng như ứng dụng của nó trong thực tế.
5.1.3 Lập trình app MIT App Invetor
Ngồi phương pháp bật/tắt máy bơm thủ cơng, MIT App Invetor giúp người sử dụng bật/tắt máy bơm từ xa cũng như nắm bắt thông tin nhiệt độ độ ẩm một cách dễ dàng, thuận tiện ngay cả khi khơng có nhà. Qua đề tài này, bản thân đã có thêm nhiều kiến thức lập trình, cách lấy thời gian hiện tại cũng như cách xử lí dữ liệu.
5.2 Kết quả thực nghiệm
Trong q trình nghiên cứu, thiết kế và thi cơng, kết quả của đề tài đáp ứng được các yêu cầu đặt ra
Hình 5.2 Màn hình của mạch
Thơng tin dữ liệu sau khi được thu thập từ các cảm biến sẽ được gửi lên màn hình chính của mạch, đồng thời gửi lên app
Viện Điện tử Viễn Thông
Thông tin gửi lên app gồm có nhiệt độ độ ẩm, trạng thái của máy bơm. Ngồi ra, phần mềm cịn có thế cho phép người dùng cài đặt thời gian tự động bất máy bơm thông qua phần set time. Nếu như nhiệt độ thực tế thấp hơn nhiệt độ cài đặt và độ ẩm thực tế cao hơn độ ẩm cài đặt thì máy bơm sẽ khơng hoạt động.
Chương VI: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN6.1 Kết luận 6.1 Kết luận
Đề tài “Hệ thống tưới cây tự động” với mục đích giảm thiểu cơng sức con người, tăng năng suất và chất lượng cây trồng. Kết quả thực nghiệm đã đáp ứng được nhưng yêu cầu đề ra. Dưới đây là một số ưu-nhược điểm của hệ thống: Ưu điểm:
Giải quyết được những yêu cầu đề ra của đề tài Hệ thống tiêu thụ ít điện năng
Dễ dàng quan sát, sử dụng Chi phí thấp
Tiết kiệm thời gian, chi phí nhân cơng
Tuy nhiên, đây là mơ hình nên sự thiếu sót là điều khơng thể tránh khỏi Nhược điểm:
Khơng gian thu thập dữ liệu của cảm biến còn hạn chế Mơ hình chưa gọn
Thơng tin dữ liệu chưa được ổn định
6.2 Hướng phát triển đề tài
Hệ thống cần được chỉnh sửa để hoàn chỉnh hơn, dưới đây là những vấn đề được đề ra nhằm hoàn thiện hệ thống hơn.
Thiết kế giao diện app sao cho dễ nhìn và dễ tiếp cận người dùng Tích hợp nhiều cảm biến để thơng tin dữ liệu được chính xác hơn
Ngồi thiết bị bơm có thể tích hợp thêm hệ thống chiếu sáng và quạt đối với cây trồng trong nhà kính.
Viện Điện tử Viễn Thơng
TÀI LIỆU THAM KHẢO
[1]Phạm Quang Huy, Nguyễn Cảnh Trung, Lập Trình Điều Khiển Với Arduino, NXB Khoa Học và kĩ Thuật.
[2] https://www.al ldata sheet.co m/, truy cập cuối cùng ngày 25 tháng 12 năm
2020.
[4] https://vi.wikipedia.org/ , truy cập cuối cùng ngày 22 tháng 12 năm 2020. [5] https://appinventor.mit.edu/ , truy cập cuối cùng ngày 28 tháng 11 năm 2020.
[6] https://firebase.google.com/ , truy cập cuối cùng ngày 26 tháng 11 năm 2020.
PHỤ LỤC
Lập trình hệ thống
#include <FirebaseArduino.h> // Gui du lieu len Firebase #include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ThingSpeak.h> // Gui du lieu led web thingspeak #include <WiFiUdp.h> // LIB use for realtime
#include <NTPClient.h> // LIB use for realtime //#include <SHT1x.h> // Sensor SHT10 #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "DHT.h" #define DHTTYPE DHT11 LiquidCrystal_I2C lcd(0x27,16,2); / SCL -D1, SDA-D2 #define Led_test D0 #define BT1 D3 #define BT2 D5 #define BT3 D6 #define Pump_Machine D8 #define dataPin D6 #define clockPin D7 #define Rain_Sensor A0 #define rain_value 315 #define dht_dpin 2 // D4 DHT dht(dht_dpin, DHTTYPE);
#define WIFI_SSID "Do-An" // change your WiFi name
#define WIFI_PASSWORD "12345678" //change your Password WiFi const char *server = "api.thingspeak.com";
unsigned long myChannelNumber = 1236409;
//SHT1x sht1x(dataPin, clockPin); float temp_c,old_temp = 0 ; float humidity, old_humi = 0 ;
Viện Điện tử Viễn Thông
unsigned long time_check = 0,time_send_data = 0 ; WiFiClient client;
//Declare
float temp_point = 0 ,humi_point = 0 ; signed int hrs_point1,minu_point1; signed int hrs_point2,minu_point2; signed int hrs_point3,minu_point3;
signed int time_start =0, time_finish = 0; signed int time_turn_on = 2 ;
signed int check_box1=0,check_box2=0,check_box3=0; String real_time;
signed int sec,minu,hrs; long time_process = 0;
int display_time=0,process_control_sendata= 0,process_control = 0 ; boolean flag_turn_on_pump = 0;
boolean flag_send_humi = 0, flag_send_temp = 0, flag_send_data = 0,old_flag_pump = 0;
boolean flag_follow_condition = 0;
int flag_check_rain_ss = 2,old_flag_rain = 5, flag_check_time = 0 ; String convert_send;
String data;
unsigned long count_average = 0;
float AverageHumi_Day = 0 ,AverageHumi_Month = 0 ,AverageTemp_Day = 0 ,AverageTemp_Month = 0 ;
unsigned long SumHumi_Day = 0, SumHumi_Month = 0, SumTemp_Day =0, SumTemp_Month = 0;
boolean flag_send_average = 0 ;
int process_control_send_average = 0; WiFiUDP u;
NTPClient n(u,"3.vn.pool.ntp.org",7*3600); void blink_led(byte number);
void display_actual(); void display_setpoint();
void convert_time_h_m(String get_time,int *_hour,int *_minute); void get_real_time(int _timeout,int *_hour,int *_minute,int *_sec); void get_firebase();
void control_pump(); void check_conditions_on_pump(); void check_conditions_off_pump(); void check_rain_sensor(); void calculator_average_data(); void ini_process(); void auto_process(); void manual_process(); void setup() { Serial.begin(9600); pinMode(Led_test, OUTPUT); pinMode(Pump_Machine, OUTPUT); pinMode(BT1, INPUT_PULLUP); pinMode(BT2, INPUT_PULLUP); pinMode(BT3, INPUT_PULLUP);
//lcd.int(); // Nếu sử dụng khác win 10 thì dùng khai báo này / lcd.begin(); // Nếu sử dụng win 10 thì dùng khai báo này lcd.backlight();
lcd.print("Hello world "); dht.begin();
if (digitalRead(BT3)== 0) {
process_control = 5; // go to Manual Mode digitalWrite(Led_test,1); } else { / connect to wifi. WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) { lcd.setCursor(0,1); lcd.print("Connecting Wifi "); Serial.print("."); delay(500); process_control++; if (process_control == 10) {
Viện Điện tử Viễn Thông process_control = 5; break; } } if ( process_control <10) { process_control = 0; lcd.setCursor(0,1); lcd.print("Connected "); Serial.println(); Serial.print("connected: "); Serial.println(WiFi.localIP()); //Firebase.begin("humi-temp.firebaseio.com"); // thay bằng địa chỉ ứng dụng của bạn Firebase.begin("temp-
humi-50f77-default- rtdb.firebaseio.com"); Firebase.stream("/GetData"); ThingSpeak.begin(client); n.begin(); n.update(); real_time= n.getFormattedTime(); blink_led(4); } else { digitalWrite(Led_test,1); lcd.clear(); process_control = 5; } } } void loop() { switch (process_control) { case 0: ini_process(); break;
case 4: auto_process(); break; case 5: manual_process(); break; } }
void blink_led(byte number) {
for (int i = 0 ; i<number;i++ ) { digitalWrite(Led_test,1); delay(200); digitalWrite(Led_test,0); delay(200); } } void display_actual() { lcd.setCursor(0,0); lcd.print("Actual:"); lcd.print(hrs); lcd.print(":"); lcd.print(minu); lcd.print(" "); lcd.setCursor(0,1); //lcd.print(round(temp_c)); lcd.print("T="); lcd.print((int)temp_c); lcd.print("*C-"); lcd.print("H="); //lcd.print(round(humidity)); lcd.print((int)humidity); lcd.print("% "); } void display_setpoint()
Viện Điện tử Viễn Thông { if (check_box1 == 1) { lcd.setCursor(0,0); lcd.print("SetTime:"); lcd.print(hrs_point1); lcd.print(":"); lcd.print(minu_point1); lcd.print(" "); } else { if (check_box2 == 1) { lcd.setCursor(0,0); lcd.print("SetTime:"); lcd.print(hrs_point2); lcd.print(":"); lcd.print(minu_point2); lcd.print(" "); } else { if (check_box3 == 1) { lcd.setCursor(0,0); lcd.print("SetTime:"); lcd.print(hrs_point3); lcd.print(":"); lcd.print(minu_point3); lcd.print(" "); } else { lcd.setCursor(0,0);
} } lcd.setCursor(0,1); lcd.print("Set:T="); lcd.print((int)temp_point); lcd.print("*C-"); lcd.print("H="); lcd.print((int)humi_point); lcd.print("% "); }
void convert_time_h_m(String get_time,int *_hour,int *_minute) {
byte moc[3];byte count_moc=0; String chuoi1, chuoi2;
get_time.remove(0,1);
get_time.remove((get_time.length()-1),1); //Serial.print(get_time );
//Data is string, type: 12:20= => Convert to int for (int i = 0 ; i<get_time.length();i++)
{ if (get_time.charAt(i) == ':') { moc[count_moc] = i; count_moc++; } } chuoi1 = get_time; chuoi2 = get_time;
chuoi1.remove(moc[0]); // Ham remove :
http://arduino.vn/reference/library/string/1/huong-dan- ham/remove chuoi2.remove(0,moc[0]+1);
*_hour = chuoi1.toInt(); *_minute = chuoi2.toInt();
//Serial.print(*_hour );Serial.print("-" );Serial.println(*_minute );
}
void get_real_time(int _timeout,int *_hour,int *_minute,int *_sec) {
Viện Điện tử Viễn Thông
{
time_process = millis(); n.update();
real_time= n.getFormattedTime(); // Get time from Internet byte moc[3];byte count_moc=0;
String chuoi1, chuoi2,chuoi3;
//Data is string, type: 12:20:35 => Convert to int for (int i = 0 ; i< real_time.length();i++)
{ if (real_time.charAt(i) == ':') { moc[count_moc] = i; count_moc++; } } chuoi1 = real_time; chuoi2 = real_time; chuoi3 = real_time;
chuoi1.remove(moc[0]); // Ham remove : http://arduino.vn/reference/library/string/1/huong-dan-ham/remove chuoi2.remove(0,moc[0]+1); chuoi3.remove(0,moc[1]+1); *_hour = chuoi1.toInt(); *_minute = chuoi2.toInt(); *_sec = chuoi3.toInt(); } }
void get_firebase() // Lấy dữ liệu từ Firebase {
if (Firebase.available()) // Nếu fire có sự thay đổi dữ liệu {
FirebaseObject event = Firebase.readEvent(); String eventType = event.getString("type"); eventType.toLowerCase();
if (eventType == "put") {
String path = event.getString("path"); data = event.getString("data");
{
if (data == "0") {
flag_turn_on_pump = 0 ;
// Serial.println("Da nhan du lieu tu FireBase - OFF May Bom");
}
if (data == "1") {
flag_turn_on_pump = 1;
/ Serial.println("Da nhan du lieu tu FireBase - ON May Bom"); } } if (path == "/SetHumi") { data.remove(0,1); data.remove((data.length()-1),1); humi_point = data.toFloat(); } if (path == "/SetTemp") { data.remove(0,1); data.remove((data.length()-1),1); temp_point = data.toFloat(); } if (path == "/SetTime1") { convert_time_h_m(data,&hrs_point1,&minu_point1); } if (path == "/SetTime2") { convert_time_h_m(data,&hrs_point2,&minu_point2); } if (path == "/SetTime3") { convert_time_h_m(data,&hrs_point3,&minu_point3); } if (path == "/CheckBox1") {
Viện Điện tử Viễn Thông data.remove(0,1); data.remove((data.length()-1),1); check_box1 = data.toInt(); } if (path == "/CheckBox2") { data.remove(0,1); data.remove((data.length()-1),1); check_box2 = data.toInt(); } if (path == "/CheckBox3") { data.remove(0,1); data.remove((data.length()-1),1); check_box3 = data.toInt(); } } } } void control_pump()