Mô hình quạt điện thông minh có thể ứng dụng trong rất nhiều mô hình quạt khác nhau, hệ thống điều khiển song song có thể ứng dụng trên cùng 1 vi điều khiển làm giảm giá thành sản xuất, đơn giản hóa quá trình lắp ráp mà vẫn giữ được các tính năng cơ bản và các tính năng hỗ trợ sẵn có, tối ưu hóa khả năng làm việc, thỏa mãn được nhu cầu đặt ra của người dùng.
Hơn nữa, công nghệ điều khiển áp dụng lập trình theo luật mờ và công nghệ điều kiển từ xa cùng hệ thống kết nối IOT đang ngày càng phổ biến, ngày càng nâng cao và đạt được nhiều thành tựu nhất định như: nhà thông minh, hệ thống sản xuất tự động... Để đi theo xu hướng phát triển của thời đại công nghệ 4.0 lên 5.0 hiện nay, các yêu cầu về luật hợp thành mờ phải được mở rộng và có thêm nhiều đầu ra tích hợp trong cùng một thiết bị, cùng với đó, các hệ thống cũng được liên kết chặt chẽ với nhau để giảm thiểu nhiễu, sai số và phòng ngừa khả năng bị xâm nhập bất hợp pháp, hack hệ thống điều khiển...
59
KẾT LUẬN
Qua thời gian nghiên cứu, nhóm đồ án đã phần nào nắm được cơ sở kiến thức, căn bản nguyên tắc về điều khiển theo luật mờ và áp dụng vào hệ thống thông minh lớn hơn như nhà thông minh,... Đồ án như một bước đệm nhỏ trong sự phát triển của xu hướng tự động hóa, hiện đại hóa hiện nay, phục vụ trực tiếp cho đời sống sinh hoạt và sản xuất của con người.
Từ sản phẩm “Quạt điện thông minh” đã nghiên cứu, nhóm đồ án muốn phân tích, hoàn thiện và đưa ra những bước cơ bản trong việc điều khiển tự động bằng phương pháp kết hợp những tín hiệu thu được từ bên ngoài, đưa ra phương pháp điều khiển từ xa bằng Wifi - bước đi đầu tiên trong việc liên kết các thiết bị thông minh nhỏ thành một hệ thống lớn. Qua đó, nâng cao khả năng hoạt động của sản phẩm và đáp ứng nhu cầu xã hội ngày nay.
Sau thời gian nỗ lực tìm hiểu, nghiên cứu và hoàn thiện đồ án, đến nay đồ án tốt nghiệp đã được hoàn thành đúng hạn với sự cố gắng của nhóm trong khả năng làm việc chung và phân chia nhiệm vụ về việc tìm hiểu sản phẩm, ứng dụng và chế tạo thành công sản phẩm thực tế. Bằng những kiến thức đã được trang bị ở trường và một số tài liệu tham khảo có liên quan đến vấn đề đang nghiên cứu, nhóm đồ án đã cố gắng trình bày đồ án một cách ngắn gọn và đầy đủ nhất. Tuy nhiên, do trình độ còn hạn chế, chưa có nhiều kinh nghiệm thực tế nên đề tài của nhóm còn có nhiều khiếm khuyết. Qua đây, nhóm đồ án rất mong muốn nhận được ý kiến đóng góp của các thầy cô giáo và các bạn sinh viên để đồ án của nhóm được hoàn thiện hơn và có thể định hướng phát triển tốt sản phẩm trong tương lai.
VIII
TÀI LIỆU THAM KHẢO
[1] Nguyễn Hữu Hưng, Lập trình với app inventer , Học viện VIETSTEM, Hà Nội
[2] Hà, Phạm Minh. 2018.KỸ THUẬT MẠCH ĐIỆN TỬ. NHÀ XUẤT BẢN KHOA
HỌC VÀ KỸ THUẬT, 2018.
[3] Nguyễn Đức Điển, Hoàng Đình Cơ. 2019. TÀI LIỆU HỌC TẬP ĐIỀU KHIỂN
MỜ VÀ MẠNG NƠRON. Nhà xuất bản giáo dục, 2019.
[4] PGS.TS TRẦN XUÂN MINH, TS. ĐỖ TRUNG HẢI. 2018. Điện tử công suất.
NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT, 2018.
[5] Phạm Quang Huy, Lê Cảnh Trung, Lập Trình Điều Khiển Với Arrduino ,NXB
khoa học và kĩ thuật ,2014.
[6]Hoàng, Nguyễn Quang. 2019. Matlab và Simulink cho kỹ sư. Hà Nội : Nhà Xuất
Bản Bách Khoa Hà Nội, 2019.
[7]Hoàng, T.S Huỳnh Thái. 2006. Hệ thống điều khiển thông minh. TP. Hồ Chí Minh
: NXB Đại học Quốc gia, 2006.
IX
PHỤ LỤC
Code chương trình của Arduino:
#include <Wire.h> #include <math.h> #include <SoftwareSerial.h> #include <ArduinoJson.h> #include <DFRobot_DHT11.h> #include <TimerOne.h> #include <OneWire.h> DFRobot_DHT11 DHT; #define DHT11_PIN 7 #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C LCD(0x27,16,2); #define Triac_Pin1 4 #define Triac_Pin2 9 SoftwareSerial espSerial(5, 6); int temp , hum ;
float ulanh ; float uvua ; float unong ; float uthap ; float utrungbinh; float ucao; double min1,min2,min3,min4,min5,min6,min7,min8,min9; int cham=7, vuaz=4 ,nhanh=1;
float thoigian1; float thoigian2; float output1; float output2;
X float M,N,O,P,Q,R,S,V,T;
unsigned long interval=500; // thời gian chờ
unsigned long previousMillis=0; // millis() trả lại thời gian void setup() { Serial.begin(115200); espSerial.begin(115200); Serial.println("Program started"); LCD.init(); LCD.backlight(); LCD.print("nhdo:"); LCD.setCursor(8,0); LCD.print("hum:"); //LCD.createChar(1,degree); LCD.setCursor(0,1); LCD.print("OT1:"); LCD.setCursor(9,1); LCD.print("OT2:");
pinMode(Triac_Pin1, OUTPUT);// đặt triac quat output pinMode(Triac_Pin2, OUTPUT);// đặt triac bom output attachInterrupt(0, zero_crosss_int1, RISING); //pin d2 attachInterrupt(1, zero_crosss_int2, RISING); //pin d2 }
void zero_crosss_int1() {
float dimtime1 = (1000 * thoigian1); // For 50hz delayMicroseconds(dimtime1); // thời gian mở quạt digitalWrite(Triac_Pin1, HIGH); // triac quat high delayMicroseconds(10); // delay
digitalWrite(Triac_Pin1, LOW); // triac đóng }
XI void zero_crosss_int2()
{
float dimtime2 = float(1000 * thoigian2); // tần số 50hz delayMicroseconds(dimtime2); // thời gian mở
digitalWrite(Triac_Pin2, HIGH); // triac bơm nước high delayMicroseconds(10); // delay thời gian đóng digitalWrite(Triac_Pin2, LOW); // đóng triac
}
void loop() {
DHT.read(DHT11_PIN);
StaticJsonBuffer<1000> jsonBuffer;
JsonObject& data = jsonBuffer.createObject(); //Obtain Temp and Hum data
dht11_func();
//Assign collected data to JSON Object data["humidity"] = hum;
data["temperature"] = temp; data.printTo(espSerial); jsonBuffer.clear(); delay(2000);
unsigned long currentMillis = millis(); // so sánh thời gian thực tế
if ((unsigned long)(currentMillis - previousMillis) >= interval) { LCD.setCursor(5,0); LCD.print(temp); LCD.setCursor(14,0); LCD.print(hum); TAPMO(); GIAIMO();
XII thoigian1 = output1; thoigian2 = output2; LCD.setCursor(4,1); LCD.print(thoigian1); LCD.setCursor(13,1); LCD.print(thoigian2); zero_crosss_int1(); zero_crosss_int2(); previousMillis = millis(); } } void TAPMO() { //////////nhiet do///////// if(temp <= 20) { ulanh =1; uvua =0; unong =0; }
else if(temp >20 && temp <=25) {
ulanh =float(25-temp)/5; uvua =float(temp-20)/5; unong =0;
}
else if(temp >25 && temp <=30) {
ulanh =0;
uvua =float(30-temp)/5; unong =float(temp-25)/5;
XIII } else { ulanh =0; uvua =0; unong =1; } ////////////hum///////////// if(hum <= 40) { uthap =1; utrungbinh =0; ucao =0; }
else if(hum >40 && hum <= 55) {
uthap =float(55-hum)/15; utrungbinh =float(hum-40)/15; ucao =0;
}
else if(hum >55 && hum<= 70) { uthap =0; utrungbinh =float(70-hum)/15; ucao =float(hum-55)/15; } else { uthap =0; utrungbinh =0; ucao =1;
XIV } //////////////max-min////////////// min1=min(ulanh,uthap); min2=min(ulanh,utrungbinh); min3=min(ulanh,ucao); min4=min(uvua,uthap); min5=min(uvua,utrungbinh); min6=min(uvua,ucao); min7=min(unong,uthap); min8=min(unong,utrungbinh); min9=min(unong,ucao); } void GIAIMO() {
// output cho quat
A=min1*cham ;B=min2*cham ;C=min3*cham ; D=min4*vuaz ;E=min5*vuaz ;F=min6*vuaz ; G=min7*nhanh ;H=min8*nhanh ;J=min9*nhanh; /////---/////
output1=(A+B+C+D+E+F+G+H+J)/(min1+min2+min3+min4+min5+min6+min7+min 8+min9);
//output cho bom nuoc
M=min1*nhanh ;N=min2*vuaz ;O=min3*cham ;P=min4*nhanh ;Q=min5*vuaz ;R=min6*cham ;S=min7*nhanh ;V=min8*vuaz ;T=min9*cham;
output2=(M+N+O+P+Q+R+S+V+T)/(min1+min2+min3+min4+min5+min6+min7+min 8+min9); } float weather() { temp = DHT.temperature; hum = DHT.humidity;
XV } void dht11_func() { weather(); Serial.print("Humidity: "); Serial.println(hum); Serial.print("Temperature: "); Serial.println(temp); }
Code của esp8266:
#include <Arduino.h>
#include "FirebaseESP8266.h" #include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h> #include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2); //Thiết lập địa chỉ và loại LCD #include <NTPClient.h>
#include <WiFiUdp.h>
#include <SoftwareSerial.h> #include <ArduinoJson.h>
SoftwareSerial espSerial(D5, D6);
// Provide the token generation process info. #include "addons/TokenHelper.h"
// Provide the RTDB payload printing info and other helper functions. #include "addons/RTDBHelper.h"
// Insert your network credentials #define WIFI_SSID "Khong Ten" #define WIFI_PASSWORD "hoilamgi" // Insert Firebase project API Key
#define API_KEY "AIzaSyD-32DzcKDtIsaaxuTLIbWYthMZw5iNL78" // Insert Authorized Email and Corresponding Password
XVI
#define USER_EMAIL "nguyenkhacbac1233@gmail.com" #define USER_PASSWORD "12345678"
// Insert RTDB URLefine the RTDB URL
#define DATABASE_URL "https://esp8266-a385a-default-rtdb.asia-
southeast1.firebasedatabase.app/" // Define Firebase objects
FirebaseData fbdo; FirebaseAuth auth; FirebaseConfig config; int a;
int lastButtonState =0; // Variable to save USER UID String uid;
int IN11 = D3; int IN10 = D4; int IN9 = D7; int IN8 = D8;
// Database main path (to be updated in setup with the user UID) String databasePath;
String databasePath1; // Database child nodesa
String tempPath = "/temperature"; String humPath = "/humidity"; String timePath = "/timestamp";
// Parent Node (to be updated in every loop) String parentPath;
FirebaseJson json;
// Define NTP Client to get time WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org"); // Variable to save current epoch time
XVII int timestamp;
float temperature; float humidity; int n=0;
// Timer variables (send new readings every three minutes) unsigned long sendDataPrevMillis = 0;
unsigned long timerDelay = 10000; // Initialize WiFi
void initWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("Connecting to WiFi .."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.println(WiFi.localIP()); Serial.println(); }
// Function that gets current epoch time unsigned long getTime() {
timeClient.update();
unsigned long now = timeClient.getEpochTime(); return now;
}
void setup(){
Serial.begin(115200); espSerial.begin(115200); while (!Serial) continue;
Wire.begin(D2,D1); //Thiết lập chân kết nối I2C (SDA,SCL);
XVIII lcd.clear(); //Xóa màn hình lcd.backlight(); //Bật đèn nền initWiFi(); timeClient.begin(); pinMode(IN11,OUTPUT); pinMode(IN10,OUTPUT); pinMode(IN9,OUTPUT); pinMode(IN8,OUTPUT); lcd.setCursor(2,0); //Đặt vị trí ở ô thứ 3 trên dòng 1
lcd.print("Welcom to:"); //Ghi đoạn text "Welcom to" lcd.setCursor(8,0); //Đặt vị trí ở ô thứ 1 trên dòng 2
lcd.print("Nhom 4");
// Assign the api key (required) config.api_key = API_KEY;
// Assign the user sign in credentials auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD; // Assign the RTDB URL (required) config.database_url = DATABASE_URL; Firebase.reconnectWiFi(true);
fbdo.setResponseSize(4096);
// Assign the callback function for the long running token generation task */
config.token_status_callback = tokenStatusCallback; //see
addons/TokenHelper.h
// Assign the maximum retry of token generation config.max_token_generation_retry = 5;
// Initialize the library with the Firebase authen and config Firebase.begin(&config, &auth);
XIX Serial.println("Getting User UID"); while ((auth.token.uid) == "") { Serial.print('.');
delay(1000); }
// Print user UID
uid = auth.token.uid.c_str(); Serial.print("User UID: "); Serial.println(uid);
// Update database path
databasePath = "/UsersData/" + uid + "/readings"; databasePath1 = "/UsersData/" + uid + "/set/state"; }
void loop(){
// DHT.read(DHT11_PIN);
// Send new readings to database StaticJsonBuffer<1000> jsonBuffer;
JsonObject& data = jsonBuffer.parseObject(espSerial); if (data == JsonObject::invalid()) {
Serial.println("Invalid Json Object"); jsonBuffer.clear();
}
Serial.println("JSON Object Recieved"); Serial.print("Recieved Humidity: "); float hum = data["humidity"];
Serial.print("Recieved Temperature: "); float temp = data["temperature"];
if (Firebase.ready() && (millis() - sendDataPrevMillis > timerDelay || sendDataPrevMillis == 0)){
XX //Get current timestamp
timestamp = getTime(); Serial.print ("time: "); Serial.println (timestamp);
parentPath= databasePath + "/" + String(timestamp); json.set(tempPath.c_str(), String(temp));
json.set(humPath.c_str(), String(hum)); json.set(timePath, String(timestamp));
Serial.printf("Set json... %s\n", Firebase.RTDB.setJSON(&fbdo, parentPath.c_str(), &json) ? "ok" : fbdo.errorReason().c_str()); } if (Firebase.getString(fbdo, databasePath1)){ Serial.println(fbdo.stringData()); if (fbdo.stringData() == "on") { digitalWrite(IN10, HIGH); digitalWrite(IN11, HIGH); digitalWrite(IN8, HIGH); digitalWrite(IN9, HIGH); lcd.setCursor(0,1); lcd.print("Chay tu dong"); a=1; Serial.println(a); }
else if (fbdo.stringData() == "off"){ a=0; digitalWrite(IN10, LOW); digitalWrite(IN11, LOW); digitalWrite(IN8, LOW); digitalWrite(IN9, LOW); lcd.setCursor(0,1);
XXI lcd.print("Chay bang tay"); Serial.println(a); } delay(2000); } } Thông số kĩ thuật DHT11: - Nguồn sử dụng: 3~5VDC.
- Dòng sử dụng: 2.5mA max (khi truyền dữ liệu).
- Đo tốt ở độ ẩm 0100%RH với sai số 2-5%.
- Đo tốt ở nhiệt độ -40 to 80°C sai số ±0.5°C.
- Tần số lấy mẫu tối đa 0.5Hz (2 giây 1 lần)
- Kích thước 27mm x 59mm x 13.5mm (1.05" x 2.32" x 0.53")
- 4 chân, khoảng cách chân 0.1''.
Thông số kĩ thuật Arduino Uno R3:
Vi điều khiển ATmega328 họ 8bit
Điện áp hoạt động 5V DC (chỉ được cấp qua cổng USB)
Tần số hoạt động 16 MHz
Dòng tiêu thụ khoảng 30mA
Điện áp vào khuyên dùng 7-12V DC
Điện áp vào giới hạn 6-20V DC
Số chân Digital I/O 14 (6 chân hardware PWM)
Số chân Analog 6 (độ phân giải 10bit)
XXII
Dòng ra tối đa (5V) 500 mA
Dòng ra tối đa (3.3V) 50 mA
Bộ nhớ flash 32 KB (ATmega328) với 0.5KB dùng bởi
bootloader
SRAM 2 KB (ATmega328)
XXIII