ฉันสร้างสถานีตรวจอากาศ Arduino ที่ใช้งานได้อย่างสมบูรณ์ได้อย่างไร
เผยแพร่แล้ว: 2022-03-11UPDATE: การทำงานกับสถานีตรวจอากาศ Arduino ของเรายังคงดำเนินต่อไปหลังจากที่บทความนี้ถูกตีพิมพ์ ส่งผลให้มีการเปิดตัว Open Weather Station (OWS) ตรวจสอบการอัปเดตเพิ่มเติม ทรัพยากร พร้อมด้วยรหัสและบทช่วยสอนใหม่
ทั้งหมดนี้เกี่ยวกับอะไร?
Kitesurfing เป็นหนึ่งในกีฬาที่น่าติดตามที่สุดในโลก สิ่งที่ต้องมีคือกระดานไคท์บอร์ด แหล่งน้ำ และอุปกรณ์เสริมบางอย่าง เป็นวิธีที่ยอดเยี่ยมในการติดต่อกับธรรมชาติ ปลดปล่อยจิตใจ และออกกำลังกาย นอกจากนี้คุณยังสามารถคลั่งไคล้มันได้จริงๆ
แล้วมีปัญหาอะไรไหม?
ฉันลืมข้อกำหนดสำคัญอย่างหนึ่ง: ลม และนั่นคือปัญหาของเรา: คุณไม่มีทางรู้ว่าจะมีลมหรือไม่ เว้นแต่คุณจะอาศัยอยู่ใกล้กับจุดไคท์เซิร์ฟที่คุณชื่นชอบ
ฉันอาศัยอยู่ในคอร์โดบา ประเทศอาร์เจนตินา ห่างจากทะเลสาบที่ฉันเล่นว่าวประมาณ 130 กิโลเมตร (~80 ไมล์) นั่นคือเวลาขับรถประมาณสองชั่วโมง ซึ่งฉันสามารถรับมือได้ แต่ฉันไม่สามารถรับมือกับข้อเท็จจริงที่ว่าพยากรณ์อากาศไม่ถูกต้อง และที่ที่ฉันอาศัยอยู่ ลมแรงดีใช้เวลาเพียงสองสามชั่วโมง สิ่งสุดท้ายที่คุณต้องการทำคือเคลียร์ตารางวันจันทร์เพื่อไปเล่นไคท์เซิร์ฟและพบว่าตัวเองสาปแช่งเทพเจ้าในทะเลสาบที่ไม่มีลมแรงหลังจากขับรถมาสองชั่วโมง
ฉันต้องการทราบสภาพลมของจุดเล่นไคท์เซิร์ฟที่ฉันชอบแบบเรียลไทม์ ดังนั้นฉันจึงตัดสินใจสร้างสถานีตรวจอากาศของตัวเอง
การวัดสภาพอากาศแบบเรียลไทม์—ในสภาพแวดล้อมที่ไม่เป็นมิตร
เป้าหมายคือการส่งข้อมูลสภาพอากาศแบบเรียลไทม์ไปยังเบราว์เซอร์ที่บ้าน:
ก่อนที่ฉันจะเจาะจงในรายละเอียด เรามาใช้เวลาสักครู่เพื่อพิจารณาคำถามสำคัญและคำเตือนที่เกี่ยวข้องกับโครงการดังนี้:
- ฉันจะสร้างสถานีตรวจอากาศที่ไม่มีคุณค่าและไม่น่าสนใจสำหรับขโมยได้อย่างไร
- ฉันจะรักษาต้นทุนฮาร์ดแวร์และเวลาในการพัฒนาให้เหลือน้อยที่สุดได้อย่างไร
- ฉันจะวัดและเข้าถึงข้อมูลสภาพอากาศแบบเรียลไทม์และแสดงผลอย่างมีประโยชน์ได้อย่างไร
- การวัดที่ต้องการ: ลมและลมกระโชก ทิศทางลม ฝน ความกดอากาศ อุณหภูมิ ความชื้น
- เชื่อมต่อสถานีกับอินเทอร์เน็ต
- จัดเก็บและเรียกข้อมูลสภาพอากาศในท้องถิ่น
- สื่อสารระหว่างสถานีตรวจอากาศและเซิร์ฟเวอร์
- ฉันจะลดการบำรุงรักษาให้เหลือ (เกือบ) เป็นศูนย์ได้อย่างไร
- จัดการการหยุดทำงานของซอฟต์แวร์
- จัดการการสูญเสียการเชื่อมต่อ
- จัดการการสูญเสียแหล่งพลังงาน
ทักทายเพื่อนตัวน้อยของฉัน!
คุณอาจคิดว่ามีถุงมือเพื่อทำให้สถานีดูเป็นมิตรมากขึ้น แต่แท้จริงแล้วใช้เพื่อทดสอบเซ็นเซอร์ความกดอากาศ (ความดันของถุงมือจะเพิ่มขึ้นภายในถุงมือที่เป่าลม) ทางด้านขวา คุณจะเห็นสถานีในตำแหน่งสุดท้ายซึ่งอยู่บนหอคอยใกล้เคียง
ฉันยังออกแบบและตั้งโปรแกรมเว็บไซต์เกี่ยวกับไคท์เซิร์ฟ ซึ่งรวมถึงพล็อตการวัดแบบเรียลไทม์ของสถานีเพื่อช่วยชุมชนไคท์เซิร์ฟ ในที่สุดฉันก็สร้างกลุ่ม kitesurfing บน Facebook
ที่น่ากลัว! แล้วคุณทำได้อย่างไร?
ฉันจะพูดถึงแต่ละประเด็นในทางกลับกัน:
“ฉันจะสร้างสถานีตรวจอากาศที่ไม่มีคุณค่าหรือน่าดึงดูดสำหรับขโมยได้อย่างไร”
นี่เป็นปัจจัยสำคัญ และในหลาย ๆ ด้าน ได้ขับเคลื่อนกระบวนการออกแบบที่เหลือ สถานีที่สร้างไว้ล่วงหน้าส่วนใหญ่ที่ต่ำกว่าเส้น $2000 ต้องการการเชื่อมต่อ USB กับคอมพิวเตอร์ ถ้าโจรรู้ตัวว่าสถานีมีพีซีอยู่ข้างๆ ก็คงจบสิ้น เพราะค่าใช้จ่ายในการเปลี่ยนคอมพิวเตอร์และสถานีจะสูงกว่างบประมาณส่วนตัวของฉัน ดังนั้นฉันจึงตัดสินใจทดสอบแพลตฟอร์มฮาร์ดแวร์หลายตัวเพื่อใช้งานสถานีตั้งแต่เริ่มต้นด้วยต้นทุนที่ต่ำลง
“ฉันจะรักษาต้นทุนฮาร์ดแวร์และเวลาในการพัฒนาให้เหลือน้อยที่สุดได้อย่างไร”
ฉันคนเดียวที่สนับสนุนค่าใช้จ่ายของโครงการด้านนี้และทำงานทั้งหมดในเวลาว่าง ดังนั้นแน่นอนว่านี่เป็นปัญหาใหญ่ ฉันเริ่มต้นด้วย PIC32 ยอดนิยมและโมดูลอีเทอร์เน็ตไมโครชิปที่ประกอบไว้ล่วงหน้าบางตัว แต่ต้นทุนไม่ต่ำอย่างที่ฉันคาดไว้และมีค่าใช้จ่ายมากเกินไปในการประกอบและขยายฮาร์ดแวร์ จากนั้นฉันก็เริ่มมองหา Arduino: ฮาร์ดแวร์และซอฟต์แวร์โอเพ่นซอร์สสำหรับการสร้างต้นแบบอิเล็กทรอนิกส์โดยใช้ภาษา C นี่คือสิ่งที่ฉันต้องการ และฉันสามารถซื้อโมดูลบน DealeXtreme ได้ ฉันสามารถเริ่มเล่นด้วยค่าใช้จ่ายเพียง 15 ดอลลาร์และใช้เวลาสองวัน
แน่นอน Arduino ก็มีข้อจำกัดเช่นกัน: RAM เพียง 2KBytes และ 32Kbytes สำหรับซอฟต์แวร์ที่คอมไพล์ของฉัน—ซึ่งไม่เหลือที่ว่างมากสำหรับสตริงแฟนซีหรือตัวแปรที่ไร้ประโยชน์ 1
“ฉันจะวัดและเข้าถึงข้อมูลสภาพอากาศแบบเรียลไทม์และแสดงผลอย่างมีประโยชน์ได้อย่างไร”
ปัจจุบัน สถานีของฉันสามารถวัดความเร็วลม ลมกระโชกแรง ทิศทางลม อุณหภูมิ ความชื้น ฝน และความกดอากาศได้ ห้องสมุดสองแห่งจัดการอุณหภูมิ ความชื้น และความดัน ซึ่งทำให้ชีวิตง่ายขึ้นมาก
การวัดความเร็วลมและปริมาณน้ำฝนนั้นค่อนข้างยุ่งเหยิง เซ็นเซอร์ทำงานโดยการเปิดและปิดสวิตช์ (สวิตช์กก) ดังนั้น ฉันจำเป็นต้องใช้ฮาร์ดแวร์ขัดจังหวะเพื่อจับเซ็นเซอร์ทันทีที่ทริกเกอร์อินพุต นั่นคือฉันต้องเรียกวิธีการบางอย่าง:
attachInterrupt(RAINGAUGE_PIN, countRainCycles, FALLING);
การขัดจังหวะนี้จะทำลายการเรียกใช้โค้ดตามปกติและเรียกใช้ฟังก์ชัน countAnemometerCycles หรือ countRainCycles ทันทีที่สวิตช์สัมผัสกับขอบที่ตกลงมา ซึ่งเกิดจากการปิดหรือเปิดวงจร ตัวแปรสองสามตัวจะเพิ่มขึ้นในแต่ละทริกเกอร์ของสวิตช์ (หลังจากนั้น คุณจะชั่งน้ำหนักตัวแปรเหล่านี้เพื่อพิจารณาการแปลงหน่วย)
void countRainCycles() { rainCyclesCounter++; // This is easy! And it actually works. }
แต่ไม่เร็วนัก! กระบวนการนี้สร้างทริกเกอร์เท็จหลายร้อยรายการอันเป็นผลมาจากเอฟเฟกต์การตีกลับของสวิตช์ที่มีอยู่ในสวิตช์ฮาร์ดแวร์ใดๆ โชคดีที่มีทั้งฮาร์ดแวร์และซอฟต์แวร์แก้ไขปัญหานี้
เกี่ยวกับเอฟเฟกต์กระเด้ง
ผลกระทบจากการกระเด้งเกิดขึ้นจากการที่สวิตช์เปิดหรือปิด "หน้าสัมผัส" ทางกายภาพ ซึ่งทำให้เกิดการสัมผัสกับส่วนที่เหลือของวงจร เมื่อหน้าสัมผัสเริ่มแยก (เปิดสวิตช์) หรือรวมเข้าด้วยกัน (ปิดสวิตช์) อาจสร้างอาร์คไฟฟ้าขนาดเล็กบางส่วน รวมถึงความยืดหยุ่นทางกลในวงจรที่จะเปิดและปิดวงจรเป็นเวลาสองสามมิลลิวินาที เมื่อคุณพลิกสวิตช์ไฟ เอฟเฟกต์นี้จะไม่ปรากฏให้เห็น แต่เมื่อคุณแนบอินเตอร์รัปต์กับขอบสัญญาณตก เอฟเฟกต์การเด้งนี้จะทริกเกอร์การขัดจังหวะจำนวนมาก เพิ่มเติมที่นี่
ฉันใช้ทั้งวงจรดีบักฮาร์ดแวร์และซอฟต์แวร์เวอร์ชันที่คล้ายกัน แต่คุณจะใช้ซอฟต์แวร์ debounce ได้อย่างไร? ง่าย! หลังจากที่ทริกเกอร์ที่คาดไว้ครั้งแรกเกิดขึ้น ให้ "รอ" เวลาเพียงพอสำหรับการตีกลับก่อนที่จะเริ่มฟังการขัดจังหวะใหม่ สามารถทำได้ในสองสามบรรทัดของ C:
void countRainCycles() { if (nextTimeRainIterrupt == 0 || nextTimeRainIterrupt < millis()) { rainCyclesCounter++; // The interrupts counter nextTimeRainIterrupt = millis() + 100; // Wait 100msecs before next trigger } }
ฟังก์ชัน millis() จะคืนค่าเวลาดำเนินการปัจจุบัน หน่วยเป็นมิลลิวินาทีนับตั้งแต่เปิด Arduino นอกจากนี้ยังควรสังเกตด้วยว่าตัวแปรเหล่านี้ต้องถูกกำหนดให้เป็นตัวแปรเพื่อสั่งให้คอมไพเลอร์ไม่ปรับการทำงานให้เหมาะสมที่สุด และด้วยเหตุนี้จึงหลีกเลี่ยงค่าที่ไม่ถูกต้องระหว่างการขัดจังหวะของฮาร์ดแวร์

ยังไงก็ตาม ฉันต้องการสถานีเพื่อเก็บข้อมูลสะสมและส่งการวัดเหล่านี้ไปยังฐานข้อมูล MySQL เป็นระยะ ดังนั้นฉันจึงเพิ่มโมดูลอีเทอร์เน็ตที่มีช่องเสียบ SD เพื่อบันทึกค่าและดึงข้อมูลเมื่อใดก็ตามที่ผู้ใช้ (เซิร์ฟเวอร์) เชื่อมต่อกับสถานี ระหว่างการทดสอบที่บ้านด้วยการเชื่อมต่อ ADSL วิธีนี้ได้ผลดีอย่างน่าอัศจรรย์—แต่ผมเกือบหลุดมือเมื่อทดสอบ "ในสนาม" นี้กับอินเทอร์เน็ต 3G (โดยใช้โมเด็ม 3G) เนื่องจากสถานีจะสุ่มรีเซ็ตตัวเองเมื่อฉันพยายามดึงข้อมูล วัด! หลังจากการทดสอบครั้งสำคัญ ในที่สุดฉันก็พบว่าตัวอย่างที่มีให้ทั่วอินเทอร์เน็ตที่อธิบายข้อมูล "การให้บริการ" กับไคลเอนต์ที่เชื่อมต่อไม่ได้พิจารณาว่าการเชื่อมต่อนั้นไม่ดีจนการเชื่อมต่อกับไคลเอนต์อาจสูญเสียการส่งกลางแพ็คเก็ต ทำให้เกิด บัฟเฟอร์เอาต์พุตจะล้น แต่ทำไมการเชื่อมต่อที่หลุดจะทำให้เกิดบัฟเฟอร์ล้น? สมมติว่าเซสชันการส่งข้อมูลเริ่มต้นขึ้นและสถานีเริ่มเติมข้อมูลในบัฟเฟอร์เอาต์พุต ตามหลักการแล้ว ไคลเอนต์จะใช้บัฟเฟอร์นี้เร็วกว่าที่จะถูกเติม อย่างไรก็ตาม เมื่อเชื่อมต่อกับโมเด็ม 3G นี่ไม่ใช่กรณี! การเชื่อมต่อกับไคลเอนต์นั้นแย่เกินไป ดังนั้นบัฟเฟอร์จึงเต็มเร็วกว่าที่ใช้ ซึ่งทำให้ทั้งบัฟเฟอร์ล้นและการรีบูตสถานีอย่างกะทันหัน
เพื่อแก้ไขปัญหานี้ ฉันต้องเพิ่มฟังก์ชันให้กับไลบรารีอีเทอร์เน็ตที่มาพร้อมกับ Arduino ซึ่งมีลักษณะดังนี้:
int EthernetClient::free() { if (_sock != MAX_SOCK_NUM) return W5100.getTXFreeSize(_sock); return 0; }
จากนั้น ฉันสามารถตรวจสอบว่าไคลเอ็นต์มีที่ว่างในบัฟเฟอร์หรือไม่ก่อนที่จะพยายามเติมข้อมูลให้เต็ม:
while (file.available() > 0) { if (client.free() > 0) { // This was key to solving the issue c = file.read(); client.print((char)c); } else { // No free buffer? Ok, I'll wait a couple of millis... delay(50); } } file.close();
อย่างไรก็ตาม หากคุณสนใจที่จะเขียนโปรแกรม Arduino นี่คือคำแนะนำที่ดี
งานที่น่าสนใจอีกประการหนึ่งคือการนำบันทึก LIFO ไปใช้ ทำไมสิ่งนี้จึงจำเป็น? โดยทั่วไปแล้ว เมื่อฉันบันทึกการวัดลงในไฟล์ที่กำหนด วิธีการนั้นง่าย: เปิดไฟล์ ต่อท้ายตัวอย่างใหม่ต่อท้าย และปิดไฟล์ แต่สมมติว่าฉันต้องการดึงข้อมูลการวัดล่าสุด 1,000 รายการ โดยเรียงตามลำดับเวลา การวัดเหล่านั้นอยู่ที่ส่วนท้ายของไฟล์ ดังนั้นฉันควรเปิดไฟล์ ย้ายเคอร์เซอร์ไปที่จุดสิ้นสุด ส่งออกการวัดล่าสุด จากนั้นนำเคอร์เซอร์ของไฟล์กลับไปที่การวัดก่อนหน้าและผลลัพธ์ที่ได้โดยการหาตัวคั่นตัวอย่างเพื่อตรวจจับตำแหน่งที่จะเริ่มต้นและหยุด Arduino มี RAM หรือโปรเซสเซอร์ไม่เพียงพอที่จะดำเนินการตามกระบวนการนี้ได้อย่างรวดเร็ว ดังนั้นฉันจึงต้องการแนวทางอื่น แต่ฉันตัดสินใจส่งออกไฟล์ในลำดับที่กลับกันไปยังเซิร์ฟเวอร์ จากนั้นเปลี่ยนตัวอักษรสตริงกลับมาที่ฝั่งเซิร์ฟเวอร์:
unsigned long filePosition = file.size(); file.seek(filePosition); while (filePosition >= 0) { if (client.free() > 0){ file.seek(filePosition); c = file.peek(); if (c != -1) { client.print((char)c); } if (filePosition <= 0) { break; } filePosition--; } }
ด้วยประสบการณ์ในฐานะนักพัฒนา PHP เป็นเรื่องง่ายที่จะได้รับตัวอย่างล่าสุดที่มีอักขระในลำดับที่ถูกต้อง:
// $output has the reversed string measures, each sample is delimited by ; $rows = split(";", trim($output)); array_walk_recursive($rows, 'reverseString'); if (strlen($rows[0]) == 0) { array_shift($rows); // Remove the first line if empty } function reverseString(&$row, $key) { $row = trim(strrev($row)); } // $rows is now the array of the latest samples :)
ที่ฝั่งเซิร์ฟเวอร์ ฉันตั้งค่ากระบวนการ cron เพื่อดึงข้อมูลการวัดล่าสุดทุกๆ สองนาที และแทรกข้อมูลลงในเอ็นจิน MySQL เพื่อแสดงข้อมูล ฉันได้สร้าง www.kitesurfcordoba.com.ar และใช้ jQuery เพื่ออัปเดตกราฟโดยอัตโนมัติ (ซึ่งสร้างขึ้นเองโดยใช้ pChart v2.0 ซึ่งเป็นไลบรารีโอเพนซอร์สที่ยอดเยี่ยม)
มีกลอุบายอื่นๆ มากมายที่จำเป็นเพื่อให้สิ่งต่าง ๆ ทำงาน ซึ่งเกี่ยวข้องกับทั้งวิศวกรรมซอฟต์แวร์และฮาร์ดแวร์ แต่ฉันใช้เวลานานพอแล้ว เรามาพูดถึงเรื่องการลดการบำรุงรักษากันดีกว่า
“ฉันจะลดการบำรุงรักษาให้เหลือ (เกือบ) ศูนย์ได้อย่างไร”
นี่เป็นข้อกังวลหลักเพราะว่ามันไม่ง่ายเลยสำหรับฉันที่จะไปถึงสถานี—ถ้าฉันเต็มใจที่จะขับรถออกไปสองชั่วโมงเพื่อแก้ไขการทำงานผิดพลาดเล็กน้อย ฉันก็คงไม่ต้องไปส่งเธอตั้งแต่แรกแล้ว (ฉัน ไม่ได้พูดถึงเรื่องนี้มาก่อน แต่หลังจากที่เราผ่านมาได้ สถานีนี้จริงๆ แล้วคือ "เธอ" และชื่อของเธอคือโดโรธี)
เรากำลังพูดถึงข้อผิดพลาดประเภทใดที่นี่ ตัวอย่างเช่น ซอฟต์แวร์อาจหยุดทำงาน เครือข่ายอาจสูญเสียการเชื่อมต่อ การจ่ายพลังงานอาจล้มเหลว (และหยุดทำงาน) เป็นต้น
โดยพื้นฐานแล้ว สถานีต้องดำเนินการกู้คืนตัวเองให้ได้มากที่สุด นั่นเป็นเหตุผลที่ฉันใช้สุนัขเฝ้าบ้านทั้งแบบอ่อนและแบบแข็ง สำหรับผู้ที่ไม่คุ้นเคย สุนัขเฝ้าบ้านคือชิ้นส่วนของซอฟต์แวร์หรือฮาร์ดแวร์ที่ตรวจสอบว่าระบบทำงานอย่างถูกต้องหรือไม่ และหากไม่เป็นเช่นนั้น จะพยายามทำให้ระบบกลับมามีชีวิตอีกครั้ง Arduino มีสุนัขเฝ้าบ้านที่คุณสามารถใช้ได้ ฉันตั้งค่าให้รอ 8 วินาที: หากการโทรใช้เวลานานกว่าที่กำหนด ซอฟต์แวร์เฝ้าระวังจะรีเซ็ตบอร์ด
wdt_enable(WDTO_8S); // "wdt" stands for "watchdog timer"
ฉันรักฟังก์ชั่นนี้ อย่างไรก็ตาม มีบางครั้งที่บอร์ดรีเซ็ตและโมดูลอีเทอร์เน็ตไม่ทำ ทำไม? นี่คือบอร์ดสร้างต้นแบบที่มีราคาไม่แพงนัก ไม่ใช่อุปกรณ์ที่ป้องกันความผิดพลาดราคาแพงมาก (คุณไม่ควรสร้างเครื่องกระตุ้นหัวใจด้วยบอร์ดนี้แน่นอน) เพื่อเอาชนะข้อเสียนี้ ฉันต้องแฮ็ค Arduino โดยการเดินสายอินพุตการรีเซ็ตฮาร์ดแวร์แบบข้ามสายไปยังเอาต์พุตดิจิทัลบนบอร์ด เพื่อหลีกเลี่ยงลูปการรีเซ็ต ต้องเพิ่มโค้ดสองสามบรรทัดด้วย:
void setup() { digitalWrite(RESET_ARDUINO_PIN, HIGH); // Set it to HIGH immediately on boot pinMode(RESET_ARDUINO_PIN, OUTPUT); // We declare it an output ONLY AFTER it's HIGH digitalWrite(RESET_ARDUINO_PIN, HIGH); // Default to HIGH, set to LOW to HARD RESET ...
หลังจากนั้น ฉันสามารถออกการรีเซ็ตฮาร์ดแวร์ให้กับ Arduino และโมดูลทั้งหมดที่อยู่ด้านบน (รวมถึงโมดูลอีเทอร์เน็ต) โดยเพียงแค่เรียก digitalWrite(RESET_ARDUINO_PIN, LOW)
ซึ่งทำให้โดโรธีกลับมามีชีวิตอีกครั้งหลังจากผ่านไปสองสามวินาที
นอกจากนี้ บอร์ดจะรีบูตอัตโนมัติหลังจากสูญเสียพลังงาน และหากการเชื่อมต่ออินเทอร์เน็ตล้มเหลว เราจะใช้ประโยชน์จากความสามารถในการจัดเก็บข้อมูลของการ์ด SD (ข้อมูลสามารถเก็บไว้ในการ์ดได้นานกว่าหนึ่งสัปดาห์ และเซิร์ฟเวอร์สามารถดึงข้อมูลเก่าเพื่อกู้คืนตัวอย่างที่ขาดหายไป) การรวมคุณสมบัติทั้งหมดเหล่านี้ทำให้เรามีสถานีตรวจอากาศที่ทนทานสูง ซึ่งสามารถอยู่รอดได้ในสภาวะที่ไม่เป็นมิตรซึ่งสร้างขึ้นเพื่อตรวจสอบ โดยรวมแล้วสิ่งนี้มีราคาเพียง 300 เหรียญเท่านั้น
และในที่สุด
สถานีเปิดให้บริการตั้งแต่เดือนธันวาคม 2555 จนถึงปัจจุบัน สถานียังไม่ล้มเหลว (หรือหากทำได้ สถานีฟื้นตัวเร็วพอที่ชุมชนไคท์เซิร์ฟและผมไม่ได้สังเกต) มีนักเล่นไคท์เซิร์ฟประมาณ 500 คนที่ตรวจสอบสถานีอากาศเป็นประจำก่อนเดินทางไปยังจุดนั้น นอกจากรางวัลจากการแก้ปัญหาทางเทคนิคที่ท้าทายแล้ว ฉันยังมีโอกาสมอบประสบการณ์การเล่นไคท์เซิร์ฟที่สนุกสนานยิ่งขึ้นให้กับผู้คนจำนวนมาก
1 ตอนแรกฉันใช้ Arduino Uno ต่อมาฉันเปลี่ยนไปใช้ Arduino Mega เนื่องจากความต้องการ RAM และหน่วยความจำแฟลชที่เพิ่มขึ้น
ที่เกี่ยวข้อง: การทำงานกับ ESP32 Audio Sampling