Tự tay làm thiết bị điều khiển thiết bị từ xa qua WIFI ESP8266

Mô tả dự án: 

Chào các bạn, Hôm nay mình sẽ hướng dẫn cách làm công tắc điều khiển từ xa bằng điện thoại thông qua module wifi8266 ep12.

 

Thành phần

​Xem bài viết mới của loạt bài này tại đây.

Các bước thực hiện

Bước 1 - Đấu nối ESP8266 V12 và USB UART để upload chương trình

ESP CP2102
TX TX
RX RX
VCC 5V
GND GND
Đóng Jump trên ESP8266

Bước 2 - Cắm CP2102 vào USB máy tính

Bước 3 - Mở Arduino chọn các thông số

1. File / Preferences nhập vào chuỗi http://arduino.esp8266.com/stable/package_esp8266com_index.json 

2a. Tools / Board / Board Manager  cài đặt board ESP8266 như hình.

2b. Tools / Board / Board Manager  cài đặt board Blynk như hình.

3. Tools / Board / Generic ESP8266 Module  4. Soạn mã nguồn sau vào khung soạn thảo ( code đính kèm)  

/*
  XSwitch - Phần mềm điều khiển công tắc qua mobile
  Copyright (C) 2016 NHX

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.
  If not, see <http://www.gnu.org/licenses/>.
 */

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "EEPROM.h"
#define  BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <BlynkSimpleEsp8266.h>
//12: Green
//13: Blue
//15: Red

ESP8266WebServer server(80);

const char*     ssid           = "XSwitch";
const char*     passphrase     = "000000000";
String          blynk          = "a4c47feas2e542f7ad7d5b2d5a4300a5";
int             inRelay1       = 14; //Chan GPIO14 gắn vào relay
String          st;
String          content;
int             statusCode;


void setup()
{
    Serial.begin(115200);
    pinMode(inRelay1, OUTPUT);
    //Delay 5m, Red blink
    pinMode(13, OUTPUT);
    pinMode(15, OUTPUT);
    for (int i = 1; i < 3; i++)
    {
        digitalWrite(15, HIGH);
        delay(500);
        digitalWrite(15, LOW);
        delay(500);
    }

    EEPROM.begin(512);
    delay(10);
    Serial.println("Startup");
    // read eeprom for ssid, pass and blynk
    Serial.println("Reading EEPROM ssid");
    String esid;
    for (int i = 0; i < 32; ++i)
    {
        esid += char(EEPROM.read(i));
    }
    Serial.print("SSID: ");
    Serial.println(esid.c_str());
    esid.trim();

    Serial.println("Reading EEPROM pass");
    String epass = "";
    for (int i = 32; i < 96; ++i)
    {
        epass += char(EEPROM.read(i));
    }
    Serial.print("PASS: ");
    Serial.println(epass.c_str());
    epass.trim();

    Serial.println("Reading EEPROM blynk");
    String eblynk = "";
    for (int i = 96; i < 128; ++i)
    {
        eblynk += char(EEPROM.read(i));
    }
    Serial.print("BLYNK: ");
    Serial.println(eblynk.c_str());
    eblynk.trim();

    if ( esid.length() > 1 )
    {
        WiFi.begin(esid.c_str(), epass.c_str());
        if (testWifi())
        {
            launchWeb(0);
            WiFi.disconnect();

            char * auth_ = new char[eblynk.length() + 1];
            eblynk.toCharArray(auth_, eblynk.length() + 1);
            Blynk.begin(auth_, esid.c_str(), epass.c_str());
            EEPROM.end();
            return;
        }
    }
    setupAP();
    EEPROM.end();
}

bool testWifi(void)
{
    int c = 0;
    Serial.println("Xin vui long doi ket noi WIFI");
    while ( c < 20 )
    {
        if (WiFi.status() == WL_CONNECTED)
        {
            return true;
        }
        delay(1000);
        Serial.print(WiFi.status());
        c++;
    }
    Serial.println("");
    Serial.println("Thoi gian ket noi cham, Mo AP");
    return false;
}

void launchWeb(int webtype)
{
    Serial.println("");
    Serial.println("WiFi ket noi");
    Serial.print("Dia chi IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("SoftAP IP: ");
    Serial.println(WiFi.softAPIP());
    createWebServer(webtype);
    // Start the server
    server.begin();
    Serial.println("May chu bat dau");
}

void setupAP(void)
{
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);
    int n = WiFi.scanNetworks();
    Serial.println("Tim hoan tat");
    if (n == 0)
    {
        Serial.println("no networks found");
    }
    else
    {
        Serial.print(n);
        Serial.println(" networks found");
        for (int i = 0; i < n; ++i)
        {
            // Print SSID and RSSI for each network found
            Serial.print(i + 1);
            Serial.print(": ");
            Serial.print(WiFi.SSID(i));
            Serial.print(" (");
            Serial.print(WiFi.RSSI(i));
            Serial.print(")");
            Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
            delay(10);
        }
    }
    Serial.println("");
    st = "<ol>";
    for (int i = 0; i < n; ++i)
    {
        // Print SSID and RSSI for each network found
        st += "<li>";
        st += WiFi.SSID(i);
        st += " (";
        st += WiFi.RSSI(i);
        st += ")";
        st += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
        st += "</li>";
    }
    st += "</ol>";
    delay(100);
    Serial.println("softap");
    Serial.println(ssid);
    Serial.println(passphrase);
    WiFi.softAP(ssid, passphrase, 6);

    launchWeb(1);
    Serial.println("over");
}

void createWebServer(int webtype)
{
    if ( webtype == 1 )
    {
        server.on("/", []()
        {
            IPAddress ip = WiFi.softAPIP();
            String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
            content = "<!DOCTYPE HTML>\r\n<html><h2>XSwitch</h2>";
            //content += ipStr;
            //content += "<form method='get' action='setting'><table width='100%' border='1'><tr><td width=\"30%\"><label>Wifi</label></td><td width=\"70%\><input name='ssid' length=32 width='500'></td></tr><tr><td><label>Password</label></td><td><input name='pass' length=64 width='500'></td></tr><tr><td><label>Blynk</label></td><td><input name='blynk' length=32 width='500'></td></tr><tr><td></td><td><input type='submit'></tr></tr></table></form>";
            content += "<form method=\"get\" action=\"setting\">";
            content += "<div>Wifi</div>";
            content += "<div><input name=\"ssid\" size=\"40\"></div>";
            content += "<div>Mat Khau</div>";
            content += "<div><input name=\"pass\" size=\"40\"></div>";
            content += "<div>Blynk</div>";
            content += "<div><input name=\"blynk\" size=\"40\"></div>";
            content += "<div><input type='submit'></div>";

            content += "<p>";
            content += st;
            content += "</p>";
            content += "</html>";
            server.send(200, "text/html", content);
        });
        server.on("/setting", []()
        {
            String qsid = server.arg("ssid");
            String qpass = server.arg("pass");
            String qblynk = server.arg("blynk");
            if (qsid.length() > 0 && qpass.length() > 0)
            {
                EEPROM.begin(512);
                Serial.println("clearing eeprom");
                for (int i = 0; i < 128; ++i)
                {
                    EEPROM.write(i, 0);
                }
                EEPROM.commit();
                Serial.println(qsid);
                Serial.println("");
                Serial.println(qpass);
                Serial.println("");
                Serial.println(qblynk);
                Serial.println("");

                Serial.println("writing eeprom ssid:");
                for (int i = 0; i < qsid.length(); ++i)
                {
                    EEPROM.write(i, qsid[i]);
                    Serial.print("Wrote: ");
                    Serial.println(qsid[i]);
                }

                Serial.println("writing eeprom pass:");
                for (int i = 0; i < qpass.length(); ++i)
                {
                    EEPROM.write(32 + i, qpass[i]);
                    Serial.print("Wrote: ");
                    Serial.println(qpass[i]);
                }

                Serial.println("writing eeprom blynk:");
                for (int i = 0; i < qblynk.length(); ++i)
                {
                    EEPROM.write(96 + i, qblynk[i]);
                    Serial.print("Wrote: ");
                    Serial.println(qblynk[i]);
                }
                EEPROM.commit();
                EEPROM.end();
                //Chop den xanh sau khu lam xong
                pinMode(13, OUTPUT);
                digitalWrite(13, LOW);
                digitalWrite(13, HIGH);
                delay(500);
                digitalWrite(13, LOW);
                content = "{\"Success\":\"Luu vao he thong. Khoi dong lai ten wifi moi\"}";
                statusCode = 200;
            }
            else
            {
                content = "{\"Error\":\"404 not found\"}";
                statusCode = 404;
                Serial.println("Sending 404");
            }
            server.send(statusCode, "application/json", content);
        });
    }
    else if (webtype == 0)
    {
        server.on("/", []()
        {
            IPAddress ip = WiFi.localIP();
            String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
            server.send(200, "application/json", "{\"IP\":\"" + ipStr + "\"}");
        });
        server.on("/cleareeprom", []()
        {
            content = "<!DOCTYPE HTML>\r\n<html>";
            content += "<h2>XSwitch</h2><p>Clearing the EEPROM</p></html>";
            server.send(200, "text/html", content);
            Serial.println("clearing eeprom");
            for (int i = 0; i < 128; ++i)
            {
                EEPROM.write(i, 0);
            }
            //Chop den xanh sau khu lam xong
            pinMode(13, OUTPUT);
            digitalWrite(13, LOW);
            digitalWrite(13, HIGH);
            delay(500);
            digitalWrite(13, LOW);
            EEPROM.commit();
        });
    }
}

void loop()
{
    server.handleClient();
    Blynk.run();
}

5.Sketch / Upload để nap chương trình

Lưu ý: Sau khi nap chương trình xong nhớ tháo jump trên ESP và tháo CP2102 ra. Lúc này chỉ cần cấp nguồn cho ESP la đã có thể chạy được.

 

Thiết kế Blynk để giao tiếp

Trên mobile, Tải và mở ứng dụng Blynk ra và tạo một nút nhấn nhớ chọn là 

 

Thế là xong!

Bây giờ mình sẽ hướng dẫn cấu hình hệ thống:  

Ở chế độ này, xSwitch trở thành 1 webserver có: Bạn vào cài đặt wifi trên điện thoại chọn wifi XSWITCH 

Mật khẩu: 000000000 (9 số 0)

IP: 192.168.4.1

Dùng thiết bị di động hay máy tính, kết nối vào access point này và mở trang web http://192.168.4.1

sau đó điền thông tin mạng WIFI chính nhà bạn và mật khẩu vào.

Wifi: nhập tên access point mà xSwitch sẽ kết nối

Password: nhập mật khẩu của wifi

Blynk: nhập vào mã xác thực của Bkynk

Nhớ nhấn submit để lưu lại. Và khởi động lại xSwitch.

Chúc các bạn thành công:

Lưu ý: mã nguồn mình lấy và chỉnh sửa lại từ tác giả: cuongdote.

Youtube: 
Enjoy
lên
29 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
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ả

K2 Farm Phần 1: Mạch điều khiển động cơ và Motor DC 24 - 350W

K2 Farm là 1 xe điều khiển từ xa qua WIFI loại hạng NẶNG được điều khiển bằng (arduino, raspberry pi 2) để áp dụng thực tế phục vụ cho Nông nghiệp. Nhiệm vụ chính của nó là phun thuốc trừ sâu, gieo hạt, tưới nước cho cây. Trong phần 1 này mình giới thiệu động cơ chính, mạch điều khiển động cơ và arduino uno.

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