5.1 MQTT LED ON-OFF CiRA

จุดประสงค์การเรียนรู้

- สามารถรับส่งข้อมูลจากESP32โดยใช้โปรโตคอลMQTT จากPlatform CiRA COREสำหรับการเปิดปิดหลอดLED


วัสดุอุปกรณ์

1. หลอด LED 3 จำนวน 3 หลอด

2. ตัวต้านทาน 220 โอห์ม จำนวน 3 ตัว

3. บอร์ด ESP32 Devkit V.1

4. สายMicro USB

5. Breadboard

6. สายแพร Male-Male

7.OLED I2C

8.ตัวต้านทานปรับค่าได้ 10 กิโลโอห์ม

9. ไมโครสวิตซ์แบบกดติดปล่อยดับ

10. ตัวต้านทาน 10 กิโลโอห์ม


วิธีทำการทดลอง

1. ต่อวงจรหลอดLEDกับบอร์ดESP32 ดังนี้

LED หลอดที่ 1 ต่อกับพอร์ต D5 (GPIO5)

LED หลอดที่ 2 ต่อกับพอร์ต D19 (GPIO19)

LED หลอดที่ 3 ต่อกับพอร์ต D23 (GPIO23)

2. ทำการหาIP Address ของเครื่องเรา ถ้าในUbuntu สามารถพิมพ์คำสั่งในTerminalด้วยคำว่า : ifconfig

หลังจากนั้นในTerminalก็จะบอกIP Address ของเครื่องเราดังรูปข้างล่าง

3. ทำการเปิดPlatform CiRA CORE โดยทำการลากกล่องต่างๆดังต่อไปนี้

การทำงานของแต่ละกล่อง

หน้าที่

โปรแกรมจะเริ่มทำงานเมื่อกดปุ่มButton Run

Java Script /การตั้งค่าในเฟือง

var a = 0

payload = {}

payload.a = "AON" // เปิดไฟหลอดLED-A


//payload.a = "AOFF" // ปิดไฟหลอดLED-A

หน้าที่

เปิดปิดไฟในบอร์ดESP32 ทั้ง3 หลอดโดยใช้งานคำสั่งในpayload.a = 1.AON เปิดไฟหลอดLED-A 2.AOFF ปิดไฟหลอดLED-A 3.BON เปิดไฟหลอดLED-B 4.BOFF ปิดไฟหลอดLED-B 5.CON เปิดไฟหลอดLED-C 6.COFF ปิดไฟหลอดLED-C

หน้าที่

ทำการส่งข้อมูลในpayload.aไปที่บอร์ดESP32 โดยใช้โปรโตคอล MQTT ชนิด Publish

Java Script /การตั้งค่าในเฟือง

4.ทำการนำ code Arduino IDE ดังช่องข้างล่าง แล้วทำการแก้ไขเพื่อให้ใช้งานได้ในเครือข่ายwifi และตัั้งค่าmqtt ก่อนการUpload

(ดังรูปข้างล่าง)หลังจากนั้นตั้งค่าเสร็จแล้วค่อยUpload codeไปที่บอร์ดESP32

Arduino IDE CODE

//////// ผนวกไลบรารี่ ////////////

#include <Arduino.h>

#include<ArduinoJson.h>

#include <WiFi.h>

#include <PubSubClient.h>

#include <ESP32Servo.h>

#include <Wire.h>

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>


Adafruit_SSD1306 OLED(-1);


// Update these with values suitable for your network.

const char* ssid = "BJHome2G";

const char* password = "123456789";


// Config MQTT Server

#define mqtt_server "192.168.1.15"

#define mqtt_port 1883

#define mqtt_user "user"

#define mqtt_password "123456"





WiFiClient espClient;

PubSubClient client(espClient);

//////////Sound buzzer์///////////

int snd = 18;

//////// set io ///////////////////

int button = 27; ///button

int k_nob = 35 ; // K-nob

#define LED_PIN_A 5

#define LED_PIN_B 19

#define LED_PIN_C 23

int ss1 = 32; // servo ch1

int ss2 = 33; // servo ch2

int ss3 = 34; // servo ch3

Servo sv1;

Servo sv2;

Servo sv3;

///////////////////////////////////////////

////////// variable motor port/////////////

#define DR1 16

#define DR2 17

#define PWMR 4

/////////////////////////////////

#define DL1 2

#define DL2 15

#define PWML 13

/////////////////////////////////

void setup() {

OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // address i2c 0x3C (for the 128x64)

pinMode(button , INPUT);

//////// Motor OUTPUT /////////

pinMode(DL1, OUTPUT);

pinMode(DL2, OUTPUT);

pinMode(PWML, OUTPUT);

pinMode(DR1, OUTPUT);

pinMode(DR2, OUTPUT);

pinMode(PWMR, OUTPUT);

////// Servo set ////////////

sv1.attach(ss1);

sv2.attach(ss2);

sv3.attach(ss3);

sv_set();

tone(snd, 800, 100); tone(snd, 1000, 100); tone(snd, 800, 100);


}

void run(int spl, int spr) // ประกาศฟังก์ชัน run(กำลังมอเตอร์ซ้าาย,กำลังมอเตอร์ขวา);

{

if (spl > 0)

{

digitalWrite(DL1, LOW);

digitalWrite(DL2, HIGH);

analogWrite(PWML, spl);

}

else if (spl < 0)

{

digitalWrite(DL1, HIGH);

digitalWrite(DL2, LOW);

analogWrite(PWML, -spl);

}

else

{

digitalWrite(DL1, HIGH);

digitalWrite(DL2, HIGH);


}

//////////////////////////////////////

if (spr > 0)

{

digitalWrite(DR1, LOW);

digitalWrite(DR2, HIGH);

analogWrite(PWMR, spr);

}

else if (spr < 0)

{

digitalWrite(DR1, HIGH);

digitalWrite(DR2, LOW);

analogWrite(PWMR, -spr);

}

else

{

digitalWrite(DR1, HIGH);

digitalWrite(DR2, HIGH);


}

}


void loop() {

int sw = digitalRead(button); // set sw = button

int nob = analogRead(k_nob); // variable nob = k_nob

int menu = map(nob, 0, 4095, 0, 12); // mab nob 0-4095 to 0-12

OLED.clearDisplay(); //clear oled

OLED.setTextColor(WHITE, BLACK); //set color

OLED.setCursor(0, 0); // set cursor position

OLED.setTextSize(2); // set text size 2 point

OLED.print(" "); // space text

OLED.println(menu); // display menu 0 to 12

OLED.setTextSize(1); // set text size 1 point

OLED.println(" LOTUS ARDUIBOT"); // display LOTUS ARDUIBOT

OLED.print(" "); // space text

OLED.print(nob); // display nob

OLED.println(" TEST"); // display TEST

OLED.setTextSize(2); // set text size 2 point

///////////////////////////////////////////////////////////////

if ((menu == 0))

{

}

if ((menu == 1))

{ OLED.println(" SERVO123");


}

if ((menu == 2))

{ OLED.println(" MOTOR");


}

if ((menu == 3))

{

OLED.println(" SOUND");

}

if ((menu == 4))

{

OLED.println(" MQTT");

}

if ((menu == 5))

{

}

if ((sw == 0) and (menu == 6))

{


}

if ((sw == 0) and (menu == 7))

{


}

if ((sw == 0) and (menu == 8))

{


}

if ((sw == 0) and (menu == 9))

{


}

if ((sw == 0) and (menu == 10))

{


}

if ((sw == 0) and (menu == 11))

{


}

if ((sw == 0) and (menu == 12))

{


}

//////////////////////////////////////////////////////////////


OLED.display();

if ((sw == 0) and (menu == 0))

{ tone(snd, 800, 100);

}

if ((sw == 0) and (menu == 1))

{

tone(snd, 800, 100); menu1();

}

if ((sw == 0) and (menu == 2))

{

tone(snd, 800, 100); menu2();

}

if ((sw == 0) and (menu == 3))

{

tone(snd, 800, 100); menu3();

}

if ((sw == 0) and (menu == 4))

{

tone(snd, 800, 100); menu4();

}

if ((sw == 0) and (menu == 5))

{

tone(snd, 800, 100); menu5();

}

if ((sw == 0) and (menu == 6))

{

tone(snd, 800, 100); menu6();

}

if ((sw == 0) and (menu == 7))

{

tone(snd, 800, 100); menu7();

}

if ((sw == 0) and (menu == 8))

{

tone(snd, 800, 100); menu8();

}

if ((sw == 0) and (menu == 9))

{

tone(snd, 800, 100); menu9();

}

if ((sw == 0) and (menu == 10))

{

tone(snd, 800, 100); menu10();

}

if ((sw == 0) and (menu == 11))

{

tone(snd, 800, 100); menu11();

}

if ((sw == 0) and (menu == 12))

{

tone(snd, 800, 100); menu12();

}

delay(100);

}



void motor()

{ //-------------- forward-------------- //

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(2);

OLED.println(" ML MR");

OLED.println(" F F");

OLED.setTextSize(1);

OLED.println(" -------------------");

OLED.setTextSize(2);

OLED.println(" FORWARD");

OLED.display();

run(100, 100); delay(1000); tone(3, 1000, 500);


//-------------- back ward-------------- //

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(2);

OLED.println(" ML MR");

OLED.println(" B B");

OLED.setTextSize(1);

OLED.println(" -------------------");

OLED.setTextSize(2);

OLED.println(" BACK");

OLED.display();

run(-100, -100); delay(2000); tone(3, 1000, 500);


//------------------ trun left-----------------------------//

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(2);

OLED.println(" ML MR");

OLED.println(" B F");

OLED.setTextSize(1);

OLED.println(" -------------------");

OLED.setTextSize(2);

OLED.println(" LEFT");

OLED.display();

run(-100, 100); delay(2000); tone(3, 1000, 500);


//------------------turn right-----------------------------//

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(2);

OLED.println(" ML MR");

OLED.println(" F B");

OLED.setTextSize(1);

OLED.println(" -------------------");

OLED.setTextSize(2);

OLED.println(" RIGHT");

OLED.display();

run(100, -100); delay(2000); tone(3, 1000, 500);


//------------------- stop motor----------------------------//

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(2);

OLED.println(" ML MR");

OLED.println(" 0 0");

OLED.setTextSize(1);

OLED.println(" -------------------");

OLED.setTextSize(2);

OLED.println(" STOP");

OLED.display();

run(0, 0); delay(2000); tone(3, 1000, 500);

}


void sv_knob() {

while (true) {

int vr = analogRead(A7);

int nob = map(vr, 0, 4095, 0, 180);

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(2);

OLED.print("SV1 = ");

OLED.println(nob);

OLED.print("SV2 = ");

OLED.println(nob);

OLED.print("SV3 = ");

OLED.println(nob);

OLED.display();

sv1.write(nob);

sv2.write(nob);

sv3.write(nob);

delay(50);

}

}

/////////////////////////////////////////////////////

void sv_set(){ sv1.write(40);}

////////////////////////////////////////////////////

void sound() {

tone(snd, 660, 100);

delay(150);

tone(snd, 660, 100);

delay(300);

tone(snd, 660, 100);

delay(300);

tone(snd, 510, 100);

delay(100);

tone(snd, 660, 100);

delay(300);

tone(snd, 770, 100);

delay(550);

tone(snd, 380, 100);

delay(575);


tone(snd, 510, 100);

delay(450);

tone(snd, 380, 100);

delay(400);

tone(snd, 320, 100);

delay(500);

tone(snd, 440, 100);

delay(300);

tone(snd, 480, 80);

delay(330);

tone(snd, 450, 100);

delay(150);

tone(snd, 430, 100);

delay(300);

tone(snd, 380, 100);

delay(200);

tone(snd, 660, 80);

delay(200);

tone(snd, 760, 50);

delay(150);

tone(snd, 860, 100);

delay(300);

tone(snd, 700, 80);

delay(150);

tone(snd, 760, 50);

delay(350);

tone(snd, 660, 80);

delay(300);

tone(snd, 520, 80);

delay(150);

tone(snd, 580, 80);

delay(150);

tone(snd, 480, 80);

delay(500);


tone(snd, 510, 100);

delay(450);

tone(snd, 380, 100);

delay(400);

tone(snd, 320, 100);

delay(500);

tone(snd, 440, 100);

delay(300);

tone(snd, 480, 80);

delay(330);

tone(snd, 450, 100);

delay(150);

tone(snd, 430, 100);

delay(300);

tone(snd, 380, 100);

delay(200);

tone(snd, 660, 80);

delay(200);

tone(snd, 760, 50);

delay(150);

tone(snd, 860, 100);

delay(300);

tone(snd, 700, 80);

delay(150);

tone(snd, 760, 50);

delay(350);

tone(snd, 660, 80);

delay(300);

tone(snd, 520, 80);

delay(150);

tone(snd, 580, 80);

delay(150);

tone(snd, 480, 80);

delay(500);


tone(snd, 500, 100);

delay(300);


tone(snd, 760, 100);

delay(100);

tone(snd, 720, 100);

delay(150);

tone(snd, 680, 100);

delay(150);

tone(snd, 620, 150);

delay(300);


tone(snd, 650, 150);

delay(300);

tone(snd, 380, 100);

delay(150);

tone(snd, 430, 100);

delay(150);


tone(snd, 500, 100);

delay(300);

tone(snd, 430, 100);

delay(150);

tone(snd, 500, 100);

delay(100);

tone(snd, 570, 100);

delay(220);


tone(snd, 500, 100);

delay(300);


tone(snd, 760, 100);

delay(100);

tone(snd, 720, 100);

delay(150);

tone(snd, 680, 100);

delay(150);

tone(snd, 620, 150);

delay(300);


tone(snd, 650, 200);

delay(300);


tone(snd, 1020, 80);

delay(300);

tone(snd, 1020, 80);

delay(150);

tone(snd, 1020, 80);

delay(300);


tone(snd, 380, 100);

delay(300);

tone(snd, 500, 100);

delay(300);


tone(snd, 760, 100);

delay(100);

tone(snd, 720, 100);

delay(150);

tone(snd, 680, 100);

delay(150);

tone(snd, 620, 150);

delay(300);


tone(snd, 650, 150);

delay(300);

tone(snd, 380, 100);

delay(150);

tone(snd, 430, 100);

delay(150);


tone(snd, 500, 100);

delay(300);

tone(snd, 430, 100);

delay(150);

tone(snd, 500, 100);

delay(100);

tone(snd, 570, 100);

delay(420);


tone(snd, 585, 100);

delay(450);


tone(snd, 550, 100);

delay(420);


tone(snd, 500, 100);

delay(360);


tone(snd, 380, 100);

delay(300);

tone(snd, 500, 100);

delay(300);

tone(snd, 500, 100);

delay(150);

tone(snd, 500, 100);

delay(300);


tone(snd, 500, 100);

delay(300);


tone(snd, 760, 100);

delay(100);

tone(snd, 720, 100);

delay(150);

tone(snd, 680, 100);

delay(150);

tone(snd, 620, 150);

delay(300);


tone(snd, 650, 150);

delay(300);

tone(snd, 380, 100);

delay(150);

tone(snd, 430, 100);

delay(150);


tone(snd, 500, 100);

delay(300);

tone(snd, 430, 100);

delay(150);

tone(snd, 500, 100);

delay(100);

tone(snd, 570, 100);

delay(220);


tone(snd, 500, 100);

delay(300);


tone(snd, 760, 100);

delay(100);

tone(snd, 720, 100);

delay(150);

tone(snd, 680, 100);

delay(150);

tone(snd, 620, 150);

delay(300);


tone(snd, 650, 200);

delay(300);


tone(snd, 1020, 80);

delay(300);

tone(snd, 1020, 80);

delay(150);

tone(snd, 1020, 80);

delay(300);


tone(snd, 380, 100);

delay(300);

tone(snd, 500, 100);

delay(300);


tone(snd, 760, 100);

delay(100);

tone(snd, 720, 100);

delay(150);

tone(snd, 680, 100);

delay(150);

tone(snd, 620, 150);

delay(300);


tone(snd, 650, 150);

delay(300);

tone(snd, 380, 100);

delay(150);

tone(snd, 430, 100);

delay(150);


tone(snd, 500, 100);

delay(300);

tone(snd, 430, 100);

delay(150);

tone(snd, 500, 100);

delay(100);

tone(snd, 570, 100);

delay(420);


tone(snd, 585, 100);

delay(450);


tone(snd, 550, 100);

delay(420);


tone(9, 500, 100);

delay(360);


tone(snd, 380, 100);

delay(300);

tone(snd, 500, 100);

delay(300);

tone(snd, 500, 100);

delay(150);

tone(snd, 500, 100);

delay(300);


tone(snd, 500, 60);

delay(150);

tone(snd, 500, 80);

delay(300);

tone(snd, 500, 60);

delay(350);

tone(snd, 500, 80);

delay(150);

tone(snd, 580, 80);

delay(350);

tone(snd, 660, 80);

delay(150);

tone(snd, 500, 80);

delay(300);

tone(snd, 430, 80);

delay(150);

tone(snd, 380, 80);

delay(600);


tone(snd, 500, 60);

delay(150);

tone(snd, 500, 80);

delay(300);

tone(snd, 500, 60);

delay(350);

tone(snd, 500, 80);

delay(150);

tone(snd, 580, 80);

delay(150);

tone(snd, 660, 80);

delay(550);


tone(snd, 870, 80);

delay(325);

tone(snd, 760, 80);

delay(600);


tone(snd, 500, 60);

delay(150);

tone(snd, 500, 80);

delay(300);

tone(snd, 500, 60);

delay(350);

tone(snd, 500, 80);

delay(150);

tone(snd, 580, 80);

delay(350);

tone(snd, 660, 80);

delay(150);

tone(snd, 500, 80);

delay(300);

tone(snd, 430, 80);

delay(150);

tone(snd, 380, 80);

delay(600);


tone(snd, 660, 100);

delay(150);

tone(snd, 660, 100);

delay(300);

tone(snd, 660, 100);

delay(300);

tone(snd, 510, 100);

delay(100);

tone(snd, 660, 100);

delay(300);

tone(snd, 770, 100);

delay(550);

tone(snd, 380, 100);

delay(575);

}

void mqtt_set(){

tone(snd, 800, 100); tone(snd, 900, 100); tone(snd, 800, 100);tone(snd, 900, 100);delay(50);tone(snd, 1000, 1000);

OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C); // กำหนดแอดเดรสของพอร์ตจอเป็น 0x3C (for the 128x64)

pinMode(LED_PIN_A, OUTPUT);

pinMode(LED_PIN_B, OUTPUT);

pinMode(LED_PIN_C, OUTPUT);

Serial.begin(115200);

delay(10);

Serial.println();

Serial.print("Connecting to ");

Serial.println(ssid);

WiFi.begin(ssid, password);

digitalWrite(LED_PIN_A,HIGH);

digitalWrite(LED_PIN_B, HIGH);

digitalWrite(LED_PIN_C, HIGH);

delay(2000);

digitalWrite(LED_PIN_A, LOW);

digitalWrite(LED_PIN_B, LOW);

digitalWrite(LED_PIN_C, LOW);

OLED.clearDisplay();

OLED.setCursor(0, 0);

OLED.setTextColor(WHITE, BLACK);

OLED.setTextSize(2);

OLED.println(" WiFi");

OLED.println("Conecting");

OLED.display();


while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(".");

}

Serial.println("");

Serial.println("WiFi connected");

Serial.println("IP address: ");

Serial.println(WiFi.localIP());

client.setServer(mqtt_server, mqtt_port);

client.setCallback(callback);

tone(snd, 1000, 100); delay(150); tone(snd, 1000, 100); delay(150); tone(snd, 1000, 100);

OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(1);

OLED.println("WiFi connected");

OLED.print("IP : "); OLED.println( WiFi.localIP());

OLED.print("*******************");

OLED.display();

}

void mqtt_loop() {while(true){

if (!client.connected()) {

Serial.print("Attempting MQTT connection...");

if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {

Serial.println("connected");

client.subscribe("ESP32"); // ESP32 Topic

} else {

Serial.print("failed, rc=");

Serial.print(client.state());

Serial.println(" try again in 5 seconds");

delay(5000);

return;

}

}

client.loop();

}}

void callback(char* topic, byte* payload, unsigned int length) {

Serial.print("Message arrived [");

Serial.print(topic);

Serial.print("] ");

String msg = "";

int i = 0;

while (i < length) msg += (char)payload[i++];

if (msg == "GET") {

client.publish("ESP32", (digitalRead(LED_PIN_A) ? "LEDON" : "LEDOFF"));

Serial.println("Send !");

return;

}

// CiRA CORE Mqtt //


const size_t capacity = JSON_OBJECT_SIZE(1); //? Object Size

DynamicJsonDocument doc(capacity); //? Declare variable for store json

deserializeJson(doc, payload, length); //? deserialize JSON

String msg_cira = doc["a"]; //? Store key title to tittle

////////////////////// command mqtt control LED A -C /////////////////////////////////

if((msg=="AON") or (msg_cira =="AON")) {digitalWrite(LED_PIN_A,HIGH);}

if((msg=="AOFF") or (msg_cira =="AOFF")){digitalWrite(LED_PIN_A,LOW);}

if((msg=="BON") or (msg_cira =="BON")){digitalWrite(LED_PIN_B,HIGH);}

if((msg=="BOFF") or (msg_cira =="BOFF")){digitalWrite(LED_PIN_B,LOW);}

if((msg=="CON") or (msg_cira =="CON")){digitalWrite(LED_PIN_C,HIGH);}

if((msg=="COFF") or (msg_cira =="COFF")){digitalWrite(LED_PIN_C,LOW);}




// digitalWrite(LED_PIN_A, (msg_cira == "LEDON" ? HIGH : LOW));



////////// Display OLED and Serial ////////////////

Serial.print("msg = "); Serial.println(msg);

Serial.print("msg_cira = "); Serial.println( msg_cira);



OLED.clearDisplay();

OLED.setTextColor(WHITE, BLACK);

OLED.setCursor(0, 0);

OLED.setTextSize(1);

OLED.println("WiFi connected");

OLED.print("IP : "); OLED.println( WiFi.localIP());

OLED.print("Topic : "); OLED.println( topic);

OLED.println("-------------------");

OLED.print("msg : "); OLED.println(msg);

OLED.println("-------------------");

OLED.print("msg_cira: "); OLED.println(msg_cira);

OLED.println("-------------------");

OLED.display();

}

//////////////write and use code menu ////////////

void menu1() /// write and use code menu 1

{

sv_knob(); // servo test

}

void menu2() /// write and use code menu

{ motor(); // dc motor test


}

void menu3() /// write and use code menu 3

{ sound(); // sound test

}

void menu4() /// write and use code menu 4

{mqtt_set();mqtt_loop();

}

void menu5() /// write and use code menu 5

{

}

void menu6() /// write and use code menu 6

{

}

void menu7() /// write and use code menu 7

{

}

void menu8() /// write and use code menu 8

{

}

void menu9() /// write and use code menu 9

{

}

void menu10() /// write and use code menu 10

{

}

void menu11() /// write and use code menu 11

{

}

void menu12() /// write and use code menu 12

{


}

5.หลังจากการUpload code Arduino IDE เสร็จสิ้น ให้ทำการหมุนตัวต้านทานปรับค่าได้ไปที่เมนูที่4 MQTT หลังจากนั้นให้ทำการกดที่ไมโครสวิตซ์ ESP32 ก็จะทำการเชื่อมต่อกับwifiที่ได้configไว้ หลังจากนั้นให้ทำการทดสอบในPlatform CiRA CORE โดยใช้คำสั่งต่อไปนี้แล้วกดปุ่มRun

รูป/คำสั่งในJava Script

การทำงานของหลอดLEDในESP32หลังกดปุ่มRun

หลอดLED-A ติด

หลอดLED-B ติด

หลอดLED-C ติด

หลอดLED-A ดับ

หลอดLED-B ดับ

หลอดLED-C ดับ

Download Flow data code สำหรับควบคุม

ภาพFlow data code