Tự làm thiết bị bật tắt đèn điều khiển qua phần mềm iNut trên Android và iPhone

Điều khiển thiết bị điện trong nhà là một trong những mong muốn cháy bỏng nhất của mình trong quá trình tìm tòi và nghiên cứu phát triển Arduino. Với board mạch ESP8266, ước mong của mình đã trở thành hiện thực. Và mình đã thực hiện hóa nó qua dự án iNut. Và đây là thời điểm hoàn hảo để triển khai dự án điều khiển thiết bị điện trong nhà này. Hãy cùng khám phá nhé.

1. Giới thiệu về dự án

Thiết bị điện thông minh ngày càng trở thành thiết bị điện dân dụng phổ biến, mọi người được khuyến khích sử dụng công tắc điện wifi vì sự tiện lợi của nó. Và thiết bị điện thông minh trong là một sản phẩm trong cuộc cách mạng công nghiệp lần thứ 4. Từ lí do đó, iNut ra đời để giúp cuộc sống của gia đình bạn trở nên dễ dàng và an toàn hơn.
 
Dự án iNut gồm hai phần chính: iNut open sourceiNut commercial. Trong đó, bài viết này sẽ được cập nhập liên tục các tính năng miễn phí cho cộng đồng chế tạo Arduino để các bạn có thể tiếp cận một cách miễn phí, chính thống và tuyệt vời nhất từ những tinh hoa được đúc kết trong iNut commercial.
  • iNut open source sẽ tập trung chia sẻ vào các tính năng mới và dễ tiếp cận với người dùng phổ thông nhằm mục đích chia sẻ phương án tiếp cận trong việc truyền nhận dữ liệu để kết nối vạn vật trong thời đại công nghệ mới 4.0 hiện nay. Điều đó có nghĩa là bạn được tiếp cận những tính năng mới và độc đáo của iNut được chia sẻ miễn phí với cộng đồng DIY, đồng thời có thể đóng góp yêu cầu tính năng để yêu cầu dự án iNut phát triển để đáp ứng nhu cầu sử dụng thực sự.
  • iNut commercial sẽ tập trung vào các giao thức bảo mật, phương thức bắt tay, mã hóa dữ liệu và lưu trữ dữ liệu để cung cấp những tính năng hiện đại và an toàn cho người dùng đại chúng qua môi trường Internet. Các ý tưởng độc đáo từ iNut open source sẽ được nhà phát triển lắng nghe và triển khai ứng dụng.

2. iNut open source

Với việc chia sẻ quá trình nghiên cứu và những kinh nghiệm trong quá trình xây dựng các dự án truyền thông trong môi trường Wifi và mạng Internet, dự án iNut open source mong muốn đem lại đóng góp nhỏ cho maker Việt có một platform nguồn mở để điều khiển thiết bị điện trong nhà. Khác với các dự án khác như Blynk hay iTead. iNut open source mong muốn cùng cộng đồng maker Việt phát triển những tính năng thực sự cần thiết trong quá trình sử dụng được điều khiển trong môi trường Wifi để giúp maker Việt có những dự án DIY nhanh chóng và có thể tự tùy biến theo nhu cầu sử dụng.

Hiện nay, dự án iNut open source cung cấp tính năng sau:

  • Điều khiển bật / tắt thiết bị qua mạng Wifi.
  • Cài đặt thiết bị tương tác.
  • Chia sẻ và cập nhập dữ liệu qua mã QRCode.
  • Đồng bộ dữ liệu lên Cloud trong thời gian thực.

3. Tải phần mềm iNut để điều khiển trên điện thoại Android và iPhone

Các bạn chỉ cần tải về phần mềm iNut - Công tắc wifi tại các địa chỉ dưới đây nhé.

image image

4. Mã nguồn trên ESP8266

Chuẩn bị phần cứng

Bạn cần chuẩn bị các phần cứng như sau để lập trình:

Nối mạch

Bạn hàn nút nhấn vào giữa hai chân GPIO 0 và GND. Nút này được dùng để lập trình con ESP8266 đó mà. Vì ESP8266 v1 không có nút FLASH sẵn trên board nên chúng ta phải chịu khó hàn dây hơi phiền một chút.

Mã nguồn

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
//phải include thiết bị
#include <ArduinoJson.h>

#define PORT 8088
#define PIN 2
#define SSID_NAME "MACHTUDONG" //Tên mạng Wifi
#define PASSPHRASE "mysmarthome" //Mật khẩu mạng Wifi
#define NODE_ID "FreeNodeV1" //Thay đổi node_id để thêm nhiều node trong một mạng
ESP8266WebServer server(PORT);

const char* ssid = SSID_NAME;
const char* passphrase = PASSPHRASE;


void clickButton() {
  toggleRelay(digitalRead(PIN));
  digitalWrite(PIN, !digitalRead(PIN));
  Serial.print("PIN status ");
  Serial.println(digitalRead(PIN));  
}

void toggleRelay(bool relayState) 
{   
  if(relayState) 
  {     
    const byte miBufferON[] = {0xA0, 0x01, 0x01, 0xA2};     
    Serial.write(miBufferON, sizeof(miBufferON));   
  }   
  else 
  {     
    //To disable the Relay send it by serial port:     
    const byte miBufferOFF[] = {0xA0, 0x01, 0x00, 0xA1};     
    Serial.write(miBufferOFF, sizeof(miBufferOFF));    
  } 
} 

void setup() {
  Serial.begin(9600);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.print("PORT: ");
  Serial.println(PORT);
  Serial.println("Startup");

  pinMode(PIN, OUTPUT);
  digitalWrite(PIN, LOW);

  

  //Setting wifi
  WiFi.begin(ssid, passphrase);
  while (WiFi.status() != WL_CONNECTED) { //Thoát ra khỏi vòng 
      delay(500);
      Serial.print('.');
  }
  launchWeb();
}


void launchWeb() {
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("Local IP: ");
  Serial.println(WiFi.localIP());
  Serial.print("SoftAP IP: ");
  Serial.println(WiFi.softAPIP());
  createWebServer();
  // Start the server
  server.begin();
  Serial.println("Server started"); 
}

void createWebServer()
{
  server.on("/", HTTP_OPTIONS, []() {
    allowHeaders();
    server.send(200, "application/json", "{\"status\":0}");
  });

  server.on("/", HTTP_GET, []() { 
    allowHeaders();
    StaticJsonBuffer<2000> jsonBuffer;
    JsonObject& root = jsonBuffer.createObject();  
    IPAddress ip = WiFi.localIP();
    String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);  
    
    root["ip"] = ipStr.c_str();
    root["version"]    = "Free.0";
    root["installed"]  = true;
    root["mode"]       = "CLIENT";
    root["status"]     = 0;
    root["id"]         = NODE_ID;
    
    String str;
    root.printTo(str);
    server.send(200, "application/json", str);   
    
  });


  //bắt gói options - bật tắt thiết bị
  server.on("/toggle/0", HTTP_OPTIONS, []() {  
    allowHeaders();
    server.send(200, "application/json", "{\"status\":0}");
  });

  //bắt gói POST - bật tắt thiết bị
  server.on("/toggle/0", HTTP_POST, []() {   
    allowHeaders(); 
    clickButton();
    server.send(200, "application/json", "{\"status\":0}");
  });

  //bắt gói GET - thông thiết bị
  server.on("/device", HTTP_GET, []() {  
    allowHeaders();
    StaticJsonBuffer<2000> jsonBuffer;
    JsonObject& root = jsonBuffer.createObject();    
    root["status"]  = 0;
    root["count"]   = 1;
    JsonArray& array = root.createNestedArray("devices");   
    JsonObject& obj = array.createNestedObject();
    obj["node_id"]  = NODE_ID;
    obj["id"]       = 0;
    obj["state"]    = (digitalRead(PIN) ? "ON" : "OFF");
    obj["type"]     = "TOGGLE";
    String str;
    root.printTo(str);
    server.send(200, "application/json", str);
  });

  server.on("/device", HTTP_OPTIONS, []() {    
    allowHeaders();
    server.send(200, "application/json", "{\"status\":0}");
  });
}

void loop() {
  server.handleClient(); //lứng nghe từ server
}
void allowHeaders() {
  //Chấp nhận các kết nối, phương thức, header từ mọi nguồn
  server.sendHeader("Access-Control-Allow-Headers", "Accept,Content-Type,Accept-Encoding,Accept-Language,Origin,Referer,User-Agent,X_TOKEN");
  server.sendHeader("Access-Control-Allow-Methods", "DELETE, GET, POST, OPTIONS, PUT");
  server.sendHeader("Connection", "close");
  server.sendHeader("Access-Control-Allow-Origin", "*");  
}

Như đoạn code, ESP8266 sẽ kết nối vào mạng Wifi trong nhà tên là MACHTUDONG với mật khẩu là mysmarthome.

Dịch vụ webserver này được mở ở port 8088. Port giao tiếp của toàn dự án iNut.

Để có thể làm nhiều iNut trong nhà, bạn thay đổi id của mỗi iNut bằng tên bạn chọn ở trường NodeID.

Webserver này mở các đường dẫn sau:

  • /
    • Trả về thông tin về node được đóng gói theo chuẩn JSON.
  • /device
    • Lấy thông tin trạng thái thiết bị của iNut. 
  • /toggle/0
    • Bật hoặc tắt thiết bị iNut

TODO:

  • Sẽ phát triển iNut với việc điều khiển nhiều thiết bị hơn.

5. Hướng dẫn sử dụng phần mềm iNut

Bạn mở iNut và chọn tab Cài đặt, sau đó nhấn cái kính lúp để quét các thiết bị trong mạng Wifi nhà mình.

Như vậy là xong rồi, chuyển qua Bảng điều khiển và tận hưởng thôi.

Nếu bạn chưa có thiết bị nhưng vẫn muốn thử nghiệm phần mềm iNut trước? Đừng lo lắng, hãy đăng ký một tài khoản ở tab Tài khoản, có thể sử dụng luôn tài khoản Facebook để đăng nhập cho nhanh. iNut sử dụng Firebase để lưu trữ thông tin người dùng và thiết bị nên bạn hoàn toàn yên tâm nhé. Việc mã hóa dữ liệu cá nhân đến ngay cả người bảo hành iNut cũng không thể truy cập điều khiển đến thông tin thiết bị trong nhà bạn nữa mà.

Sau đó, chọn tab Cập nhập thiết bị và thêm thiết bị ảo hóa trên nền Internet qua mã Qrcode dưới đây:

Bạn thử khám phá tính năng chia sẻ thiết bị thử nhé heart!

5. Hơn thế nữa

Với iNut commercial bạn có thể

  • Điều khiển thiết bị qua môi trường Internet.
  • Lên lịch bật tắt thiết bị (lên đến 8 time slot).
  • Chuẩn hóa giao thức bảo mật One-time hashing và SSL.
  • An toàn điện tuyệt đối với rơ-le hai chấu.

Vì vậy, nếu bạn hài lòng với iNut open source, đừng ngần ngại chia sẻ những ý tưởng độc đáo với dự án iNut. Bạn có thể liên hệ trực tiếp với nhóm phát triển dự án iNut thông qua địa chỉ email [email protected]

Các bạn cùng nhau ủng hộ dự án iNut để cộng đồng Arduino Việt Nam có nhiều dự án startup hơn nữa nhé. Điều đó sẽ góp phần thúc đẩy sự phát triển lớn mạnh của cộng đồng maker Việt nhé

Bài viết truyền cảm hứng: 
lên
6 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Tự học Arduino

Các bài viết trong trang này đều đã được BQT cùng các bạn Cộng tác viên đánh giá và lựa chọn để cho các bạn trẻ kể cả mới bắt đầu hay đã có kinh nghiệm có thể dùng được. Hãy lưu giữ bài viết này như bản đồ hướng các bạn đến những điều hay ho trong Cộng đồng angel.

lên
324 thành viên đã đánh giá bài viết này hữu ích.

ESP8266 kết nối Internet - Phần 4: Kết nối Internet cho dự án không cần NAT Port, không cần mua server, không cần Blynk

Ở 3 phần trước, mình đã hướng dẫn các bạn toàn bộ kỹ thuật để xây dựng một chương trình webapp để điều khiển, đọc cảm biến, điều khiển thiết bị trong mạng LAN (wifi). Và, bây giờ là lúc các bạn đưa sản phẩm của mình ra ngoài Internet! Và với cách của mình sẽ giới thiệu tiếp đây, các bạn sẽ không cần phải NAT port, không cần phải mua server hàng tháng và hơn hết là không cần phải dùng Blynk. 

lên
19 thành viên đã đánh giá bài viết này hữu ích.