บทความนี้เป็นการเข้าไปดูรายละเอียดของไฟล์ ESP.h ของ esp8266 Arduino เพื่อศึกษาหน้าที่ฟังก์ชันต่าง ๆ ซึ่งมีประโยชน์มากต่อการเขียนโปรแกรมเพื่อควบคุมการทำงานของไมโครคอนโทรลเลอร์ตัวนี้ เช่น การทราบจำนวนหน่วยความจำที่เหลืออยู่ หรือขนาดหน่วยความจำใหญ่ที่สุดที่สามรถจองได้ ซึ่งใช้ในการกรณีที่ต้องการเขียนโปรแกรมที่ใช้หน่วยความจำแบบพลวัติ (Dynamic) เพื่อเก็บรายชื่อ AP ที่พบทั้งหมด เป็นต้น โดยการผู้เขียนโปรแกรมสามารถใช้คลาสนี้ได้โดยตรงจากวัตถุ ESP
ค่าคงที่
รายการค่าคงที่ที่กำหนดไว้ใน ESP.h ประกอบด้วย x กลุ่ม และแต่ละกลุ่มประกอบด้วยรายการค่าคงที่ต่าง ๆ ดังต่อไปนี้
- WDTO_t เป็นค่าคงที่ใช้สำหรับกำหนดช่วงเวลาสำหรับ WDT (Watch-dog-Timer) ได้แก่
- WDTO_0MS
- WDTO_15MS
- WDTO_30MS
- WDTO_60MS
- WDTO_120MS
- WDTO_250MS
- WDTO_500MS
- WDTO_1S
- WDTO_2S
- WDTO_4S
- WDTO_8S
- RGMode เป็นค่าคงที่เก็บประเภทโหมดของ RF ได้แก่
- RF_DEFAULT
- RF_CAL
- RF_NO_CAL
- RF_DISABLED
- ADCMode เป็นค่าคงที่โหมดของ ADC ได้แก่
- ADC_TOUT
- ADC_TOUT_3V3
- ADC_VCC
- ADC_VDD
- FlashMode_t เป็นค่าประเภทโหมดของหน่วยความจำแฟลช ได้แก่
- FM_QIO
- FM_QOUT
- FM_DIO
- FM_DOUT
- FM_UNKNOWN
คำสั่งเกี่ยวกับ WDT
WDT หรือ Watch Dog Timer เป็นนาฬิกาของไมโครคอนโทรลเลอร์ที่ใช้สำหรับรีเซ็นตนเองในกรณีที่ซอฟต์แวร์ที่กำลังทำงานนั้นไม่ส่งสัญาณตอบสนองกลับมาที่ระบบโดยการเรียกใช้ฟังก์ชัน ESP.wdtFeed() ทั้งนี้เพื่อป้องกันไม่ให้ระบบเกิดสถานะว่างโดยไม่สามารถทำอะไรได้ เช่น อาการแฮ็ง เป็นต้น รายการคำสั่งในกลุ่มนี้ได้แก่
- ESP.wdtEnable( ค่าเวลาสำหรับกำหนดให้ซอฟต์แวร์ต้องตอบสนองกลับมา )
- ESP.wdtDisable()
- ESP.wdtFeed()
คำสั่งโหมดประหยัดพลังงาน
การสั่งให้ไมโครคอนโทรเลอร์เข้าสู่โหมดประหยัดพลังงานประกอบไปด้วย 3 คำสั่งดังนี้
- ESP.deepSleep(uint64_t time_us, RFMode mode = RF_DEFAULT)
- ESP.deepSleepInstant(uint64_t time_us, RFMode mode = RF_DEFAULT)
- uint64_t ESP.deepSleepMax()
คำสั่งรีเซ็ตระบบ
กรณีที่ต้องการรีเซ็ตระบบหรือรีบูตระบบให้ใช้งานคำสั่งสำหรับงานดังกล่าวดังนี้
- ESP.reset()
- ESP.reboot()
- ESP.rebootIntoUartDownloadMode()
- String ESP.getResetReason()
- String ESP.getResetInfo()
- struct rst_info * ESP.getResetInfoPtr()
RTC
คำสั่งสำหรับอ่านและเขียนข้อมูลในส่วนของหน่วยความจำสำหรับผู้ใช้จากโมดูล RTC มีดังนี้
- bool ESP.rtcUserMemoryRead(uint32_t offset, uint32_t *data, size_t size)
- bool ESP.rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size);
ข้อมูลของชิพ
คำสั่งสำหรับอ่านข้อมูลของชิพ ESP8266 เพื่อทราบถึงขนาดความจุของแฟลช/หน่วยความจำแรม หรือหมายเลขรุ่นต่าง ๆ เป็นต้น ได้แก่คำสั่งต่อไปนี้
- uint16_t ESP.getVcc()
- uint32_t ESP.getChipId()
- uint32_t ESP.getFreeHeap()
- uint16_t ESP.getMaxFreeBlockSize()
- uint8_t ESP.getHeapFragmentation() รายงานผลเป็นหน่วยร้อยละ (%)
- ESP.getHeapStats(uint32_t* free = nullptr, uint16_t* max = nullptr, uint8_t* frag = nullptr)
- uint32_t ESP.getFreeContStack()
- ESP.resetFreeContStack()
- const char * ESP.getSdkVersion()
- String ESP.getCoreVersion()
- String ESP.getFullVersion()
- uint8_t ESP.getBootVersion()
- uint8_t ESP.getBootMode()
- uint8_t ESP.getCpuFreqMHz()
- uint8_t *ESP.random(uint8_t *resultArray, const size_t outputSizeBytes)
- uint32_t ESP.random()
- uint32_t ESP.getCycleCount()
- ESP.setDramHeap() เลือกใช้ฮีพจาก DRAM
- ESP.setIramHeap() เลือกใช้ฮีพจาก IRAM
- ESP.setExternalHeap() เลือกใช้ฮีพจากหน่วยความจำภายนอก
- ESP.resetHeap() กลับไปใช้ฮีพจากหน่วยความจำเริ่มต้น
คำสั่งเกี่ยวกับหน่วยความจำแฟลช
รายการคำสั่งที่เกี่ยวข้องกับหน่วยความจำแฟลชของไมโครคอนโทรลเลอร์มีดังนี้
- uint32_t ESP.getFlashChipId()
- uint8_t ESP.getFlashChipVendorId()
- uint32_t ESP.getFlashChipRealSize()
- uint32_t ESP.getFlashChipSize()
- uint32_t ESP.getFlashChipSpeed()
- FlashMode_t ESP.getFlashChipMode()
- uint32_t ESP.getFlashChipSizeByChipId()
- uint32_t ESP.magicFlashChipSize(uint8_t byte)
- uint32_t ESP.magicFlashChipSize(uint8_t byte)
- FlashMode_t ESP.magicFlashChipMode(uint8_t byte)
- bool ESP.checkFlashConfig(bool needsEquals = false)
- bool ESP.checkFlashCRC()
- bool ESP.flashEraseSector(uint32_t sector)
- bool ESP.flashWrite(uint32_t address, const uint32_t *data, size_t size)
- bool ESP.flashWrite(uint32_t address, const uint8_t *data, size_t size)
- bool ESP.flashRead(uint32_t address, uint32_t *data, size_t size
- bool ESP.flashRead(uint32_t address, uint8_t *data, size_t size)
- bool ESP.eraseConfig()
คำสั่งเกี่ยวกับโปรแกรม
รายการคำสั่งที่เกี่ยวข้องกับโปรแกรมหรือ Sketch มีดังนี้
- uint32_t ESP.getSketchSize()
- String ESP.getSketchMD5()
- uint32_t ESP.getFreeSketchSpace()
- bool ESP.updateSketch(Stream& in, uint32_t size, bool restartOnFail = false, bool restartOnSuccess = true)
ตัวอย่างการใช้งาน เช่น
Serial.print("ESP.getBootMode(); ");
Serial.println(ESP.getBootMode());
Serial.print("ESP.getResetReason(); ");
Serial.println(ESP.getResetReason());
Serial.print("ESP.getResetInfo(); ");
Serial.println(ESP.getResetInfo());
Serial.print("ESP.getMaxFreeBlockSize(); ");
Serial.println(ESP.getMaxFreeBlockSize());
Serial.print("ESP.getHeapFragmentation(); ");
Serial.print(ESP.getHeapFragmentation());
Serial.println("%");
Serial.print("ESP.getFreeHeap(): ");
Serial.println(ESP.getFreeHeap());
Serial.print("ESP.getSdkVersion(); ");
Serial.println(ESP.getSdkVersion());
Serial.print("ESP.getBootVersion(); ");
Serial.println(ESP.getBootVersion());
Serial.print("ESP.getChipId(); ");
Serial.println(ESP.getChipId());
Serial.print("ESP.getFlashChipSize(); ");
Serial.println(ESP.getFlashChipSize());
Serial.print("ESP.getFlashChipRealSize(); ");
Serial.println(ESP.getFlashChipRealSize());
Serial.print("ESP.getFlashChipSizeByChipId(); ");
Serial.println(ESP.getFlashChipSizeByChipId());
Serial.print("ESP.getFlashChipId(); ");
Serial.println(ESP.getFlashChipId());
สรุป
ทั้งหมดนี้เป็นรายการคำสั่งต่าง ๆ ภายในคลาส ESP ซึ่งเป็นคลาสหลักของไมโครคอนโทรลเลอร์ esp8266 หวังว่าคงเป็นประโยชน์ในการศึกษาเพิ่มเติมต่อไป สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
- esp8266 / Arduino : ESP.h
(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-08-10, 2021-11-11