ไม่มีบอร์ด? ใช้ Wokwi จำลอง

ทำขั้นที่ 1–4 ของ Arduino ในเบราว์เซอร์ ไม่ต้องมีฮาร์ดแวร์

Author

ผศ.ดร.ศุภชัย วรพจน์พิศุทธิ์

Published

4 ตุลาคม 2569

ถ้าคุณยังไม่มีบอร์ดหรือเซนเซอร์ ใช้ Wokwi ซึ่งเป็นตัวจำลองวงจร Arduino บนเว็บ ต่อวงจร เขียนโค้ด กดรัน และดู Serial Monitor ได้ในหน้าเดียว ไม่ต้องติดตั้งอะไร และไม่ต้องใช้ Arduino Cloud Agent

Importantใช้บอร์ด Arduino Uno ใน Wokwi (ไม่ใช่ UNO R4 WiFi)

หน้า Supported Hardware ของ Wokwi ที่ผู้เขียนตรวจไม่ได้ระบุ UNO R4 ไว้ในรายการบอร์ดมาตรฐาน และการจำลอง Wi-Fi ของ Wokwi ใช้ต่อออก Internet ไม่ได้ต่อกับ gateway ในห้องเรียนของผู้สอน ได้ (ผู้เขียนไม่ได้ทดสอบฟีเจอร์เสริมที่เชื่อมเครือข่ายภายใน) ชุดโค้ดในหน้านี้จึงออกแบบสำหรับ Arduino Uno และจำลองส่วน Wi-Fi ด้วย Serial แทน

เทียบกับบอร์ดจริง

เรื่อง บอร์ดจริง (UNO R4 WiFi) Wokwi (Arduino Uno)
โค้ด devices/01_–04_ devices/wokwi/01_–04_
ADC 10 หรือ 14 บิต (analogReadResolution) 10 บิตเท่านั้น (0–1023) ไม่ต้องเรียก analogReadResolution
เซนเซอร์แสง LDR หรือ potentiometer จำลองแสง potentiometer (หมุนขวา = ค่ามาก = สว่าง)
ขั้นที่ 3 (Wi-Fi + gateway) ส่ง HTTP ไป gateway จริง Serial จำลอง gateway: พิมพ์ on / off / auto แทนหน้าแชต
ขั้นที่ 4 14 บิต, Wi-Fi, LED ที่ D5 10 บิต, ไม่มี Wi-Fi, LED ที่ D5 เหมือนกัน
หน้าแชตจริงของผู้สอน ใช้ได้ ใช้ไม่ได้ (ไม่มีทางเชื่อมจาก Wokwi)
Noteทำไมไม่ใช้เซนเซอร์แสงของ Wokwi

ชิ้นส่วน Photoresistor Sensor ของ Wokwi (ขา AO) ให้ค่าต่ำลงเมื่อสว่างขึ้น ผู้เขียนทดสอบตั้งความสว่างเป็น 500 lux ได้ค่า A0 ประมาณ 250 และตั้ง 5,000 lux ได้ประมาณ 62 ซึ่งกลับด้านกับที่โค้ดของเราสมมติ (ค่ามาก = สว่าง) ชุดนี้จึงใช้ potentiometer ถ้าอยากใช้เซนเซอร์แสงของ Wokwi ให้เติม raw = 1023 - raw; หลังบรรทัด analogRead

เริ่มใช้งาน (3 นาที)

  1. เปิด https://wokwi.com/projects/new/arduino-uno (โปรเจกต์ Arduino Uno ใหม่)
  2. คลิกแท็บ diagram.json แล้วเลือกข้อความทั้งหมด (Ctrl+A) และวางไฟล์ diagram.json ของขั้นที่ต้องการ (ดูด้านล่าง) ในหน้าจำลองจะเห็นบอร์ด Uno ต่อกับ potentiometer (และ LED ในขั้นที่ 4)
  3. คลิกแท็บ sketch.ino แล้วลบโค้ดเดิม วางโค้ดของขั้นนั้น
  4. กดปุ่มสีเขียว Start the simulation แล้วดู Serial Monitor ที่ด้านล่างของหน้าจำลอง
  5. คลิกที่ potentiometer แล้วลากลูกบิดเพื่อเปลี่ยน “ความสว่าง” ดูตัวเลขใน Serial Monitor เปลี่ยน

โค้ดและ diagram ของแต่ละขั้นอยู่ในโฟลเดอร์ devices/wokwi/ ใน repo (เปิดไฟล์แล้วกด Copy raw file)

Tip

การบันทึกโปรเจกต์ใน Wokwi ต้องล็อกอิน แต่รันและแก้โค้ดได้โดยไม่ต้องล็อกอิน ถ้าไม่บันทึก งานจะหายเมื่อปิดหน้าเว็บ ให้เก็บโค้ดของคุณไว้ในไฟล์ของเครื่องด้วย

วงจร: ขั้นที่ 1–3

ใช้ชิ้นส่วนสองอย่างคือ Arduino Uno และ Potentiometer

potentiometer ต่อกับบอร์ด Uno
VCC 5V
GND GND
SIG A0
devices/wokwi/01_read_light/diagram.json
{
  "version": 1,
  "author": "aiot-for-beginners",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-arduino-uno",
      "id": "uno",
      "top": 0,
      "left": 0,
      "attrs": {}
    },
    {
      "type": "wokwi-potentiometer",
      "id": "pot1",
      "top": -120,
      "left": 20,
      "attrs": {}
    }
  ],
  "connections": [
    [
      "pot1:VCC",
      "uno:5V",
      "red",
      [
        "v0"
      ]
    ],
    [
      "pot1:GND",
      "uno:GND.2",
      "black",
      [
        "v0"
      ]
    ],
    [
      "pot1:SIG",
      "uno:A0",
      "green",
      [
        "v0"
      ]
    ]
  ],
  "dependencies": {}
}

ถ้าวางไม่ได้หรืออยากต่อเอง: คลิกปุ่ม + ในหน้าจำลองเพื่อเพิ่มชิ้นส่วน (Potentiometer) แล้วลากสายจากขาของชิ้นส่วนไปยังขาของบอร์ด

วงจร: ขั้นที่ 4

เพิ่ม LED และ Resistor 220 Ω: ขา D5 → ตัวต้านทาน → ขา A (anode) ของ LED → ขา C (cathode) ของ LED → GND

devices/wokwi/04_smart_lamp_tuned/diagram.json
{
  "version": 1,
  "author": "aiot-for-beginners",
  "editor": "wokwi",
  "parts": [
    {
      "type": "wokwi-arduino-uno",
      "id": "uno",
      "top": 0,
      "left": 0,
      "attrs": {}
    },
    {
      "type": "wokwi-potentiometer",
      "id": "pot1",
      "top": -120,
      "left": 20,
      "attrs": {}
    },
    {
      "type": "wokwi-led",
      "id": "led1",
      "top": -140,
      "left": 230,
      "attrs": {
        "color": "yellow"
      }
    },
    {
      "type": "wokwi-resistor",
      "id": "r1",
      "top": -70,
      "left": 200,
      "rotate": 90,
      "attrs": {
        "value": "220"
      }
    }
  ],
  "connections": [
    [
      "pot1:VCC",
      "uno:5V",
      "red",
      [
        "v0"
      ]
    ],
    [
      "pot1:GND",
      "uno:GND.2",
      "black",
      [
        "v0"
      ]
    ],
    [
      "pot1:SIG",
      "uno:A0",
      "green",
      [
        "v0"
      ]
    ],
    [
      "uno:5",
      "r1:1",
      "orange",
      [
        "v0"
      ]
    ],
    [
      "r1:2",
      "led1:A",
      "orange",
      [
        "v0"
      ]
    ],
    [
      "led1:C",
      "uno:GND.1",
      "black",
      [
        "v0"
      ]
    ]
  ],
  "dependencies": {}
}

ขั้นที่ 1–2: อ่านค่าและไฟกลางคืน

ทำเหมือนที่หน้าสร้างโคมไฟ โดยใช้โค้ดจาก devices/wokwi/01_read_light/sketch.ino และ 02_local_nightlight/sketch.ino ซึ่งต่างจากของบอร์ดจริงแค่ไม่เรียก analogReadResolution(10) ในขั้นที่ 2 ให้สังเกต LED สีแดงเล็กที่บอร์ดมีตัวอักษร L (ขา 13): ติดเมื่อหมุนไปทางมืด (ค่าต่ำกว่า 358)

ขั้นที่ 3: จำลอง gateway ด้วย Serial

Wokwi เชื่อม gateway จริงไม่ได้ สเก็ตช์ devices/wokwi/03_smart_lamp_serial/sketch.ino จึงทำหน้าที่ของ gateway ในตัวเอง และพิมพ์ข้อมูลที่บอร์ดจริงจะส่ง (->) กับคำตอบที่ได้รับ (<-) ทุก 3 วินาที (หมายเหตุ: ตัวจำลองบางเครื่องเดินช้ากว่าเวลาจริง ดูตัวเลขความเร็วมุมขวาบนของหน้าจำลอง รอบแรกอาจใช้เวลานาน)

Smart lamp (Wokwi). Type: on / off / auto / ?
-> {"schema_version":1,"device_id":"desk-01","seq":0,"light_raw":310}
<- {"schema_version":1,"device_id":"desk-01","seq":0,"action":"LED_ON","mode":"auto","light_pct":30}

สองบรรทัดนี้คือ JSON ชุดเดียวกับที่บอร์ดจริงกับ gateway ส่งหากัน (ดูอธิบายในหน้าสร้างโคมไฟ) พิมพ์คำสั่งในช่องด้านล่าง Serial Monitor แล้วกด Enter เหมือนพิมพ์ในหน้าแชต

พิมพ์ ผล
on เปิดไฟตลอด ("mode":"on")
off ปิดไฟตลอด
auto กลับไปตามความสว่าง
? ดูโหมดปัจจุบัน

ทดลอง

  1. หมุน potentiometer ข้ามจุดมืด/สว่าง ตัวเลข light_pct กับ action เปลี่ยนที่เท่าไร
  2. พิมพ์ on แล้วหมุนไปทางสว่าง ไฟยังติดอยู่หรือไม่ เปลี่ยน mode เป็นอะไร
  3. หา decide() ในโค้ด เทียบกับกฎในปรับแก้โค้ด แล้วเปลี่ยน ON_BELOW = 30 และ OFF_ABOVE = 40 ลองหมุนให้ค่าอยู่ช่วง 30–40% ไฟคงสถานะเดิมหรือไม่ (hysteresis)
  4. เพิ่มคำสั่ง dim ที่ให้ไฟติดเมื่อต่ำกว่า 15% เท่านั้น ต้องแก้ตรงไหนบ้าง

ขั้นที่ 4: ฉบับปรับแก้

ใช้ devices/wokwi/04_smart_lamp_tuned/sketch.ino กับวงจรที่มี LED ที่ D5 รันแล้วจะเห็น LED ค่อย ๆ สว่างและหรี่ (PWM fade) และ Serial Monitor พิมพ์ค่าเฉลี่ย เปอร์เซ็นต์ และสถานะทุก 1 วินาที

avg=512 (50%) lamp=OFF pwm=0

ทดลองเหมือนในหน้าปรับแก้โค้ด: เปลี่ยน WINDOW (16 → 64 → 4), FADE_STEP (5 → 1), ช่วง hysteresis และ SENSOR_DARK/SENSOR_BRIGHT แล้วสังเกตผล ในหน้าจำลองให้ลองหมุน potentiometer เร็ว ๆ เพื่อเทียบ smoothing กับค่าดิบ

แก้ปัญหาที่พบบ่อยใน Wokwi

อาการ สาเหตุที่พบบ่อย วิธีแก้
กด Start แล้วไม่เห็นอะไรใน Serial Monitor ยังคอมไพล์ไม่เสร็จ หรือไม่ได้ Serial.begin(115200) รอสักครู่ ดูแถบ error ที่ด้านล่างของ editor
สายไม่ขึ้นในหน้าจำลองหลังวาง diagram.json JSON ผิดรูปแบบ (วางไม่ครบ หรือวางทับแท็บ sketch.ino) เลือกทั้งหมดในแท็บ diagram.json แล้ววางใหม่
ค่า light ไม่เปลี่ยนเมื่อหมุน ยังไม่ได้คลิกที่ potentiometer เพื่อลากลูกบิด หรือสาย SIG ไม่ได้ต่อ A0 คลิกที่ลูกบิดแล้วลาก ตรวจสาย SIG ถึง A0
ค่าอยู่ที่ 0 หรือ 1023 ตลอด สาย VCC หรือ GND ต่อกลับกัน ตรวจว่า VCC ไป 5V และ GND ไป GND
ขั้นที่ 4: LED ไม่ติด ต่อ LED กลับขั้ว หรือไม่ได้ต่อตัวต้านทาน ขา A (anode) ต่อฝั่งตัวต้านทาน ขา C ต่อ GND
พิมพ์คำสั่งใน Serial Monitor แล้วไม่ตอบ ไม่ได้กด Enter หรือพิมพ์ไม่ตรงคำสั่ง พิมพ์ on, off, auto หรือ ? ตัวพิมพ์เล็ก แล้วกด Enter
จำลองช้ามาก เครื่องช้า หรือเปิดแท็บ/โปรแกรมหนักอยู่ ปิดแท็บอื่น ดูเลข % ความเร็วที่มุมขวาบนของหน้าจำลอง
รันแล้วขึ้น error เรื่อง analogReadResolution วางโค้ดของบอร์ดจริงลงใน Wokwi (Uno ไม่มีฟังก์ชันนี้) ใช้โค้ดในโฟลเดอร์ devices/wokwi/
ใช้ WiFiS3.h ไม่ได้ Wokwi (Uno) ไม่มี Wi-Fi ใช้ขั้นที่ 3 แบบ Serial จำลอง gateway

เมื่อได้บอร์ดจริง

นำโค้ดจากโฟลเดอร์ devices/01_–04_ ไปอัปโหลดตามหน้าเตรียมเครื่องมือ และสร้างโคมไฟ ความรู้ที่ได้จากการจำลองใช้ต่อได้ทั้งหมด สิ่งที่เพิ่มคือ Wi-Fi และการสั่งผ่านหน้าแชตจริง