สารบัญ:
- ขั้นตอนที่ 1: การใช้ Arduino Millisecond Timestamps, Millis()
- ขั้นตอนที่ 2: การเพิ่มแผนภูมิลงในเมนู
- ขั้นตอนที่ 3: การแก้ไข Plot Source และ Lables
- ขั้นตอนที่ 4: การเลือกรูปแบบวันที่/เวลา
- ขั้นตอนที่ 5: สร้างและทดสอบ Arduino Sketch
- ขั้นตอนที่ 6: PfodApp พล็อตวันที่/เวลาจากมิลลิวินาที () อย่างไร
- ขั้นตอนที่ 7: การสร้างแผนผังวันที่/เวลาบนคอมพิวเตอร์ของคุณ
- ขั้นตอนที่ 8: วิธีหลีกเลี่ยงขีด จำกัด 49.7 วัน () และทำไมคุณไม่ควร
- ขั้นตอนที่ 9: การใช้ RTC (นาฬิกาตามเวลาจริง)
- ขั้นตอนที่ 10: การใช้โมดูล GPS
- ขั้นตอนที่ 11: บทสรุป
วีดีโอ: Arduino Date/Time Plotting/Logging โดยใช้ Millis() และ PfodApp: 11 Steps
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:04
ไม่จำเป็นต้องมีการเขียนโปรแกรม Arduino หรือ Android นอกจากนี้ยังรองรับโมดูล RTC และ GPS การแก้ไขอัตโนมัติสำหรับเขตเวลา การเลื่อน RTC และ GPS หายไปในไม่กี่วินาที
บทนำ
บทช่วยสอนนี้จะแสดงให้คุณเห็นถึงวิธีใช้การประทับเวลาของ Arduino millis() เพื่อพล็อตข้อมูลเทียบกับวันที่และเวลาบนมือถือ Android ของคุณโดยใช้ pfodApp
ไม่จำเป็นต้องเขียนโปรแกรม Arduino หรือ Android pfodApp ยังบันทึกข้อมูลที่เพียงพอเพื่อให้คุณสามารถสร้างพล็อตวันที่/เวลาในสเปรดชีตได้ในภายหลัง
ไม่จำเป็นต้องใช้โมดูล RTC หรือ GPS แต่ถ้าโปรเจ็กต์ Arduino ของคุณมี RTC (Real Time Clock) หรือโมดูล GPS ก็สามารถใช้ได้เช่นกัน ในกรณีดังกล่าว พล็อต pfodApp จะแก้ไขเขตเวลา การเลื่อน RTC และ GPS ที่ขาดหายไปในวินาทีกระโดดโดยอัตโนมัติ ไม่จำเป็นต้องใช้รหัส Arduino พิเศษสำหรับการแก้ไขเหล่านี้ เช่นเคยกับ pfodApp ข้อมูลที่ได้รับจะถูกบันทึกทุกประการตามที่เป็นอยู่ ไม่ถูกแก้ไข อย่างไรก็ตาม ไฟล์บันทึกยังมีข้อมูลเพียงพอเพื่อให้คุณสามารถใช้การแก้ไขเหล่านี้ได้ด้วยตนเองเมื่อคุณดาวน์โหลดบันทึกลงในคอมพิวเตอร์ของคุณ ดูด้านล่างสำหรับตัวอย่างหลังการประมวลผลนี้
รองรับการจัดรูปแบบแกน X เวลาและวันที่ที่หลากหลาย ซึ่งทั้งหมดควบคุมโดยสตริงข้อความสั้นในร่าง Arduino ของคุณ ไม่จำเป็นต้องมีการเขียนโปรแกรม Android
pfodApp จะเชื่อมต่อผ่าน WiFi, Bluetooth Classic, BLE และ SMS pfodDesigner ฟรีสร้างภาพร่าง Arduino ที่สมบูรณ์สำหรับการพล็อตวันที่/เวลา/การบันทึกเพื่อเชื่อมต่อกับบอร์ดที่หลากหลาย ไม่จำเป็นต้องเขียนโปรแกรม Arduino
คำแนะนำนี้จะใช้ Adafruit Feather52 เป็นบอร์ด Arduino ตัวอย่างซึ่งเชื่อมต่อผ่าน BLE
คำแนะนำนี้ครอบคลุมสามกรณี: - 1) โปรเจ็กต์ไมโครโปรเซสเซอร์ของคุณมีการประทับเวลามิลลิวินาทีเท่านั้น - มิลลิวินาที ()2) โปรเจ็กต์ไมโครโปรเซสเซอร์ของคุณมีนาฬิกาตามเวลาจริง (RTC) - pfodApp จะแก้ไขการเลื่อนโดยอัตโนมัติ 3) โปรเจ็กต์ไมโครโปรเซสเซอร์ของคุณมีโมดูล GPS – pfodApp จะแก้ไขโดยอัตโนมัติสำหรับวินาทีอธิกสุรทินที่เกิดขึ้น (ปัจจุบันคือ 18 วินาที ณ ปี 2018)
ขั้นตอนที่ 1: การใช้ Arduino Millisecond Timestamps, Millis()
มีสองส่วนในการใช้มิลลิวินาทีสำหรับวันที่และเวลา หนึ่งคือการพล็อตข้อมูลเทียบกับเวลาที่ผ่านไปหรือวันที่/เวลา และอีกส่วนหนึ่งคือการสร้างวันที่และเวลาใหม่จากการประทับเวลามิลลิวินาทีของ rawdata ที่บันทึกไว้ pfodApp ไม่แก้ไขข้อมูลดิบที่ได้รับจาก pfodDevice (ไมโคร Arduino) มันบันทึกเฉพาะไบต์ที่ได้รับ
ขั้นแรกให้ใช้ pfodDesigner ฟรีเพื่อสร้างภาพร่าง Arduino สำหรับไมโครของคุณ ซึ่งจะส่งมิลลิวินาทีและการวัดข้อมูลไปยัง pfodApp สำหรับการวางแผน/การบันทึก ตัวอย่างนี้สร้างเมนูสำหรับบอร์ด Adafruit Feather 52 BLE ที่อ่านว่า A0 บทช่วยสอนเกี่ยวกับ Adafruit Feather nRF52 LE - การควบคุมแบบกำหนดเองด้วย pfodApp จะผ่านขั้นตอน pfodDesigner เพื่อสร้างเมนูสำหรับ Feather nRF52 ที่มีปุ่มแผนภูมิ ดังนั้นโปรดดูรายละเอียดเพิ่มเติม ในบทช่วยสอนนี้ เราจะเพิ่มเพียงปุ่มแผนภูมิและใช้ตัวเลือกรูปแบบแกน X ใหม่เพื่อพล็อตการอ่าน A0 เทียบกับเวลาและวันที่/เวลาที่ผ่านไป
ส่วนแรกของบทช่วยสอนนี้จะใช้ pfodDesigner ฟรีเพื่อสร้างแผนภูมิวันที่/เวลาตัวอย่างบนมือถือ Android ของคุณ เมื่อคุณพอใจกับจอแสดงผล คุณสามารถสร้างภาพร่าง Arduino ที่จะทำซ้ำได้เมื่อคุณเชื่อมต่อกับ pfodApp ไม่จำเป็นต้องเขียนโปรแกรม Android และเนื่องจาก pfodDesigner สร้างภาพร่าง Arduino ที่สมบูรณ์สำหรับบอร์ด Arduino ที่หลากหลาย จึงไม่จำเป็นต้องเขียนโปรแกรม Arduino เช่นกัน
ขั้นตอนที่ 2: การเพิ่มแผนภูมิลงในเมนู
ดาวน์โหลดแอป pfodDesigner จาก Google Play เปิดและคลิกที่ "เริ่มเมนูใหม่"
คลิกที่ "Target Serial" จากนั้นบนปุ่ม "Bluetooth Low Energy" เพื่อแสดงรายการบอร์ด BLE 11 รายการ (เลื่อนลงเพื่อดูตัวเลือกอื่นๆ) เลือก Adafruit Bluefruit Feather52
กลับไปที่เมนู Editing แล้วคลิก “Edit Prompt” และตั้งค่าพรอมต์ที่เหมาะสมสำหรับเมนูนี้ เช่น “Feather52” และตัวหนาและขนาด +7 สีพื้นหลังเหลือเป็น 'ค่าเริ่มต้น' สีขาว
ย้อนกลับและคลิกที่ "เพิ่มรายการเมนู" เลื่อนลงและเลือก "ปุ่มแผนภูมิ" ซึ่งจะเปิดหน้าจอแก้ไขปุ่มแผนภูมิ คุณสามารถเปลี่ยนแปลงลักษณะที่ปรากฏของปุ่มได้ที่นี่ ในกรณีนี้ ข้อความของปุ่มถูกเปลี่ยนเป็น “พล็อตวันที่/เวลาของ A0” และค่าเริ่มต้นอื่นๆ จะถูกปล่อยไว้ตามเดิม
ซึ่งจะให้ปุ่มบนเมนูที่จะเปิดหน้าจอแผนภูมิ
ขั้นตอนที่ 3: การแก้ไข Plot Source และ Lables
คลิกที่ปุ่ม "Date/Time plot of A0" เพื่อเปิดหน้าจอ Editing Plots ซึ่งคุณสามารถเข้าถึงป้ายชื่อแผนภูมิ รูปแบบแกน X ช่วงข้อมูลการลงจุด และ (โดยการเลื่อนลง) การตั้งค่าพล็อตด้วยตนเอง แก้ไข Chart Label ให้เหมาะสม เช่น “A0 โวลต์”.
เลื่อนลงและสำหรับ Plots 2 และ 3 เปิด Edit Plot แล้วคลิก Hide Plot เพื่อลบออกจากการแสดงแผนภูมิ
จากนั้นคลิกที่ “Edit Plot 1” และตั้งป้ายชื่อแผนภาพ (เช่น A0) หน่วย yAxis (เช่น โวลต์) แสดงค่าสูงสุด 3.6V และเชื่อมต่อกับพิน I/O A0
เลื่อนกลับขึ้นแล้วคลิก "แสดงตัวอย่างแผนภูมิ" ไปยังจุดข้อมูลตัวอย่าง 0 รายการล่าสุด ในช่วงเวลา 1 วินาที ซึ่งวางแผนตามเวลาที่ผ่านไปเป็นนาที:วินาที
สำหรับพล็อตเวลาที่ผ่านไปทั้งหมด ค่านำศูนย์หน่วยจะไม่แสดง ดังนั้นในพล็อตนี้ จะแสดงเฉพาะเวลา > 1 นาทีเท่านั้นที่มีการแสดงนาทีนำ
ขั้นตอนที่ 4: การเลือกรูปแบบวันที่/เวลา
สำหรับแผนภาพเวลาที่ผ่านไป หน่วยนำจะเพิ่มขึ้นเรื่อยๆ เมื่อเวลาผ่านไป หากต้องการดูตัวอย่างนี้ ให้กลับไปที่หน้าจอ "กำลังแก้ไขพล็อต" และเพิ่มช่วงข้อมูลพล็อตเป็น 15 นาที (ด้านล่างของหน้าจอนี้)
จากนั้นคลิกที่ Chart Preview เพื่อแสดงข้อมูลตัวอย่างเดียวกัน แต่ตอนนี้มีช่วงเวลา 15 นาทีระหว่างกลุ่มตัวอย่าง อย่างที่คุณเห็นส่วนนาทีของ mm:ss เพิ่มขึ้นเรื่อยๆ
ย้อนกลับไปและคลิกที่ปุ่มแกน X เพื่อแสดงการเลือกรูปแบบข้อมูล/เวลาของแกน X ที่เป็นไปได้ทั้งหมด (เลื่อนลงเพื่อดูข้อมูลเพิ่มเติม)
ด้านบนคือการเลือกตัวอย่างแผนภูมิโดยใช้รูปแบบแกน X ที่แตกต่างกัน
พล็อตวันที่/เวลาที่แสดงที่นี่อยู่ในเขตเวลา 'ท้องถิ่น' นอกจากนี้ยังมีตัวเลือกรูปแบบเพื่อลงจุดวันที่/เวลาใน UTC สำหรับชุดตัวเลือกรูปแบบวันที่/เวลาที่เป็นไปได้ทั้งหมด โปรดดูที่ pfodSpecification.pfd
ขั้นตอนที่ 5: สร้างและทดสอบ Arduino Sketch
เมื่อคุณพอใจกับรูปแบบแผนภูมิและช่วงข้อมูลแล้ว คุณสามารถไปที่หน้าจอ “การแก้ไข Menu_1” และเลื่อนลงมาและ “สร้างรหัส” สำหรับกระดานเป้าหมายที่คุณเลือก นี่คือภาพร่างตัวอย่างสำหรับ Adafruit Feather52 โดยใช้ช่วงเวลาข้อมูล 1 วินาทีและรูปแบบเวลาที่ผ่านไป mm:ss pfodFeather52_timeplot.ino
ด้านบนเป็นพล็อตของ A0 จาก Feather52
การเปลี่ยนรูปแบบเป็น วันธรรมดา hr:mins:sec (~E HH:mm:ss) และสร้างโค้ดใหม่ (pfodFeather52_dateplot.ino) ให้พล็อตเหมือนอย่างที่สองด้านบน
คุณสามารถแก้ไขรูปแบบแกน X ได้โดยตรงในร่าง Arduino ตามที่อธิบายไว้ถัดไป
ขั้นตอนที่ 6: PfodApp พล็อตวันที่/เวลาจากมิลลิวินาที () อย่างไร
เมื่อ pfodApp เชื่อมต่อ มันจะจดจำเวลา 'ท้องถิ่น' และ UTC และขอเวลาประทับข้อมูลปัจจุบันของ pfodDevice (บอร์ด Arduino) การใช้ข้อมูลนี้ pfodApp สามารถพล็อตการประทับเวลามิลลิวินาทีเป็นเวลาที่ผ่านไป เช่น การแปลงมิลลิวินาทีเป็นชั่วโมง นาที วินาที เป็นต้น หรือพล็อตวันที่และเวลาที่ประทับเวลามิลลิวินาทีแทนเวลาที่สัมพันธ์กับเวลาที่ทำการเชื่อมต่อและขอเวลาปัจจุบันของ pfodDevice
ดูใน Arduino ที่สร้างแบบร่าง (เช่น pfodFeather52_dateplot.ino) มีโค้ดเล็กๆ สามบิตที่จัดการด้าน Arduino ของแปลง
ส่วนโค้ด loop() ที่จัดการคำขอเวลาปัจจุบันของ {@} ของ pfodApp
// จัดการ {@} คำขอ } else if ('@'==cmd) { // pfodApp ขอเวลา 'ปัจจุบัน' plot_mSOffset = millis (); // จับมิลลิวินาทีปัจจุบันเป็น offset rawdata timestamps parser.print(F("{@`0}")); // คืนค่า `0 เป็น 'ปัจจุบัน' ข้อมูลดิบเป็นมิลลิวินาที
คุณสามารถคืนค่าปัจจุบันของ millis() ได้ แต่ millis() จะวนกลับเป็น 0 ทุกๆ 49.7 วัน ซึ่งจะทำให้พล็อตย้อนกลับ ดังนั้นโค้ดจะจำค่า millis() ปัจจุบันเมื่อมีการส่งคำขอ {@} และส่งกลับ {@`0} นั่นคือการประทับเวลามิลลิวินาทีปัจจุบันเป็นศูนย์ จากนั้นเมื่อส่งจุดข้อมูลดิบที่ร่างใช้
plot_1_var = analogRead (A0); // อ่านอินพุตไปยังพล็อต // plot_2_var plot ถูกซ่อนไว้ ดังนั้นจึงไม่มีการกำหนดข้อมูลไว้ที่นี่ // plot_3_var plot ถูกซ่อนดังนั้นจึงไม่มีการกำหนดข้อมูลไว้ที่นี่ // ส่งข้อมูลการพล็อตในรูปแบบ CSV parser.print (มิลลิวินาที ()-plot_mSOffset); // เวลาเป็นมิลลิวินาที ….
เพื่อให้การประทับเวลามิลลิวินาทีที่ส่งพร้อมข้อมูลเริ่มต้นที่ 0 และเพิ่มขึ้นถึง 49.7 วัน หากคุณเชื่อมต่ออย่างต่อเนื่องเป็นเวลา 49.7 วัน คุณจะเห็นโครงเรื่องย้อนกลับประมาณ 50 วัน การตัดการเชื่อมต่อและเชื่อมต่อใหม่ทุกๆ 49.7 วันจะช่วยหลีกเลี่ยงปัญหานี้
ส่วนที่สามของพล็อตวันที่/เวลาคือข้อความการลงจุด
} else if('A'==cmd) { // ผู้ใช้กด -- 'Date/Time plot of A0' // ในเมนูหลักของ Menu_1 // ส่งคืนข้อความแสดงการวางแผน parser.print(F("{=A0 Volts~E HH:mm:ss|date|A0~~~Volts||}"));
เมื่อผู้ใช้กดปุ่ม “พล็อตวันที่/เวลาของ A0” pfodApp จะส่ง {A} cmd ไปยัง pfodDevice และ pfodDevice ตอบสนองด้วยข้อความพล็อต {=…{=A0 Volts~E HH:mm:ss|date |A0~~~Volts||}ซึ่งมีรูปแบบแกน X E HH:mm:ss
ยอมรับรูปแบบ Java SimpleDateFormat ที่นี่ pfodApp Data Logging and Plotting และ pfodSpecification.pdf มีรายละเอียดเพิ่มเติมเกี่ยวกับข้อความพล็อต
ขั้นตอนที่ 7: การสร้างแผนผังวันที่/เวลาบนคอมพิวเตอร์ของคุณ
โดยค่าเริ่มต้น pfodApp จะบันทึกข้อมูลดิบขาเข้าทั้งหมดไปยังไฟล์บันทึกบนมือถือของคุณ เว้นแต่คุณจะปิดใช้งานการบันทึกนี้ในหน้าจอแก้ไขการเชื่อมต่อ โปรดดูที่ pfodAppForAndroidGettingStarted.pdf
เมื่อคุณแก้ไข pfodApp ข้อความสั้นๆ จะปรากฏขึ้นพร้อมตำแหน่งและชื่อของไฟล์บันทึก เช่น /pfodAppRawData/pfod_bluefruit52.txt ไฟล์นั้นอยู่ในรูปแบบ CSV คั่นด้วยเครื่องหมายจุลภาค และหลังจากโอนไปยังคอมพิวเตอร์ของคุณแล้ว (ดูที่ pfodAppForAndroidGettingStarted.pdf สำหรับตัวเลือกการถ่ายโอน) คุณสามารถเปิดไฟล์นั้นในสเปรดชีตเพื่อลงจุดข้อมูล
นี่คือสองสามบรรทัดแรกของล็อกไฟล์
// pfodApp V3.0.360, เวลาท้องถิ่น, UTC, mS ต่อวัน, pfod bluefruit52 เวลาปัจจุบัน (mS), pfod bluefruit52 เวลาปัจจุบัน, // เชื่อมต่อเมื่อ, 2019/04/20 11:32:50.238, 2019/04/20 01:32:50.238, 86400000, 0, 366, 0.25,, 1366, 0.29,, 2366, 0.31,, 3366, 0.33,, 4366, 0.33,,
ด้านบน คุณจะเห็นเวลา 'ท้องถิ่น' และ UTC ที่ pfodApp เชื่อมต่อกับ Feather52 และเวลาปัจจุบันในหน่วย mS ที่ Feather52 รายงานผ่านการตอบกลับ {@..} คอลัมน์สุดท้ายว่างเปล่า เนื่องจากไม่มี RTC หรือ GPS ดังนั้นจึงไม่มีรายงานเวลาปัจจุบันเป็น ปปปป/ดด/วว โดย Feather52
หากต้องการพล็อตข้อมูลเทียบกับเวลาที่ผ่านไป ให้ลบเวลาปัจจุบัน (mS) ออกจากการประทับเวลาเป็นมิลลิวินาที แล้วหารด้วยค่า mS ต่อวัน นี่คือสเปรดชีตที่มีการเพิ่มสูตรและพล็อตผลลัพธ์ สเปรดชีตด้านล่าง (pfod_bluefruit52.xls) เป็นสเปรดชีต OpenOffice ที่บันทึกในรูปแบบ Excel
ใน OpenOffice พล็อตเป็นแบบกระจายและแกน x ของพล็อตถูกจัดรูปแบบใน HH:MM:SS หมายเหตุ: รูปแบบวันที่/เวลาของสเปรดชีตไม่เหมือนกับรูปแบบพล็อตที่ใช้โดย pfodApp ตัวอย่างเช่นใน pfodApp MM คือเดือนและ mm คือนาที
ในการลงจุดตามวันที่และเวลา คุณจะต้องเพิ่มเวลาเชื่อมต่อไปยังเวลาของสเปรดชีตและแปลงใหม่เท่านั้น (pfod_bluefruit52_date.xls)
หมายเหตุ: เวลาท้องถิ่นและ UTC ถูกนำเข้าเป็นข้อความในสเปรดชีตของฉัน ดังนั้นฉันจึงจำเป็นต้องลบส่วนนำหน้า ' ก่อนที่จะใช้ในสูตร
ขั้นตอนที่ 8: วิธีหลีกเลี่ยงขีด จำกัด 49.7 วัน () และทำไมคุณไม่ควร
ดังที่กล่าวไว้ข้างต้นใน pfodApp จะพล็อตวันที่/เวลาจากมิลลิวินาที () อย่างไร หากคุณยังคงเชื่อมต่ออย่างต่อเนื่องนานกว่า 49.7 วัน การประทับเวลามิลลิวินาทีจะถูกตัดกลับเป็นศูนย์ รหัสสองสามบรรทัดสามารถหลีกเลี่ยงสิ่งนี้ได้ แต่ไม่แนะนำ
วิธีหลีกเลี่ยงการพันรอบก่อน เพิ่มตัวแปร int ที่ไม่ได้ลงนามเพื่อติดตามจำนวนครั้งที่ประทับเวลาล้อมรอบและพิมพ์ผลลัพธ์ที่รวมกันใน HEX
uint_t mSwrapCount = 0;uint32_t lastTimeStamp = 0;
… plot_1_var = analogRead (A0); // อ่านอินพุตไปยังพล็อต // plot_2_var พล็อตที่ซ่อนอยู่ ดังนั้นจึงไม่มีข้อมูลที่กำหนดที่นี่ // พล็อต plot_3_var ถูกซ่อนดังนั้นจึงไม่มีการกำหนดข้อมูลไว้ที่นี่ // ส่งข้อมูลการพล็อตในรูปแบบ CSV uint32_t timeStamp = millis()-plot_mSOffset; ถ้า (timeStamp <lastTimeStamp) { // timeStamp ห่อกลับเป็น 0 mSwrapCount ++; // เพิ่มเพื่อนับ } lastTimeStamp = timeStamp; parser.print("0x"); parser.print (msWrapCount, HEX); parser.print(timeStamp, HEX); // เวลาเป็นมิลลิวินาทีใน HEX ….
เมื่อส่งคืนการตอบสนอง {@.. ให้ล้าง mSwrapCount ด้วย
// จัดการ {@} คำขอ } else if ('@'==cmd) { // pfodApp ขอเวลา 'ปัจจุบัน' plot_mSOffset = millis (); // จับมิลลิวินาทีปัจจุบันเป็น offset rawdata timestamps mSwrapCount = 0; //ล้างนับห่อ. parser.print(F("{@`0}")); // คืนค่า `0 เป็น 'ปัจจุบัน' ข้อมูลดิบเป็นมิลลิวินาที
ขณะนี้การประทับเวลาจะให้ค่า 'ถูกต้อง' สำหรับ 40.7 วันถัดไป * 65536 ~= 7308 ปี
pfodApp จะแปลงการประทับเวลาฐานสิบหกโดยอัตโนมัติสำหรับการพล็อตและบันทึกตามที่ได้รับ นั่นคือในรูปแบบฐานสิบหก ในสเปรดชีต (OpenOffice) คุณใช้สูตรนี้เพื่อแปลงสตริงฐานสิบหกใน A2 เป็น mS (โดยที่ A1 คือเซลล์ว่างใดๆ) =HEX2DEC(REPLACE(A2;1;2;A1))
ทำไมถึงไม่อยากทำ
ดังที่แสดงไว้ด้านบน ง่ายต่อการขยายเวลาประทับ mS ให้นานกว่า 50 วัน อย่างไรก็ตาม คุณอาจไม่ต้องการทำอย่างนั้น เพราะมันไม่ถูกต้องมากขึ้น คริสตัล 16Mhz ทั่วไปที่ใช้ในการสร้างมิลลิวินาที () ส่งผลให้ไมโครมีความแม่นยำ ~50ppm (ส่วนในล้าน) ซึ่งหมายความว่าหลังจาก 49.7 วัน การประทับเวลามิลลิวินาทีอาจหมดไป 3 ½ นาที และไม่สนใจผลกระทบของอุณหภูมิที่มีต่อความแม่นยำของผลึก
ในช่วงระยะเวลาการเชื่อมต่อสั้น ความไม่ถูกต้องนี้ไม่เป็นปัญหา เนื่องจาก {@.. ตอบกลับจะซิงโครไนซ์เวลาประทับเป็นมิลลิวินาทีกับวันที่/เวลาของมือถือในการเชื่อมต่อใหม่แต่ละครั้ง อย่างไรก็ตาม หากคุณต้องการเชื่อมต่อเป็นเวลานาน (วัน) และบันทึกข้อมูลอย่างต่อเนื่อง คุณควรใช้บางสิ่งที่แม่นยำกว่ามิลลิวินาทีในตัว () เช่น RTC หรือโมดูล GPS
ขั้นตอนที่ 9: การใช้ RTC (นาฬิกาตามเวลาจริง)
มีโมดูล RTC มากมายให้เลือก หนึ่งในโมดูลที่แม่นยำกว่าคือ DS3231 เช่น โมดูล DS3231 ของ Adafruit ความแม่นยำที่ระบุคือ +/-2ppm มากกว่า 0 ถึง 40C เช่น ~+/-5 วินาที/เดือน
หากคุณต้องการพล็อตข้อมูลที่มีการประทับวันที่/เวลา เช่น 2019/04/19 20:4:34 น. จากนั้นคุณต้องแก้ไข {@ response to return the current date/time, e.g. {@`0~2019/4/19 3:33:5}. นี่คือตัวอย่างการเปลี่ยนแปลงโค้ดบางส่วนเพื่อนำไปใช้กับ pfodDesigner แบบร่างที่สร้างขึ้นสำหรับการใช้โมดูล RTC สมมติว่าคุณกำลังใช้ไลบรารี RTClib และได้เพิ่มโค้ดเพื่อเริ่มต้นโมดูล RTC
// จัดการ {@} คำขอ } else if ('@'==cmd) { // pfodApp ขอเวลา 'ปัจจุบัน' plot_mSOffset = millis (); // จับมิลลิวินาทีปัจจุบันเป็น offset rawdata timestamps parser.print(F("{@`0"}); // คืนค่า `0 เป็น 'current' ข้อมูลดิบ parser.print('~'); // เริ่มสตริงของ date/time DateTime now = rtc.now() sendDateTime(&now); // ส่ง yyyy/M/d/ H:m:s ไปที่ parser.print ส่งที่อยู่ & เป็น arg. parser.print('}'); // สิ้นสุด {@ การตอบสนอง เช่น {@`0~2019/4/19 3:33:5}….
// ส่งวันที่เวลาไปยัง parser printvoid sendDateTime(DateTime* dt) { parser.print(dt->year(), DEC); parser.print('/'); parser.print(dt->เดือน (), ธ.ค.); parser.print('/'); parser.print(dt->day(), ธ.ค.); parser.print(' '); parser.print(dt->hour(), ธ.ค.); parser.print(':'); parser.print(dt->minute(), DEC); parser.print(':'); parser.print(dt->second(), DEC); }
เป็นโมฆะ sendData () { ถ้า (plotDataTimer.isFinished ()) { plotDataTimer.repeat (); // รีสตาร์ทตัวจับเวลาข้อมูลพล็อตโดยไม่ต้องเลื่อน // กำหนดค่าให้กับตัวแปรพล็อตจากตัวแปรลูปของคุณหรืออ่านอินพุต ADC plot_1_var = analogRead (A0); // อ่านอินพุตไปยังพล็อต // plot_2_var plot ถูกซ่อนไว้ ดังนั้นจึงไม่มีการกำหนดข้อมูลไว้ที่นี่ // plot_3_var plot ถูกซ่อนดังนั้นจึงไม่มีการกำหนดข้อมูลไว้ที่นี่ // ส่งข้อมูลการพล็อตในรูปแบบ CSV DateTime now = rtc.now (); sendDateTime(&ตอนนี้); // ส่ง yyyy/M/d/ H:m:s ไปที่ parser.print ส่งที่อยู่ & เป็น arg parser.print(','); parser.print(((float)(plot_1_var - plot_1_varMin)) * plot_1_scaling + plot_1_varDisplayMin); parser.print(','); // พล็อต 2 ถูกซ่อนไว้ ไม่มีการส่งข้อมูล parser.print(','); // พล็อต 3 ถูกซ่อนไว้ ไม่มีการส่งข้อมูล parser.println(); // สิ้นสุดการบันทึกข้อมูล CSV } }
ส่วน ~2019/4/19 3:33:5 ของ {@ การตอบสนองช่วยให้ pfodApp รู้ว่า pfodDevice คิดว่าเป็นวันที่และเวลาปัจจุบันอย่างไร จากนั้นสเก็ตช์ของคุณสามารถส่งข้อมูลด้วยการประทับเวลา yMd Hms และ pfodApp จะพล็อตเป็นเวลาที่ผ่านไปจากเวลาที่เชื่อมต่อหรือเป็นวันที่และเวลา ขึ้นอยู่กับรูปแบบแกน X ที่คุณระบุ
เมื่อทำการลงจุดตามวันที่และเวลา รูทีนการลงจุด pfodApp จะแก้ไข 'การลอย' ใดๆ ใน RTC โดยการเปรียบเทียบเวลาปัจจุบันที่รายงานของ pfodDevice กับเวลาปัจจุบันของมือถือ การแก้ไขนี้ยังจัดการ RTC ที่ถูกตั้งค่าเป็นเขตเวลาที่แตกต่างจากเขตเวลาท้องถิ่นของมือถือของคุณ millis() timestamps ยังคงทำงานเหมือนกับการใช้ Arduino millisecond timestamps, ขั้นตอนที่ 5 ด้านบน
นี่คือตัวอย่างสเปรดชีตของอุณหภูมิห้องในช่วง 8 วัน Office_Temp.xls เมื่อนำเข้าไฟล์บันทึก คอลัมน์แรกจะถูกทำเครื่องหมายเป็น YMD เพื่อแปลงข้อความเป็นวันที่/เวลา คุณยังต้องลบนำหน้า ' จากเวลาท้องถิ่น รายการเวลาปัจจุบัน UTC และ Office Temp เพื่อให้สเปรดชีตตีความว่าเป็นวันที่และเวลา
เพื่อให้ได้พล็อตเดียวกันกับที่ pfodApp แสดง คุณต้องคำนวณ "วันที่/เวลาที่ถูกต้อง" ในกรณีนี้ เวลา RTC จะช้ากว่าเวลาท้องถิ่นของมือถือ 2 วินาที ดังนั้นจะมีการเพิ่มการประทับเวลา RTC แต่ละรายการ (เวลาท้องถิ่น – เวลาปัจจุบันของ Office Temp) เพื่อให้ได้เวลาท้องถิ่นที่แท้จริง
สำหรับแผนภาพเวลาที่ผ่านไป ให้สร้างคอลัมน์ใหม่ที่มี (timstamp วันที่/เวลา – เวลาปัจจุบันของ Office Time) และใช้เป็นแกน X ในแผนภูมิ (Office_TempElapsed.xls) ที่จริงแล้ว pfodApp จะสร้างแผนภูมิเวลาที่ผ่านไปได้ดีกว่า เป็นวัน hr:mins:sec.
ขั้นตอนที่ 10: การใช้โมดูล GPS
การใช้โมดูล GPS นั้นคล้ายกับการใช้โมดูล RTC ยกเว้นว่าโมดูล GPS มีมิลลิวินาทีที่พร้อมใช้งาน ปีเริ่มต้นที่ 2000 และเวลาไม่มีวินาทีอธิก UTC (ดู https://tycho.usno.navy.mil/leapsec.html) วันที่และเวลาของ GPS ปัจจุบันเร็วกว่า UTC 18 วินาที ณ มกราคม 2018
ไลบรารี Adafruit GPS สำหรับ Adafruit Ultimate GPS ซึ่งแตกต่างจาก RTClib ไม่ได้เพิ่มการชดเชยปี 2000 ให้กับปี GPS ดังนั้นจึงจำเป็นต้องเพิ่มเมื่อคุณส่งวันที่และเวลาประทับ แม้ว่าไลบรารี GPS จะจ่ายมิลลิวินาทีซึ่งมีความแม่นยำในระยะยาวที่ดีมาก แต่ก็ไม่ได้แม่นยำมาก การอัปเดตเวลา GPS มีเพียงครั้งเดียวในแต่ละ 100mS จากนั้นจะมีความล่าช้าเป็นพิเศษในการรับข้อมูลซีเรียลที่ความเร็ว 9600 บอดและความล่าช้าในการแยกวิเคราะห์ ทั้งหมดนี้ช่วยเพิ่มความแม่นยำในมิลลิวินาทีเมื่อทำการประทับเวลาอ่านข้อมูล
ต่อไปนี้คือการเปลี่ยนแปลงโค้ดตัวอย่างเพื่อนำไปใช้กับ pfodDesigner แบบร่างที่สร้างขึ้นสำหรับการใช้โมดูล GPS สมมติว่าคุณใช้ไลบรารี GPS ของ Adafruit และได้เพิ่มโค้ดเพื่อรับและแยกวิเคราะห์ข้อความลงในวัตถุ GPS
// จัดการ {@} คำขอ } else if ('@'==cmd) { // pfodApp ขอเวลา 'ปัจจุบัน' plot_mSOffset = millis (); // จับมิลลิวินาทีปัจจุบันเป็น offset rawdata timestamps parser.print(F("{@`0"}); // คืนค่า `0 เป็น 'current' ข้อมูลดิบ parser.print('~'); // เริ่มสตริงของ date/time sendDateTime(&GPS); // ส่ง yyyy/M/d/ H:m:s ไปยัง parser.print, pass address & as arg. parser.print('}'); // สิ้นสุด {@ การตอบสนอง เช่น {@`0~2019/4/19 3:33:5}….
// ส่งวันที่เวลาไปยัง parser printvoid sendDateTime(Adafruit_GPS* gps) { parser.print(F("20"); // 20.. year parser.print(gps->year, DEC); parser.print('/ '); parser.print(gps->เดือน DEC); parser.print('/'); parser.print(gps->วัน DEC); parser.print(' '); parser.print(gps- >ชั่วโมง ธ.ค.); parser.print(':'); parser.print(gps->minute, DEC); parser.print(':'); parser.print(gps->วินาที ธันวาคม); // parser.print('.'); หากส่งมิลลิวินาที // หากคุณต้องการส่ง mS คุณต้องเพิ่มค่า gps->มิลลิวินาทีด้วยเลขศูนย์นำหน้า // เช่น 3 จำเป็นต้องเพิ่มเป็น 003 }
เป็นโมฆะ sendData () { ถ้า (plotDataTimer.isFinished ()) { plotDataTimer.repeat (); // รีสตาร์ทตัวจับเวลาข้อมูลพล็อตโดยไม่ต้องเลื่อน // กำหนดค่าให้กับตัวแปรพล็อตจากตัวแปรลูปของคุณหรืออ่านอินพุต ADC plot_1_var = analogRead (A0); // อ่านอินพุตไปยังพล็อต // พล็อต plot_2_var ถูกซ่อนดังนั้นจึงไม่มีข้อมูลที่กำหนดที่นี่ // พล็อต plot_3_var ถูกซ่อนดังนั้นจึงไม่มีการกำหนดข้อมูลไว้ที่นี่ // ส่งข้อมูลการพล็อตในรูปแบบ CSV sendDateTime(&GPS); // ส่ง yyyy/M/d/ H:m:s ไปที่ parser.print ส่งที่อยู่ & เป็น arg parser.print(','); parser.print(((float)(plot_1_var - plot_1_varMin)) * plot_1_scaling + plot_1_varDisplayMin); parser.print(','); // พล็อต 2 ถูกซ่อนไว้ ไม่มีการส่งข้อมูล parser.print(','); // พล็อต 3 ถูกซ่อนไว้ ไม่มีการส่งข้อมูล parser.println(); // สิ้นสุดการบันทึกข้อมูล CSV } }
เมื่อวางแผนตามวันที่และเวลา pfodApp จะแก้ไขโดยอัตโนมัติในไม่กี่วินาที ณ ม.ค. 2561 เวลา GPS เร็วกว่า UTC 18 วินาที pfodApp แก้ไขโดยการเปรียบเทียบวันที่/เวลาที่ส่งกลับโดย GPS ในการเชื่อมต่อ ผ่านการตอบกลับ {@ กับวันที่และเวลา UTC ของมือถือ การสร้างพล็อตในสเปรดชีตจากล็อกไฟล์ pfodApp จะเหมือนกับโมดูล RTC ด้านบน การเพิ่ม (เวลาท้องถิ่น – เวลาปัจจุบันของ Office Temp) ในการประทับเวลาของ GPS จะแก้ไขสำหรับวินาทีอธิกสุรทิน
millis() timestamps ยังคงทำงานเหมือนกับการใช้ Arduino millisecond timestamps, ขั้นตอนที่ 5 ด้านบน
ขั้นตอนที่ 11: บทสรุป
การใช้ pfodApp บนมือถือ Android ของคุณทำให้คุณสามารถพล็อตข้อมูลเทียบกับวันที่และเวลาหรือเวลาที่ผ่านไป โดยใช้ฟังก์ชัน millis() ของ Arduino เท่านั้น การใช้ล็อกไฟล์ pfodApp คุณสามารถสร้างพล็อตวันที่/เวลาเหล่านี้ซ้ำในสเปรดชีตได้ หากโปรเจ็กต์ Arduino ของคุณมีโมดูล RTC คุณสามารถบันทึกและลงจุดวันที่และการประทับเวลา RTC ได้ ซึ่งจะแก้ไข 'drift' ของ RTC โดยอัตโนมัติ หากโปรเจ็กต์ Arduino ของคุณมีโมดูล GPS คุณสามารถบันทึกและพล็อตการประทับเวลาที่แม่นยำสูงและ pfodApp จะแก้ไขวินาทีกระโดดที่หายไปของ GPS โดยอัตโนมัติ
ในทุกกรณี ข้อมูลดิบจากโครงการ Arduino ของคุณจะถูกบันทึกตรงตามที่ได้รับ ไม่ถูกแก้ไข อย่างไรก็ตาม ไฟล์บันทึก pfodApp มีข้อมูลเพิ่มเติมเพื่อให้คุณสร้างการแก้ไขเหล่านี้ซ้ำในสเปรดชีตจากไฟล์บันทึกที่ดาวน์โหลด
ไม่จำเป็นต้องมีการเข้ารหัส Android รูปแบบพล็อตทั้งหมดถูกกำหนดโดยสตริงข้อความขนาดเล็กในร่าง Arduino ของคุณ pfodDesigner ฟรีสร้างการบันทึกข้อมูล Arduino ที่สมบูรณ์และพล็อตสเก็ตช์สำหรับบอร์ด Arduino ที่หลากหลายที่เชื่อมต่อผ่าน WiFi, Classic Bluetooth, BLE และ SMS
แนะนำ:
การจดจำใบหน้าและการระบุตัวตน - Arduino Face ID โดยใช้ OpenCV Python และ Arduino: 6 ขั้นตอน
การจดจำใบหน้าและการระบุตัวตน | Arduino Face ID โดยใช้ OpenCV Python และ Arduino: การจดจำใบหน้า AKA face ID เป็นหนึ่งในคุณสมบัติที่สำคัญที่สุดบนโทรศัพท์มือถือในปัจจุบัน ดังนั้นฉันจึงมีคำถาม "ฉันขอรหัสใบหน้าสำหรับโครงการ Arduino ของฉันได้ไหม" และคำตอบคือ ใช่… การเดินทางของฉันเริ่มต้นดังนี้: ขั้นตอนที่ 1: เข้าถึงเรา
การบันทึกข้อมูลมือถืออย่างง่ายโดยใช้ PfodApp, Android และ Arduino: 5 ขั้นตอน
การบันทึกข้อมูลมือถืออย่างง่ายโดยใช้ PfodApp, Android และ Arduino: การบันทึกข้อมูล Moblie ทำได้ง่ายโดยใช้ pfodApp, Andriod mobile และ Arduino ของคุณ ไม่จำเป็นต้องเขียนโปรแกรม Android สำหรับการพล็อตข้อมูลบน Android ของคุณ ให้ดูสิ่งนี้ในภายหลัง การทำพล็อตข้อมูลระยะไกลอย่างง่ายที่จำลองได้โดยใช้ Android / Arduino / pfodAppFor Plotting
Neopixel Ws2812 Rainbow LED เรืองแสงพร้อม M5stick-C - เรียกใช้ Rainbow บน Neopixel Ws2812 โดยใช้ M5stack M5stick C โดยใช้ Arduino IDE: 5 ขั้นตอน
Neopixel Ws2812 Rainbow LED เรืองแสงพร้อม M5stick-C | เรียกใช้ Rainbow บน Neopixel Ws2812 โดยใช้ M5stack M5stick C การใช้ Arduino IDE: สวัสดีทุกคนในคำแนะนำนี้ เราจะเรียนรู้วิธีใช้ neopixel ws2812 LED หรือแถบนำหรือเมทริกซ์นำหรือวงแหวน LED พร้อมบอร์ดพัฒนา m5stack m5stick-C พร้อม Arduino IDE และเราจะทำ ลายรุ้งกับมัน
การควบคุมวิทยุ RF 433MHZ โดยใช้ HT12D HT12E - การสร้างรีโมทคอนโทรล Rf โดยใช้ HT12E & HT12D ด้วย 433mhz: 5 ขั้นตอน
การควบคุมวิทยุ RF 433MHZ โดยใช้ HT12D HT12E | การสร้างการควบคุมระยะไกล Rf โดยใช้ HT12E & HT12D ด้วย 433mhz: ในคำแนะนำนี้ฉันจะแสดงวิธีสร้างรีโมทคอนโทรล RADIO โดยใช้โมดูลตัวรับส่งสัญญาณ 433mhz พร้อมการเข้ารหัส HT12E & IC ถอดรหัส HT12D ในคำแนะนำนี้ คุณจะสามารถส่งและรับข้อมูลโดยใช้ส่วนประกอบราคาถูกมาก เช่น HT
LED Blinker และ PWM Oscillator โดยใช้ 555 Timer: 3 Steps
LED Blinker และ PWM Oscillator โดยใช้ 555 Timer: ทุกคนเป็นมือใหม่ในอุปกรณ์อิเล็กทรอนิกส์ และสำหรับผู้เริ่มต้น บางครั้งการสร้างวงจรที่ใช้งานได้อาจเป็นเรื่องยาก นั่นเป็นเหตุผลที่ฉันตัดสินใจโพสต์โครงการประเภทนี้ วงจรนี้เป็นรุ่นที่เรียบง่ายของวงจรอย่างง่ายซึ่งแผนผังของเ