CHƯƠNG 3. THIẾT KẾ, LẬP TRÌNH VÀ LẮP ĐẶT MẠCH ĐIỀU KHIỂN TỪ XA VỀ NHIỆT ĐỘ, ĐỘ ẨM TRÊN ĐIỆN THOẠI DI ĐỘNG THÔNG
3.1 Phân tích mạch điều khiển
Phân tích mạch là bước quan trọng giúp xác định được kết cấu của mạch, các thông số của thiết bị để từ đó có cơ sở thiết kế, điều khiển và lắp đặt.
Phân tích mạch điều khiển thiết bị dùng Module Wifi ESP8266 V1 với sơ đồ khối tổng quát của mạch, nguyên lí hoạt động, lưu đồ thuật toán và chương trình điều khiển.
3.1.1 Sơ đồ khối tổng quát
Mạch điều khiển thiết bị dùng Arduino Uno kết nối với Module Wifi ESP8266 V1 và cảm biến DHT11 có sơ đồ khối tổng quát được thể hiện như trên hình 3.1
Hình 3.1 Sơ đồ khối tổng quát Trong đó:
- Khối nguồn: gồm có nguồn cấp cho Arduino Uno là 5V-DC lấy từ máy tính điện tử thông qua cổng USB.
- Khối điều khiển trung tâm: board Arduino Uno có chức năng nhận tín hiệu từ cảm biến DHT11 và gủi tín hiệu sang Module Wifi Esp8266 V1.
- Khối phát tín hiệu điều khiển: Smartphone điều khiển bằng Module Wifi ESP8266 có chức năng nhận tín hiệu từ Arduino Uno và phát tín hiệu qua wifi và truyền lên web có tên là ThingSpeak.
- Khối thiết bị ngoại vi: cảm biến nhiệt độ và độ ẩm DHT11 có chức năng nhận giá trih nhiệt độ và độ ẩm từ môi trường.
Quy trình kết nối (khi giới thiệu các thiết bị đã có sơ đồ kết nối):
- Trước tiên, kết nối Arduino Uno với Module Wifi Esp8266 V1.
- Tiếp theo, kết nối cảm biến nhiệt độ, độ ẩm DHT11 với Arduino Uno.
- Cắm dây USB 5V vào Arduino.
3.1.2 Nguyên lý hoạt động của hệ thống
Đầu tiên, khởi động phần mềm Virtuino. Tiếp theo, khởi động chương trình - hệ thống sẽ thiết lập các thông số cần thiết và nhận tín hiệu từ Arduino IDE.
Trong đó, cần thiết lập các cổng của bo mạch Arduino. Người dùng sử dụng phần mềm Arduino IDE để tiến hành viết chương trình code cho mạch điều khiển.
Mạch điều khiển kiểm tra tiêu chuẩn truyền UART (9600) sau đó đọc giá trị nhiệt độ, độ ẩm từ cảm biến DHT11 và gửi đến Arduino. Lúc này, nếu Arduino có giá trị nhiệt độ và độ ẩm thì sẽ gửi qua Module Wifi Esp8266 V1. Esp8266 V1 truyền dữ liệu qua wifi và gửi lên trang web gọi là ThingSpeak. Cuối cùng, kết quả được hiển thị lên màn hình điện thoại thông qua Apps Virtuino.
3.1.3 Lưu đồ thuật toán
Mạch điều khiển thiết bị dùng Module Wifi Esp8266 V1 có lưu đồ thuật toán như hình 3.2:
Hình 3.2 Lưu đồ thuật toán mạch điều khiển 3.1.4 Nạp code và chạy chương trình.
- Đầu tiên để có thể viết chương trình cho mạch điều khiển thì ta cần chọn thư viện SoftwareSerial cho phần mềm Arduino IDE.
- Viết code để nạp cho chương trình kết nối giữa Arduino + Esp8266 V1 + DHT11 gửi lên Thingspeak như sau:
// Khóa luận
// Tạo giao tiếp với esp8266
#include <SoftwareSerial.h>
SoftwareSerial espSerial = SoftwareSerial(2,3); // arduino RX pin=2
#include <DHT.h> //thư viện cảm biến
#define DHTPIN 5 // chân input cảm biến
#define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE);
String apiKey = "OG23B22NRB99H1D2"; // key API trên thingSpeak String ssid="WIFI CHUA"; // Nhập wifi
String password ="0988366493"; // Nhập pass wifi boolean DEBUG=true;
// kiểm tra phản hồi
void showResponse(int waitTime){
long t=millis();
char c;
while (t+waitTime>millis()){
if (espSerial.available()){
c=espSerial.read();
if (DEBUG) Serial.print(c);
} } }
//Hàm gửi giá trị lên thingSpeak
boolean thingSpeakWrite(float value1, float value2){
String cmd = "AT+CIPSTART=\"TCP\",\""; // Kết nối với TCP cmd += "184.106.153.149"; // api.thingspeak.com cmd += "\",80";
espSerial.println(cmd);
if (DEBUG) Serial.println(cmd);
if(espSerial.find("Error")){
if (DEBUG) Serial.println("AT+CIPSTART error");
return false;
}
String getStr = "GET /update?api_key=";
getStr += apiKey;
getStr +="&field1=";
getStr += String(value1);
getStr +="&field2=";
getStr += String(value2);
getStr += "\r\n\r\n";
// send data length
cmd = "AT+CIPSEND="; //Đưa độ dài tập tin cho Esp8266 để nhận
cmd += String(getStr.length()); //Lấy độ dài của getStr rồi gửi lên Esp8266 espSerial.println(cmd);
if (DEBUG) Serial.println(cmd);
delay(100);
if(espSerial.find(">")){
espSerial.print(getStr); //Nếu tìm thấy kí tự phản hồi của lệnh Send thì gửi dữ liệu lên thingSpeak cho Esp8266
if (DEBUG) Serial.print(getStr);
} else{
espSerial.println("AT+CIPCLOSE");
// alert user
if (DEBUG) Serial.println("AT+CIPCLOSE");
return false;
}
return true;
}
//=============================================== setup void setup() {
DEBUG=true;
Serial.begin(9600);
dht.begin();
espSerial.begin(115200);
espSerial.println("AT+CWMODE=1"); // set esp8266 as client showResponse(1000);
espSerial.println("AT+CWJAP=\""+ssid+"\",\""+password+"\"");
showResponse(5000);
if (DEBUG) Serial.println("Setup completed");
}
// chương trình chính void loop() {
// Read sensor values
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
if (DEBUG) Serial.println("Failed to read from DHT");
} else {
if (DEBUG) Serial.println("Temp="+String(t)+" *C");
if (DEBUG) Serial.println("Humidity="+String(h)+" %");
thingSpeakWrite(t,h);
}
delay(2000);
}