สารบัญ:

ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง: 13 ขั้นตอน
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง: 13 ขั้นตอน

วีดีโอ: ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง: 13 ขั้นตอน

วีดีโอ: ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง: 13 ขั้นตอน
วีดีโอ: ปรับค่าวันที่ และเวลาใน Windows 10 - Date & Time | EP.15 ทริคใช้งาน Windows 10 2024, กรกฎาคม
Anonim
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง
ตัวตั้งเวลาตั้งโปรแกรมได้ 8 ช่อง

บทนำ

ฉันใช้ไมโครคอนโทรลเลอร์ PIC ของ Microchip สำหรับโครงการของฉันมาตั้งแต่ปี 1993 และได้เขียนโปรแกรมทั้งหมดของฉันในภาษาแอสเซมเบลอร์ โดยใช้ Microchip MPLab IDE โปรเจ็กต์ของฉันมีตั้งแต่สัญญาณไฟจราจรธรรมดาและไฟ LED กะพริบ ไปจนถึงอินเทอร์เฟซจอยสติ๊ก USB สำหรับรุ่น R/C และตัววิเคราะห์สวิตช์เกียร์ที่ใช้ในอุตสาหกรรม การพัฒนาใช้เวลาหลายวัน และบางครั้งอาจต้องใช้รหัสแอสเซมเบลอร์หลายพันบรรทัด

หลังจากได้รับ Matrix Multimedia Flowcode 4 Professional ฉันค่อนข้างสงสัยเกี่ยวกับซอฟต์แวร์ มันดูง่ายเกินไปที่จะเชื่อ ฉันตัดสินใจลองใช้และทดสอบ Component Macro ต่างๆ ทั้งหมด ทั้งหมดนี้ประสบความสำเร็จอย่างมาก ส่วนที่ดีที่สุดของการใช้ Flowcode คือโครงการง่ายๆ สามารถเขียนโค้ดได้ในคืนเดียว หลังจากเล่นกับI²Cและนาฬิกาเรียลไทม์ DS1307 ฉันตัดสินใจออกแบบตัวจับเวลาช่องสัญญาณ 8 ช่องโดยใช้ Flowcode ไม่ใช่โครงการขนาดเล็กและง่าย ฉันเชื่อว่านี่จะเป็นโครงการที่ดีในการสอน Flowcode ให้กับตัวเอง

การเลือกไมโครโปรเซสเซอร์และส่วนประกอบอื่นๆ

เนื่องจากต้องใช้พิน I/O จำนวนมาก จึงชัดเจนว่าจำเป็นต้องใช้อุปกรณ์ 40 พิน PIC 18F4520 ได้รับเลือกสำหรับหน่วยความจำโปรแกรม 32K เป็นหลัก และหน่วยความจำข้อมูล 1536 ไบต์ ส่วนประกอบทั้งหมดที่ใช้เป็นอุปกรณ์เจาะรูมาตรฐาน ทำให้สามารถสร้างวงจรบนบอร์ด Vero ได้หากต้องการ สิ่งนี้ยังช่วยในการพัฒนาบนเขียงหั่นขนม

ขั้นตอนที่ 1: วัตถุประสงค์ของโครงการ

วัตถุประสงค์ของโครงการ
วัตถุประสงค์ของโครงการ

วัตถุประสงค์

- จับเวลาได้อย่างแม่นยำ พร้อมแบตเตอรี่สำรอง

- โปรแกรมและข้อมูลทั้งหมดจะถูกเก็บไว้แม้หลังจากสูญเสียพลังงาน

- ส่วนต่อประสานผู้ใช้ที่เรียบง่าย

- ความยืดหยุ่นในการเขียนโปรแกรม

จับเวลา

การใช้ชีวิตในพื้นที่ที่มีแนวโน้มว่าจะเกิดไฟฟ้าขัดข้อง มาตรฐาน 50/60Hz จากสายไฟจะไม่เพียงพอสำหรับการรักษาเวลาที่แม่นยำ นาฬิกาแบบเรียลไทม์เป็นสิ่งจำเป็น และหลังจากทดสอบชิป RTC หลายตัว ฉันตัดสินใจเลือก DS1307 เนื่องจากออสซิลเลเตอร์ที่เรียบง่ายและการกำหนดค่าการสำรองแบตเตอรี่ รักษาเวลาได้อย่างแม่นยำโดยใช้คริสตัล 32.768 kHz ที่เชื่อมต่อกับ DS1307 เท่านั้น ความแม่นยำอยู่ภายใน 2 วินาทีในช่วงทดลองใช้งาน 2 เดือนโดยใช้คริสตัล 4 แบบที่แตกต่างกัน

การเก็บรักษาข้อมูล

ข้อมูลโปรแกรมจับเวลาทั้งหมดจะต้องถูกเก็บรักษาไว้ แม้ในระหว่างที่ไฟฟ้าดับ ด้วยโปรแกรมต่างๆ มากถึง 100 โปรแกรมและข้อมูลการกำหนดค่าต่างๆ เป็นที่ชัดเจนว่า EEPROM ออนบอร์ด 256 ไบต์ของ PIC จะไม่ใหญ่พอ EEPROM 24LC256 I²C ใช้เพื่อเก็บข้อมูลการเขียนโปรแกรมทั้งหมด

ส่วนต่อประสานผู้ใช้ที่เรียบง่าย

อินเทอร์เฟซผู้ใช้ประกอบด้วย 2 รายการเท่านั้น จอ LCD 16 x 4 บรรทัด พร้อมไฟพื้นหลัง LED และปุ่มกด 4 x 3 การเขียนโปรแกรมทั้งหมดสามารถทำได้ด้วยการกดปุ่มเพียงไม่กี่ปุ่ม ส่วนเพิ่มเติมในอินเทอร์เฟซคือเสียง Piezo Buzzer และไฟพื้นหลัง LCD ที่กะพริบเป็นภาพ

ขั้นตอนที่ 2: ความยืดหยุ่นในการเขียนโปรแกรม

ความยืดหยุ่นในการเขียนโปรแกรม
ความยืดหยุ่นในการเขียนโปรแกรม

เพื่อให้แน่ใจว่าโปรแกรมมีความยืดหยุ่นเพียงพอ ตัวจับเวลามี 100 โปรแกรมซึ่งสามารถตั้งค่าแยกกันได้ สำหรับแต่ละโปรแกรม สามารถตั้งค่า On time, Off Time, Output Channels และ Day of Week ได้ แต่ละโปรแกรมมีสามโหมด:

- อัตโนมัติ: ตั้งค่าเวลาเปิด เวลาปิด ช่องสัญญาณออก และวันในสัปดาห์

- ปิด: สามารถปิดใช้งานแต่ละโปรแกรมได้โดยไม่ต้องลบการตั้งค่า หากต้องการเปิดใช้งานโปรแกรมอีกครั้ง

เพียงแค่เลือกโหมดอื่น

- กลางวัน/กลางคืน: ตั้งค่าเวลาเปิด เวลาปิด ช่องสัญญาณออก และวันในสัปดาห์ ทำงานเหมือนกับโหมดอัตโนมัติ แต่จะ

เปิดเอาต์พุตระหว่างเวลาเปิดและปิดเมื่อมืดเท่านั้น สิ่งนี้ทำให้สามารถควบคุมกลางวัน/กลางคืนได้อย่างเต็มที่เช่นกัน

เป็นการเพิ่มความยืดหยุ่นในการเปิดไฟในเวลาพระอาทิตย์ตกและปิดเมื่อพระอาทิตย์ขึ้น

ตัวอย่างที่ 1: จะเปิดไฟหลังเวลา 20:00 น. และปิดไฟเมื่อพระอาทิตย์ขึ้น:

เมื่อ: 20:00 น.

ปิด:12:00, ตัวอย่างที่ 2: จะเปิดไฟเมื่อพระอาทิตย์ตก และปิดไฟเวลา 23:00 น.

เมื่อ: 12:00

ปิด: 23:00 น.

ตัวอย่างที่ 3: จะเปิดไฟเมื่อพระอาทิตย์ตก และปิดไฟเมื่อพระอาทิตย์ขึ้น

เมื่อ: 12:01

ปิด: 12:00

มีตัวเลือกเพิ่มเติม โดยทั้งหมดทำงานแยกจากโปรแกรมเปิด/ปิด 100 รายการ

ช่องรายการที่ใช้งาน: แทนที่จะปิดหลายโปรแกรม ช่องสัญญาณออกแต่ละช่องสามารถปิดใช้งานได้โดยไม่ต้องเปลี่ยนโปรแกรม

อินพุตเสริม: มีอินพุตดิจิตอลสองช่อง เพื่อให้สามารถเปิดช่องสัญญาณเอาต์พุตบางช่องในช่วงเวลาที่กำหนดได้ ตัวอย่างเช่น สามารถใช้เพื่อเปิดไฟบางดวงเมื่อกลับถึงบ้านตอนดึก เมื่อกดปุ่มบนรีโมท หรือเปิดไฟอื่นเมื่อสัญญาณเตือนบ้านถูกกระตุ้น

เอาต์พุตเสริม: มีเอาต์พุตเพิ่มเติม 2 เอาต์พุต (นอกเหนือจาก 8 ช่องสัญญาณเอาต์พุต) สามารถตั้งโปรแกรมให้เปิดด้วยช่องสัญญาณเอาต์พุตบางช่องหรือด้วยอินพุตดิจิตอล ในการติดตั้งของฉัน ฉันมีเอาต์พุต 6-8 ที่ควบคุมการชลประทานของฉัน ซึ่งทำงานบน 24V ฉันใช้ช่อง 6-8 เพื่อเปิดหนึ่งในเอาต์พุตเสริม เพื่อเปิดแหล่งจ่ายไฟ 24V สำหรับระบบชลประทาน

เปิดเอง: เมื่ออยู่ในหน้าจอหลัก ปุ่ม 1-8 สามารถใช้เพื่อเปิดหรือปิดช่องด้วยตนเองได้

ขั้นตอนที่ 3: ฮาร์ดแวร์

ฮาร์ดแวร์
ฮาร์ดแวร์

แหล่งจ่ายไฟ: แหล่งจ่ายไฟประกอบด้วยวงจรเรียงกระแส ตัวเก็บประจุปรับให้เรียบ และฟิวส์ 1 แอมป์สำหรับการป้องกันการโอเวอร์โหลด อุปทานนี้ถูกควบคุมโดยตัวควบคุม 7812 และ 7805 แหล่งจ่ายไฟ 12V ใช้สำหรับขับรีเลย์เอาต์พุต และวงจรอื่นๆ ทั้งหมดใช้พลังงานจากแหล่งจ่ายไฟ 5V เนื่องจากตัวควบคุม 7805 เชื่อมต่อกับเอาต์พุตของตัวควบคุม 7812 กระแสทั้งหมดจะต้องถูกจำกัดไว้ที่ 1 แอมป์ผ่านตัวควบคุม 7812 ขอแนะนำให้ติดตั้งตัวควบคุมเหล่านี้บนแผ่นระบายความร้อนที่เหมาะสม

I²C Bus: แม้ว่า Flowcode จะอนุญาตให้มีการควบคุมฮาร์ดแวร์I²C แต่ฉันตัดสินใจใช้การกำหนดค่าซอฟต์แวร์I²C ซึ่งช่วยให้กำหนดพินได้อย่างยืดหยุ่นมากขึ้น แม้ว่าจะช้ากว่า (50 kHz) แต่ก็ยังทำงานได้ดีเมื่อเทียบกับฮาร์ดแวร์บัส I²C ทั้ง DS1307 และ 24LC256 เชื่อมต่อกับบัสI²Cนี้

นาฬิกาเรียลไทม์ (DS1307): ในระหว่างการเริ่มต้นระบบจะอ่าน RTC register 0 และ 7 เพื่อตรวจสอบว่ามีข้อมูลเวลาและการกำหนดค่าที่ถูกต้องหรือไม่ เมื่อตั้งค่าถูกต้องแล้ว เวลา RTC จะถูกอ่านและเวลาที่โหลดใน PIC นี่เป็นครั้งเดียวที่เวลาจะถูกอ่านจาก RTC หลังจากเริ่มต้นแล้ว จะมีชีพจร 1Hz อยู่ที่พิน 7 ของ RTC สัญญาณ 1Hz นี้เชื่อมต่อกับ RB0/INT0 และผ่านรูทีนบริการขัดจังหวะ เวลา PIC จะได้รับการอัปเดตทุกวินาที

EEPROM ภายนอก: ข้อมูลโปรแกรมและตัวเลือกทั้งหมดจะถูกเก็บไว้ใน EEPROM ภายนอก ข้อมูล EEPROM จะถูกโหลดเมื่อเริ่มต้น และสำเนาของข้อมูลจะถูกเก็บไว้ในหน่วยความจำ PIC ข้อมูล EEPROM จะอัปเดตเมื่อมีการเปลี่ยนแปลงการตั้งค่าโปรแกรมเท่านั้น

เซ็นเซอร์กลางวัน/กลางคืน: ใช้ตัวต้านทานแบบพึ่งพาแสงมาตรฐาน (LDR) เป็นเซ็นเซอร์กลางวัน/กลางคืน เนื่องจาก LDR มีหลายรูปแบบและหลากหลาย โดยทั้งหมดมีค่าความต้านทานต่างกันภายใต้สภาพแสงเดียวกัน ฉันจึงใช้ช่องสัญญาณอินพุตแบบอะนาล็อกเพื่ออ่านระดับแสง ระดับกลางวันและกลางคืนสามารถปรับได้ และให้ความยืดหยุ่นบางอย่างสำหรับเซ็นเซอร์ต่างๆ ในการตั้งค่าฮิสเทรีซีส คุณสามารถตั้งค่าแต่ละค่าสำหรับกลางวันและกลางคืนได้ สถานะจะเปลี่ยนก็ต่อเมื่อระดับแสงอยู่ต่ำกว่ากลางวันหรือสูงกว่าจุดที่ตั้งกลางคืนเป็นเวลานานกว่า 60 วินาที

จอแสดงผล LCD: ใช้จอแสดงผล 4 บรรทัด 16 ตัวอักษร เนื่องจากข้อมูลทั้งหมดไม่สามารถแสดงบนจอแสดงผล 2 บรรทัดได้ โปรเจ็กต์มีอักขระที่กำหนดเองบางตัว ซึ่งกำหนดไว้ในแมโคร LCD_Custom_Char

อินพุตเสริม: อินพุตทั้งสองถูกบัฟเฟอร์ด้วยทรานซิสเตอร์ NPN นอกจากนี้ยังมีค่า +12v และ 0V ที่ตัวเชื่อมต่อ ซึ่งช่วยให้สามารถเชื่อมต่อกับการเชื่อมต่อภายนอกได้อย่างยืดหยุ่นยิ่งขึ้น ตัวอย่างเช่น ตัวรับการควบคุมระยะไกลสามารถเชื่อมต่อกับแหล่งจ่ายได้

เอาต์พุต: เอาต์พุตทั้งหมดถูกแยกด้วยไฟฟ้าจากวงจรโดยใช้รีเลย์ 12V รีเลย์ที่ใช้ได้รับการจัดอันดับสำหรับ 250V AC ที่ 10 แอมป์ หน้าสัมผัสที่เปิดตามปกติและปิดตามปกติจะถูกนำออกมาที่เทอร์มินัล

ปุ่มกด: ปุ่มกดที่ใช้เป็นปุ่มกดแบบเมตริกซ์ 3 x 4 และเชื่อมต่อ PORTB:2..7

ขั้นตอนที่ 4: ปุ่มกดขัดจังหวะ

ปุ่มกดขัดจังหวะ
ปุ่มกดขัดจังหวะ
ปุ่มกดขัดจังหวะ
ปุ่มกดขัดจังหวะ
ปุ่มกดขัดจังหวะ
ปุ่มกดขัดจังหวะ

ฉันต้องการใช้ประโยชน์จาก PORTB Interrupt on Change interrupt เมื่อกดแป้นใดๆ สำหรับสิ่งนี้ ต้องสร้าง Custom Interrupt ใน Flowcode เพื่อให้แน่ใจว่าทิศทาง PORTB และข้อมูลได้รับการตั้งค่าถูกต้องก่อนและหลังการขัดจังหวะของปุ่มกดแต่ละครั้ง มีการขัดจังหวะทุกครั้งที่กดปุ่มหรือปล่อยปุ่ม รูทีนขัดจังหวะจะตอบสนองเมื่อกดปุ่มเท่านั้น

กำหนดเอง ขัดจังหวะ

เปิดใช้งานรหัส

portb = 0b00001110; trisb = 0b11110001;

intcon. RBIE = 1;

intcon2. RBIP = 1;

intcon2. RBPU = 1;

rcon. IPEN = 0;

รหัสตัวจัดการ

ถ้า (intcon & (1 << RBIF))

{ FCM_%n();

พอร์ตบี = 0b00001110;

ทริสบ = 0b11110001;

wreg= portb;

clear_bit(intcon, RBIF);

}

เจอปัญหา

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

ในรหัสที่กำหนดเองของปุ่มกดภายใต้ GetKeyPadNumber มีการเรียกมาโคร Delay_us ดังกล่าว ซึ่งจะทำให้สแต็กโอเวอร์โฟลว์ เพื่อแก้ปัญหานี้ ฉันได้ลบคำสั่ง Delay_us(10) และแทนที่ด้วย 25 บรรทัดของ "wreg = porta;" คำสั่ง คำสั่งนี้อ่าน PORTA และใส่ค่าลงในการลงทะเบียน W เพื่อให้เกิดความล่าช้า คำสั่งนี้จะถูกคอมไพล์เป็นคำสั่งเดียวที่คล้ายกับ assembler movf porta, 0 สำหรับนาฬิกา 10MHz ที่ใช้ในโปรเจ็กต์ แต่ละคำสั่งจะเป็น 400ns และเพื่อให้ได้ค่าดีเลย์ 10us ฉันต้องการ 25 คำสั่งเหล่านี้

หมายเหตุในบรรทัดที่สองของรูปที่ 3: GetKeypadNumber Custom Code ว่าคำสั่ง delay_us(10) เดิมถูกปิดใช้งานด้วย “//” ด้านล่างนี้ ฉันได้เพิ่ม 25 “wreg = porta;” คำสั่งให้ได้รับความล่าช้า 10us ใหม่ ไม่มีการเรียกใช้มาโครใดๆ ภายในโค้ดที่กำหนดเองของ Keypad_ReadKeypadNumber ตอนนี้สามารถใช้มาโครปุ่มกดภายในรูทีนบริการขัดจังหวะได้แล้ว

ควรสังเกตว่าส่วนประกอบ Flowcode Keypad และ eBlocks ไม่ได้ใช้ตัวต้านทานแบบดึงขึ้นมาตรฐานบนสายอินพุต แต่จะใช้ตัวต้านทานแบบดึงลง 100K แทน เนื่องจากมีการรบกวนบนแป้นพิมพ์ในระหว่างการพัฒนา ตัวต้านทาน 100K ทั้งหมดจึงถูกแทนที่ด้วย 10K และตัวต้านทาน 10K ทั้งหมดถูกแทนที่ด้วย 1K5 ปุ่มกดได้รับการทดสอบว่าทำงานได้อย่างถูกต้องด้วยสายวัดขนาด 200 มม.

ขั้นตอนที่ 5: การใช้ตัวจับเวลา

การใช้ตัวจับเวลา
การใช้ตัวจับเวลา
การใช้ตัวจับเวลา
การใช้ตัวจับเวลา
การใช้ตัวจับเวลา
การใช้ตัวจับเวลา

หน้าจอทั้งหมดได้รับการตั้งค่าเพื่อระบุข้อมูลที่จำเป็นทั้งหมดสำหรับผู้ใช้เพื่อเปลี่ยนแปลงการตั้งค่าอย่างรวดเร็ว บรรทัดที่ 4 ใช้เพื่อช่วยในการนำทางผ่านเมนูและตัวเลือกโปรแกรม มีหน้าจอทั้งหมด 22 จอให้เลือกใช้งานระหว่างการทำงานปกติ

บรรทัดที่ 1: เวลาและสถานะ

แสดงวันและเวลาปัจจุบัน ตามด้วยไอคอนสถานะ:

A – ระบุว่าอินพุต Aux A ถูกทริกเกอร์ และตัวจับเวลา Aux Input A กำลังทำงาน

B – ระบุว่า Aux Input B ถูกทริกเกอร์ และตัวจับเวลา Aux Input B กำลังทำงาน

C – ระบุว่า Aux Output C เปิดอยู่

D – ระบุว่า Aux Output D เปิดอยู่

} – สถานะเซ็นเซอร์กลางวัน/กลางคืน ถ้ามีแสดงว่าเป็นกลางคืน

บรรทัดที่ 2: ผลลัพธ์ของโปรแกรม

แสดงช่องที่เปิดใช้งานโดยโปรแกรมต่างๆ ช่องสัญญาณจะแสดงเป็นหมายเลขเอาต์พุต และ "-" แสดงว่าไม่ได้เปิดเอาต์พุตเฉพาะ ช่องที่ถูกปิดใช้งานใน "Program Outputs Active" จะยังคงระบุไว้ที่นี่ แต่จะไม่มีการตั้งค่าเอาต์พุตจริง

บรรทัดที่ 3: ผลลัพธ์ที่แท้จริง

แสดงช่องที่เปิดโดยโปรแกรมต่างๆ, Aux Inputs A & B หรือเอาต์พุตแบบแมนนวลที่ผู้ใช้กำหนด การกด 0 จะเป็นการปิดเอาต์พุตที่เปิดใช้งานด้วยตนเองทั้งหมดและรีเซ็ตตัวจับเวลา Aux Output A & B

LINE 4: เมนูและตัวเลือกที่สำคัญ (ในทุกเมนู)

ระบุฟังก์ชันของปุ่ม “*” และ “#”

ส่วนตรงกลางระบุว่าปุ่มตัวเลข (0-9) ใดที่ใช้งานสำหรับหน้าจอที่เลือก

สถานะอินพุตของ Aux Input A & B จะแสดงด้วยไอคอนสวิตช์เปิดหรือปิด

สามารถเปิด/ปิดเอาต์พุตได้ด้วยตนเองโดยกดปุ่มที่เกี่ยวข้องบนแป้นพิมพ์

ตลอดทั้งเมนู ปุ่ม Star และ Hash ใช้เพื่อนำทางผ่านตัวเลือกโปรแกรมต่างๆ ปุ่ม 0-9 ใช้สำหรับตั้งค่าตัวเลือก ในกรณีที่มีตัวเลือกหลายตัวในหน้าจอเดียวหรือเมนูการเขียนโปรแกรม ปุ่ม Hash จะใช้เพื่อเลื่อนดูตัวเลือกต่างๆ ตัวเลือกที่เลือกในปัจจุบันจะแสดงด้วยอักขระ “>” ทางด้านซ้ายของหน้าจอเสมอ

0-9 ป้อนค่าเวลา

1-8 เปลี่ยนการเลือกช่อง

14 36 ก้าวผ่านโปรแกรม ถอยหลัง 1 ก้าว ถอยหลัง 4 ก้าว 10 โปรแกรม เดินหน้า 3 ก้าว เดินหน้า 6 ก้าว 10

โปรแกรม

1-7 กำหนดวันในสัปดาห์ 1=วันอาทิตย์ 2=วันจันทร์ 3=วันอังคาร 4=วันพุธ 5=วันพฤหัสบดี 6=วันศุกร์ 7=วันเสาร์

0 ในหน้าจอหลัก ล้างการแทนที่ด้วยตนเองทั้งหมดและตัวจับเวลาอินพุต A และอินพุต B ในเมนูอื่นๆ มีการเปลี่ยนแปลง

ตัวเลือกที่เลือก

# ในหน้าจอหลักจะปิดใช้งานการแทนที่ด้วยตนเองทั้งหมด ตัวจับเวลาอินพุต A & อินพุต B และเอาต์พุตของโปรแกรม จนถึง

เหตุการณ์ต่อไป

* และ 1 รีบูตตัวจับเวลา

* และ 2 ล้างโปรแกรมและตัวเลือกทั้งหมด คืนค่าการตั้งค่าเป็นค่าเริ่มต้น

* และ 3 ใส่ตัวจับเวลาเข้าสู่โหมดสแตนด์บาย หากต้องการเปิดตัวจับเวลาอีกครั้ง ให้กดปุ่มใดก็ได้

ในระหว่างการป้อนค่าเวลาที่ไม่ถูกต้อง ไฟพื้นหลัง LCD จะกะพริบ 5 ครั้งเพื่อระบุข้อผิดพลาด ในเวลาเดียวกันเสียงกริ่งจะดังขึ้น คำสั่ง Exit และ Next จะทำงานเมื่อรายการปัจจุบันถูกต้องเท่านั้น

ไฟหลังจอ LCD

เมื่อเริ่มต้นใช้งานครั้งแรก ไฟพื้นหลัง LCD จะเปิดเป็นเวลา 3 นาที เว้นแต่:

- มีความล้มเหลวของฮาร์ดแวร์ (ไม่พบ EEPROM หรือ RTC)

- ไม่ได้ตั้งเวลาใน RTC

ไฟพื้นหลัง LCD จะเปิดขึ้นอีกครั้งเป็นเวลา 3 นาทีเมื่อผู้ใช้ป้อนข้อมูลบนแป้นพิมพ์ หากไฟแบ็คไลท์ LCD ปิดอยู่ คำสั่งปุ่มกดใดๆ จะเปิดไฟแบ็คไลท์ LCD ก่อน และไม่ต้องสนใจคีย์ที่กด เพื่อให้แน่ใจว่าผู้ใช้จะสามารถอ่านจอ LCD ก่อนใช้ปุ่มกดได้ ไฟพื้นหลัง LCD จะเปิดขึ้นเป็นเวลา 5 วินาทีหากเปิดใช้งาน Aux Input A หรือ Aux Input B

ขั้นตอนที่ 6: ภาพหน้าจอเมนู

ภาพหน้าจอเมนู
ภาพหน้าจอเมนู
ภาพหน้าจอเมนู
ภาพหน้าจอเมนู
ภาพหน้าจอเมนู
ภาพหน้าจอเมนู

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

ขั้นตอนที่ 7: การออกแบบระบบ

การออกแบบระบบ
การออกแบบระบบ

การพัฒนาและการทดสอบทั้งหมดทำบนเขียงหั่นขนม เมื่อดูส่วนต่างๆ ของระบบแล้ว ฉันแยกระบบออกเป็นสามโมดูล การตัดสินใจนี้ส่วนใหญ่เกิดจากการจำกัดขนาด PCB (80 x 100 มม.) ของ Eagle เวอร์ชันฟรี

โมดูล 1 - พาวเวอร์ซัพพลาย

โมดูล 2 - บอร์ด CPU

โมดูล 3 - บอร์ดรีเลย์

ฉันตัดสินใจว่าส่วนประกอบทั้งหมดจะต้องหาซื้อได้ง่าย และฉันไม่ต้องการใช้ส่วนประกอบยึดพื้นผิว

ผ่านแต่ละของพวกเขา

ขั้นตอนที่ 8: พาวเวอร์ซัพพลาย

พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย
พาวเวอร์ซัพพลาย

แหล่งจ่ายไฟตรงไปข้างหน้า และจ่าย CPU และแผงรีเลย์ด้วย 12V และ 5V

ฉันติดตั้งตัวควบคุมแรงดันไฟฟ้าบนฮีตซิงก์ที่เหมาะสม และยังใช้ตัวเก็บประจุแบบโอเวอร์เรตสำหรับการจ่ายไฟด้วย

ขั้นตอนที่ 9: บอร์ด CPU

บอร์ด CPU
บอร์ด CPU
บอร์ด CPU
บอร์ด CPU
บอร์ด CPU
บอร์ด CPU
บอร์ด CPU
บอร์ด CPU

ส่วนประกอบทั้งหมด ยกเว้นหน้าจอ LCD ปุ่มกด และรีเลย์ ถูกติดตั้งบนบอร์ด CPU

เพิ่มเทอร์มินัลบล็อกเพื่อลดความซับซ้อนในการเชื่อมต่อระหว่างแหล่งจ่าย อินพุตดิจิตอลสองช่อง และเซ็นเซอร์วัดแสง

หมุด/ซ็อกเก็ตส่วนหัวช่วยให้สามารถเชื่อมต่อกับหน้าจอ LCD และปุ่มกดได้ง่าย

สำหรับเอาต์พุตไปยังรีเลย์ ฉันใช้ ULN2803 มันมีตัวต้านทานการขับและฟลายแบ็คไดโอดที่จำเป็นทั้งหมดอยู่แล้ว สิ่งนี้ทำให้มั่นใจได้ว่าบอร์ด CPU ยังคงสามารถสร้างได้โดยใช้ Eagle เวอร์ชันฟรี รีเลย์เชื่อมต่อกับ ULN2803 สองตัว ULN2803 ด้านล่างใช้สำหรับเอาต์พุต 8 ช่อง และ ULN2803 ด้านบนสำหรับเอาต์พุตเสริม 2 ช่อง เอาต์พุตเสริมแต่ละตัวมีทรานซิสเตอร์สี่ตัว การเชื่อมต่อกับรีเลย์ยังใช้หมุด/ซ็อกเก็ตส่วนหัวอีกด้วย

PIC 18F4520 ได้รับการติดตั้งซ็อกเก็ตการเขียนโปรแกรมเพื่อให้สามารถตั้งโปรแกรมได้ง่ายผ่านโปรแกรมเมอร์ PicKit 3

บันทึก:

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

ฉันยังจัดเตรียมพอร์ต I2C ผ่านพิน/ซ็อกเก็ตส่วนหัวด้วย สิ่งนี้จะมีประโยชน์ในภายหลังกับแผงรีเลย์

บอร์ดประกอบด้วยจัมเปอร์สองสามตัว ซึ่งควรบัดกรีก่อนประกอบซ็อกเก็ต IC

ขั้นตอนที่ 10: สรุป Flowcode

สรุป Flowcode
สรุป Flowcode
สรุป Flowcode
สรุป Flowcode
สรุป Flowcode
สรุป Flowcode

เนื่องจากฉันเคยทำงานในระดับรีจิสเตอร์ในแอสเซมบลี บางครั้งการใช้มาโครคอมโพเนนต์เป็นเรื่องยากและน่าหงุดหงิด สาเหตุหลักมาจากการขาดความรู้เกี่ยวกับโครงสร้างการเขียนโปรแกรมของ Flowcode ที่เดียวที่ฉันเคยใช้บล็อก C หรือ ASM คือการเปิดเอาต์พุตภายในรูทีนการขัดจังหวะ และในรูทีน Do_KeyPressed เพื่อปิด/เปิดใช้งานการขัดจังหวะของปุ่มกด PIC จะถูกวางลงใน SLEEP โดยใช้บล็อก ASM เมื่อไม่พบ EEPROM หรือ RTC

ความช่วยเหลือเกี่ยวกับการใช้คำสั่ง I²C ต่างๆ ได้มาจากไฟล์วิธีใช้ Flowcode จำเป็นต้องรู้ว่าอุปกรณ์ I²C ต่างๆ ทำงานอย่างไร ก่อนจึงจะสามารถใช้คำสั่งได้สำเร็จ การออกแบบวงจรกำหนดให้ผู้ออกแบบต้องมีเอกสารข้อมูลที่เกี่ยวข้องทั้งหมด นี่ไม่ใช่ข้อบกพร่องของ Flowcode

Flowcode ยืนหยัดในการทดสอบจริงๆ และแนะนำเป็นอย่างยิ่งสำหรับผู้ที่ต้องการเริ่มทำงานกับไมโครโปรเซสเซอร์ในกลุ่มไมโครชิป

การเขียนโปรแกรม Flowcode และการกำหนดค่าสำหรับ PIC ถูกตั้งค่าตามรูปภาพ

ขั้นตอนที่ 11: บอร์ดรีเลย์ I2C เสริม

บอร์ดรีเลย์ I2C เสริม
บอร์ดรีเลย์ I2C เสริม
บอร์ดรีเลย์ I2C เสริม
บอร์ดรีเลย์ I2C เสริม
บอร์ดรีเลย์ I2C เสริม
บอร์ดรีเลย์ I2C เสริม

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

หลังจากการทดสอบระบบครั้งแรก ฉันไม่ชอบสายไฟทั้งหมดระหว่างบอร์ด CPU และรีเลย์ เมื่อฉันรวมพอร์ต I2C บนบอร์ด CPU ฉันตัดสินใจออกแบบบอร์ดรีเลย์เพื่อเชื่อมต่อกับพอร์ต I2C การใช้ชิปขยายพอร์ต I/O MCP23017 16 ช่องสัญญาณและอาร์เรย์ทรานซิสเตอร์ ULN2803 ฉันลดการเชื่อมต่อระหว่าง CPU และรีเลย์เป็น 4 สาย

เนื่องจากฉันไม่สามารถใส่รีเลย์ 16 ตัวบน PCB ขนาด 80 x 100 มม. ฉันจึงตัดสินใจสร้างสองบอร์ด MCP23017 แต่ละตัวใช้เพียง 8 พอร์ตจากทั้งหมด 16 พอร์ต บอร์ด 1 รองรับ 8 เอาต์พุต และบอร์ด 2 เอาต์พุตเสริมสองตัว ความแตกต่างเพียงอย่างเดียวบนกระดานคือที่อยู่ของแต่ละกระดาน ตั้งค่าได้ง่ายด้วยจัมเปอร์ขนาดเล็ก แต่ละบอร์ดมีคอนเน็กเตอร์สำหรับจ่ายไฟและข้อมูล I2C ไปยังบอร์ดอื่น

บันทึก:

หากจำเป็น ซอฟต์แวร์จะจัดเตรียมสำหรับบอร์ดเดียวที่สามารถใช้พอร์ตทั้งหมด 16 พอร์ตได้ ข้อมูลรีเลย์เอาท์พุตทั้งหมดมีอยู่ในบอร์ดแรก

เนื่องจากวงจรเป็นทางเลือกและเรียบง่ายมาก ฉันไม่ได้สร้างแผนผัง หากมีความต้องการเพียงพอก็เพิ่มภายหลังได้

ขั้นตอนที่ 12: ตัวเลือก RF Link

ตัวเลือก RF Link
ตัวเลือก RF Link
ตัวเลือก RF Link
ตัวเลือก RF Link
ตัวเลือก RF Link
ตัวเลือก RF Link

หลังจากเสร็จสิ้นโครงการ ฉันก็รู้ว่าต้องดึงสายไฟ AC 220V จำนวนมากไปยังตัวจับเวลา ฉันพัฒนาลิงค์ RF โดยใช้โมดูล 315MHz มาตรฐานที่อนุญาตให้วางตัวจับเวลาไว้ในตู้ และแผงรีเลย์ภายในหลังคา ใกล้กับสายไฟ 220V ทั้งหมด

ลิงก์นี้ใช้ AtMega328P ที่ทำงานที่ 16MHz ซอฟต์แวร์สำหรับทั้งตัวส่งและตัวรับจะเหมือนกัน และโหมดนี้จะถูกเลือกโดยจัมเปอร์ขนาดเล็ก

เครื่องส่ง

เครื่องส่งเพียงแค่เสียบเข้ากับพอร์ต CPU I2C ไม่จำเป็นต้องตั้งค่าเพิ่มเติม เนื่องจาก AtMega328P จะรับฟังข้อมูลเดียวกันกับบอร์ดรีเลย์ I2C

ข้อมูลจะได้รับการอัปเดตหนึ่งครั้งต่อวินาทีบนพอร์ต I2C และเครื่องส่งจะส่งข้อมูลนี้ผ่านลิงก์ RF หากเครื่องส่งไม่ได้รับข้อมูล I2C เป็นเวลาประมาณ 30 วินาที เครื่องส่งจะส่งข้อมูลอย่างต่อเนื่องเพื่อปิดรีเลย์ทั้งหมดไปยังหน่วยรับ

สามารถเลือกกำลังไฟของโมดูลเครื่องส่งสัญญาณได้ระหว่าง 12V และ 5V โดยใช้จัมเปอร์ขนาดเล็กบนบอร์ด PC ฉันกำลังเปิดเครื่องส่งของฉันโดยใช้ 12V

ผู้รับ

เครื่องรับจะรับฟังข้อมูลที่เข้ารหัสจากเครื่องส่ง และวางข้อมูลบนพอร์ต I2C บอร์ดรีเลย์เพียงแค่เสียบเข้ากับพอร์ตนี้ และทำงานเหมือนกับที่เสียบเข้ากับบอร์ด CPU

หากผู้รับไม่ได้รับข้อมูลที่ถูกต้องเป็นเวลา 30 วินาที ผู้รับจะส่งข้อมูลอย่างต่อเนื่องบนพอร์ต I2C เพื่อปิดรีเลย์ทั้งหมดบนแผงรีเลย์

แผนผัง

วันหนึ่งหากมีความต้องการ ร่าง Arduino มีข้อมูลที่จำเป็นทั้งหมดในการสร้างวงจรโดยไม่มีแผนภาพวงจร

พิสัย

ในการติดตั้งของฉัน ตัวส่งและตัวรับอยู่ห่างกันประมาณ 10 เมตร ตัวจับเวลาอยู่ในตู้และชุดรีเลย์อยู่บนเพดาน

ขั้นตอนที่ 13: ผลิตภัณฑ์ขั้นสุดท้าย

ผลิตภัณฑ์สุดท้าย
ผลิตภัณฑ์สุดท้าย
ผลิตภัณฑ์สุดท้าย
ผลิตภัณฑ์สุดท้าย
ผลิตภัณฑ์สุดท้าย
ผลิตภัณฑ์สุดท้าย

ยูนิตหลักติดตั้งในกล่องโปรเจ็กต์เก่า ประกอบด้วยสิ่งต่อไปนี้:

- หม้อแปลงไฟฟ้า 220V/12V

- บอร์ดเพาเวอร์ซัพพลาย

- บอร์ด CPU

- จอ LCD

- ปุ่มกด

- เครื่องส่งสัญญาณ RF ลิงค์

- ชุดรับสัญญาณรีโมตที่บ้านเพิ่มเติมเพื่อให้ฉันสามารถเปิด/ปิดไฟผ่านรีโมทได้

หน่วยรีเลย์ประกอบด้วยสิ่งต่อไปนี้:

- หม้อแปลงไฟฟ้า 220V/12V

- บอร์ดเพาเวอร์ซัพพลาย

- ตัวรับลิงค์ RF

- 2 x บอร์ดรีเลย์ I2C

กระดานทั้งหมดได้รับการออกแบบให้มีมิติเท่ากัน ทำให้ง่ายต่อการวางซ้อนกันโดยใช้ตัวเว้นระยะ 3 มม.

แนะนำ: