Subscribe Us

header ads

Bài 4: Hưỡng Dẫn Tự Học Esp8266. Esp8266 Button WebServer Điều Khiển Bật Tắt led


Điều Khiển Bật Tắt Led Từ Web Server Esp8266 Và Button

Ở bài viết trước mình đã giới thiệu qua bài Điều Khiển Bật Tắt Led Từ Web Server Qua ESP8266 rồi. và bài 2 có giới thiệu qua cho các bạn về làm web server cơ bả trên esp 8266 rồi
Bài viết này mình sẽ hưỡng dẫn các bạn làm Điều Khiển Bật Tắt Led Từ Web Server Esp8266 Và Button nhá

Sơ Đồ Mạch button control led Esp8266


Như Bài Trước mình dung 2 chân GPIO4 D2  và chân GPIO5 D1 làm chân led nhá. 2 Chân này sẽ dùng mức thấp (LOW) để Bật led Và mức cao (High) Để Tắt led nhá



Trong bài này mình dùng thêm chân GPIO12 D6 Chân GPIO14 D5 làm chân Button
Vậy button D6 sẽ điều khiển led D2. Và button D5 sẽ điều khiển led D1

Chương Trình ESP8266 2 Button Điều Khiển 2 LED


  
/*  LEPAN Trợ Lý Học Tập
 *  WEB Button 
 *  Tự học esp 8266
 *  https://trolyhoctap.blogspot.com/
*/
int ledPin1=4;
int ledPin2=5;
int buttonPin1=12;
int buttonPin2=14;
String status1 = "OFF";
String status2 = "OFF";
int previous1;        //trạng thái trước khi an nút
int previous2;
int reading1;        // lưu lại trạng thái nút ấn ở cuối loop
int reading2;
long time1 = 0;       // dùng để lưu millis khi nhấn nút
long time2 = 0;
long debounce = 200;    // thời gian chờ chống rung nút nhấn

void buildLed1(){
  if (status1 == "ON"){
        Serial.print("status1 la ");
        Serial.println(status1);
        digitalWrite(ledPin1, LOW);       // Led Kich ở mức thấp
  }
  else {
        Serial.print("status1 la ");
        Serial.println(status1);
        digitalWrite(ledPin1, HIGH);
  }
}

void buildLed2(){
  if (status2 == "ON"){
        Serial.print("status2 la ");
        Serial.println(status2);
        digitalWrite(ledPin2, LOW);   //led bật ở mức thấp
  }
  else {
        Serial.print("status2 la ");
        Serial.println(status2);
        digitalWrite(ledPin2, HIGH);
  }
}

void setup() {

  Serial.begin(9600);  
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  pinMode(buttonPin1,INPUT);
  pinMode(buttonPin2,INPUT);
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);

}

void loop() {

    reading1 = digitalRead(buttonPin1);
    reading2 = digitalRead(buttonPin2);
    if(reading1 == HIGH  && previous1 == LOW && millis() - time1 > debounce) {
        if(status1=="OFF"){
          status1="ON";
        }else if(status1=="ON"){
          status1="OFF";
        }
        time1 = millis();
        Serial.println("reading1");
        Serial.println(reading1);
        buildLed1();
    }
    
    if(reading2 == HIGH  && previous2 == LOW && millis() - time2 > debounce) {
        if(status2=="OFF"){
          status2="ON";
        }else if(status2=="ON"){
          status2="OFF";
        }
        time2 = millis();
        Serial.println("reading2");
        Serial.println(reading2);
        buildLed2();
    }
    previous1 = reading1;
    previous2 = reading2;

}



Giải Thích Chương Trình ESP8266


int buttonPin1=11
Lệnh khai báo biến int buttonPin

int previous1;
lệnh khái báo biến int previous. Biến này sẽ dùng để lư trạng thái nút nhấn đầu

int reading1;
lệnh khai báo biến int reading. Biến này dùng để lưu lại trạng thái nút nhấn cuối vòng LOOP

long time1 = 0;
Lệnh dùng để khai báo biên time*. Biến này dùng để lưu lại millis

long debounce = 200
biến debounce dùng để tạo thời gian chờ chống rung nút nhấn

pinMode(buttonPin1,INPUT);
Khai báo chân buttonPin1 là chân input


reading1 = digitalRead(buttonPin1);
    if(reading1 == HIGH  && previous1 == LOW && millis() - time1 > debounce) {
        if(status1=="OFF"){
          status1="ON";
        }else if(status1=="ON"){
          status1="OFF";
        }
        time1 = millis();
        Serial.println("reading1");
        Serial.println(reading1);
        buildLed1();
    }
    previous1 = reading1;

mình cắt nhỏ chương trình trong void loop để giải thích chương trình buttonPin1 và ledPin1 nhá

millis()
Có nhiệm vụ trả về một số nguyên kiểu unsigned long - là thời gian (tính theo mili giây) kể từ lúc mạch Arduino bắt đầu chương trình của bạn. Nó sẽ tràn số và quay số 0 (sau đó tiếp tục tăng) sau 50 ngày.
Ta sử dụng hàm millis() này để phục vụ cho việc chống rung nút nhấn
Lúc đầu reading1 sẽ lưu trạng thái chủa chân input buttonPin1
Ở phần cuối chương trình có lệnh previous1 = reading1 lệnh này sẽ lưu lại trạng thái reading1 vào previous1 (lúc này nút chưa nhấn previous1 sẽ là LOW)
Nếu nút được nhấn ở buttonPin1 thì lúc này bottonPin1 sẽ ở mức cao è reading1 sẽ ở mức cao (HIGH) thì lúc này lệnh if được thực hiện với 2 kết quả đúng là reading2 == LOW  previous1 == LOW như đã giả thích ở đầu bài. Millis() sẽ chạy từ lúc ESP8266 hoạt động. lúc này sẽ lớn hơn 200 rất nhiều time1 lúc này bằng 0 nên millis() – time2 sẽ Lớn Hơn debounce vậy 3 trường hợp đều đúng. Lúc này lệnh if sẽ được thực hiện.
        if(status1=="OFF"){
          status1="ON";
        }else if(status1=="ON"){
          status1="OFF";
        }
khối lệnh này được thực hiện để thay đổi trạng thái status1 khi nút dược nhấn. nếu là ON thì sẽ chuyển sang OFF, và ngược lại. từ OFF sẽ chuyển sang ON
time1 = millis()  lệnh này sẽ được chạy khi lệnh if đúng 3 điều khiện. lúc này time1 sẽ lưu lại thời gian của millis() sẽ dùng để so sánh khi void loop được chạy lại đến lệnh if và so sánh millis() – time2 > debounce thì millis() - time sẽ Lớn hợn debounce. Cho đến khi millis() chạy được thêm hơn 200ms thì lúc này lệnh millis() – time2 > debounce mới đúng.
Lệnh này giúp chống rung nút nhấn trong khoảng debounce 200ms. Nếu trong khoản thời gian này hiện tương rung nút nhấn sẩy ra sẽ k bị coi là nhấn nút 2 hoặc 3 lần mà chỉ là 1 lần.
previous1 = reading1 và đến cuối chương trình previous1 sẽ lấy trạng thái của reading 1 lưu lại. lúc này nếu nút nhấn còn giữ thì sẽ là HIGH, khi void loop duocjd lặp lại lệnh if sẽ sai 1 trường hợp previous1 == HIGH lệnh if sẽ không được thực hiện..
Tương tự như vậy với inputPin2 Và ledPin2 nhá
Kết luận.
Qua phần này chúng ta giả quết được 2 vấn đề.
1. Là thay đổi trạng thái khi nhấn nút
2. chống rung nút nhấn mà không cần phải dùng lệnh delay().
Giúp giả quết dược vấn đề vừa chống rung nút nhấn trong vòng 200ms mà chương trình vẫn hoạt động được,
đây là giả pháp sử dụng hàm millis() thay thế cho hàm delay()
Mình tách riêng phần trên để mọi người có thể dùng chuong trình đó nạp vào sử dụng cho Arduino nhá. Chi cần thay chân cho phù hợp thôi.
Và bây giờ chúng ta sẽ kết hợp bài trước Điều Khiển Bật Tắt Led Từ Web Server Qua ESP8266 và bài hôm may nhá.

Chương Trinh Điều Khiển Bật Tắt Led Từ Web Server Esp8266 Và Button


  
/*  LePan Trợ Lý Học Tập
 *  WEB Button 
 *  Tự học esp 8266
 *  https://trolyhoctap.blogspot.com/
*/
 
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);


const char* ssid="HomeSmart";       //viết têm wifi muốn truy cập
const char* password="098847474567"; // viết mật khẩu wifi đo

String webSite;
int ledPin1=4;
int ledPin2=5;
int buttonPin1=12;
int buttonPin2=14;
String status1 = "OFF";
String status2 = "OFF";
int previous1;        //trạng thái trước khi an nút
int previous2;
int reading1;        // lưu lại trạng thái nút ấn ở cuối loop
int reading2;
long time1 = 0;       // dùng để lưu millis khi nhấn nút
long time2 = 0;
long debounce = 200;    // thời gian chờ chống rung nút nhấn



//trạng thái led
void buildLed1(){
  if (status1 == "ON"){
        Serial.print("status1 la ");
        Serial.println(status1);
        digitalWrite(ledPin1, LOW);       // Led Kich ở mức thấp
  }
  else {
        Serial.print("status1 la ");
        Serial.println(status1);
        digitalWrite(ledPin1, HIGH);
  }
}

void buildLed2(){
  if (status2 == "ON"){
        Serial.print("status2 la ");
        Serial.println(status2);
        digitalWrite(ledPin2, LOW);   //led bật ở mức thấp
  }
  else {
        Serial.print("status2 la ");
        Serial.println(status2);
        digitalWrite(ledPin2, HIGH);
  }
}
//Trang Chủ
void handleWebsite(){
     Serial.print("URI :");
     Serial.print(server.uri());   
     String uriweb = server.uri();
            if (uriweb.indexOf("/4on") >= 0) {
              Serial.println("GPIO 4 on" + uriweb);
              status1 = "ON";
              buildLed1();
            }
            if (uriweb.indexOf("/4off") >= 0) {
              Serial.println("GPIO 4 off" + uriweb);
              status1 = "OFF";
              buildLed1();
            }
            if (uriweb.indexOf("/5on") >= 0) {
              Serial.println("GPIO 5 on" + uriweb);
              status2 = "ON";
              buildLed2();
            }
            if (uriweb.indexOf("/5off") >= 0) {
              Serial.println("GPIO 5 OFF" + uriweb);
              status2 = "OFF";
              buildLed2();
            }
  
  webSite = "<html lang=\"en\" class=\"\"><head>";
  webSite += "<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=no\">";
  webSite += "<title>Trợ Lý Học Tập</title>";
  webSite += "<script>";
  webSite += "</script>";
  webSite += "<style>";
  webSite += "</style>";
  webSite += "</head>";
  webSite += "<body>";
  webSite += "</div>";
  webSite += "<b>led 4 </b>";
  webSite += "<b>" + status1 + "</b>"; //Lấy Trạng Thái Của Led 4 Đưa Lên Web
  webSite += "<br>";
  webSite += "<form action='/4on'>";
  webSite += "<input type='submit' value='ON'>";
  webSite += "</form>";
  webSite += "<form action='/4off'>";
  webSite += "<input type='submit' value='OFF'>";
  webSite += "</form>";
  webSite += "<b>Led 5 </b>";
  webSite += "<b>" + status2 + "</b>";                 //Lấy Trạng Thái Của Led 4 Đưa Lên Web
  webSite += "<form action='/5on'>";
  webSite += "<input type='submit' value='ON'>";
  webSite += "</form>";
  webSite += "<form action='/5off'>";
  webSite += "<input type='submit' value='OFF'>";
  webSite += "</form>";
  webSite += "<hr>";


  webSite += "</body>";
  webSite += "</html>";
  
  server.send(200,"text/html",webSite);
}


void setup() {
  Serial.begin(9600);  
  Serial.println("LePan Trợ Lý Học Tập");
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  pinMode(buttonPin1,INPUT);
  pinMode(buttonPin2,INPUT);
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid,password);
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("kết nối thành công");
  Serial.print("đã kết nối tới ");
  Serial.println(ssid);
  Serial.print("địa chỉ IP là: ");
  Serial.println(WiFi.localIP());
  server.on("/",handleWebsite);
  server.on("/4on",handleWebsite);
  server.on("/4off",handleWebsite);
  server.on("/5on",handleWebsite);
  server.on("/5off",handleWebsite);
  
  server.begin();
}

void loop() {
    server.handleClient();
    reading1 = digitalRead(buttonPin1);
    reading2 = digitalRead(buttonPin2);
    if(reading1 == HIGH  && previous1 == LOW && millis() - time1 > debounce) {
        if(status1=="OFF"){
          status1="ON";
        }else if(status1=="ON"){
          status1="OFF";
        }
        time1 = millis();
        Serial.println("reading1");
        Serial.println(reading1);
        buildLed1();
    }
    
    if(reading2 == HIGH  && previous2 == LOW && millis() - time2 > debounce) {
        if(status2=="OFF"){
          status2="ON";
        }else if(status2=="ON"){
          status2="OFF";
        }
        time2 = millis();
        Serial.println("reading2");
        Serial.println(reading2);
        buildLed2();
    }
    previous1 = reading1;
    previous2 = reading2;
} 



như vậy là hoàn thành. Các bạn mở Ardiono IED lên coppy phần chương trình trên vào, lưu lại biên dịch rồi nạp thử cho ESP8266 nhá. Phần hưỡng dẫn nạp mình để ở bài trước nhá bạn quay lại lam theo hưỡng dẫn nạp esp8266 từArduino ide nếu bạn chưa biết nhá.
bạn mở cửa sổ serial monitor lên lấy IP và truy cập vào đỉa chỉ IP và nhấn thử led nhá

Serial monitor Button ESP8266

Trong bài này mình chúng ta đã kết hợp nút nhấn để điều khiển led kèm với điều khiển led trên web server  nhưng khi nhấn nút trạng thái ON OFF của led trên web server không được cập nhật. dẫ đế khó kiểm xoát trên led...
mình xẽ giải quyết vấn đề trên ở một bài khác trong chuỗi bài giảng hưỡng dẫn tự học esp8266
Cảm ơn bạn đã xem bài viết. chúc bạn thành công
Có thắc mắc hay sai sót gì các bạn để dưới bình luận nhá

Đăng nhận xét

0 Nhận xét