สารบัญ:

Arduino 3-in-1 การแสดงเวลาและสภาพอากาศ: 11 ขั้นตอน
Arduino 3-in-1 การแสดงเวลาและสภาพอากาศ: 11 ขั้นตอน

วีดีโอ: Arduino 3-in-1 การแสดงเวลาและสภาพอากาศ: 11 ขั้นตอน

วีดีโอ: Arduino 3-in-1 การแสดงเวลาและสภาพอากาศ: 11 ขั้นตอน
วีดีโอ: การใช้เซ็นเซอร์ DHT11 อ่านค่าอุณหภูมิและความชื้น | JAKK DIY 2024, พฤศจิกายน
Anonim

โดย Boomer48ติดตามเพิ่มเติมโดยผู้เขียน:

การใช้ ATtiny85
การใช้ ATtiny85
การใช้ ATtiny85
การใช้ ATtiny85
Pi Powered Pie Partitioning และ Polygon Pruning Tool
Pi Powered Pie Partitioning และ Polygon Pruning Tool
Pi Powered Pie Partitioning และ Polygon Pruning Tool
Pi Powered Pie Partitioning และ Polygon Pruning Tool
การควบคุมแบบดิจิตอลสำหรับแอมพลิฟายเออร์เสียงแบบแมนนวล
การควบคุมแบบดิจิตอลสำหรับแอมพลิฟายเออร์เสียงแบบแมนนวล
การควบคุมแบบดิจิตอลสำหรับแอมพลิฟายเออร์เสียงแบบแมนนวล
การควบคุมแบบดิจิตอลสำหรับแอมพลิฟายเออร์เสียงแบบแมนนวล

ฉันชอบไมโครคอนโทรลเลอร์ PIC และฉันชอบการเขียนโปรแกรมในภาษาแอสเซมบลี อันที่จริง ในช่วงสองสามปีที่ผ่านมา ฉันได้โพสต์ประมาณ 40 โครงการบนเว็บไซต์ของฉันตามการรวมกันนั้น เมื่อเร็วๆ นี้ ฉันกำลังสั่งซื้อชิ้นส่วนจากผู้ขายรายหนึ่งในสหรัฐอเมริกาที่ฉันชื่นชอบ และฉันเห็น Arduino Nano พร้อมสายเคเบิลสำหรับโปรแกรม ซึ่งมากกว่าชิปตัวประมวลผล ATMEGA328 เปล่าเพียง 1.20 เหรียญเท่านั้น ดังนั้นฉันจึงซื้อสองสามตัว จากนั้นฉันดาวน์โหลด Arduino IDE และกำจัดหน่วยความจำของการเขียนโปรแกรม 'C++'

โปรเจ็กต์นี้เป็นการรวมนาฬิกาที่ใช้ GPS ในการจับเวลา และตัวรับสัญญาณ RF ที่ถอดรหัสข้อความสภาพอากาศจากเซ็นเซอร์ AcuRite ทั่วไป ผลที่ได้คือการแสดงเวลาและอุณหภูมิในขนาดเล็ก นาฬิกา GPS และกิจวัตรสภาพอากาศได้รับการตั้งค่าเป็นไฟล์แยกกัน ดังนั้นจึงง่ายที่จะเข้าสู่กิจวัตรหลักและกำหนดค่าให้ทำเฉพาะฟังก์ชันนาฬิกาหรือฟังก์ชันสภาพอากาศ เพียงยกเลิกการใส่เครื่องหมาย #define ที่เหมาะสมที่ด้านบนของรูทีนหลัก หากคุณต้องการเพียงฟังก์ชันใดฟังก์ชันหนึ่ง

หากใช้ทั้งสองฟังก์ชัน บรรทัดบนสุดของ LCD จะแสดงเวลาท้องถิ่น และบรรทัดล่างสุดของ LCD จะแสดงความชื้นและอุณหภูมิทั้งแบบเซลเซียสและฟาเรนไฮต์ หากใช้เพียงฟังก์ชันนาฬิกา บรรทัดบนสุดจะแสดงเวลาท้องถิ่นและบรรทัดล่างสุดจะแสดง UTC หากใช้เพียงฟังก์ชันสภาพอากาศ บรรทัดบนสุดจะแสดงเซ็นเซอร์ตัวแรกที่ได้รับ และบรรทัดล่างสุดจะแสดงเซ็นเซอร์อื่นๆ ที่ได้รับ ฉันเพิ่มความสามารถนั้นเพราะฉันมีเซ็นเซอร์สภาพอากาศสองตัว

ขั้นตอนที่ 1: เซ็นเซอร์สภาพอากาศ

เซ็นเซอร์สภาพอากาศ
เซ็นเซอร์สภาพอากาศ
เซ็นเซอร์สภาพอากาศ
เซ็นเซอร์สภาพอากาศ
เซ็นเซอร์สภาพอากาศ
เซ็นเซอร์สภาพอากาศ

เซ็นเซอร์สภาพอากาศ AcuRite ที่ใช้ในที่นี้จะส่งข้อมูลอุณหภูมิและความชื้นทุกๆ 16 วินาที ด้านหลังแสดงหมายเลขรุ่น 000592TXR แต่โดยทั่วไปจะโฆษณาเป็นรุ่น 06002M เซ็นเซอร์นี้ถูกใช้โดยสถานีตรวจอากาศรุ่นต่างๆ มากมาย ดังนั้นจึงหาได้ง่าย และฉันสามารถซื้อบน eBay ได้ในราคาต่ำกว่า $20 AcuRite ขายเซ็นเซอร์ที่มีลักษณะคล้ายกันสำหรับสถานีตรวจอากาศบางแห่ง แต่อาจเป็นไปตามโปรโตคอลการสื่อสารเดียวกันหรือไม่ก็ได้ มีข้อบ่งชี้บางอย่างบนเว็บว่าเซ็นเซอร์อุณหภูมิเท่านั้น 00606 ใช้รูปแบบข้อความเดียวกัน แต่มีไบต์ความชื้นที่ไม่ถูกต้อง

ดังที่เห็นในรูปคลื่นแรกที่แสดงด้านบน ข้อความสภาพอากาศจะถูกส่งเป็นชุดโดยมีช่องว่าง 2ms ระหว่างข้อความที่ต่อเนื่องกัน รูปคลื่นที่สองที่แสดงด้านบนจะขยายส่วนหนึ่งของข้อความหนึ่งข้อความเพื่อดูระยะเวลาและรูปแบบบิต มีสี่บิตการซิงค์ที่สูงประมาณ 600us ตามด้วยต่ำ 600us บิตข้อมูลแสดงโดยสูง 400us ตามด้วย 200us ต่ำ (1) หรือสูง 200us ตามด้วย 400us ต่ำ (0)

รูปแบบข้อความประกอบด้วยข้อมูล 7 ไบต์ สองไบต์แรกคือ ID เซ็นเซอร์และจะไม่เปลี่ยนแปลง (เช่น ไม่ใช้รหัสการเลื่อน) ไบต์สุดท้ายคือผลรวมการตรวจสอบแบบง่ายของหกไบต์แรก ไบต์ที่สามเป็นตัวบ่งชี้ระดับแบตเตอรี่และควรเป็นเลขฐานสิบหก 44 เสมอหากแบตเตอรี่ดี ไบต์ที่สี่คือความชื้นและเป็นค่าที่ไม่ได้ปรับขนาดระหว่าง 0 ถึง 99 สิ่งสำคัญคือต้องจำไว้ว่าบิตที่สำคัญที่สุดของไบต์ 4, 5 และ 6 เป็นบิตพาริตีและไม่ได้เป็นส่วนหนึ่งของการวัด ค่า ไบต์ที่ 5 และ 6 คืออุณหภูมิที่ปรับขนาด (เซลเซียส) โดยที่ 4 บิตที่ต่ำกว่าของไบต์ 5 จะถูกรวมเข้ากับ 7 บิตที่ต่ำกว่าของไบต์ 6 เพื่อสร้างค่า 11 บิต อุณหภูมิจะแสดงเป็นจำนวนบวกเสมอและจะกลายเป็นลบก็ต่อเมื่อมีการใช้มาตราส่วน มาตราส่วนคือ (C / 10) - 100 จำเป็นต้องหารด้วย 10 เนื่องจากความละเอียดของอุณหภูมิมีค่าเท่ากับหนึ่งในสิบขององศา จำเป็นต้องมีการลบเนื่องจากเซ็นเซอร์เพิ่ม 100 เพื่อให้ค่าที่ส่งเป็นบวก

ขั้นตอนที่ 2: ตัวรับสัญญาณ RF

เครื่องรับ RF
เครื่องรับ RF
เครื่องรับ RF
เครื่องรับ RF

โมดูล RF ที่ฉันใช้สำหรับโครงการนี้คือ RXB6 มันเป็นตัวรับ super heterodyne เมื่อเทียบกับตัวรับ super regenerative ที่ไม่พึงปรารถนาน้อยกว่า หากคุณดูที่โมดูล RF ราคาถูกคุณจะพบว่าบอร์ดตัวส่งและตัวรับมักจะถูกรวมเข้าด้วยกัน รีซีฟเวอร์แบบรวมกลุ่มส่วนใหญ่เป็นประเภทที่เกิดใหม่มาก ดังนั้นจึงมีแนวโน้มที่จะมีลักษณะการทำงานที่ต่ำกว่ามาก (รวมถึงช่วง) มากกว่ารีซีฟเวอร์ซูเปอร์เฮเทอโรไดน์ เราต้องการโมดูลตัวรับสำหรับโครงการนี้เท่านั้นเพราะเราจะรับสัญญาณจากเครื่องส่งเซ็นเซอร์สภาพอากาศ

ขั้นตอนที่ 3: เสาอากาศ RF

เสาอากาศ RF
เสาอากาศ RF

RXB6 ไม่ได้มาพร้อมกับเสาอากาศ คุณสามารถซื้อเสาอากาศแบบเกลียวได้ในราคาถูก แต่ก็ยังง่ายต่อการสร้างเสาอากาศของคุณเอง อันที่จริง สายจัมเปอร์เขียงหั่นขนมสามารถเสียบเข้ากับขาเสาอากาศของโมดูลได้หากคุณไม่ต้องการจินตนาการมากเกินไป ตามหลักการแล้วเสาอากาศแบบลวดตรงจะมีความยาวคลื่น 1/4 ซึ่งใช้งานได้ประมาณ 6.8 นิ้ว ตอนแรกฉันทำสายจัมเปอร์และไม่มีปัญหาในการหยิบเซ็นเซอร์ภายนอกของฉันแม้ว่าโรงงานอิเล็กทรอนิกส์ของฉันจะอยู่ในห้องใต้ดินของฉัน

ความเป็นไปได้อีกประการหนึ่งคือการสร้างเสาอากาศแบบเกลียวของคุณเอง มีแผนที่หลากหลายสำหรับสิ่งนั้นบนเว็บ แต่แผนที่ที่แสดงในภาพด้านบนคือสิ่งที่ฉันทำ ฉันใช้ลวดแกนแข็งจากชิ้นส่วนของสายเคเบิลอีเทอร์เน็ตแล้วพันรอบก้านเรียบของดอกสว่าน 5/32 นิ้ว เปิดฉนวนทิ้งไว้ ยกเว้นส่วนปลายที่บัดกรีกับบอร์ด RF คุณจะต้อง 20 รอบ คุณสามารถใช้ดอกสว่านขนาด 7/32 นิ้วและพันรอบได้ 17 รอบแทน สิ่งเหล่านี้อาจทำงานได้ดีสำหรับช่วงที่คุณน่าจะมีสำหรับเซ็นเซอร์ของคุณ กุญแจสำคัญคือการมีเครื่องรับ RF ที่ดีในการเริ่มต้น เซ็นเซอร์ AcuRite ยังมีตัวส่งสัญญาณที่ค่อนข้างแรง

ขั้นตอนที่ 4: โปรโตคอลการสื่อสาร RF

มีเทคนิคการมอดูเลตที่แตกต่างกันสองสามแบบสำหรับการส่งข้อมูล แต่เซ็นเซอร์เหล่านี้ใช้วิธีที่ง่ายที่สุดคือ OOK (เปิด-ปิด-คีย์) หรือ ASK (แอมพลิจูด-ชิฟต์-คีย์) เนื่องจากเรากำลังจัดการกับบิตข้อมูล 0/1 ในตัวอย่างนี้ แอมพลิจูดจึงเต็มหรือเต็ม ดังนั้น เพื่อจุดประสงค์ของเรา OOK และ ASK จึงเหมือนกันเพราะ OOK หมายความว่าผู้ให้บริการ RF เต็มหรือเต็ม รูปแบบข้อความถูกกำหนดโดยผู้ผลิตอุปกรณ์ส่งสัญญาณโดยทั่วไป และสามารถใช้อัตราการส่ง รูปแบบการจัดรูปแบบบิต และความยาวของข้อความได้แทบทุกรูปแบบ แบนด์ 433 เมกะเฮิรตซ์เต็มไปด้วยการส่งสัญญาณสำหรับสิ่งต่าง ๆ เช่นสมาร์ทมิเตอร์ ฯลฯ ดังนั้นจึงต้องปรับซอฟต์แวร์เพื่อกรองเฉพาะรูปแบบข้อความที่เราต้องการใช้

ขั้นตอนที่ 5: ข้อมูลเวลา

ข้อมูลเวลา
ข้อมูลเวลา

ฉันใช้หน่วย GPS ราคาถูกเพื่อรับข้อมูลเวลาที่แม่นยำซึ่งจะรีสตาร์ทโดยอัตโนมัติหลังจากไฟฟ้าดับ ฉันมีหน่วย GPS หลายเครื่อง (ไม่มีจอแสดงผล) ที่ส่งออกประโยค NMEA มาตรฐาน แต่หน่วยที่เล็กที่สุดและราคาถูกที่สุดที่ฉันมีคือ NEO-6M โมดูล NEO-6M นั้นง่ายต่อการเชื่อมต่อกับ Arduino เนื่องจากใช้พอร์ตอนุกรมระดับ TTL ข้อแตกต่างที่แท้จริงเพียงอย่างเดียวคือมาตรฐาน NMEA ระบุอัตราบอดแบบอนุกรมที่ 4800 แต่ค่าเริ่มต้น NEO-6M เป็น 9600 บอด คุณสามารถเรียกใช้โปรแกรม "u-center" ฟรีเพื่อเปลี่ยนอัตรารับส่งข้อมูลได้ แต่ฉันเพิ่งปล่อยให้เป็นค่าเริ่มต้นจากโรงงาน นอกจากนี้ยังมีโปรแกรมยูทิลิตี้ฟรีที่เรียกว่า GPSInfo (เผยแพร่โดย Globalsat) ซึ่งมีประโยชน์มากสำหรับการดูข้อมูล GPS บนพีซี คุณสามารถเชื่อมต่อหน่วย GPS กับสาย USB มาตรฐานกับ TTL เพื่อตรวจสอบหรือตั้งค่าโดยใช้พีซี โปรดทราบว่าชิป GPS บนโมดูลทำงานจริงที่ 3.3 โวลต์ (ผ่านตัวควบคุมแรงดันไฟฟ้าออนบอร์ด) ดังนั้นหากคุณต้องการเชื่อมต่อกับพอร์ต RXD คุณควรลดระดับลงจาก 5 โวลต์ พอร์ต TXD สามารถเชื่อมต่อโดยตรงกับ Arduino หรือพีซี

ขั้นตอนที่ 6: เขตเวลา

การแสดงเวลา GPS เป็นเรื่องง่ายที่จะทำตราบเท่าที่คุณต้องการแสดง UTC (Universal Time Coordinated) ประโยค NMEA ประกอบด้วยอักขระ ASCII ซึ่งสามารถส่งออกไปยัง LCD ได้โดยตรง ส่วนของเวลาอยู่ในรูปแบบ HHMMSS. FF (ชั่วโมง นาที วินาที และเศษส่วนวินาที) สำหรับนาฬิกาของเรา ส่วนที่เป็นเศษส่วนไม่มีประโยชน์ ดังนั้นสิ่งที่เราต้องจัดการคืออักขระหกตัว ปัญหาคือคุณต้องแปลงเป็นเวลาท้องถิ่นของคุณและเป็นรูปแบบ AM/PM 12 ชั่วโมงหากคุณต้องการ แต่บางครั้งปัญหาคือสิ่งที่ทำให้ชีวิตน่าสนใจ นั่นคือส่วนนั้นของซอฟต์แวร์เป็นเรื่องเกี่ยวกับ

สำหรับเขตเวลา คุณอาจคิดว่าจะมีเพียง 24 แห่ง โดย 12 แห่งอยู่ทางตะวันออกของตำแหน่ง UTC (+ โซน) และ 12 แห่งอยู่ทางตะวันตกของตำแหน่ง UTC (- โซน) อันที่จริงมีลูกบอลคี่สองสามชั่วโมงที่เป็นเศษส่วนและอีกสองสามอันที่เกิน "ขีด จำกัด " 12 ชั่วโมง หากคุณบังเอิญอาศัยอยู่ในพื้นที่เหล่านั้น ฉันขอโทษเพราะซอฟต์แวร์ของฉันมีบัญชีสำหรับโซนทั้ง 24 ชั่วโมงเท่านั้น มีพวกเราบางคนที่ใช้ Daylight Savings Time ส่วนหนึ่งของปี แต่ไม่ได้นับรวมในซอฟต์แวร์โดยอัตโนมัติ ซึ่งจะต้องมีตารางค้นหาวันที่ในอนาคต ความซับซ้อนเพิ่มเติมในซอฟต์แวร์ และความจำเป็นในการอัปเดตซอฟต์แวร์หากสัปดาห์ของปีสำหรับการเปลี่ยนผ่านเปลี่ยนไป แต่ฮาร์ดแวร์จะใช้สวิตช์สัมผัสชั่วขณะเพื่อให้ตั้งค่าเขตเวลาได้ง่าย (ออฟเซ็ต UTC)

ขั้นตอนที่ 7: แผนผัง

แผนผัง
แผนผัง

แผนผังแสดงไว้ด้านบนและรวมการเชื่อมต่อสำหรับอินเทอร์เฟซ LCD ขนาด 4 บิต 1602 ข้อมูลอนุกรมจากเครื่องรับ RF อยู่ที่ระดับลอจิกดิจิตอล ดังนั้นจึงเชื่อมต่อโดยตรงกับพินอินพุตข้อมูล Arduino ตัวใดตัวหนึ่ง พินได้รับการกำหนดค่าในซอฟต์แวร์เพื่อทำหน้าที่ขัดจังหวะเมื่อเปลี่ยนเพื่อให้เราสามารถวัดความกว้างของพัลส์ได้ เอาต์พุต GPS TXD เชื่อมต่อโดยตรงกับอินพุต Arduino RX

มีสวิตช์สองตัวที่ใช้ ดังที่กล่าวไว้ก่อนหน้านี้ สวิตช์สัมผัสชั่วขณะช่วยให้สามารถตั้งค่าออฟเซ็ต UTC ได้ สามารถกดสวิตช์เมื่อใดก็ได้เพื่อเข้าสู่โหมดตั้งค่า เริ่มแรก หน้าจอจะแสดงค่าชดเชย UTC ที่ไม่ถูกต้องเป็น “+77” โปรดดูส่วน “ซอฟต์แวร์นาฬิกา” สำหรับคำแนะนำการตั้งค่าออฟเซ็ต UTC

สวิตช์ที่สองเป็นสวิตช์เปิด/ปิดอย่างง่าย ในตำแหน่ง "ปิด" เวลาจะแสดงในรูปแบบ 12 ชั่วโมง (AM/PM) และในตำแหน่ง "เปิด" เวลาจะแสดงในรูปแบบ 24 ชั่วโมง สวิตช์นี้สามารถเปลี่ยนแปลงได้ตลอดเวลาเพื่อสลับระหว่างรูปแบบต่างๆ

หากต้องการเพียงแค่ฟังก์ชันนาฬิกา ก็ไม่จำเป็นต้องเชื่อมต่อโมดูลตัวรับสัญญาณ RF หากต้องการเพียงแค่ฟังก์ชันสภาพอากาศ ก็ไม่จำเป็นต้องเชื่อมต่อ GPS และสวิตช์ทั้งสอง

ขั้นตอนที่ 8: ซอฟต์แวร์ LCD

ฉันมักจะใช้อินเทอร์เฟซ LCD แบบใดแบบหนึ่งจากสองประเภท หนึ่งคืออินเทอร์เฟซ 4 บิตมาตรฐานและอีกอันคืออินเทอร์เฟซ 3 สายที่ใช้ shift register ฉันออกแบบอินเทอร์เฟซนั้นเมื่อทำงานกับไมโครคอนโทรลเลอร์ PIC ขนาดเล็กที่มีพิน I/O ในจำนวนจำกัด ฉันใช้อินเทอร์เฟซ 4 บิตสำหรับโปรเจ็กต์นี้ แต่มีไฟล์รวม LCD ของตัวเอง แทนที่จะใช้ไลบรารี Arduino LCD ทั่วไป ซึ่งช่วยลดการใช้หน่วยความจำและความซับซ้อนของโค้ด และยังช่วยให้ฉันปรับแต่งโค้ดสำหรับโปรเจ็กต์เฉพาะเช่นนี้ได้

ขั้นตอนที่ 9: ซอฟต์แวร์นาฬิกา

หน่วย GPS ส่งออกประโยคมาตรฐาน NMEA-0183 ซึ่งเป็นสตริง ASCII ที่มีข้อมูลหลากหลาย สำหรับแอปพลิเคชันนี้ ฉันเลือกประโยค GGA เพื่อรับข้อมูลเวลา เพราะนั่นคือประโยคที่ฉันใช้สำหรับโครงการ GPS ก่อนหน้า เขตข้อมูลในประโยค NMEA จะถูกคั่นด้วยเครื่องหมายจุลภาค ดังนั้น หลังจากที่ตรวจพบส่วนหัวของประโยค GGA ซอฟต์แวร์จะนับเครื่องหมายจุลภาคและเรียกรูทีนที่เหมาะสมสำหรับแต่ละเขตข้อมูลที่ต้องการของข้อมูล GPS เฉพาะข้อมูลเวลาเท่านั้นที่จำเป็นที่นี่และที่อยู่ในฟิลด์หลังเครื่องหมายจุลภาคแรก ดังนั้นจึงไม่จำเป็นต้องนับ

หกหลักเวลา (HHMMSS) จะถูกบัฟเฟอร์และประมวลผลหลังจากได้รับทั้งหมดแล้ว GPS อาจแสดงข้อความที่ไม่สมบูรณ์บางส่วนตั้งแต่เนิ่นๆ ดังนั้นรูทีนการบัฟเฟอร์จะตรวจสอบว่าอักขระแต่ละตัวเป็นค่าตัวเลข ASCII หากได้รับอักขระที่ไม่ถูกต้อง ข้อความจะถูกยกเลิก สิ่งนี้อาจเกิดขึ้นได้น้อยมากในระหว่างการทำงานปกติ โดยเฉพาะอย่างยิ่งหากการสื่อสารพอร์ตอนุกรมลดลงเล็กน้อย ฉันเคยเห็นสิ่งนี้เพียงครั้งเดียวและทั้งหมดที่เกิดขึ้นคือเวลาหยุดชั่วคราวหนึ่งวินาทีแล้วเพิ่มขึ้นสองวินาทีแทนที่จะเป็นหนึ่งครั้ง

หากซอฟต์แวร์ได้รับการกำหนดค่าให้แสดงเวลาเท่านั้น บรรทัดแรกของ LCD จะแสดงเวลาท้องถิ่นและบรรทัดที่สองจะแสดง UTC สำหรับ UTC ซอฟต์แวร์เพียงแค่ส่งอักขระ ASCII ไปยังรูทีนการแสดงผลโดยตรง โดยใส่เครื่องหมายทวิภาค (:) อย่างเหมาะสม

ในการแปลง UTC เป็นเวลาท้องถิ่น ต้องใช้ออฟเซ็ต UTC (เขตเวลา) เนื่องจากเวลา UTC จาก GPS อยู่ในรูปแบบ ASCII ซอฟต์แวร์จึงแปลงอักขระชั่วโมง ASCII เป็นทศนิยม แล้วจึงเพิ่มออฟเซ็ต UTC ออฟเซ็ต UTC ถูกเก็บไว้เป็นค่า BCD บวกกับบิตเครื่องหมาย ดังนั้นมันจึงถูกแปลงเป็นค่าจำนวนเต็มก่อนแล้วจึงลบล้างหากบิตเครื่องหมายถูกตั้งค่าไว้ เมื่อคำนวณค่าชั่วโมงตามเวลาท้องถิ่นแล้ว ตารางค้นหาจะถูกใช้เพื่อแปลงเป็น BCD จากนั้น BCD จะถูกแปลงกลับเป็น ASCII เพื่อแสดงผล ตารางค้นหาต้องรองรับรูปแบบ UTC แบบ 24 ชั่วโมงและเขตเวลา +/- 12 ในการดำเนินการนี้ เวลา UTC จาก 0000 ถึง 2300 จะใช้ 24 รายการตรงกลางในตารางโดยมี 12 รายการก่อนหน้าและ 12 รายการหลังจากนั้น เพื่อพิจารณาเขตเวลา ตารางหนึ่งอยู่ในรูปแบบ 12 ชั่วโมง ดังนั้นฉันจึงเพิ่มตารางค้นหาสำหรับส่วน AM/PM ของจอแสดงผลด้วย อีกตารางหนึ่งอยู่ในรูปแบบ 24 ชั่วโมง ดังที่ได้กล่าวไว้ก่อนหน้านี้ สวิตช์เปิด/ปิดช่วยให้สามารถเลือกรูปแบบ 12 ชั่วโมงหรือ 24 ชั่วโมงได้

โซนเวลาถูกดึงมาจาก EEPROM ระหว่างการเริ่มต้นและแสดงชั่วครู่ หากไม่ได้ตั้งค่าไว้อย่างน้อยหนึ่งครั้ง ระบบจะเรียกรูทีนการตั้งค่า รูทีนการตั้งค่าสามารถเรียกได้ตลอดเวลาโดยกดสวิตช์หน้าสัมผัสชั่วขณะ ขั้นตอนการตั้งค่าจะเริ่มต้นการแสดงผลเป็น “UTC OFFSET +77” กดสวิตช์สั้น ๆ จะเปลี่ยนค่าเป็น "-00" หากจำเป็นต้องใช้เขตเวลาที่เป็นบวก การกดสั้นๆ อีกครั้งจะเปลี่ยนค่าเป็น “+00” กดค้าง (> 1 วินาที) จะเป็นการย้ายโหมดการตั้งค่าไปยังขั้นตอนถัดไป ณ จุดนี้การกดสั้นๆ แต่ละครั้งจะเพิ่มค่าเวลาสูงสุด 12 หลังจากถึงโซนเวลาที่ต้องการแล้ว ให้กดสวิตช์ค้างไว้นานกว่า 1 วินาทีแล้วปล่อย ซอฟต์แวร์จะบันทึกค่า UTC ใน EEPROM และแสดง “OFFSET SAVED” สั้นๆ หากคุณทำผิดพลาดระหว่างการเข้าออก ให้ออกแล้วกดสวิตช์อีกครั้งเพื่อรีเซ็ต

NEO-6M ไม่ต้องการตำแหน่งที่ดีในการส่งสัญญาณเวลา ดังนั้นควรส่งข้อความทันทีที่ได้รับดาวเทียมหนึ่งดวง ก่อนหน้านั้นหน้าจอจะอ่านว่า "NO DATA"

ขั้นตอนที่ 10: ซอฟต์แวร์สภาพอากาศ

ไมโครคอนโทรลเลอร์ PIC มีความสามารถในการเปิด/ปิดตัวจับเวลาโดยใช้พัลส์ภายนอก พัลส์อินพุตเดียวกันนั้นสามารถใช้เป็นอินเทอร์รัปต์ภายนอกเพื่อส่งสัญญาณการอ่านระยะเวลาของพัลส์ Arduino ไม่มีความสามารถที่แน่นอนนั้น ฉันจึงใช้ฟังก์ชันขัดจังหวะเมื่อเปลี่ยน ที่ขอบด้านหนึ่งของพัลส์ข้อความ RF เวลาไมโครวินาทีปัจจุบันจะถูกบันทึกโดยตัวจัดการการขัดจังหวะ ที่ขอบด้านตรงข้าม เวลาที่ผ่านไปจะถูกคำนวณเพื่อกำหนดความกว้างพัลส์

ซอฟต์แวร์มีการกำหนด "DEBUG" ที่อนุญาตให้แสดงรูปแบบข้อมูลดิบของข้อความที่ได้รับ นอกจากนี้ยังมีการกำหนดเพื่อระบุพินอินพุต Arduino สำหรับสตรีมอนุกรมจากเครื่องรับ RF ซอฟต์แวร์ได้รับการตั้งค่าให้คำนวณการตั้งค่าการลงทะเบียนการขัดจังหวะเมื่อเปลี่ยนที่เหมาะสมตามคำจำกัดความนี้ การคำนวณใช้ได้กับพินดิจิตอล Arduino เท่านั้น สามารถใช้พินอะนาล็อกแทนได้ แต่จะต้องมีการเข้ารหัสค่ารีจิสเตอร์อย่างหนัก

ตัวจัดการขัดจังหวะกำหนดว่าจำนวนที่จับได้นั้นยาวพอที่จะเป็นพัลส์เริ่มต้นหรือไม่ ดังที่กล่าวไว้ก่อนหน้านี้ ช่องว่างระหว่างหลายข้อความคือ 2ms นั่นคือสิ่งที่ซอฟต์แวร์มองหา เนื่องจากการรับส่งข้อมูล 433 MHz ทั้งหมด การคัดกรองเบื้องต้นในซอฟต์แวร์ทำให้แน่ใจได้ว่าเวลาที่วัดได้อย่างน้อย 1.8 มิลลิวินาที แต่ไม่เกิน 2.4 มิลลิวินาที หลังจากตรวจพบการเริ่มต้น ซอฟต์แวร์จะค้นหาบิตซิงค์ (600us) และนับเพื่อให้แน่ใจว่าได้รับสี่บิต เมื่อผ่านการทดสอบเหล่านี้ ซอฟต์แวร์จะค้นหาบิตไทม์ที่เหมาะสมที่ 200us และ 400us

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

ข้อมูลเซนติเกรดสองไบต์ในข้อความ RF ถูกผสมเข้าด้วยกันเพื่อสร้างค่า 11 บิต ส่วนล่างถูกเลื่อนไปทางซ้ายหนึ่งบิตเพื่อกำจัดพาริตีบิตและจัดตำแหน่งให้ตรงกับบิตในส่วนบน สองไบต์ถูกสร้างเป็นตัวแปรคำ 16 บิต จากนั้นสิ่งทั้งหมดจะถูกเลื่อนไปทางขวาหนึ่งบิตเพื่อรับการจัดตำแหน่งบิตสุดท้าย ตัวแปรคำจะถูกแปลงเป็นตัวแปรจุดลอยตัวสำหรับการคำนวณทางคณิตศาสตร์

ข้อดีอย่างหนึ่งของการใช้ C++ บน Arduino กับภาษาแอสเซมบลีบน PIC คือทำให้การคำนวณทางคณิตศาสตร์ง่ายขึ้น ดังที่ได้กล่าวไว้ก่อนหน้านี้การแปลงเซนติเกรดคือ (C / 10) -100 ผลลัพธ์จะถูกแปลงเป็นสตริงและส่งไปยัง LCD เพื่อแสดงผล การคำนวณฟาเรนไฮต์คือ (C * 1.8) + 32 ผลลัพธ์จะถูกแปลงเป็นสตริงอีกครั้งและส่งไปยัง LCD เพื่อแสดงผล ในทั้งสองกรณี การแปลงสตริงจะมีเครื่องหมายลบ (หากเหมาะสม) และจุดทศนิยม มีการตรวจสอบจุดทศนิยมเพื่อให้แน่ใจว่ามีเพียงอักขระเดียวหลังจากจุดทศนิยมถูกส่งไปยังจอแสดงผล จำเป็นต้องมีการตรวจสอบเนื่องจากสตริงสามารถมีความยาวได้ตั้งแต่ 3 ถึง 5 อักขระ

ฉันมีเซ็นเซอร์ AcuRite สองตัว ดังนั้นฉันจึงเพิ่มการตรวจสอบในซอฟต์แวร์เพื่อให้แน่ใจว่าข้อมูลสำหรับตัวหนึ่งจะไม่เขียนทับข้อมูลของอีกตัวหนึ่ง หากซอฟต์แวร์ถูกตั้งค่าให้ทำหน้าที่เกี่ยวกับสภาพอากาศเท่านั้น เซ็นเซอร์ตัวแรกที่ได้รับหลังจากเปิดเครื่องจะแสดงในบรรทัดที่ 1 และอีกอันแสดงขึ้นในบรรทัดที่ 2 โดยใช้โหมดดีบัก ฉันสามารถดูว่า ID คืออะไรสำหรับเซ็นเซอร์แต่ละตัว ฉันจึงสามารถตรวจสอบโค้ดง่ายๆ ได้หากฉันเท่านั้น ต้องการประมวลผลข้อมูลจากหนึ่งในนั้น

ซอฟต์แวร์ตรวจสอบสถานะแบตเตอรี่ (byte3) และแสดงข้อความหากแสดงว่าแบตเตอรี่เหลือน้อย ข้อความนี้จะเขียนทับข้อมูลอื่นๆ ทั้งหมดสำหรับเซ็นเซอร์นั้น

ขั้นตอนที่ 11: แสดง

จอแสดงผล
จอแสดงผล
จอแสดงผล
จอแสดงผล
จอแสดงผล
จอแสดงผล

ต่อไปนี้คือตัวอย่างบางส่วนที่แสดงสำหรับฟังก์ชันต่างๆ ฉันมี Instructables อื่น ๆ สองสามตัว แต่โครงการไมโครคอนโทรลเลอร์ PIC ส่วนใหญ่ของฉันสามารถพบได้บนเว็บไซต์ของฉันที่: www.boomerrules.wordpress.com

แนะนำ: