[TAPIT Share Contest][MS 01] Điều khiển thiết bị IoTs

      Đề tài sử dụng esp8266 kết hợp với các module cảm biến nhiệt độ, led 7 đoạn để hiển thị và gửi dữ liệu lên server, ngoài ra còn có các cảm biến dòng và công tắc để nhận biết và điều khiển trạng thái hoạt động của tải xoay chiều.

Phần mềm sử dụng là Arduino IDE

Một số hình ảnh của đề tài

                            

ESP8266                                             DHT11                                             ACS712

             

Chi tiết và điểm nổi bật

  1. Chi tiết:

​      Đề tài sử dụng 3 module cảm biến dòng ACS712 để xác định là thiết bị cần điều khiển có hoạt động hay không ( nếu thiết bị hoạt động thì sẽ có dòng chạy qua module ), IC phân kênh 4051 sẽ luân phiên đọc dữ liệu adc từ module cảm biến dòng ( vì ESP8266 chỉ có 1 cổng adc ) để đưa vào xử lí nhận biết. Sau đó trạng thái tải sẽ được gửi lên server và hiển thị ra web cho người sử dụng.
Để tránh tình trạng nhiễu khi get/up liên tục thì chỉ cho phép up dữ liệu khi nhận thấy có sự thay đổi trạng thái của tải.
Ngoài ra, đề tài còn dùng DHT11 để thu thập nhiệt độ hiển thị ra led 7 đoạn và hiển thị trên nền web.
Lưu đồ:

Các hàm quan trọng sử dụng trong chương trình:
Hàm đọc dữ liệu từ cảm biến:

void Readsensor()
{
Temp=ReadTemp();
for(int i=0;i<3;i++)
if(Compare[i]==0)                  //gui len va nhan ve giong nhau
{
Mux(i);                             //doc tung cam bien dong
Val[i]=ReadAcs712();      //luu gia tri cam bien 
}
}

Hàm điều khiển tải:
Hàm này có tác dụng đảo mức logic của các chân điều khiển relay, có thể xem relay như là công tắc thứ nhất trong cặp công tắc cầu thang.

void Control()
{
Conver();
for (int i=0 ; i<3 ; i++)
if (Compare[i]==1)
{
RelayStt[i]=RelayStt[i]^0B1;
RelayControl(i,RelayStt[i]);
Compare[i]=0;
}
}

      Hàm chọn kênh của IC4051 để đọc liên tục 3 cảm biến dòng qua 1 chân analog của Esp8266:
Do Esp8266 chỉ có 1 chân Analog nên ta phải sử dụng IC4051 để chọn kênh đọc liên tiếp 3 cảm biến dòng qua 1 chân analog của esp8266. Hàm sẽ set giá trị ngõ điều khiển để chọn được ngõ ra tín hiệu thích hợp

void Mux(int channel)
{
if (channel==0)                            //X0
{
digitalWrite(S0,LOW);           //A=0
digitalWrite(S1,LOW);           //B=0;
digitalWrite(S2,LOW);           //C=0;
}
if  (channel==1)                          //X1
{
digitalWrite(S0,HIGH);          //A=1;
digitalWrite(S1,LOW);           //B=0;
digitalWrite(S2,LOW);           //C=0;
}
if (channel==2)                            //X2
{
digitalWrite(S0,LOW);           //A=0;
digitalWrite(S1,HIGH);          //B=1;
digitalWrite(S2,LOW);           //C=0;
}
}

      Hàm nhận biết trạng thái của tải:
Hàm sẽ so sánh giá trị của cảm biến dòng với giá trị của ngưỡng để kiểm tra xem tải có hoạt động hay không​

void Conver()
{
for (int i=0 ; i<3 ; i++)
if(Compare[i]==0)
{
if (Val[i]>=Threshold) Sender[i]=1;
else Sender[i]=0;
}
}

      Hàm UpStt:
Khi có sự thay đổi trạng thái thì trạng thái của các tải sẽ được chuyển lên DataBase rồi hiển thị ở website để người dùng nhận biết. Để up trạng thái tải lên web thì từ vi xử lí truy cập theo đường dẫn iot08.tapit.vn/control.php?status1=a&status2=b&status=c. Trong đó a,b,c là các số nguyên 0 hoặc 1, với 0 là off còn 1 là on. Còn khi tải không có sự thay đổi trạng thái thì vi xử lí chỉ cập nhật nhiệt độ phòng lên web với đường dẫn iot08.tapit.vn/control.php?temp=d với d là biến nhiệt độ đọc được từ cảm biến DHT11

void UpStt()
{
WiFiClient client;
const int httpPort = 80;       //sua port trong XAMPP
if (!client.connect(host, httpPort))
{
return;
}
if (Sender[0]!=Reciever[0]||Sender[1]!=Reciever[1]||Sender[2]!=Reciever[2]||Check==0)
{
url = “/control.php?status1=”+String(int(Sender[0]))+“&status2=”+String(int(Sender[1]))+“&status3=”+String(int(Sender[2]));
client.print(String(“GET “) + url + ” HTTP/1.1\r\n” + “Host: “ + host + “\r\n” + “Connection: close\r\n\r\n”);
Check=1;
}
else
{
url = “/control.php?temp=”+String(int(Temp));
client.print(String(“GET “) + url + ” HTTP/1.1\r\n” + “Host: “ + host + “\r\n” + “Connection: close\r\n\r\n”);
}
}

Hàm GetStt:

void GetStt()
{
WiFiClient client;
const int httpPort = 80;      //sua port trong XAMPP
if (!client.connect(host, httpPort))
{
return;
}
url = “/status.php”;
client.print(String(“GET “) + url + ” HTTP/1.1\r\n” + “Host: ” + host + “\r\n” + “Connection: close\r\n\r\n”);
unsigned long timeout = millis();
while (client.available() == 0)
{
if (millis() – timeout > 5000)
{
client.stop();
return;
}
}
while(client.available())
{
line = client.readString();
}
}

Hàm này dùng để lấy thông tin từ host trả về về khi vi xử lí gửi yêu cầu đọc trạng thái lên. Thông tin này được trả về dưới dạng một chuỗi như sau:

      Thông tin mà vi xử lí cần là |0|0|0, nên thao tác được thuận tiện hơn thì ta tiến hành cắt chuỗi, chỉ giữ lại những thông tin cần thiết. việc này được làm trong hàm SetUpStt.

      Hàm SetUpStt:

void SetUpStt()
{
line1=line.substring(167,173);
for(int i; i<3; i++)
{
Reciever[i]=line1.substring(2*i+1,2*i+2).toInt();
}
for (int j=0;j<3;j++)
{
if (Sender[j]!= Reciever[j])
{
Compare[j]=1;
Sender[j]=Sender[j]^0B1;
}
}
}

      Chuỗi sau khi được làm gọn sẽ được xử lí gán vào biến Reciever, tiếp đến sẽ so sánh biến Reciever và Sender, nếu khác nhau thì biến Compare sẽ được set lên 1, và đảo biến Sender.

Lập trình web
      index.php

<?php 
$con = mysqli_connect(“localhost”,“iot08_lamdao”,“Thokhung9879”,“iot08_lamdao”);
if (!$con) {
die(‘Could not connect: ‘ . mysqli_error($con));
}
$sql = “SELECT * FROM TTCN”;
$result = mysqli_query($con,$sql);
$row = mysqli_fetch_array($result);
?>

Những lệnh này dùng để load trạng thái hiện tại của nút bấm từ databse để hiển thị lên web.

<form action=“test.php”>
<?php 
if($row[‘status2’] == ‘1’){
echo ‘Trạng thái thiết bị 2:’;
echo ‘<input type=”submit” value=”ON” name=”status2″ class=”btn btn-primary”>’;
}
if($row[‘status2’] == ‘0’){
echo ‘Trạng thái thiết bị 2:’;
echo ‘<input type=”submit” value=”OFF” name=”status2″ class=”btn btn-danger”>’;
}
?>
</form>

Nếu trạng thái của thiết bị là 1 thì nút bấm sẽ có giá trị là ON.
Nếu trạng thái của thiết bị là 0 thì nút bấm sẽ có giá trị là OFF.
Nếu nhấn nút để chuyển trạng thái của thiết bị thì dữ liệu sẽ được chuyển qua file test.php để xử lí và lưu vào Database.
test.php:

if(isset($_GET[‘status1’])){
$status1 = $_GET[‘status1’];
if($status1 == “ON”){
$sql = “UPDATE TTCN SET status1 = ‘0’”;
$result = mysqli_query($con,$sql);
}
if($status1 == “OFF”){
$sql = “UPDATE TTCN SET status1 = ‘1’”;
$result = mysqli_query($con,$sql);
}
}

File tes.php này sẽ nhận lệnh từ index.php để xử lí các nút nhấn on/off đưa về 1/0 để lưu vào Database
      status.php:

      File này sẽ lấy thông tin từ Database, sau đó đẩy các giá trị status ra ( khung đỏ) để cho vi xử lí lấy về ( hàm GetStt ở trên ).​
      control.php:

      File này sẽ nhận dữ liệu từ hàm UpStt của vi xử lí gửi lên hoặc từ các nút nhấn của file index.php, sao đó lưu các giá trị status1, status2, status3 vào Database để cấp dữ liệu cho status.php để vi xử lí lấy về.

  1. Điểm nổi bật:

​      Vừa có thể điều khiển từ web vừa có thể điều khiển được từ công tắc ngoài

Video demo

Kinh nghiệm của nhóm

Giải pháp dùng module dòng phù hợp hơn trong việc giám sát dòng qua tải, ở đây nếu dùng module dòng này thì yêu cầu tải phải có công suất đủ lớn để sau khi khuếch đại đưa vào thì vi điều khiển mới nhận biết được, và khi tải từ trạng thái on về off thì mức điện áp nhận biết từ high to low chậm nên có delay tương đối lớn ( tầm 3-5s)

Có thể làm lại đề tài này bằng cách sử dụng công tắc ngoài trên dây 1 chiều sẽ đơn giản và hiệu quả hơn.

Nên áp dụng giao thức MQTT để khắc phục tình trạng delay

Đề tài dự thi TAPIT Share Contest của nhóm có mã số 01
Đào Dũ Hoàn Lâm, Phan Văn Huy, Trần Hồng Quân!