กลับหน้าหลัก
views
10 โปรเจค Arduino มือใหม่ ที่ทำแล้วเข้าใจ Input/Output จริง ๆ
Last updated on

10 โปรเจค Arduino มือใหม่ ที่ทำแล้วเข้าใจ Input/Output จริง ๆ


เตรียมของให้พร้อม!

โปรเจคนี้ต้องใช้: Ds18b20 ชุดโมดูลเซนเซอร์วัดอุณหภูมิดิจิทัล สเตนเลส กันน้ํา 100 ซม. สําหรับ Arduino

🛒 สั่งซื้อที่ Shopee

ทำไมต้องเริ่มจาก Input/Output พื้นฐาน

ถ้าถามว่าทำไมต้องเริ่มจาก input output ก่อน คำตอบง่าย ๆ คือ ทุกโปรเจคที่ทำไปต่อยอด ต้องใช้สองอย่างนี้เป็นปฐมภูมิ ตั้งแต่ไฟกระพริบง่าย ๆ ไปจนถึงระบบควบคุมอุณหภูมิที่ซับซ้อน ถ้าเข้าใจว่า digitalWrite, digitalRead, analogRead, analogWrite ทำงานยังไงในเชิงลึก ไม่ใช่แค่ก็อปปี้โค้ดแล้วกดอัพโหลด จะทำให้ debug ปัญหาได้เร็วขึ้นมาก

[image: ภาพแสดง Arduino UNO พร้อม breadboard ต่อ LED และปุ่มกดพื้นฐาน]

ตัวอย่างจริงที่เจอบ่อยคือ คนที่ข้ามพื้นฐานไปต่อเซนเซอร์ RS485 เลย แล้วมานั่งงมว่าทำไมอ่านค่าไม่ได้ ทั้งที่ปัญหาจริง ๆ คือไม่เข้าใจเรื่อง serial communication พื้นฐาน

โปรเจคที่ 1: LED กระพริบด้วย digitalWrite

โปรเจคแรกที่ทุกคนต้องผ่านคือ LED กระพริบ แต่สิ่งที่หลายคนมองข้ามคือการเลือกใช้ pin ที่เหมาะสม แนะนำใช้ pin 8-12 ซึ่งเป็น digital pin ธรรมดาไม่ใช่ pin พิเศษ เพราะจะได้เข้าใจว่า digitalWrite ทำงานยังไง

const int LED_PIN = 8;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

ข้อควรระวัง: ต่อ resistor 220-330 ohm อนุกรมกับ LED ก่อนเสมอ ถ้าไม่ต่อ LED จะไหม้ภายใน 2-3 วินาที ถ้าไม่มี resistor ลองใช้ LED ขนาดใหญ่เกินไป กระแสที่ไหลผ่านจะเกิน 40mA ซึ่งเป็นค่าสูงสุดที่ Arduino pin รับได้

โปรเจคที่ 2: ปุ่มกดควบคุม LED ด้วย digitalRead

ต่อจากโปรเจคแรก เมื่อเข้าใจ output แล้ว มาลอง input กันบ้าง ปุ่มกดต้องต่อแบบ pull-down resistor หรือใช้ pull-up resistor ภายในของ Arduino ก็ได้ แต่ต้องรู้ว่าถ้าใช้ INPUT_PULLUP ค่าจะกลับกัน (กด = LOW, ไม่กด = HIGH)

const int BUTTON_PIN = 2;
const int LED_PIN = 8;
int buttonState = 0;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  buttonState = digitalRead(BUTTON_PIN);
  if (buttonState == LOW) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
}

[image: ภาพวงจรการต่อปุ่มกดกับ Arduino พร้อม pull-up resistor]

ข้อผิดพลาดที่เจอบ่อยมากในโปรเจคนี้คือ คนใช้ delay ใน loop ทำให้กดปุ่มแล้วตอบสนองช้า ถ้าต้องการให้กดปุ่มครั้งเดียวแล้ว toggle LED ได้ ให้ใช้ตัวแปรเก็บสถานะเดิมของปุ่ม แล้วเช็ค edge trigger แทน

โปรเจคที่ 3: หรี่ไฟ LED ด้วย PWM (analogWrite)

พอเข้าใจ digital output แล้ว ต่อไปคือ PWM ซึ่งใช้คำสั่ง analogWrite บน Arduino แม้จริง ๆ แล้วไม่ใช่ analog แต่เป็น Pulse Width Modulation ที่เปิดปิดสัญญาณเร็วมากจนมองเหมือนหรี่ไฟได้

const int LED_PIN = 9;
int brightness = 0;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  brightness = (brightness + 5) % 256;
  analogWrite(LED_PIN, brightness);
  delay(20);
}

ข้อควรระวัง: analogWrite รองรับเฉพาะ pin ที่มีเครื่องหมาย tilde (~) บนบอร์ด สำหรับ Arduino UNO คือ pin 3, 5, 6, 9, 10, 11 ถ้าใช้ pin อื่นจะไม่ทำงานแบบ PWM

โปรเจคที่ 4: อ่านค่าเซนเซอร์อุณหภูมิ DS18B20

โปรเจคนี้เป็นการเปิดใจเรื่อง input แบบ sensor จริง ๆ ไม่ใช่แค่ปุ่มกด DS18B20 เป็น sensor อุณหภูมิดิจิทัลที่ใช้ protocol OneWire ซึ่งหมายความว่าต่อสายแค่เส้นเดียวกับ data ก็ส่งข้อมูลได้ เหมาะสำหรับเรียนรู้การสื่อสารกับ sensor

[image: ภาพโมดูล DS18B20 ต่อกับ Arduino ผ่าน breadboard]

ต้องติดตั้ง library OneWire และ DallasTemperature ก่อนใช้งาน ผ่าน Library Manager ใน Arduino IDE แล้วต่อสาย 3 เส้น คือ VCC (แดง), GND (ดำ), DATA (เหลือง) เข้ากับ pin 2 ของ Arduino พร้อมใส่ resistor 4.7k ohm ระหว่าง DATA กับ VCC

โปรเจคที่ 5: ควบคุม Relay ด้วย Arduino

Relay คือ output ที่ใช้ควบคุมอุปกรณ์ไฟฟ้า 220V ได้ เช่น หลอดไฟ, พัดลม, ปั๊มน้ำ ข้อดีคือแยกวงจรไฟสูงออกจาก Arduino ได้เลย ป้องกันบอร์ดเสียหากไฟลัดวงจร

const int RELAY_PIN = 7;

void setup() {
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
}

void loop() {
  digitalWrite(RELAY_PIN, HIGH);
  delay(5000);
  digitalWrite(RELAY_PIN, LOW);
  delay(5000);
}

ข้อควรระวังอย่างมาก: อย่าใช้มือเปียกสัมผัสสายไฟ 220V ถ้าไม่มั่นใจว่าต่อถูกต้อง และต้องมี diode flyback ขนานกับขดลวด relay เพื่อป้องกันแรงดันย้อนกลับทำลาย transistor ที่ขับ relay

โปรเจคที่ 6: อ่านค่า potentiometer ด้วย analogRead

Potentiometer เป็น input แบบ analog ที่เข้าใจง่ายที่สุด ปรับค่าได้ต่อเนื่อง 0-1023 ผ่าน ADC ของ Arduino ใช้ในโปรเจคหลายอย่าง เช่น ควบคุมความเร็วมอเตอร์ หรือปรับความสว่างหน้าจอ

const int POT_PIN = A0;
const int LED_PIN = 9;

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  int potValue = analogRead(POT_PIN);
  int brightness = map(potValue, 0, 1023, 0, 255);
  analogWrite(LED_PIN, brightness);
  Serial.println(potValue);
  delay(100);
}

[image: ภาพการต่อ potentiometer กับ Arduino เพื่ออ่านค่า analog]

เคล็ดลับที่หลายคนไม่รู้คือ ค่า ADC ของ Arduino มี noise พื้นฐานอยู่ ถ้าต้องการค่าที่แม่นยำขึ้น ให้อ่านค่าหลายครั้งแล้วเฉลี่ย หรือใช้ตัวเก็บประจุ (capacitor) 0.1uF ขนานกับขา analog เพื่อกรอง noise

โปรเจคที่ 7: ใช้ Ultrasonic Sensor (HC-SR04)

Ultrasonic sensor เป็น input ที่ใช้วัดระยะทางด้วยคลื่นเสียง ใช้ในโปรเจคหุ่นยนต์หลบหลีมสิ่งกีดขวาง ระบบเตือนระยะใกล้ หรือระบบนับจำนวนคนเข้า-ออก หลักการคือ ยิงคลื่น ultrasonic ไปข้างหน้า แล้วจับเวลาที่คลื่นสะท้อนกลับมา

const int TRIG_PIN = 9;
const int ECHO_PIN = 10;

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  
  long duration = pulseIn(ECHO_PIN, HIGH);
  int distance = duration * 0.034 / 2;
  Serial.print("Distance: ");
  Serial.println(distance);
  delay(500);
}

ข้อควรระวัง: ค่าที่ได้จาก HC-SR04 ไม่แม่นยำ 100% โดยเฉพาะระยะใกล้มาก ๆ (ต่ำกว่า 2 ซม.) และระยะไกลมาก ๆ (เกิน 4 เมตร) ถ้าต้องการความแม่นยำสูงต้องใช้ sensor ประเภทอื่นแทน

โปรเจคที่ 8: ใช้ LDR วัดแสงแล้วเปิดไฟอัตโนมัติ

LDR (Light Dependent Resistor) เป็นตัวต้านทานที่เปลี่ยนค่าตามความเข้มแสง ใช้ทำระบบไฟอัตโนมัติได้ดี โปรเจคนี้เป็นการรวม input (LDR) กับ output (LED/Relay) เข้าด้วยกัน ซึ่งเป็นพื้นฐานของระบบควบคุมแบบอัตโนมัติจริง ๆ

const int LDR_PIN = A0;
const int LED_PIN = 8;
const int THRESHOLD = 500;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int lightValue = analogRead(LDR_PIN);
  Serial.println(lightValue);
  
  if (lightValue < THRESHOLD) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
  delay(100);
}

[image: ภาพโปรเจคระบบไฟอัตโนมัติด้วย LDR และ Arduino]

เรื่องที่ต้องระวังคือ LDR มี response time ช้า ค่าความต้านทานจะเปลี่ยนแปลงช้าเมื่อแสงเปลี่ยน ถ้าต้องการตอบสนองเร็วต้องใช้ photodiode หรือ phototransistor แทน

โปรเจคที่ 9: สร้าง Digital Clock ด้วย 7-segment Display

โปรเจคนี้เป็นการฝึกควบคุม output หลายตัวพร้อมกัน 7-segment display มี 8 segment (รวมจุด) ต้องจัดการ output แต่ละขาให้ถูกต้อง การใช้ shift register (74HC595) จะช่วยประหยัด pin ได้มาก

#include <ShiftDisplay.h>
const int DATA_PIN = 4;
const int CLOCK_PIN = 5;
const int LATCH_PIN = 6;
ShiftDisplay display(DATA_PIN, CLOCK_PIN, LATCH_PIN, COMMON_ANODE, 4);

void setup() {}

void loop() {
  int seconds = (millis() / 1000) % 60;
  int minutes = (millis() / 60000) % 60;
  display.setCursor(0, 2);
  display.print("0420"); // ตัวอย่าง format
}

ข้อควรระวัง: 7-segment display มีหลายแบบ COMMON_ANODE กับ COMMON_CATHODE ต้องเลือกใช้ library หรือปรับโค้ดให้ตรงกับฮาร์ดแวร์ที่มี ถ้าใช้ผิด display จะไม่ติดเลย

โปรเจคที่ 10: รวมทุกอย่างเป็น Smart System ง่าย ๆ

โปรเจคสุดท้ายเป็นการเอาความรู้จาก 9 โปรเจคแรกมาประกอบกัน ตัวอย่างเช่น ระบบควบคุมอุณหภูมิอัตโนมัติที่อ่านค่าจาก DS18B20 แล้วเปิด-ปิดพัดลมตามค่าที่ตั้ง รวม input (ปุ่มปรับ), input (sensor), output (relay ควบคุมพัดลม) เข้าด้วยกัน

#include <OneWire.h>
#include <DallasTemperature.h>

const int TEMP_SENSOR_PIN = 2;
const int RELAY_PIN = 7;
const int BUTTON_UP = 3;
const int BUTTON_DOWN = 4;

OneWire oneWire(TEMP_SENSOR_PIN);
DallasTemperature sensors(&oneWire);
int setTemp = 30;

void setup() {
  sensors.begin();
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(BUTTON_UP, INPUT_PULLUP);
  pinMode(BUTTON_DOWN, INPUT_PULLUP);
}

void loop() {
  sensors.requestTemperatures();
  float currentTemp = sensors.getTempCByIndex(0);
  
  if (digitalRead(BUTTON_UP) == LOW) setTemp++;
  if (digitalRead(BUTTON_DOWN) == LOW) setTemp--;
  
  if (currentTemp > setTemp) {
    digitalWrite(RELAY_PIN, HIGH);
  } else {
    digitalWrite(RELAY_PIN, LOW);
  }
  delay(500);
}

[image: ภาพโปรเจครวมระบบควบคุมอุณหภูมิพร้อม sensor ปุ่มกด และ relay]

สิ่งที่จะเจอเมื่อทำโปรเจคจริง

ทำโปรเจคจริงแล้วจะเจอปัญหาหลายอย่างที่เว็บไซต์สอนไม่เคยบอก ปัญหาแรกคือเรื่อง debounce ของปุ่มกด ปุ่มกดทั่วไปจะมีการสั่น (bounce) เมื่อกด ทำให้ Arduino อ่านค่าได้หลายครั้งจากการกดครั้งเดียว วิธีแก้คือใช้ software debounce หรือใส่วงจร debounce ด้วยตัวเก็บประจุ

ปัญหาที่สองคือเรื่อง ground loop โดยเฉพาะเมื่อต่อ sensor หลายตัว ถ้า ground ไม่ต่อร่วมกันถูกต้อง ค่าที่อ่านได้จะผิดเพี้ยน วิธีแก้คือต่อสาย GND ของทุกอุปกรณ์เข้าด้วยกันที่จุดเดียวบน breadboard ก่อนแล้วค่อยต่อเข้า GND ของ Arduino

ต่อยอดไปไหนต่อ

พอเข้าใจ input output พื้นฐานแล้ว จะต่อยอดไปทำโปรเจคที่ซับซ้อนขึ้นได้ไม่ยาก ถ้าสนใจเรื่องการแจ้งเตือนผ่านมือถือ ลองดู แจกฟรี 10 โปรเจกต์ แจ้งเตือนบุกรุกมือถือ ด้วย Arduino/ESP32 ซึ่งเป็นโปรเจคที่ใช้ input จาก sensor หลายแบบรวมกัน

หรือถ้าอยากเรียนรู้เรื่องการสื่อสารอุปกรณ์หลายตัวพร้อมกัน ลองดูบทความ ต่อใช้งาน Arduino กับเซ็นเซอร์วัดการสั่นสะเทือน RS485 ที่จะสอนเรื่อง serial communication ขั้นสูงขึ้นไปอีก

สำหรับโปรเจคที่อยากลองทำเป็นตัวจริง แนะนำลองทำ Touchscreen Thermostat ด้วย Arduino MKR เป็นโปรเจคที่รวม input (เซนเซอร์อุณหภูมิ, touchscreen) และ output (ควบคุมอุปกรณ์ภายนอก) ได้อย่างครบถ้วน

สรุป

10 โปรเจคนี้ครอบคลุม input และ output พื้นฐานที่จำเป็นต้องรู้ก่อนจะต่อยอดไปทำโปรเจคอื่น ๆ ที่ซับซ้อนขึ้น เริ่มจาก LED กระพริบ ไปจนถึงระบบควบคุมอุณหภูมิอัตโนมัติ สิ่งสำคัญคือต้องเข้าใจว่าแต่ละคำสั่งทำงานยังไงในระดับล่าง ไม่ใช่แค่ก็อปปี้โค้ดแล้วกดอัพโหลด พอเข้าใจพื้นฐานแล้ว จะต่อยอดไปทำโปรเจคอะไรก็ไม่ยากแล้ว

อยากทำโปรเจคแบบนี้?

รับทำโปรเจค Arduino / IoT จบงานไว ส่งงานครบ พร้อมสอน

หากต้องการ รับทำโปรเจคอาดูโน่ หรือระบบ IoT แบบเร่งด่วน สามารถดูรายละเอียดบริการได้ที่หน้าแรก

จ้างทำโปรเจคเลย

ความคิดเห็น