หน้าแรก ดูโปรเจกต์ทั้งหมด
Easy

โปรเจกต์ ESP 32 Elapsed Timer Alerting Framework

Timer interrupt framework ที่มีความยืดหยุ่นสูงและใช้งานได้ทั่วไป สำหรับการออกแบบ solution ที่ต้องการ individual elapsing และ separate timers จำนวนหนึ่งหรือหลายตัว

โปรเจกต์ ESP 32 Elapsed Timer Alerting Framework

รายการอุปกรณ์และเครื่องมือ

รายละเอียดและวิธีทำ

บทนำ

คุณเคยจำเป็นต้องออกแบบ sketches โดยใช้ timers ตัวเดียวหรือหลายตัวบ้างไหม? บทความนี้จะนำเสนอเรื่อง timer interrupts ของ ESP 32 ที่นักออกแบบสามารถเข้าถึงได้ง่าย เพื่ออธิบายโครงงานที่สามารถนำไปใช้สร้างโซลูชันที่ต้องการ timers หนึ่งตัวหรือหลายตัว โดยแต่ละตัวมีวัตถุประสงค์เฉพาะเจาะจง ไม่ว่าจะเป็น timers แบบทำงานครั้งเดียวหรือแบบทำงานซ้ำ

วิธีการนั้นตรงไปตรงมามาก - เพียงแค่กำหนดความต้องการของ timer ของคุณ, สร้าง timers และเขียนโค้ดที่เหมาะสมกับความต้องการของคุณ เพื่อตัดสินใจว่าต้องทำอะไรเมื่อ timers ครบกำหนด

คำที่โครงงานนี้ใช้เรียก timers ที่ผู้ใช้กำหนดเมื่อครบกำหนดเวลาคือ Elapsed Timer Alerting หรือ Elapsed Timer Alerts (ETAs) โดยทุกๆ ETA ที่คุณกำหนดจะระบุถึง:

  • ประเภทของมัน (one-off หรือ recurring),
  • ETA alert ID (ค่าเฉพาะที่ระบุตัวตนของ ETA เพื่อให้สามารถใช้ในการควบคุมการตัดสินใจเมื่อ ETA นั้นครบกำหนดเวลาแล้ว) และ
  • การนับถอยหลังเวลาที่ผ่านไปในหน่วย milliseconds (เวลาที่จะต้องผ่านไปตั้งแต่การสร้าง/เริ่มต้นใหม่ จนกระทั่งมีการแจ้งเตือนเกิดขึ้น)

โครงงานนี้ใช้แนวทางพื้นฐานในการกำหนดและประมวลผล timer interrupts บนไมโครคอนโทรลเลอร์ ESP 32 (ดู sketch พื้นฐานในตัวอย่างที่ 1 ด้านล่าง) ซึ่งถูกนำมาปรับแต่งเพื่อให้ timer interrupts สามารถประมวลผลตาม ETAs ที่เรากำหนด และยังทำงานแบบ asynchronously กับกระบวนการ interrupt ได้ด้วย

เราจะมาดูตัวอย่างในแต่ละกรณีทั้ง 3 อย่างคร่าวๆ ดังนี้:

1. ตัวอย่างพื้นฐานของ ESP 32 timer interrupt ซึ่งสามารถหาได้ทั่วไปบนอินเทอร์เน็ต,
2. โครงงาน ETA พื้นฐานของ ESP 32 ที่ถูกลดทอนเหลือเพียงการกำหนดค่าเริ่มต้นแบบสำเร็จรูป (OOTB) นี่คือจุดเริ่มต้นสำหรับการใช้โครงงาน ETA สำหรับโปรเจกต์ของคุณ และ
3. ตัวอย่างสมมติของการกำหนดค่าโครงงาน ETA แบบ OOTB เพื่อสร้างสิ่งที่มีประโยชน์ เราจะมาดูระบบสภาพแวดล้อมในบ้านสำหรับควบคุมต้นไม้ที่บอบบาง โดยคอยติดตามอุณหภูมิ, ความชื้น, ระดับแสง และความชื้นในดิน นอกจากนี้ เราจะเพิ่มสิ่งอื่นๆ เข้าไปด้วย เช่น heartbeat ของ sketch เพื่อแสดงว่าไมโครคอนโทรลเลอร์กำลังรัน sketch ของเราอยู่ และ statistics module เพื่อรายงานสถิติพื้นฐานผ่าน serial monitor เป็นระยะ sketch นี้เป็นเพียงตัวอย่างว่าโครงงาน ETA สามารถกำหนดค่าสำหรับวัตถุประสงค์เฉพาะได้อย่างไร

ความถี่ของ timer interrupt สำหรับโครงงานนี้ถูกตั้งไว้ที่ 1 millisecond เหตุผลที่เลือกค่านี้เพื่อให้โครงงานรองรับนักพัฒนาในวงกว้างที่อาจไม่ต้องการความถี่ที่สูงมากนัก อย่างไรก็ตาม ความถี่ 1 millisecond ไม่มีอะไรพิเศษ - สามารถเปลี่ยนได้ตามต้องการ แต่หากเปลี่ยน โปรดตระหนักว่าค่าช่วงเวลาที่ผ่านไปของ ETA จะมีค่าหรือความหมายที่เปลี่ยนไป ซึ่งต้องนำมาพิจารณาเมื่อกำหนด ETAs ด้วย

โครงงาน ETA นี้พัฒนาขึ้นโดยใช้ไมโครคอนโทรลเลอร์ ESP 32S 30 pin WROOM และ Arduino IDE การเลือก Board ใน IDE คือ "DOIT ESP32 DEVKIT V1" การเชื่อมต่อ ESP 32 ใช้สาย USB ตามมาตรฐาน และไม่มี schematics ที่เกี่ยวข้อง - มันเป็นโครงงานที่พร้อมสำหรับการนำไปปรับแต่งเป็นโซลูชันหรือโปรเจกต์

สุดท้ายนี้ หากผู้อ่านปรารถนาจะนำโครงงานนี้ไปใช้กับไมโครคอนโทรลเลอร์ Arduino (AVR) จะต้องทำการเปลี่ยน ESP timer interrupt ISR, คำจำกัดความ และการตั้งค่า ให้เป็นโค้ด Arduino ISR timer ที่เหมาะสมกับ Board ปลายทาง หากคุณสนใจ แหล่งข้อมูลที่มีประโยชน์สำหรับการตั้งค่า Arduino timer interrupts สำหรับไมโครคอนโทรลเลอร์ (AVR board) และความถี่ interrupt เฉพาะ สามารถดูได้ที่:

Arduino Slovakia - AVR Timer Interrupts Calculator

ซึ่งคุณสามารถคัดลอกและวางโค้ด interrupt timer และการตั้งค่าที่ถูกต้องลงใน sketch ได้ทันที

ตัวอย่างที่ 1: พื้นฐาน ESP 32 Timer Interrupt

ตัวอย่างที่ 1 แสดง sketch พื้นฐานสำหรับการกำหนดหนึ่งใน interrupt timers ของ ESP 32 คือ timer 0 ซึ่งมีให้ใช้งานทั้งหมด 4 ตัว (0-3) โดย sketch นี้จะใช้ timer 0 เป็นค่าเริ่มต้น ซึ่งถูกตั้งค่าไว้สำหรับ 1 millisecond timer interrupts

คุณจะเห็นว่ามีการใช้ interrupt function เพื่อเพิ่มค่า interrupt count ทุกครั้งที่ timer interrupt ทำงาน เนื่องจาก interrupt timer ถูกตั้งค่าไว้ที่ 1 millisecond ค่า interrupt count จะเพิ่มขึ้นทุกๆ 1 millisecond ดังนั้น main loop จะรายงานการอัปเดตไปยัง serial monitor ทุกๆ 1000 timer interrupts หรือทุกๆ 1 วินาที

นั่นคือทั้งหมด นี่คือพื้นฐานสำหรับการออกแบบและโครงสร้างของโครงงาน ETA

หากคุณต้องการทำความเข้าใจอย่างลึกซึ้งเกี่ยวกับกลไกของ timer interrupts ใน ESP 32 อินเทอร์เน็ตมีแหล่งข้อมูลมากมาย ซึ่งเรื่องนี้อยู่นอกเหนือขอบเขตของบทความนี้

ตัวอย่างที่ 2: โครงงาน ETA พื้นฐาน

โครงงาน ETA พื้นฐานใช้ sketch ในตัวอย่างที่ 1 เป็นจุดเริ่มต้น โดยเพิ่มฟังก์ชันและคำจำกัดความที่เราสามารถนำไปใช้สร้างแอปพลิเคชันที่ทำงานบนพื้นฐานของ timer ได้

ก่อนที่เราจะดูฟังก์ชันหลักและคำจำกัดความของโครงงาน เราจำเป็นต้องเข้าใจก่อนว่าโครงงานนี้ทำงานอย่างไร:

  • เป็นไปได้ที่จะกำหนด elapsing timers แยกย่อยกี่ตัวก็ได้ โดยแต่ละตัวเราสามารถกำหนด ID เฉพาะ หรือ 'ETA alert ID' ได้ตั้งแต่ 0 ถึง 65, 535 (unsigned 16 bit word)
  • เราสามารถสร้าง ETA ให้เป็นแบบ one-off timer หรือ recurring timer ได้ โดย One-off ETA timers จะถูกลบโดยอัตโนมัติเมื่อครบกำหนดเวลา ส่วน Recurring ETA timers จะถูกรีเซ็ตโดยอัตโนมัติและทำงานต่อไปตามที่กำหนดไว้
  • เมื่อ ETA timer ครบกำหนดเวลา มันจะถูกเพิ่มเข้าไปในรายการของ elapsed timers ซึ่งจะถูกประมวลผลภายใน main loop โดยโค้ดของผู้ใช้ วิธีนี้ช่วยให้เราสามารถแยกการทำงานของ timer ISR ออกจากโค้ดหลักได้ จึงเป็นการออกแบบเชิง asynchronous
  • main loop จะตรวจสอบอย่างต่อเนื่องว่ามี timer interrupts ที่ค้างอยู่เพื่อรอการประมวลผลหรือไม่ และสำหรับแต่ละ interrupt ที่ยังไม่ได้ประมวลผล มันจะทำการประมวลผล ETAs ของเรา - โดยลดค่า countdown intervals ลงทีละ 1 millisecond เมื่อ ETA ครบกำหนดเวลา มันจะถูกเพิ่มเข้าไปในรายการ elapsed ETA alert จากนั้นรายการ elapsed ETA alert จะถูกประมวลผลอย่างต่อเนื่องจนกว่า elapsed ETAs ทั้งหมดจะถูกจัดการ
  • โค้ดของผู้ใช้จะถูกออกแบบมาเพื่อประมวลผล elapsed ETAs ตาม ETA alert ID ที่ได้รับมอบหมายในระหว่างขั้นตอนการสร้าง กลไกนี้ช่วยให้เราสามารถกำหนดค่าการออกแบบ sketch ด้วย ETAs เฉพาะจำนวนมากตามที่เราต้องการเพื่อนำไปกำหนดค่าและประมวลผล คุณจะเห็นว่าโครงงานนี้และตัวอย่างที่ 3 ใช้แนวทาง switch/case ในการประมวลผล elapsed ETAs แต่นั่นก็ไม่ใช่เรื่องพิเศษอะไร คุณสามารถออกแบบตามที่คุณต้องการได้ - ETA alert ID คือตัวบอกเราว่า ETA ตัวไหนที่ครบกำหนดเวลาแล้ว
  • ผมควรระบุด้วยว่าโครงงานนี้อนุญาตให้ใส่โค้ดที่ไม่ใช่ ETA ไว้ภายใน main loop ได้ด้วย ด้วยความถี่ 1 millisecond interrupt timer เมื่อไม่ได้ประมวลผล ETAs ตัว sketch จะมี 'down-time' ค่อนข้างมาก ซึ่งในช่วงเวลานั้นมันสามารถทำสิ่งอื่นๆ ได้ เช่น กระบวนการ IOT และอื่นๆ

จากค่าเริ่มต้น (OOTB) โครงงานนี้มี ETA ที่กำหนดไว้หนึ่งตัว คือ heartbeat ที่ทำงานที่ความถี่ 1 Hz (คือทุกๆ 500 milliseconds) ซึ่งจะกะพริบ LED บน Board ของ ESP (โดยปกติคือ GPIO 2) วัตถุประสงค์คือเพื่อแสดงว่า sketch กำลังทำงานอยู่ แต่สามารถนำออกได้หากต้องการโดยไม่มีผลกระทบต่อการออกแบบ

การออกแบบ main loop ของโครงงานเป็นไปตามโครงสร้างนี้ (pseudo code):

 main loop{  
read current timer interrupt count;
while (current interrupt timer > 0) {
update_ETAs();
while (elapsed ETAs in elapsed list) {
switch by ETA alert id {
case heart_beat:
toggle onboard LED;
case ETA_alert_id_1:
process this timer alert for this alert id;
case ETA_alert_id_2:
process this timer alert for this alert id;
...
case ETA_alert_id_n:
process this timer alert for this alert id;
default:
process default handling;
}
}
}
process any non-timer based needs here, e.g. IOT;
}

pseudo code ด้านบนแสดง main loop ที่มีการออกแบบ switch/case เพื่อประมวลผลแต่ละ ETAs ที่กำหนดไว้ (ETA_alert_id_1,..., ETA_alert_id_n)

การกำหนดจำนวน ETAs ที่ sketch จะรองรับ

โครงงานนี้สามารถจัดการ ETAs ได้มากเท่าที่เราต้องการ อย่างไรก็ตาม เราจำเป็นต้องระบุจำนวนนี้เพื่อให้สามารถจัดสรรทรัพยากรได้อย่างเหมาะสม ซึ่งทำได้ง่ายมาก - เพียงแค่หา macro 'max_ETAs' และระบุจำนวน ETAs ที่จะถูกกำหนดค่า ตัวอย่างเช่น ในค่าเริ่มต้น OOTB จะเป็นดังนี้:

// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// % Elapsed Time Alert(s) declarations and functions %
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#define max_ETAs 1 // User defined - at least 1, the heartbeat

OOTB ของโครงงานถูกจัดเตรียมมาพร้อมกับ ETA ที่ทำสำเร็จรูปมาให้แล้วหนึ่งตัว คือ heartbeat monitor

คราวนี้มาดูฟังก์ชันหลักของโครงงานที่คุณจะได้ใช้งาน:

การสร้าง ETA - ฟังก์ชัน: create_ETA

ฟังก์ชันนี้ช่วยให้เราสร้าง ETAs ในประเภท, alert ID และช่วงเวลาที่ต้องการได้ ฟังก์ชันมี 3 parameters คือ ETA_type, ETA_alert_id และ ETA_interval (ช่วงเวลาที่ครบกำหนดในหน่วย milliseconds) ดังนี้:

  • ETA_type - 'one_off_ETA' หรือ 'recurring_ETA'
  • ETA_alert_id - ค่าที่ผู้ใช้กำหนดในช่วง 0 ถึง 65, 535
  • ETA_interval - เวลาที่ครบกำหนดของการแจ้งเตือนที่ผู้ใช้ระบุในหน่วย milliseconds

ความสำเร็จหรือความผิดพลาดของการเรียกฟังก์ชันสามารถตรวจสอบได้ - มันจะส่งคืนหนึ่งในหลายสภาวะซึ่งสามารถจัดการได้ตามต้องการ:

  • Success - สร้าง/แทรก ETA ลงในตาราง ETA สำเร็จ - 'ETA_inserted'
  • Failure 1 - พยายามสร้างเกินจำนวนสูงสุดของ ETAs ที่กำหนดไว้ ('max_ETAs') - 'ETA_insert_failure'
  • Failure 2 - ประเภท ETA ไม่ถูกต้อง ต้องเป็น 'one_off_ETA' หรือ 'recurring_ETA' เท่านั้น
  • Failure 3 - ETA ซ้ำซ้อน มีอยู่ในตาราง ETA อยู่แล้ว โปรดทราบว่า ETA จะถือว่าซ้ำกันหากมี ทั่ง ETA type และ ETA alert ID เดียวกัน - 'ETA_duplicate'

เพื่อช่วยในการเขียนโค้ดที่อธิบายตัวเองได้ (self-documenting code) แต่ละสภาวะข้างต้นถูกกำหนดเป็น macro ไว้ดังนี้:

#define one_off_ETA            1
#define recurring_ETA 2
#define ETA_inserted 1 // positive result for success
#define ETA_insert_failure -1 // negative result for failure
#define ETA_invalid_type -2 // ditto
#define ETA_duplicate -3 // ditto

ตัวอย่าง:

if(create_ETA(recurring_ETA, 102, 500) !=ETA_inserted){
}

ในที่นี้เราสร้าง recurring ETA timer พร้อมกับ alert ID 102 และ elapse interval 500 milliseconds

ในกรณีที่การออกแบบต้องการกำหนด ETAs จำนวนมาก วิธีที่ดีกว่าคือการตั้งค่า multidimensional array เพื่อเก็บ parameters ของ ETA เช่น สำหรับแต่ละ ETA จะระบุ ETA type, ETA alert ID และ ETA elapse time ในหน่วย milliseconds (ดูใน sketch ตัวอย่างที่ 3) ตัวอย่างเช่น:

...
define max_ETAs 5
unsigned int my_ETA_data[max_ETAs][3] = {
one_off_ETA, 99, 5000, // 5 second interval
recurring_ETA, 57, 50, // 1/20 second interval
recurring_ETA, 17, 250, // 1/4 second interval
one_off_ETA, 127, one_hour,// one hour interval
recurring_ETA, 1, one_day
};
...

โครงงานแบบ OOTB ได้รวม array ด้านบนและกำหนดไว้เพียงหนึ่งรายการ คือสำหรับ heartbeat monitor ให้ใช้ array นี้เพื่อเพิ่มคำจำกัดความ ETA ของคุณเอง เนื่องจากมันจะช่วยให้ฟังก์ชัน setup() สร้างพวกมันให้คุณโดยไม่ต้องเขียนโค้ดเพิ่มเติม ข้อสังเกตคือค่า 'one_hour' และ 'one_day' เป็น macros ที่ถูกกำหนดไว้แล้ว - ดูด้านล่าง

การลบ ETA ที่มีอยู่ - ฟังก์ชัน: delete_ETA

เช่นเดียวกับที่เราสามารถสร้าง ETAs เราก็สามารถลบพวกมันได้ด้วยการเขียนโปรแกรม กระบวนการนี้ตรงไปตรงมาและใช้ฟังก์ชัน delete_ETA ฟังก์ชันนี้มีเพียงสอง parameters คือ 'ETA_type' และ 'ETA_Alert_id' โดย parameters เหล่านี้มีความหมายและคำจำกัดความเช่นเดียวกับข้างต้น โปรดดูที่ create_ETA

ความสำเร็จหรือความล้มเหลวของกระบวนการลบสามารถตรวจสอบได้ - ฟังก์ชันจะส่งคืนหนึ่งในสองค่า คือ 'ETA_deleted' หรือ '!ETA_deleted' อีกครั้ง 'ETA_deleted' คือการกำหนด macro (กำหนดเป็น true) และสามารถนำไปใช้เพื่อช่วยให้โค้ดอธิบายตัวเองได้ในทำนองเดียวกัน

...
if(delete_ETA(recurring_ETA, 17) == ETA_deleted){
// ETA deleted
...
}

โปรดทราบว่า แม้ว่า ETAs จะถูกกำหนดไว้ล่วงหน้าและสร้างขึ้นในช่วงเริ่มต้น/initialisation ของ sketch แต่ก็ไม่มีเหตุผลใดที่จะสร้าง/ลบพวกมันแบบไดนามิกผ่านการเขียนโปรแกรมในระหว่างที่ sketch ทำงาน โดยต้องแน่ใจเสมอว่าจำนวนรวมของ ETAs ที่กำหนดอยู่ในปัจจุบันมีค่า <= จำนวนสูงสุดของ ETAs ที่ sketch ถูกกำหนดค่าไว้

การพิมพ์ตาราง ETA - ฟังก์ชัน: print_ETAs

มีอีกหนึ่งฟังก์ชันสำหรับผู้ใช้ที่คุณอาจพบว่ามีประโยชน์ในระหว่างการ debugging และการทดสอบ คือ print_ETAs

ฟังก์ชันนี้ไม่มี parameters และจะพิมพ์สถานะปัจจุบันของตาราง ETA ออกมาทาง serial monitor (ตั้งค่าไว้ที่ 115200 baud โดยค่าเริ่มต้น) เพื่อยืนยันว่า ETAs ของคุณถูกกำหนดไว้ตามที่คุณตั้งใจไว้ มันไม่มีความจำเป็นหลังจากขั้นตอนการพัฒนาและสามารถนำออกได้ในภายหลัง ตัวอย่างเช่น:

...
print_ETAs();
...

ตัวอย่าง output จาก OOTB sketch (heartbeat ETA):

ETA entry = 0
ETA_type = recurring ETA
ETA_alert_id = 2
ETA_interval = 500
ETA_count_down = 500

ทรัพยากรข้อมูลอื่นๆ ที่อาจเป็นประโยชน์

มีการจัดเตรียม macro definitions จำนวนหนึ่งที่อาจเป็นประโยชน์ โดยกำหนดช่วงเวลามาตรฐานเป็นหน่วย milliseconds:

// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// % Data specific to this use of the ETA framework for this example %
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// These macros can be used for creating ETAs and are provided
// for convenience of programming standard intervals, as required.
// They may be modified to achieve the desired count down frequencies,
// for example 2 * one_second, 5 * minute + 500, etc (all in milliseconds)
//
const uint32_t one_day = 86400000; // millisecs in 24 hours
const uint32_t one_hour = 3600000; // millisecs in 1 hour
const uint16_t one_minute = 60000; // millisecs in 1 minute
const uint16_t one_second = 1000; // millisecs in 1 second

ตัวอย่างเช่น:

...
create_ETA(one-off_ETA, 5, one_hour);
...

อีกครั้ง วัตถุประสงค์ในที่นี้คือเพื่อช่วยสร้างโค้ดที่อธิบายตัวเองได้

ฟังก์ชันอื่นที่น่าสนใจ

เพื่อความครบถ้วน ฟังก์ชันต่อไปนี้ควรค่าแก่การสังเกต แต่ ไม่ ได้มีไว้เพื่อให้ผู้ใช้ปลายทางไปกำหนดค่าหรือใช้งานนอกเหนือจากที่โครงงานออกแบบไว้:

create_and_start_timer - ฟังก์ชันนี้ถูกเรียกในระหว่างกระบวนการ setup() และจะทำงาน หลังจาก ที่ ETAs ทั้งหมดของคุณถูกสร้างขึ้นแล้วเท่านั้น มันจะทำการตั้งค่าและเริ่มทำงาน ESP timer 0 (default_timer)
update_ETAs - ถูกเรียกใน main loop สำหรับทุกๆ timer interrupt ที่ค้างอยู่ ฟังก์ชันจะประมวลผลแต่ละ ETA ที่กำหนดไว้โดยลดค่า countdowns จนกว่าจะถึง 0 เมื่อถึง 0 รายการจะถูกเพิ่มเข้าไปใน ETA alert list และ ETA นั้นจะถูกลบออก (one_off_ETA) หรือเริ่มต้นใหม่ (recurring_ETA)
clear_ETAs - ล้างตาราง ETA ก่อนการตั้งค่า
get_ETA_alert - ถูกเรียกใน main loop ฟังก์ชันนี้ใช้สำหรับประมวลผล ETA alert list (ที่สร้างขึ้นโดยกระบวนการ update_ETAs) โดยลบ ETA alert ทีละรายการและตั้งค่า ETA type และ ETA alert ID ในตัวแปรท้องถิ่น ซึ่งสามารถนำไปใช้ในโค้ด main loop เพื่อควบคุมการตัดสินใจว่าจะทำอะไรกับการแจ้งเตือนนั้น การประมวลผลรายการจะดำเนินต่อไปจนกว่ารายการจะว่างเปล่า หลังจากนั้นโครงสร้างจะวนกลับไปตรวจสอบอีกครั้งว่ามี timer interrupts เกิดขึ้นเพิ่มเติมหรือไม่ และเป็นเช่นนี้ต่อไปเรื่อยๆ

ตัวอย่าง ETA Sketch สำหรับการควบคุมสภาพแวดล้อมในบ้าน, ตัวอย่างที่ 3

เพื่อให้เห็นภาพว่าโครงงานนี้สามารถนำไปใช้งานได้อย่างไร ตัวอย่างที่ 3 ได้จัดเตรียม sketch ที่จำลองโปรเจกต์สภาพแวดล้อมในบ้านเพื่อตรวจสอบสภาวะต่างๆ เช่น ในเรือนกระจก - โดยทำการทดสอบอุณหภูมิ, แสงสว่าง, ความชื้น และความชื้นในดินเป็นระยะ ซึ่งตัวอย่างนี้มีไว้เพื่อเป็นแนวทางที่น่าสนใจเท่านั้น

บทสรุป

ผมหวังว่าคุณจะพบว่าบทความนี้น่าสนใจ (และมีประโยชน์?) Timer interrupts มักเป็นเรื่องลึกลับสำหรับหลายๆ คน และผมได้พยายามทำให้แน่ใจว่าโครงงานนี้ช่วยให้นักพัฒนาสามารถมุ่งเน้นไปที่ความต้องการในการกำหนด timers ของตนเองได้ โดยไม่สูญเสียความสามารถในการปรับแต่ง

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: esp-32-elapsed-timer-alerting-framework-0e4593
2450 บาท
PromptPay QR Code

Verified user reviews

รีวิวและความคิดเห็นจากผู้ใช้จริง

ล็อกอินด้วยบัญชีบนเว็บนี้แล้วให้คะแนนหรือคอมเมนต์ได้เลย ระบบเก็บผ่าน Supabase ไม่ต้องใช้ GitHub แล้ว

กำลังโหลดรีวิว...