🧩 1. ความหมายของ Array (อาร์เรย์)
Array (อาร์เรย์) คือ “ชุดของตัวแปรชนิดเดียวกัน” ที่ถูกจัดเก็บในหน่วยความจำแบบต่อเนื่อง แต่สามารถเข้าถึงแต่ละตัวได้ด้วย หมายเลขลำดับ (index)
📘 ตัวอย่าง:
int scores[5] = {90, 80, 70, 85, 95};
| ชื่อ | Index | ค่า |
|---|---|---|
| scores[0] | 0 | 90 |
| scores[1] | 1 | 80 |
| scores[2] | 2 | 70 |
| scores[3] | 3 | 85 |
| scores[4] | 4 | 95 |
🧠 หมายเลข Index ของ Array จะเริ่มที่ 0 เสมอ ไม่ใช่ 1
⚙️ 2. โครงสร้างการประกาศอาร์เรย์
type arrayName[size];
หรือประกาศพร้อมกำหนดค่า:
type arrayName[size] = {value1, value2, value3, ...};
📘 ตัวอย่าง:
int ledPins[3] = {2, 4, 5};
float sensorData[5] = {23.5, 25.0, 22.8, 24.2, 23.9};
char name[6] = {'A', 'r', 'd', 'u', 'i', 'n', 'o'};
🔹 3. การเข้าถึงสมาชิกในอาร์เรย์
int ledPins[3] = {2, 4, 5};
digitalWrite(ledPins[0], HIGH); // เข้าถึงตัวแรก
digitalWrite(ledPins[1], LOW); // ตัวที่สอง
🔹 4. การเปลี่ยนค่าในอาร์เรย์
int score[3] = {10, 20, 30};
score[1] = 50; // เปลี่ยนค่า index 1 เป็น 50
🔹 5. การใช้ Array กับ Loop
เป็นการใช้งานที่นิยมที่สุด เพราะ Array และ Loop เข้ากันได้ดีมาก
📘 ตัวอย่าง: กระพริบไฟ LED หลายดวง
int leds[] = {2, 4, 5, 18};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(leds[i], OUTPUT);
}
}
void loop() {
for (int i = 0; i < 4; i++) {
digitalWrite(leds[i], HIGH);
delay(200);
digitalWrite(leds[i], LOW);
}
}
🔹 6. การหาขนาดของอาร์เรย์
ใช้ฟังก์ชัน sizeof() เพื่อหาจำนวนสมาชิกในอาร์เรย์
int ledPins[] = {2, 4, 5, 18};
int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
📘 ตัวอย่าง:
Serial.println(numLeds); // 4
ใช้บ่อยมาก เพราะจะช่วยให้ Loop ทำงานครบทุกตัวโดยไม่ต้องนับเอง
🔹 7. Array ของชนิดข้อมูลอื่น ๆ
🔸 ตัวเลขทศนิยม
float temperature[] = {24.3, 25.7, 26.2};
🔸 ตัวอักษร
char letters[] = {'A', 'B', 'C', 'D'};
🔸 Boolean (สถานะเปิด/ปิด)
bool ledState[4] = {true, false, false, true};
🔹 8. String Array (ข้อความหลายชุด)
String names[] = {"Nathee", "LIC", "Arduino", "ESP32"};
for (int i = 0; i < 4; i++) {
Serial.println(names[i]);
}
หรือใช้
const char*สำหรับข้อความแบบ C (ใช้หน่วยความจำน้อยกว่า)
const char* fruits[] = {"Apple", "Banana", "Cherry"};
Serial.println(fruits[1]); // Banana
🔹 9. ตัวอย่าง: อ่านค่าหลาย Sensor
int sensorPins[] = {34, 35, 32};
float values[3];
void loop() {
for (int i=0; i<3; i++) {
int raw = analogRead(sensorPins[i]);
values[i] = (float)raw * 3.3 / 4095.0;
Serial.printf("Sensor %d = %.2f V\n", i, values[i]);
}
delay(1000);
}
🔹 10. ตัวอย่าง: แสดงผลเฉลี่ยจาก Array
float temp[] = {25.4, 26.1, 24.8, 25.6, 26.0};
float sum = 0;
for (int i = 0; i < 5; i++) {
sum += temp[i];
}
float avg = sum / 5.0;
Serial.printf("Average = %.2f °C\n", avg);
🔹 11. Multi-Dimensional Array (อาร์เรย์หลายมิติ)
ใช้เมื่อข้อมูลมี “แถว” และ “คอลัมน์” เช่น ตาราง, เซนเซอร์ 2 มิติ, หุ่นยนต์ 2 แกน
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
| Index | ค่า |
|---|---|
| matrix[0][0] | 1 |
| matrix[0][1] | 2 |
| matrix[1][2] | 6 |
📘 ตัวอย่าง:
for (int r=0; r<2; r++) {
for (int c=0; c<3; c++) {
Serial.print(matrix[r][c]);
Serial.print(" ");
}
Serial.println();
}
🔹 12. การส่ง Array เข้า Function
สามารถส่งทั้ง Array หรือ Element เข้าไปในฟังก์ชันได้
📘 ตัวอย่าง:
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
Serial.println(arr[i]);
}
}
void setup() {
Serial.begin(115200);
int data[] = {1, 2, 3, 4, 5};
int len = sizeof(data) / sizeof(data[0]);
printArray(data, len);
}
🔹 13. การใช้ Pointer กับ Array (ขั้นสูง)
ในภาษา C/C++ Array และ Pointer เกี่ยวข้องกันโดยตรง
int nums[] = {10, 20, 30};
int *ptr = nums;
Serial.println(*(ptr + 1)); // 20
ใช้บ่อยใน ESP32 เมื่อต้องทำงานกับ buffer, Serial, หรือการสื่อสารข้อมูล
🔹 14. ตัวอย่าง Array ในงานจริงของ ESP32
🔸 อ่านค่าอุณหภูมิหลายเซนเซอร์
int pins[] = {34, 35, 32};
float temp[3];
void loop() {
for (int i=0; i<3; i++) {
temp[i] = analogRead(pins[i]) * 3.3 / 4095.0 * 100;
Serial.printf("Sensor %d: %.1f°C\n", i, temp[i]);
}
delay(1000);
}
🔸 ควบคุมไฟ RGB ด้วย Array
int rgbPins[3] = {16, 17, 18};
int colors[3] = {255, 0, 128};
for (int i=0; i<3; i++) {
analogWrite(rgbPins[i], colors[i]);
}
📊 15. ตารางสรุปชนิดข้อมูลและรูปแบบ Array
| ชนิดข้อมูล | ตัวอย่างการประกาศ | ตัวอย่างการใช้ | หมายเหตุ |
|---|---|---|---|
int | int data[3]; | data[0] = 5; | ค่าจำนวนเต็ม |
float | float volt[5]; | volt[i] = 3.3; | ค่าทศนิยม |
char | char name[6]; | name[0] = 'A'; | ตัวอักษรเดี่ยว |
String | String names[3]; | names[1] = "LIC"; | ข้อความหลายชุด |
bool | bool state[2]; | state[0] = true; | สถานะเปิด/ปิด |
| 2D Array | int mat[2][3]; | mat[0][1] = 5; | ตารางข้อมูล |
🧠 16. เคล็ดลับ
✅ เริ่มจากการอธิบาย “ตารางเก็บของ” (Array = กล่องต่อเนื่อง)
✅ ใช้ตัวอย่างเชื่อมกับ LED / Sensor หลายตัว ให้เด็กเห็นภาพ
✅ ให้ฝึก Loop ผ่าน Array แล้ว Print ออก Serial Monitor
✅ ฝึกใช้ sizeof() เพื่อหาขนาดแทนการนับเอง
✅ ให้ต่อยอดเขียน “ระบบแสดงค่า Sensor หลายตัวพร้อมกัน”
📚 17. แบบฝึกหัด
1️⃣ สร้างอาร์เรย์ int leds[5] = {2,4,5,18,19} ให้กระพริบไฟทีละดวงแบบวนซ้ำ
2️⃣ สร้างอาร์เรย์ float temps[5] อ่านค่า analog sensor แล้วหาค่าเฉลี่ย
3️⃣ เขียนฟังก์ชัน float average(int arr[], int size) คืนค่าผลเฉลี่ยของอาร์เรย์
4️⃣ ใช้อาร์เรย์ 2 มิติ int mat[2][3] แสดงผลออกทาง Serial Monitor
5️⃣ เขียนโปรแกรมควบคุม LED 3 ดวงตามรูปแบบในอาร์เรย์สถานะ bool states[3] = {1,0,1}
🧾 18. สรุปแนวคิดสำคัญ
| แนวคิด | คำอธิบาย |
|---|---|
| Array คือ | กลุ่มตัวแปรชนิดเดียวกัน |
| Index เริ่มที่ | 0 |
| ใช้ร่วมกับ | for, while, sizeof() |
| ใช้งานหลัก | LED หลายดวง, Sensor หลายตัว |
| ข้อดี | เก็บข้อมูลจำนวนมากในชื่อเดียว |
| ข้อควรระวัง | ห้ามเข้าถึง index เกินขอบเขต |
| 2D Array | ใช้ในข้อมูลแบบตาราง |
| String Array | เก็บข้อความหลายชุดได้ |
