๐Ÿ”ฅ ๅŸบไบŽESP32-C6็š„ๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ - ๅŒไผ ๆ„Ÿๅ™จๅˆ†็บง้ข„่ญฆๅฎžๆˆ˜ ๐Ÿšจ
ๅˆ†ไบซไฝœ่€…๏ผšXIUYUAN
ไฝœ่€…ๆ˜ต็งฐ๏ผšXIUYUAN
่ฏ„ๆต‹ๅ“็‰Œ๏ผšiCEasy
่ฏ„ๆต‹ๅž‹ๅท๏ผš็ซ็„ฐไผ ๆ„Ÿๅ™จๆจกๅ—
ๅ‘ๅธƒๆ—ถ้—ด๏ผš2025-10-16 09:24:04
1
่ง†้ข‘้“พๆŽฅ
ใ€ๅŸบไบŽESP32-C6็š„ๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ - ๅŒไผ ๆ„Ÿๅ™จๅˆ†็บง้ข„่ญฆๅฎžๆˆ˜-ๅ“”ๅ“ฉๅ“”ๅ“ฉใ€‘ https://b23.tv/IZx4emp
ๅ‰่จ€
ๆœฌ้กน็›ฎๅฎž็Žฐไบ†ไธ€ไธชๅŒไผ ๆ„Ÿๅ™จๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ๏ผŒ้‡‡็”จESP32-C6ไฝœไธบไธปๆŽง่Šฏ็‰‡๏ผŒ็ป“ๅˆ็ซ็„ฐไผ ๆ„Ÿๅ™จๅ’ŒMQ-2ๆฐ”ไฝ“ไผ ๆ„Ÿๅ™จ๏ผŒๅฎž็ŽฐไปŽๆ—ฉๆœŸ็ƒŸ้›พ้ข„่ญฆๅˆฐๆ˜Ž็ซๆŠฅ่ญฆ็š„ๅ…จๆ–นไฝไฟๆŠคใ€‚
ๅผ€ๆบๅฃ็ข‘ๅˆ†ไบซๅ†…ๅฎน

๐Ÿ“‹ ้กน็›ฎๆฆ‚่ฟฐ

       ๆœฌ้กน็›ฎๅฎž็Žฐไบ†ไธ€ไธชๅŒไผ ๆ„Ÿๅ™จๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ๏ผŒ้‡‡็”จESP32-C6ไฝœไธบไธปๆŽง่Šฏ็‰‡๏ผŒ็ป“ๅˆ็ซ็„ฐไผ ๆ„Ÿๅ™จๅ’ŒMQ-2ๆฐ”ไฝ“ไผ ๆ„Ÿๅ™จ๏ผŒๅฎž็ŽฐไปŽๆ—ฉๆœŸ็ƒŸ้›พ้ข„่ญฆๅˆฐๆ˜Ž็ซๆŠฅ่ญฆ็š„ๅ…จๆ–นไฝไฟๆŠคใ€‚


๐ŸŽฏ ๆ ธๅฟƒ็‰นๆ€ง

       โœ… ๅŒไผ ๆ„Ÿๅ™จ่žๅˆ๏ผš็ซ็„ฐไผ ๆ„Ÿๅ™จ๏ผˆๆ˜Ž็ซๆฃ€ๆต‹๏ผ‰ + MQ-2๏ผˆ็ƒŸ้›พ/ๆฐ”ไฝ“ๆฃ€ๆต‹๏ผ‰

       โœ… ๅˆ†็บงๆŠฅ่ญฆ๏ผšๅฎ‰ๅ…จ โ†’ ๆฐ”ไฝ“้ข„่ญฆ โ†’ ็ซ็พ่ญฆๆŠฅไธ‰็บง็Šถๆ€

       โœ… ๆ—ฉๆœŸ้ข„่ญฆ๏ผšMQ-2ๅฏๅœจ่ตท็ซๅ‰ๆฃ€ๆต‹ๅˆฐ็ƒŸ้›พๅ’Œๅฏ็‡ƒๆฐ”ไฝ“

       โœ… ๆœ‰ๆบ่œ‚้ธฃๅ™จ๏ผš85dB+ๅคง้Ÿณ้‡๏ผŒๆ€ฅไฟƒ/็ผ“ๆ…ขๅŒๆจกๅผๆŠฅ่ญฆ

       โœ… ๅŒ่‰ฒLEDๆŒ‡็คบ๏ผš็บข่‰ฒ๏ผˆ็ซ็พ๏ผ‰+ ้ป„่‰ฒ๏ผˆ้ข„่ญฆ๏ผ‰็›ด่ง‚ๆ˜พ็คบ

       โœ… ๆ™บ่ƒฝ่‡ชๆฃ€๏ผšๅผ€ๆœบ่‡ชๅŠจๆฃ€ๆต‹ๆ‰€ๆœ‰็ป„ไปถๆ˜ฏๅฆๆญฃๅธธ

       โœ… ไฝŽ่ฏฏๆŠฅ็އ๏ผšๅŒไผ ๆ„Ÿๅ™จไบคๅ‰้ชŒ่ฏ๏ผŒๆ้ซ˜ๅฏ้ ๆ€ง


๐Ÿ› ๏ธ ็กฌไปถๆธ…ๅ•

| ็ป„ไปถ | ๅž‹ๅท/่ง„ๆ ผ | ๆ•ฐ้‡ | ไฝœ็”จ | ๅ‚่€ƒไปทๆ ผ |
|------|-----------|------|------|----------|
| ไธปๆŽงๆฟ | ESP32-C6-WROOM-1 | 1 | ๆ ธๅฟƒๆŽงๅˆถๅ™จ๏ผŒๆ”ฏๆŒWiFi/Thread/Zigbee | ยฅ25 |
| ็ซ็„ฐไผ ๆ„Ÿๅ™จ | ็บขๅค–็ซ็„ฐไผ ๆ„Ÿๅ™จๆจกๅ— | 1-2 | ๆฃ€ๆต‹ๆ˜Ž็ซ๏ผˆ760-1100nm็บขๅค–ๅ…‰๏ผ‰ | ยฅ4 |
| ๆฐ”ไฝ“ไผ ๆ„Ÿๅ™จ | MQ-2ไผ ๆ„Ÿๅ™จๆจกๅ— | 1 | ๆฃ€ๆต‹็ƒŸ้›พ/ๆถฒๅŒ–ๆฐ”/็”ฒ็ƒท็ญ‰ๅฏ็‡ƒๆฐ”ไฝ“ | ยฅ5 |
| ๆœ‰ๆบ่œ‚้ธฃๅ™จ | 5V 85dB+ | 1 | ๅฃฐ้ŸณๆŠฅ่ญฆ๏ผˆๆŽจ่ๆœ‰ๆบ๏ผ‰ | ยฅ3 |
| ็บข่‰ฒLED | 5mm้ซ˜ไบฎLED | 1 | ็ซ็พ่ญฆๆŠฅๆŒ‡็คบ | ยฅ0.5 |
| ้ป„่‰ฒLED | 5mm LED | 1 | ๆฐ”ไฝ“้ข„่ญฆๆŒ‡็คบ | ยฅ0.5 |
| NPNไธ‰ๆž็ฎก | 8050ๆˆ–S8050 | 1 | ่œ‚้ธฃๅ™จ้ฉฑๅŠจๆ”พๅคง | ยฅ0.5 |
| ็”ต้˜ป | 220ฮฉ ร— 2๏ผˆLED้™ๆต๏ผ‰ | 2 | LED้™ๆตไฟๆŠค | ยฅ0.2 |
| ็”ต้˜ป | 1kฮฉ ร— 1๏ผˆไธ‰ๆž็ฎกๅŸบๆž๏ผ‰ | 1 | ไธ‰ๆž็ฎกๅŸบๆž้™ๆต | ยฅ0.2 |
| ้ขๅŒ…ๆฟ | ๆ ‡ๅ‡†้ขๅŒ…ๆฟ | 1 | ็”ต่ทฏๆญๅปบ | ยฅ3 |
| ๆœ้‚ฆ็บฟ | ๅ…ฌๅฏนๅ…ฌ/ๅ…ฌๅฏนๆฏ | ่‹ฅๅนฒ | ็”ต่ทฏ่ฟžๆŽฅ | ยฅ2 |
| ๆ€ปๆˆๆœฌ | - | - | - | ็บฆยฅ44 |

๐Ÿ’ก ไธบไป€ไนˆ้€‰ๆ‹ฉๆœ‰ๆบ่œ‚้ธฃๅ™จ๏ผŸ

| ๅฏนๆฏ”้กน | ๆœ‰ๆบ่œ‚้ธฃๅ™จ โœ… | ๆ— ๆบ่œ‚้ธฃๅ™จ |
|--------|--------------|-----------|
| ๆŽงๅˆถๆ–นๅผ | ็ฎ€ๅ•๏ผˆๆ•ฐๅญ—IOๅผ€ๅ…ณ๏ผ‰ | ๅคๆ‚๏ผˆ้œ€่ฆPWM้ข‘็އ๏ผ‰ |
| ้Ÿณ้‡ | 85-95dB๏ผˆๅคง๏ผ‰ | 60-80dB๏ผˆๅฐ๏ผ‰ |
| ไปฃ็  | `digitalWrite(pin, HIGH)` | `tone(pin, 2000)` |
| ็จณๅฎšๆ€ง | ๅ›บๅฎš้Ÿณ่ฐƒ๏ผŒ็จณๅฎš | ้Ÿณ่ฐƒๅฏ่ƒฝไธ็จณๅฎš |
| ้€‚็”จๅœบๆ™ฏ*| โœ… ็ซ็พๆŠฅ่ญฆ | ้Ÿณไนๆ’ญๆ”พใ€ๆ็คบ้Ÿณ |

๐Ÿ”Œ ๆŽฅ็บฟ่ฏดๆ˜Ž

   ๅผ•่„šๅˆ†้…่กจ

| ESP32-C6ๅผ•่„š | ่ฟžๆŽฅ่ฎพๅค‡ | ๅŠŸ่ƒฝ่ฏดๆ˜Ž |
|-------------|---------|---------|
| GPIO2 | ็ซ็„ฐไผ ๆ„Ÿๅ™จ DO | ๆ•ฐๅญ—่พ“ๅ‡บ๏ผˆLOW=ๆฃ€ๆต‹ๅˆฐ็ซ็„ฐ๏ผ‰ |
| GPIO3 | MQ-2 AO | ๆจกๆ‹Ÿ่พ“ๅ‡บ๏ผˆ0-4095๏ผŒๆต“ๅบฆๅ€ผ๏ผ‰ |
| GPIO4 | MQ-2 DO | ๆ•ฐๅญ—่พ“ๅ‡บ๏ผˆLOW=่ถ…้˜ˆๅ€ผ๏ผ‰ |
| GPIO5 | ไธ‰ๆž็ฎกๅŸบๆž | ๆŽงๅˆถ่œ‚้ธฃๅ™จๅผ€ๅ…ณ |
| GPIO6 | ็บข่‰ฒLEDๆญฃๆž | ็ซ็พ่ญฆๆŠฅๆŒ‡็คบ |
| GPIO7 | ้ป„่‰ฒLEDๆญฃๆž | ๆฐ”ไฝ“้ข„่ญฆๆŒ‡็คบ |
| 3.3V | ็ซ็„ฐไผ ๆ„Ÿๅ™จVCC | ไพ›็”ต |
| 5V | MQ-2 VCC, ่œ‚้ธฃๅ™จ+ | ไพ›็”ต๏ผˆMQ-2้œ€ๅŠ ็ƒญ๏ผ‰ |
| GND | ๆ‰€ๆœ‰่ฎพๅค‡GND | ๅ…ฌๅ…ฑๅœฐ |

   ่ฏฆ็ป†ๆŽฅ็บฟๅ›พ

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                    ESP32-C6 ็ซ็พๆŠฅ่ญฆ็ณป็ปŸๆŽฅ็บฟๅ›พ                 โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

ใ€็ซ็„ฐไผ ๆ„Ÿๅ™จใ€‘
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ ็ซ็„ฐไผ ๆ„Ÿๅ™จ   โ”‚
  โ”‚             โ”‚
  โ”‚  VCC  GND  DO  AO โ”‚
  โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
      โ”‚   โ”‚   โ”‚
      โ”‚   โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ†’ ESP32-C6 GPIO2
      โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ ESP32-C6 GND
      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ ESP32-C6 3.3V

ใ€MQ-2ๆฐ”ไฝ“ไผ ๆ„Ÿๅ™จใ€‘
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  MQ-2ๆจกๅ—   โ”‚
  โ”‚  (้œ€้ข„็ƒญ)   โ”‚
  โ”‚ VCC GND AO DO โ”‚
  โ””โ”€โ”€โ”ฌโ”€โ”€โ”ฌโ”€โ”€โ”ฌโ”€โ”€โ”ฌโ”€โ”˜
     โ”‚  โ”‚  โ”‚  โ”‚
     โ”‚  โ”‚  โ”‚  โ””โ”€โ”€โ†’ ESP32-C6 GPIO4 (ๆ•ฐๅญ—่พ“ๅ‡บ)
     โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ†’ ESP32-C6 GPIO3 (ๆจกๆ‹Ÿ่พ“ๅ‡บ)
     โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ ESP32-C6 GND
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ ESP32-C6 5V (โš ๏ธๆณจๆ„๏ผšMQ-2้œ€5Vไพ›็”ต)

ใ€ๆœ‰ๆบ่œ‚้ธฃๅ™จ + ไธ‰ๆž็ฎก้ฉฑๅŠจใ€‘
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚  5V                                  โ”‚
  โ”‚   โ”‚                                  โ”‚
  โ”‚   โ””โ”€โ”€โ†’ ่œ‚้ธฃๅ™จ+                       โ”‚
  โ”‚         ่œ‚้ธฃๅ™จ-                      โ”‚
  โ”‚            โ”‚                         โ”‚
  โ”‚            โ””โ”€โ”€โ†’ 8050้›†็”ตๆž(C)        โ”‚
  โ”‚                 8050ๅ‘ๅฐ„ๆž(E) โ†’ GND  โ”‚
  โ”‚                 8050ๅŸบๆž(B)          โ”‚
  โ”‚                    โ”‚                 โ”‚
  โ”‚                  1kฮฉ                 โ”‚
  โ”‚                    โ”‚                 โ”‚
  โ”‚            ESP32-C6 GPIO5            โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ใ€LEDๆŒ‡็คบ็ฏใ€‘
  ็บข่‰ฒLED๏ผˆ็ซ็พ่ญฆๆŠฅ๏ผ‰:
    ๆญฃๆž โ†’ 220ฮฉ โ†’ ESP32-C6 GPIO6
    ่ดŸๆž โ†’ GND

  ้ป„่‰ฒLED๏ผˆๆฐ”ไฝ“้ข„่ญฆ๏ผ‰:
    ๆญฃๆž โ†’ 220ฮฉ โ†’ ESP32-C6 GPIO7
    ่ดŸๆž โ†’ GND

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘ โš ๏ธ ้‡่ฆๆ็คบ๏ผš                                                  โ•‘
โ•‘ 1. MQ-2ไผ ๆ„Ÿๅ™จ้œ€่ฆ5Vไพ›็”ตไปฅไฟ่ฏๅŠ ็ƒญๅ…ƒไปถๆญฃๅธธๅทฅไฝœ                  โ•‘
โ•‘ 2. ็ซ็„ฐไผ ๆ„Ÿๅ™จไฝฟ็”จ3.3Vไพ›็”ตๅณๅฏ                                 โ•‘
โ•‘ 3. ไธ‰ๆž็ฎก8050็š„ๅผ•่„š๏ผšE(ๅ‘ๅฐ„ๆž) C(้›†็”ตๆž) B(ๅŸบๆž)              โ•‘
โ•‘ 4. LEDๅŠกๅฟ…ไธฒ่”220ฮฉ็”ต้˜ป๏ผŒๅฆๅˆ™ไผš็ƒงๆฏ                            โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

๐Ÿ’ป ๅฎŒๆ•ดArduinoไปฃ็ 

   ไธป็จ‹ๅบ๏ผˆFire_Alarm_System.ino๏ผ‰

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
//  ESP32-C6 ๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ v2.0
//  ไฝœ่€…: XIUYUAN
//  ๅŠŸ่ƒฝ: ็ซ็„ฐๆฃ€ๆต‹ + ๆฐ”ไฝ“ๆฃ€ๆต‹ + ๅˆ†็บงๆŠฅ่ญฆ
//  ็กฌไปถ: ESP32-C6 + ็ซ็„ฐไผ ๆ„Ÿๅ™จ + MQ-2 + ๆœ‰ๆบ่œ‚้ธฃๅ™จ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// ๅผ•่„šๅฎšไน‰
// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
#define FLAME_SENSOR_PIN  2   // ็ซ็„ฐไผ ๆ„Ÿๅ™จๆ•ฐๅญ—่พ“ๅ‡บ (LOW=ๆฃ€ๆต‹ๅˆฐ็ซ็„ฐ)
#define MQ2_ANALOG_PIN    3   // MQ-2ๆจกๆ‹Ÿ่พ“ๅ‡บ (0-4095)
#define MQ2_DIGITAL_PIN   4   // MQ-2ๆ•ฐๅญ—่พ“ๅ‡บ (LOW=่ถ…้˜ˆๅ€ผ)
#define BUZZER_PIN        5   // ๆœ‰ๆบ่œ‚้ธฃๅ™จๆŽงๅˆถๅผ•่„š
#define LED_FIRE          6   // ็บข่‰ฒLED๏ผˆ็ซ็พ่ญฆๆŠฅ๏ผ‰
#define LED_GAS           7   // ้ป„่‰ฒLED๏ผˆๆฐ”ไฝ“้ข„่ญฆ๏ผ‰

// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// ็ณป็ปŸๅ‚ๆ•ฐ้…็ฝฎ
// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
#define GAS_THRESHOLD     1500  // MQ-2ๆฐ”ไฝ“ๆต“ๅบฆ้˜ˆๅ€ผ (0-4095)
#define PREHEATING_TIME   30000 // MQ-2้ข„็ƒญๆ—ถ้—ด๏ผˆ30็ง’๏ผ‰
#define SCAN_INTERVAL     200   // ไผ ๆ„Ÿๅ™จๆ‰ซๆ้—ด้š”๏ผˆ200ms๏ผ‰
#define STATUS_PRINT_INTERVAL 5000 // ็Šถๆ€ๆ‰“ๅฐ้—ด้š”๏ผˆ5็ง’๏ผ‰

// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// ๆŠฅ่ญฆ็บงๅˆซๆžšไธพ
// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
enum AlarmLevel {
  SAFE,         // ๐ŸŸข ๅฎ‰ๅ…จ็Šถๆ€
  GAS_WARNING,  // ๐ŸŸก ๆฐ”ไฝ“้ข„่ญฆ๏ผˆๆฃ€ๆต‹ๅˆฐ็ƒŸ้›พ/ๅฏ็‡ƒๆฐ”ไฝ“๏ผ‰
  FIRE_ALARM    // ๐Ÿ”ด ็ซ็พ่ญฆๆŠฅ๏ผˆๆฃ€ๆต‹ๅˆฐๆ˜Ž็ซ๏ผ‰
};

// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
// ๅ…จๅฑ€ๅ˜้‡
// โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
AlarmLevel currentLevel = SAFE;       // ๅฝ“ๅ‰ๆŠฅ่ญฆ็บงๅˆซ
unsigned long lastPrintTime = 0;      // ไธŠๆฌกๆ‰“ๅฐๆ—ถ้—ด
unsigned long systemStartTime = 0;    // ็ณป็ปŸๅฏๅŠจๆ—ถ้—ด
unsigned int alarmCount = 0;          // ๆŠฅ่ญฆๆฌกๆ•ฐ็ปŸ่ฎก

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๅˆๅง‹ๅŒ–ๅ‡ฝๆ•ฐ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void setup() {
  // ๅˆๅง‹ๅŒ–ไธฒๅฃ๏ผˆ็”จไบŽ่ฐƒ่ฏ•๏ผ‰
  Serial.begin(115200);
  delay(1000);
  
  // ๆ‰“ๅฐๅฏๅŠจไฟกๆฏ
  printWelcome();
  
  // ้…็ฝฎGPIOๅผ•่„š
  initPins();
  
  // MQ-2ไผ ๆ„Ÿๅ™จ้ข„็ƒญ
  preheatingMQ2();
  
  // ็ณป็ปŸ่‡ชๆฃ€
  selfTest();
  
  // ่ฎฐๅฝ•ๅฏๅŠจๆ—ถ้—ด
  systemStartTime = millis();
  
  Serial.println("โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”");
  Serial.println("๐Ÿ›ก๏ธ  ็ณป็ปŸ็›‘ๆŽงๅทฒๅฏๅŠจ...\n");
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ไธปๅพช็Žฏ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void loop() {
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  // 1. ่ฏปๅ–ไผ ๆ„Ÿๅ™จๆ•ฐๆฎ
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  bool flameDetected = (digitalRead(FLAME_SENSOR_PIN) == LOW);  // LOW=ๆฃ€ๆต‹ๅˆฐ็ซ็„ฐ
  int gasValue = analogRead(MQ2_ANALOG_PIN);                    // ๆฐ”ไฝ“ๆต“ๅบฆๅ€ผ (0-4095)
  bool gasAlert = (digitalRead(MQ2_DIGITAL_PIN) == LOW);        // LOW=่ถ…้˜ˆๅ€ผ
  
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  // 2. ๅˆคๆ–ญๆŠฅ่ญฆ็บงๅˆซ๏ผˆไผ˜ๅ…ˆ็บง๏ผš็ซ็„ฐ > ๆฐ”ไฝ“๏ผ‰
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  AlarmLevel previousLevel = currentLevel;
  
  if (flameDetected) {
    // ๐Ÿ”ด ๆœ€้ซ˜ไผ˜ๅ…ˆ็บง๏ผšๆฃ€ๆต‹ๅˆฐๆ˜Ž็ซ
    currentLevel = FIRE_ALARM;
  } else if (gasAlert || gasValue > GAS_THRESHOLD) {
    // ๐ŸŸก ๆฌกไผ˜ๅ…ˆ็บง๏ผšๆฃ€ๆต‹ๅˆฐๆฐ”ไฝ“/็ƒŸ้›พ
    currentLevel = GAS_WARNING;
  } else {
    // ๐ŸŸข ๅฎ‰ๅ…จ็Šถๆ€
    currentLevel = SAFE;
  }
  
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  // 3. ็Šถๆ€ๆ”นๅ˜ๆ—ถๆ‰“ๅฐ่ฏฆ็ป†ไฟกๆฏๅนถ่ฎกๆ•ฐ
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  if (currentLevel != previousLevel) {
    if (currentLevel != SAFE) {
      alarmCount++;  // ๆŠฅ่ญฆๆฌกๆ•ฐ+1
    }
    printDetailedStatus(flameDetected, gasValue, gasAlert);
  }
  
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  // 4. ๆ‰ง่กŒๅฏนๅบ”็š„ๆŠฅ่ญฆๅŠจไฝœ
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  switch(currentLevel) {
    case FIRE_ALARM:
      executeFireAlarm();
      break;
      
    case GAS_WARNING:
      executeGasWarning();
      break;
      
    case SAFE:
      executeAllClear();
      break;
  }
  
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  // 5. ๅฎšๆœŸๆ‰“ๅฐ็›‘ๆŽงๆ•ฐๆฎ
  // โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  if (millis() - lastPrintTime > STATUS_PRINT_INTERVAL) {
    lastPrintTime = millis();
    printMonitoringData(flameDetected, gasValue);
  }
  
  // ็Ÿญๆš‚ๅปถ่ฟŸ
  delay(SCAN_INTERVAL);
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๅˆๅง‹ๅŒ–ๅผ•่„š
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void initPins() {
  Serial.println("๐Ÿ“Œ ้…็ฝฎGPIOๅผ•่„š...");
  
  // ่พ“ๅ…ฅๅผ•่„š
  pinMode(FLAME_SENSOR_PIN, INPUT);
  pinMode(MQ2_DIGITAL_PIN, INPUT);
  // MQ2_ANALOG_PIN ไธ้œ€่ฆpinMode๏ผˆ่‡ชๅŠจ้…็ฝฎไธบๆจกๆ‹Ÿ่พ“ๅ…ฅ๏ผ‰
  
  // ่พ“ๅ‡บๅผ•่„š
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(LED_FIRE, OUTPUT);
  pinMode(LED_GAS, OUTPUT);
  
  // ๅˆๅง‹็Šถๆ€๏ผšๅ…จ้ƒจๅ…ณ้—ญ
  digitalWrite(BUZZER_PIN, HIGH);  // ไฝŽ็”ตๅนณ่งฆๅ‘่œ‚้ธฃๅ™จ๏ผŒHIGH=ๅ…ณ้—ญ
  digitalWrite(LED_FIRE, LOW);
  digitalWrite(LED_GAS, LOW);
  
  Serial.printf("   ็ซ็„ฐไผ ๆ„Ÿๅ™จ: GPIO%d\n", FLAME_SENSOR_PIN);
  Serial.printf("   MQ-2ๆจกๆ‹Ÿ:   GPIO%d (ADC)\n", MQ2_ANALOG_PIN);
  Serial.printf("   MQ-2ๆ•ฐๅญ—:   GPIO%d\n", MQ2_DIGITAL_PIN);
  Serial.printf("   ่œ‚้ธฃๅ™จ:     GPIO%d\n", BUZZER_PIN);
  Serial.printf("   ็บข่‰ฒLED:    GPIO%d (็ซ็พ)\n", LED_FIRE);
  Serial.printf("   ้ป„่‰ฒLED:    GPIO%d (้ข„่ญฆ)\n\n", LED_GAS);
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// MQ-2ไผ ๆ„Ÿๅ™จ้ข„็ƒญ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void preheatingMQ2() {
  Serial.println("๐Ÿ”ฅ MQ-2ไผ ๆ„Ÿๅ™จ้ข„็ƒญไธญ...");
  Serial.println("   (ๅปบ่ฎฎ้ข„็ƒญ30็ง’ไปฅ็กฎไฟ่ฏปๆ•ฐๅ‡†็กฎ)");
  Serial.println("   ๆ็คบ๏ผš้ข„็ƒญๆœŸ้—ด้ป„่‰ฒLEDไผš้—ช็ƒ\n");
  
  int totalSeconds = PREHEATING_TIME / 1000;
  for(int i = totalSeconds; i > 0; i--) {
    Serial.printf("   โณ ๅ€’่ฎกๆ—ถ: %2d ็ง’ | ๅฝ“ๅ‰MQ-2ๅ€ผ: %4d\r", 
                  i, analogRead(MQ2_ANALOG_PIN));
    
    // ้ป„่‰ฒLED้—ช็ƒๆ็คบ้ข„็ƒญไธญ
    digitalWrite(LED_GAS, i % 2);
    delay(1000);
  }
  
  digitalWrite(LED_GAS, LOW);
  Serial.println("\nโœ… ้ข„็ƒญๅฎŒๆˆ๏ผ");
  
  // ๆ˜พ็คบ้ข„็ƒญๅŽ็š„ๅŸบๅ‡†ๅ€ผ
  int baselineValue = 0;
  for(int i = 0; i < 10; i++) {
    baselineValue += analogRead(MQ2_ANALOG_PIN);
    delay(50);
  }
  baselineValue /= 10;
  Serial.printf("   ๐Ÿ“Š MQ-2ๅŸบๅ‡†ๅ€ผ: %d (้˜ˆๅ€ผ: %d)\n\n", baselineValue, GAS_THRESHOLD);
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ็ณป็ปŸ่‡ชๆฃ€
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void selfTest() {
  Serial.println("๐Ÿ”ง ็ณป็ปŸ่‡ชๆฃ€ไธญ...\n");
  
  // โ”€โ”€โ”€ ๆต‹่ฏ•LED โ”€โ”€โ”€
  Serial.println("   [1/3] ๆต‹่ฏ•LEDๆŒ‡็คบ็ฏ...");
  Serial.print("         ็บข่‰ฒLED: ");
  digitalWrite(LED_FIRE, HIGH);
  delay(300);
  Serial.print("โœ“ ");
  digitalWrite(LED_FIRE, LOW);
  
  Serial.print("้ป„่‰ฒLED: ");
  digitalWrite(LED_GAS, HIGH);
  delay(300);
  Serial.println("โœ“");
  digitalWrite(LED_GAS, LOW);
  delay(200);
  
  // โ”€โ”€โ”€ ๆต‹่ฏ•่œ‚้ธฃๅ™จ โ”€โ”€โ”€
  Serial.println("   [2/3] ๆต‹่ฏ•ๆœ‰ๆบ่œ‚้ธฃๅ™จ...");
  Serial.print("         ่œ‚้ธฃๅ™จ: ");
  digitalWrite(BUZZER_PIN, LOW);   // ไฝŽ็”ตๅนณ่งฆๅ‘
  delay(200);
  digitalWrite(BUZZER_PIN, HIGH);  // ้ซ˜็”ตๅนณๅ…ณ้—ญ
  Serial.println("โœ“ (ๅบ”่ฏฅๅฌๅˆฐไธ€ๅฃฐ\"ๆปด\")\n");
  delay(300);
  
  // โ”€โ”€โ”€ ่ฏปๅ–ไผ ๆ„Ÿๅ™จๅˆๅง‹ๅ€ผ โ”€โ”€โ”€
  Serial.println("   [3/3] ่ฏปๅ–ไผ ๆ„Ÿๅ™จๅˆๅง‹็Šถๆ€...");
  bool flameStatus = digitalRead(FLAME_SENSOR_PIN);
  int gasValue = analogRead(MQ2_ANALOG_PIN);
  bool gasDigital = digitalRead(MQ2_DIGITAL_PIN);
  
  Serial.printf("         ็ซ็„ฐไผ ๆ„Ÿๅ™จ: %s\n", 
                flameStatus == HIGH ? "โœ“ ๆ— ็ซ็„ฐ" : "โš ๏ธ ๆฃ€ๆต‹ๅˆฐ็ซ็„ฐ!");
  Serial.printf("         MQ-2ๆจกๆ‹Ÿๅ€ผ: %d\n", gasValue);
  Serial.printf("         MQ-2ๆ•ฐๅญ—ๅ€ผ: %s\n", 
                gasDigital == HIGH ? "โœ“ ๆญฃๅธธ" : "โš ๏ธ ่ถ…้˜ˆๅ€ผ!");
  
  Serial.println("\nโœ… ่‡ชๆฃ€ๅฎŒๆˆ๏ผๆ‰€ๆœ‰็ป„ไปถๆญฃๅธธ\n");
  delay(1000);
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๐Ÿ”ด ็ซ็พ่ญฆๆŠฅๅŠจไฝœ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void executeFireAlarm() {
  // ็บข่‰ฒๅ’Œ้ป„่‰ฒLEDๅ…จ้ƒจ็‚นไบฎ
  digitalWrite(LED_FIRE, HIGH);
  digitalWrite(LED_GAS, HIGH);
  
  // ๆ€ฅไฟƒๆŠฅ่ญฆๅฃฐ๏ผˆๆœ‰ๆบ่œ‚้ธฃๅ™จ๏ผšๅฟซ้€Ÿๅผ€ๅ…ณ๏ผ‰
  // ๆจกๅผ๏ผšๆปดๆปดๆปด-ๅœ-ๆปดๆปดๆปด-ๅœ
  for(int i = 0; i < 3; i++) {
    digitalWrite(BUZZER_PIN, LOW);   // ไฝŽ็”ตๅนณ่งฆๅ‘=ๅ“
    delay(100);
    digitalWrite(BUZZER_PIN, HIGH);  // ้ซ˜็”ตๅนณ=ๅœ
    delay(100);
  }
  delay(300);  // ็Ÿญๆš‚ๅœ้กฟ
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๐ŸŸก ๆฐ”ไฝ“้ข„่ญฆๅŠจไฝœ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void executeGasWarning() {
  // ไป…้ป„่‰ฒLED็‚นไบฎ
  digitalWrite(LED_FIRE, LOW);
  digitalWrite(LED_GAS, HIGH);
  
  // ็ผ“ๆ…ขๆŠฅ่ญฆๅฃฐ๏ผˆๆœ‰ๆบ่œ‚้ธฃๅ™จ๏ผš้•ฟๅ“-้•ฟๅœ๏ผ‰
  // ๆจกๅผ๏ผšๆปด~~~-ๅœ-ๆปด~~~-ๅœ
  digitalWrite(BUZZER_PIN, LOW);   // ไฝŽ็”ตๅนณ่งฆๅ‘=ๅ“
  delay(200);
  digitalWrite(BUZZER_PIN, HIGH);  // ้ซ˜็”ตๅนณ=ๅœ
  delay(800);  // ่พƒ้•ฟๅœ้กฟ
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๐ŸŸข ๅฎ‰ๅ…จ็Šถๆ€
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void executeAllClear() {
  // ๅ…จ้ƒจๅ…ณ้—ญ
  digitalWrite(LED_FIRE, LOW);
  digitalWrite(LED_GAS, LOW);
  digitalWrite(BUZZER_PIN, HIGH);  // ไฝŽ็”ตๅนณ่งฆๅ‘่œ‚้ธฃๅ™จ๏ผŒHIGH=ๅ…ณ้—ญ
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๆ‰“ๅฐๆฌข่ฟŽไฟกๆฏ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void printWelcome() {
  Serial.println("\n");
  Serial.println("โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—");
  Serial.println("โ•‘                                                โ•‘");
  Serial.println("โ•‘    ๐Ÿšจ ESP32-C6 ๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ v2.0 ๐Ÿšจ       โ•‘");
  Serial.println("โ•‘                                                โ•‘");
  Serial.println("โ•‘    ๅŠŸ่ƒฝ๏ผš็ซ็„ฐๆฃ€ๆต‹ + ๆฐ”ไฝ“ๆฃ€ๆต‹ + ๅˆ†็บงๆŠฅ่ญฆ        โ•‘");
  Serial.println("โ•‘    ไฝœ่€…๏ผšiCEasy IoT Lab                        โ•‘");
  Serial.println("โ•‘    ๆ—ฅๆœŸ๏ผš2025-10-15                            โ•‘");
  Serial.println("โ•‘                                                โ•‘");
  Serial.println("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•");
  Serial.println();
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๆ‰“ๅฐ่ฏฆ็ป†็Šถๆ€๏ผˆ็Šถๆ€ๆ”นๅ˜ๆ—ถ๏ผ‰
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void printDetailedStatus(bool flame, int gas, bool gasAlert) {
  Serial.println("\nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—");
  Serial.println("โ•‘            โš ๏ธ  ่ญฆๆŠฅ็Šถๆ€ๅ˜ๆ›ด  โš ๏ธ                โ•‘");
  Serial.println("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•");
  
  // ๆ—ถ้—ดไฟกๆฏ
  unsigned long runTime = (millis() - systemStartTime) / 1000;
  Serial.printf("โฐ ่ฟ่กŒๆ—ถ้—ด: %lu ็ง’ | ๆŠฅ่ญฆๆฌกๆ•ฐ: %u\n", runTime, alarmCount);
  Serial.printf("๐Ÿ“… ๅฝ“ๅ‰ๆ—ถ้—ด: %lu ms\n", millis());
  Serial.println("โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”");
  
  // ไผ ๆ„Ÿๅ™จ็Šถๆ€
  Serial.println("๐Ÿ“Š ไผ ๆ„Ÿๅ™จ็Šถๆ€:");
  Serial.printf("   ๐Ÿ”ฅ ็ซ็„ฐไผ ๆ„Ÿๅ™จ: %s\n", 
                flame ? "๐Ÿ”ด ๆฃ€ๆต‹ๅˆฐ็ซ็„ฐ!" : "โœ… ๆญฃๅธธ");
  Serial.printf("   ๐Ÿ’จ MQ-2ๆฐ”ไฝ“ๅ€ผ: %d (้˜ˆๅ€ผ:%d) %s\n", 
                gas, GAS_THRESHOLD, 
                gas > GAS_THRESHOLD ? "๐ŸŸก ่ถ…้˜ˆๅ€ผ!" : "โœ…");
  Serial.printf("   ๐Ÿ’จ MQ-2ๆ•ฐๅญ—่พ“ๅ‡บ: %s\n", 
                gasAlert ? "๐ŸŸก ๆŠฅ่ญฆ!" : "โœ… ๆญฃๅธธ");
  Serial.println("โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”");
  
  // ๅฝ“ๅ‰็บงๅˆซๅ’ŒๅŠจไฝœ
  Serial.println("๐Ÿšฆ ็ณป็ปŸ็Šถๆ€:");
  switch(currentLevel) {
    case FIRE_ALARM:
      Serial.println("   ็บงๅˆซ: ๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด ใ€็ซ็พ่ญฆๆŠฅใ€‘ ๐Ÿ”ด๐Ÿ”ด๐Ÿ”ด");
      Serial.println("   ๅŠจไฝœ:");
      Serial.println("      โ†’ ็บข่‰ฒLEDๅธธไบฎ");
      Serial.println("      โ†’ ้ป„่‰ฒLEDๅธธไบฎ");
      Serial.println("      โ†’ ่œ‚้ธฃๅ™จๆ€ฅไฟƒๆŠฅ่ญฆ (ๆปดๆปดๆปด-ๅœ-ๆปดๆปดๆปด)");
      Serial.println("   ๅปบ่ฎฎ:");
      Serial.println("      โš ๏ธ  ็ซ‹ๅณ็–ๆ•ฃไบบๅ‘˜๏ผ");
      Serial.println("      โš ๏ธ  ๆ‹จๆ‰“็ซ่ญฆ็”ต่ฏ119๏ผ");
      Serial.println("      โš ๏ธ  ไฝฟ็”จ็ญ็ซๅ™จ็ญ็ซ๏ผˆๅฐ็ซๆƒ…ๅ†ตไธ‹๏ผ‰๏ผ");
      break;
      
    case GAS_WARNING:
      Serial.println("   ็บงๅˆซ: ๐ŸŸก๐ŸŸก ใ€ๆฐ”ไฝ“้ข„่ญฆใ€‘ ๐ŸŸก๐ŸŸก");
      Serial.println("   ๅŠจไฝœ:");
      Serial.println("      โ†’ ้ป„่‰ฒLEDๅธธไบฎ");
      Serial.println("      โ†’ ่œ‚้ธฃๅ™จ็ผ“ๆ…ขๆŠฅ่ญฆ (ๆปด~ๅœ~ๆปด~ๅœ)");
      Serial.println("   ๅฏ่ƒฝๅŽŸๅ› :");
      Serial.println("      โ€ข ๆฃ€ๆต‹ๅˆฐ็ƒŸ้›พ๏ผˆๅฏ่ƒฝๆ˜ฏๆ—ฉๆœŸ็ซ็พ๏ผ‰");
      Serial.println("      โ€ข ๆฃ€ๆต‹ๅˆฐๅฏ็‡ƒๆฐ”ไฝ“๏ผˆ็…คๆฐ”/ๅคฉ็„ถๆฐ”ๆณ„ๆผ๏ผ‰");
      Serial.println("   ๅปบ่ฎฎ:");
      Serial.println("      โš ๏ธ  ็ซ‹ๅณๆฃ€ๆŸฅๅ‘จๅ›ด็Žฏๅขƒ");
      Serial.println("      โš ๏ธ  ๆ‰“ๅผ€้—จ็ช—้€š้ฃŽ");
      Serial.println("      โš ๏ธ  ๆฃ€ๆŸฅ็‡ƒๆฐ”้˜€้—จๆ˜ฏๅฆๅ…ณ้—ญ");
      break;
      
    case SAFE:
      Serial.println("   ็บงๅˆซ: ๐ŸŸข ใ€ๅฎ‰ๅ…จใ€‘");
      Serial.println("   ๅŠจไฝœ:");
      Serial.println("      โ†’ ๆ‰€ๆœ‰LED็†„็ญ");
      Serial.println("      โ†’ ่œ‚้ธฃๅ™จ้™้Ÿณ");
      Serial.println("      โ†’ ็ปง็ปญ็›‘ๆŽงไธญ...");
      break;
  }
  Serial.println("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n");
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ๆ‰“ๅฐ็›‘ๆŽงๆ•ฐๆฎ๏ผˆๅฎšๆœŸ๏ผ‰
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
void printMonitoringData(bool flame, int gas) {
  Serial.printf("๐Ÿ“Š [็›‘ๆŽง] ็Šถๆ€:%s | ็ซ็„ฐ:%s | ๆฐ”ไฝ“:%4d | ่ฟ่กŒ:%lu็ง’ | ๆŠฅ่ญฆ:%uๆฌก\n", 
                getLevelIcon(currentLevel),
                flame ? "๐Ÿ”ดๆฃ€ๆต‹" : "โšชๆ—   ",
                gas,
                (millis() - systemStartTime) / 1000,
                alarmCount);
}

// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// ่Žทๅ–็บงๅˆซๅ›พๆ ‡
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
const char* getLevelIcon(AlarmLevel level) {
  switch(level) {
    case FIRE_ALARM:   return "๐Ÿ”ด็ซ็พ";
    case GAS_WARNING:  return "๐ŸŸก้ข„่ญฆ";
    case SAFE:         return "๐ŸŸขๅฎ‰ๅ…จ";
    default:           return "โ“ๆœช็Ÿฅ";
  }
}

๐Ÿง  ๅทฅไฝœๅŽŸ็†่ฏฆ่งฃ

1๏ธโƒฃ ไผ ๆ„Ÿๅ™จๆฃ€ๆต‹ๅŽŸ็†

๐Ÿ”ฅ ็ซ็„ฐไผ ๆ„Ÿๅ™จ

       ๆฃ€ๆต‹ๅŽŸ็†๏ผš็บขๅค–ๅ…‰ๆ•ไธ‰ๆž็ฎก๏ผŒๆฃ€ๆต‹760-1100nmๆณข้•ฟ็š„็บขๅค–ๅ…‰

       ็ซ็„ฐ็‰นๅพ๏ผš็‡ƒ็ƒงไบง็”Ÿ็š„็ซ็„ฐไผšๅ‘ๅ‡บ็‰นๅฎšๆณข้•ฟ็š„็บขๅค–่พๅฐ„

       ่พ“ๅ‡บๆ–นๅผ๏ผš

           `DO`๏ผˆๆ•ฐๅญ—่พ“ๅ‡บ๏ผ‰๏ผšๆฃ€ๆต‹ๅˆฐ็ซ็„ฐๆ—ถ่พ“ๅ‡บLOW๏ผŒๅฆๅˆ™HIGH

           `AO`๏ผˆๆจกๆ‹Ÿ่พ“ๅ‡บ๏ผ‰๏ผš่พ“ๅ‡บ็ซ็„ฐๅผบๅบฆๅ€ผ๏ผˆๅฏ้€‰๏ผ‰

       ๆฃ€ๆต‹่ท็ฆป๏ผš0.8-3็ฑณ๏ผˆๅฏ้€š่ฟ‡ๆฟ่ฝฝ็”ตไฝๅ™จ่ฐƒ่Š‚็ตๆ•ๅบฆ๏ผ‰
๐Ÿ’จ MQ-2ๆฐ”ไฝ“ไผ ๆ„Ÿๅ™จ

   ๆฃ€ๆต‹ๅŽŸ็†๏ผšSnOโ‚‚ๅŠๅฏผไฝ“๏ผŒ้‡ๅฏ็‡ƒๆฐ”ไฝ“็”ต้˜ป้™ไฝŽ

   ๅฏๆฃ€ๆต‹ๆฐ”ไฝ“๏ผš

       ๆถฒๅŒ–ๆฐ”๏ผˆLPG๏ผ‰

       ไธ็ƒทใ€ไธ™็ƒทใ€็”ฒ็ƒท

       ๆฐขๆฐ”ใ€้…’็ฒพใ€็ƒŸ้›พ

   ้ข„็ƒญ่ฆๆฑ‚๏ผš้œ€ๅŠ ็ƒญ20-30็ง’ๆ‰่ƒฝๅ‡†็กฎๆฃ€ๆต‹

   ่พ“ๅ‡บๆ–นๅผ๏ผš

       `AO`๏ผˆๆจกๆ‹Ÿ่พ“ๅ‡บ๏ผ‰๏ผš0-4095๏ผˆESP32-C6็š„12ไฝADC๏ผ‰

       ` DO`๏ผˆๆ•ฐๅญ—่พ“ๅ‡บ๏ผ‰๏ผš่ถ…่ฟ‡้˜ˆๅ€ผๆ—ถ่พ“ๅ‡บLOW

2๏ธโƒฃ ๅˆ†็บงๆŠฅ่ญฆ้€ป่พ‘

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   ๅ†ณ็ญ–ๆ ‘๏ผˆไผ˜ๅ…ˆ็บงๆŽ’ๅบ๏ผ‰                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

START
  โ”‚
  โ”œโ”€โ†’ ็ซ็„ฐไผ ๆ„Ÿๅ™จๆฃ€ๆต‹ๅˆฐ็ซ็„ฐ๏ผŸ
  โ”‚    โ”œโ”€ YES โ†’ ๐Ÿ”ด FIRE_ALARM๏ผˆๆœ€้ซ˜ไผ˜ๅ…ˆ็บง๏ผ‰
  โ”‚    โ”‚         โ”œโ”€ ็บข่‰ฒLED + ้ป„่‰ฒLEDๅ…จไบฎ
  โ”‚    โ”‚         โ”œโ”€ ่œ‚้ธฃๅ™จๆ€ฅไฟƒๆŠฅ่ญฆ๏ผˆ100msๅ“-100msๅœ ร— 3๏ผ‰
  โ”‚    โ”‚         โ””โ”€ ไธฒๅฃ่พ“ๅ‡บ่ฏฆ็ป†่ญฆๆŠฅไฟกๆฏ
  โ”‚    โ”‚
  โ”‚    โ””โ”€ NO โ†’ MQ-2ๆฐ”ไฝ“ๆต“ๅบฆ > ้˜ˆๅ€ผ ๆˆ– MQ-2 DO = LOW๏ผŸ
  โ”‚              โ”œโ”€ YES โ†’ ๐ŸŸก GAS_WARNING
  โ”‚              โ”‚         โ”œโ”€ ้ป„่‰ฒLEDไบฎ
  โ”‚              โ”‚         โ”œโ”€ ่œ‚้ธฃๅ™จ็ผ“ๆ…ขๆŠฅ่ญฆ๏ผˆ200msๅ“-800msๅœ๏ผ‰
  โ”‚              โ”‚         โ””โ”€ ไธฒๅฃ่พ“ๅ‡บ้ข„่ญฆไฟกๆฏ
  โ”‚              โ”‚
  โ”‚              โ””โ”€ NO โ†’ ๐ŸŸข SAFE
  โ”‚                        โ”œโ”€ ๆ‰€ๆœ‰LED็†„็ญ
  โ”‚                        โ”œโ”€ ่œ‚้ธฃๅ™จ้™้Ÿณ
  โ”‚                        โ””โ”€ ๆฏ5็ง’ๆ‰“ๅฐ็›‘ๆŽงๆ•ฐๆฎ
  โ”‚
END

3๏ธโƒฃ ๆœ‰ๆบ่œ‚้ธฃๅ™จๆŽงๅˆถๆ–นๅผ

// ๆœ‰ๆบ่œ‚้ธฃๅ™จ๏ผšๅ†…็ฝฎๆŒฏ่กๅ™จ๏ผŒๅช้œ€ๅผ€ๅ…ณๆŽงๅˆถ
// ๆณจๆ„๏ผšๆœฌ้กน็›ฎไฝฟ็”จไฝŽ็”ตๅนณ่งฆๅ‘่œ‚้ธฃๅ™จ

// ๆ€ฅไฟƒๆŠฅ่ญฆ๏ผˆ็ซ็พ๏ผ‰
for(int i = 0; i < 3; i++) {
  digitalWrite(BUZZER_PIN, LOW);   // ไฝŽ็”ตๅนณ่งฆๅ‘=ๅ“
  delay(100);
  digitalWrite(BUZZER_PIN, HIGH);  // ้ซ˜็”ตๅนณ=ๅœ
  delay(100);
}
// ๆ•ˆๆžœ๏ผšๆปด-ๆปด-ๆปด-(ๅœ)-ๆปด-ๆปด-ๆปด-(ๅœ)...

// ็ผ“ๆ…ขๆŠฅ่ญฆ๏ผˆๆฐ”ไฝ“้ข„่ญฆ๏ผ‰
digitalWrite(BUZZER_PIN, LOW);   // ไฝŽ็”ตๅนณ่งฆๅ‘=ๅ“
delay(200);
digitalWrite(BUZZER_PIN, HIGH);  // ้ซ˜็”ตๅนณ=ๅœ
delay(800);
// ๆ•ˆๆžœ๏ผšๆปด~~~-(้•ฟๅœ)-ๆปด~~~-(้•ฟๅœ)...

๐ŸŽจ ็ณป็ปŸ็Šถๆ€ๆŒ‡็คบ

| ็Šถๆ€ | ็บข่‰ฒLED | ้ป„่‰ฒLED | ่œ‚้ธฃๅ™จ | ๅซไน‰ |
|------|---------|---------|--------|------|
| ๐ŸŸข ๅฎ‰ๅ…จ | โšซ ็†„็ญ | โšซ ็†„็ญ | ๐Ÿ”‡ ้™้Ÿณ | ๆญฃๅธธ็›‘ๆŽงไธญ |
| ๐ŸŸก ๆฐ”ไฝ“้ข„่ญฆ | โšซ ็†„็ญ | ๐ŸŸก ๅธธไบฎ | ๐Ÿ”” ๆปด~ๅœ~ๆปด | ๆฃ€ๆต‹ๅˆฐ็ƒŸ้›พ/ๅฏ็‡ƒๆฐ”ไฝ“ |
| ๐Ÿ”ด ็ซ็พ่ญฆๆŠฅ | ๐Ÿ”ด ๅธธไบฎ | ๐ŸŸก ๅธธไบฎ | ๐Ÿ”” ๆปดๆปดๆปดๅœ | ๆฃ€ๆต‹ๅˆฐๆ˜Ž็ซ๏ผ |
| ๐Ÿ”ง ้ข„็ƒญไธญ | โšซ ็†„็ญ | ๐ŸŸก ้—ช็ƒ | ๐Ÿ”‡ ้™้Ÿณ | MQ-2ไผ ๆ„Ÿๅ™จ้ข„็ƒญ |
| ๐Ÿงช ่‡ชๆฃ€ | ๐Ÿ”ด/๐ŸŸก ไพๆฌก | ๐Ÿ”ด/๐ŸŸก ไพๆฌก | ๐Ÿ”” ็Ÿญ้ธฃ | ็ณป็ปŸ่‡ชๆฃ€ |

๐Ÿ› ่ฐƒ่ฏ•ไธŽๆ•…้šœๆŽ’้™ค

ๅธธ่ง้—ฎ้ข˜ๆŽ’ๆŸฅ่กจ

| ้—ฎ้ข˜็Žฐ่ฑก | ๅฏ่ƒฝๅŽŸๅ›  | ่งฃๅ†ณๆ–นๆกˆ |
|---------|---------|---------|
| MQ-2่ฏปๆ•ฐไธ€็›ดๅพˆไฝŽ | ๆœช้ข„็ƒญๆˆ–ไพ›็”ตไธ่ถณ | ็กฎไฟ5Vไพ›็”ต๏ผŒ้ข„็ƒญ30็ง’ไปฅไธŠ |
| ็ซ็„ฐไผ ๆ„Ÿๅ™จไธ€็›ดLOW | ็Žฏๅขƒๅ…‰ๅคชๅผบๆˆ–ๆ•…้šœ | ่ฐƒ่Š‚ๆฟ่ฝฝ็”ตไฝๅ™จ้™ไฝŽ็ตๆ•ๅบฆ |
| ่œ‚้ธฃๅ™จไธๅ“ | ไธ‰ๆž็ฎกๆŽฅ็บฟ้”™่ฏฏ | ๆฃ€ๆŸฅE/B/Cๅผ•่„š๏ผŒๅ‚่€ƒๆŽฅ็บฟๅ›พ |
| LEDไธไบฎ | ๆœชไธฒ่”้™ๆต็”ต้˜ป | ๅฟ…้กปไธฒ่”220ฮฉ็”ต้˜ป๏ผ |
| MQ-2ๅ€ผไธ็จณๅฎš | ้ข„็ƒญๆ—ถ้—ดไธ่ถณ | ๅปถ้•ฟ้ข„็ƒญๆ—ถ้—ด่‡ณ60็ง’ |
| ้ข‘็น่ฏฏๆŠฅ | ้˜ˆๅ€ผ่ฎพ็ฝฎ่ฟ‡ไฝŽ | ่ฐƒ้ซ˜`GAS_THRESHOLD`ๅ€ผ๏ผˆๅฆ‚2000๏ผ‰ |
| ็ผ–่ฏ‘้”™่ฏฏ | ๅผ€ๅ‘ๆฟ้€‰ๆ‹ฉ้”™่ฏฏ | ็กฎไฟ้€‰ๆ‹ฉ"ESP32C6 Dev Module" |

๐Ÿš€ ๅŠŸ่ƒฝๆ‰ฉๅฑ•ๅปบ่ฎฎ

       WiFi่ฟœ็จ‹็›‘ๆŽง๏ผšๆทปๅŠ WebๆœๅŠกๅ™จ๏ผŒๆ‰‹ๆœบๆต่งˆๅ™จๆŸฅ็œ‹็Šถๆ€

       ๆ‰‹ๆœบๆŽจ้€๏ผšไฝฟ็”จBlynk/ๅทดๆณ•ไบ‘ๅฎž็Žฐ็ซ่ญฆๆŽจ้€้€š็Ÿฅ

       OLEDๆ˜พ็คบๅฑ๏ผšๅฎžๆ—ถๆ˜พ็คบไผ ๆ„Ÿๅ™จๆ•ฐๆฎๅ’ŒๆŠฅ่ญฆ็Šถๆ€

       ๅคš่Š‚็‚น็ป„็ฝ‘๏ผšESP-NOWๆˆ–Zigbeeๅ่ฎฎ๏ผŒๅคšๆˆฟ้—ด่”ๅŠจๆŠฅ่ญฆ

       ๆ™บ่ƒฝๅฎถๅฑ…่”ๅŠจ๏ผš่‡ชๅŠจๅ…ณ้—ญ็‡ƒๆฐ”้˜€ใ€ๅˆ‡ๆ–ญ็”ตๆบใ€่งฃ้”้—จ้”


โš ๏ธ ๅฎ‰ๅ…จๆ็คบ

       โš ๏ธ ๆœฌ้กน็›ฎไป…ไพ›ๅญฆไน ๅ’ŒDIYๅฎž้ชŒไฝฟ็”จ๏ผŒไธ่ƒฝๆ›ฟไปฃๅ•†็”จ็ซ็พๆŠฅ่ญฆๅ™จ  

       โš ๏ธ ๅฎž้™…ๅบ”็”จ่ฏท่ดญไนฐๅ›ฝๅฎถ3C่ฎค่ฏ็š„ๆถˆ้˜ฒไบงๅ“  

       โš ๏ธ ไผ ๆ„Ÿๅ™จๅญ˜ๅœจๆผๆฃ€้ฃŽ้™ฉ๏ผŒๅปบ่ฎฎ้…ๅˆไผ ็ปŸ็ƒŸ้›พๆŠฅ่ญฆๅ™จไฝฟ็”จ  

       โš ๏ธ ๅฎšๆœŸๆฃ€ๆŸฅไผ ๆ„Ÿๅ™จๅทฅไฝœ็Šถๆ€๏ผˆๅปบ่ฎฎๆฏๆœˆไธ€ๆฌก๏ผ‰


๐Ÿ“ ๆ€ป็ป“

       ๆœฌ้กน็›ฎไฝฟ็”จESP32-C6 + ็ซ็„ฐไผ ๆ„Ÿๅ™จ + MQ-2ๅฎž็Žฐไบ†ๅŒไผ ๆ„Ÿๅ™จๆ™บ่ƒฝ็ซ็พๆŠฅ่ญฆ็ณป็ปŸ๏ผŒ้€š่ฟ‡ๅˆ†็บงๆŠฅ่ญฆๆœบๅˆถ๏ผŒไปŽๆ—ฉๆœŸ็ƒŸ้›พ้ข„่ญฆๅˆฐๆ˜Ž็ซ่ญฆๆŠฅ๏ผŒๆไพ›ๅ…จๆ–นไฝไฟๆŠคใ€‚ๆ€ปๆˆๆœฌ็บฆยฅ44๏ผŒ้€‚ๅˆๅญฆไน ไผ ๆ„Ÿๅ™จๅบ”็”จใ€็Šถๆ€ๆœบ่ฎพ่ฎกๅ’Œ็‰ฉ่”็ฝ‘ๅผ€ๅ‘ใ€‚

๐Ÿ”ฅ ๆถˆ้˜ฒๅฎ‰ๅ…จ๏ผŒไบบไบบๆœ‰่ดฃ๏ผ๐Ÿšจ

ๅ…จ้ƒจ่ฏ„่ฎบ
ๆš‚ๆ— ่ฏ„่ฎบ
0/144