🧩 1. ความหมายของ Array (อาร์เรย์)

Array (อาร์เรย์) คือ “ชุดของตัวแปรชนิดเดียวกัน” ที่ถูกจัดเก็บในหน่วยความจำแบบต่อเนื่อง แต่สามารถเข้าถึงแต่ละตัวได้ด้วย หมายเลขลำดับ (index)

📘 ตัวอย่าง:

C++
int scores[5] = {90, 80, 70, 85, 95};
ชื่อIndexค่า
scores[0]090
scores[1]180
scores[2]270
scores[3]385
scores[4]495

🧠 หมายเลข Index ของ Array จะเริ่มที่ 0 เสมอ ไม่ใช่ 1


⚙️ 2. โครงสร้างการประกาศอาร์เรย์

C++
type arrayName[size];

หรือประกาศพร้อมกำหนดค่า:

C++
type arrayName[size] = {value1, value2, value3, ...};

📘 ตัวอย่าง:

C++
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. การเข้าถึงสมาชิกในอาร์เรย์

C++
int ledPins[3] = {2, 4, 5};
digitalWrite(ledPins[0], HIGH); // เข้าถึงตัวแรก
digitalWrite(ledPins[1], LOW);  // ตัวที่สอง

🔹 4. การเปลี่ยนค่าในอาร์เรย์

C++
int score[3] = {10, 20, 30};
score[1] = 50;  // เปลี่ยนค่า index 1 เป็น 50

🔹 5. การใช้ Array กับ Loop

เป็นการใช้งานที่นิยมที่สุด เพราะ Array และ Loop เข้ากันได้ดีมาก

📘 ตัวอย่าง: กระพริบไฟ LED หลายดวง

C++
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() เพื่อหาจำนวนสมาชิกในอาร์เรย์

C++
int ledPins[] = {2, 4, 5, 18};
int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);

📘 ตัวอย่าง:

C++
Serial.println(numLeds); // 4

ใช้บ่อยมาก เพราะจะช่วยให้ Loop ทำงานครบทุกตัวโดยไม่ต้องนับเอง


🔹 7. Array ของชนิดข้อมูลอื่น ๆ

🔸 ตัวเลขทศนิยม

C++
float temperature[] = {24.3, 25.7, 26.2};

🔸 ตัวอักษร

C++
char letters[] = {'A', 'B', 'C', 'D'};

🔸 Boolean (สถานะเปิด/ปิด)

C++
bool ledState[4] = {true, false, false, true};

🔹 8. String Array (ข้อความหลายชุด)

C++
String names[] = {"Nathee", "LIC", "Arduino", "ESP32"};
for (int i = 0; i < 4; i++) {
  Serial.println(names[i]);
}

หรือใช้ const char* สำหรับข้อความแบบ C (ใช้หน่วยความจำน้อยกว่า)

C++
const char* fruits[] = {"Apple", "Banana", "Cherry"};
Serial.println(fruits[1]);  // Banana

🔹 9. ตัวอย่าง: อ่านค่าหลาย Sensor

C++
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

C++
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 แกน

C++
int matrix[2][3] = {
  {1, 2, 3},
  {4, 5, 6}
};
Indexค่า
matrix[0][0]1
matrix[0][1]2
matrix[1][2]6

📘 ตัวอย่าง:

C++
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 เข้าไปในฟังก์ชันได้

📘 ตัวอย่าง:

C++
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 เกี่ยวข้องกันโดยตรง

C++
int nums[] = {10, 20, 30};
int *ptr = nums;
Serial.println(*(ptr + 1)); // 20

ใช้บ่อยใน ESP32 เมื่อต้องทำงานกับ buffer, Serial, หรือการสื่อสารข้อมูล


🔹 14. ตัวอย่าง Array ในงานจริงของ ESP32

🔸 อ่านค่าอุณหภูมิหลายเซนเซอร์

C++
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

C++
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

ชนิดข้อมูลตัวอย่างการประกาศตัวอย่างการใช้หมายเหตุ
intint data[3];data[0] = 5;ค่าจำนวนเต็ม
floatfloat volt[5];volt[i] = 3.3;ค่าทศนิยม
charchar name[6];name[0] = 'A';ตัวอักษรเดี่ยว
StringString names[3];names[1] = "LIC";ข้อความหลายชุด
boolbool state[2];state[0] = true;สถานะเปิด/ปิด
2D Arrayint 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เก็บข้อความหลายชุดได้