สารบัญ:
- ขั้นตอนที่ 1: ฮาร์ดแวร์
- ขั้นตอนที่ 2: การเดินสายไฟ
- ขั้นตอนที่ 3: การก่อสร้าง
- ขั้นตอนที่ 4: รหัส
- ขั้นตอนที่ 5: การใช้งาน
วีดีโอ: Task Manager - ระบบจัดการงานบ้าน: 5 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
ฉันต้องการพยายามแก้ไขปัญหาที่เกิดขึ้นจริงในครอบครัวของเรา (และฉันคิดว่าปัญหาของผู้อ่านคนอื่นๆ อีกมาก) ซึ่งเป็นวิธีการจัดสรร จูงใจ และให้รางวัลลูกๆ ของฉันที่ช่วยเหลืองานบ้าน
จนถึงตอนนี้ เราได้เก็บกระดาษลามิเนต A4 ไว้ข้างตู้เย็น มีตารางของงานที่พิมพ์ไว้ พร้อมด้วยจำนวนเงินค่าขนมที่เกี่ยวข้องซึ่งสามารถหาได้จากการทำภารกิจนั้นให้สำเร็จ แนวคิดก็คือทุกครั้งที่ลูกๆ ของเราช่วยงานบ้าน พวกเขาจะได้รับเครื่องหมายถูกในกล่องนั้น และเมื่อสิ้นสุดแต่ละสัปดาห์ เราจะรวมเงินที่ได้รับ เช็ดกระดานแล้วเริ่มใหม่อีกครั้ง อย่างไรก็ตาม รายการงานล้าสมัยและเปลี่ยนแปลงได้ยาก บางครั้งเราก็ไม่ลืมที่จะทำความสะอาดบอร์ดทุกสัปดาห์ และงานบางรายการจำเป็นต้องดำเนินการด้วยความถี่ต่างกัน บางงานควรทำทุกวัน อื่น ๆ อาจเป็นเดือนละครั้งเท่านั้น ดังนั้นฉันจึงเริ่มสร้างอุปกรณ์ที่ใช้ Arduino เพื่อแก้ไขปัญหาเหล่านี้ - ความตั้งใจของฉันคือการสร้างบางสิ่งที่อนุญาตให้เพิ่ม/ลบ/อัปเดตงานได้ง่าย กลไกที่คล่องตัวสำหรับการบันทึกเมื่องานเสร็จสิ้นและจัดสรรเครดิตให้กับ บุคคลที่เหมาะสม และวิธีการติดตามตารางเวลาและความถี่ที่แตกต่างกันซึ่งต้องทำงานที่แตกต่างกัน และเน้นงานที่ค้างชำระ และคำแนะนำนี้จะแสดงให้เห็นว่าอุปกรณ์ "ตัวจัดการงาน" ที่ได้ออกมาเป็นอย่างไร
ขั้นตอนที่ 1: ฮาร์ดแวร์
โปรเจ็กต์นี้ใช้ประโยชน์จากส่วนประกอบฮาร์ดแวร์ที่มีการใช้งานที่ดีและได้รับการจัดทำเป็นเอกสารหลายอย่าง:
- Arduino UNO/Nano - นี่คือ "สมอง" ของระบบ หน่วยความจำ EEPROM ออนบอร์ดจะถูกใช้เพื่อบันทึกสถานะของงานแม้ว่าระบบจะปิดอยู่ เพื่อความสะดวกในการเดินสาย ฉันได้ติดตั้ง Nano บนสกรูชิลด์ แต่คุณสามารถบัดกรีหรือใช้การเชื่อมต่อแบบจีบกับหมุด GPIO แทนได้หากต้องการ
- โมดูลนาฬิกาตามเวลาจริง (RTC) - ใช้เพื่อบันทึกการประทับเวลาที่งานที่ทำ และโดยการเปรียบเทียบครั้งสุดท้ายกับเวลาปัจจุบัน กำหนดว่างานใดที่ค้างชำระ โปรดทราบว่าอุปกรณ์ที่ฉันได้รับได้รับการออกแบบเพื่อใช้กับแบตเตอรี่ LiPo แบบชาร์จซ้ำได้ (LIR2032) อย่างไรก็ตาม ฉันใช้แบตเตอรี่ CR2032 ที่ไม่สามารถชาร์จใหม่ได้ ดังนั้นฉันจึงต้องทำการปรับเปลี่ยนเล็กน้อยเพื่อปิดวงจรการชาร์จ (คุณไม่ต้องการลองชาร์จแบตเตอรี่ที่ไม่สามารถชาร์จใหม่ได้ หรือคุณอาจเผชิญกับการระเบิด….). โดยเฉพาะฉันลบตัวต้านทาน R4, R5 และ R6 และไดโอดทำเครื่องหมาย D1 จากนั้นฉันก็สร้างสะพานประสานให้สั้นข้ามที่ที่ R6 อยู่ การเปลี่ยนแปลงเหล่านี้แสดงไว้ในรูปภาพด้านล่าง
- เครื่องอ่าน RFID ISO14443 + หนึ่งแท็กต่อผู้ใช้ - เพื่อเป็นการ "เล่นเกม" ระบบ ลูก ๆ ของฉันแต่ละคนมีแท็ก RFID เฉพาะของตัวเอง การเลือกงานแล้วปัดแท็กผ่านตัวอ่านจะเป็นกลไกที่ใช้ทำเครื่องหมายงานว่าเสร็จสิ้น
- จอ LCD ขนาด 16x2 - ใช้เพื่อจัดเตรียมส่วนต่อประสานผู้ใช้กับระบบ ด้วยการใช้บอร์ดที่มีกระเป๋าเป้ PCF8574A ในตัว บอร์ดสามารถเชื่อมต่อผ่านอินเทอร์เฟซ I2C กับ Arduino ซึ่งทำให้การเดินสายง่ายขึ้นอย่างมาก
- Rotary Encoder - จะเป็นปุ่มควบคุมหลักที่ผู้ใช้จะหมุนเพื่อเลือกงานต่างๆ ที่มีอยู่
- คอนเนคเตอร์ Wago - คอนเน็กเตอร์แบบ snap-shut เหล่านี้เป็นวิธีที่สะดวกในการต่อส่วนประกอบเข้าด้วยกัน หรือสร้างบัสแบบง่ายสำหรับโมดูลหลายตัวที่แต่ละตัวต้องการกราวด์ทั่วไปหรือแหล่งจ่ายไฟ 5V
ขั้นตอนที่ 2: การเดินสายไฟ
จอภาพ LCD ขนาด 16x2 และ DS1307 RTC ใช้อินเทอร์เฟซ I2C ซึ่งสะดวกเพราะทำให้การเดินสายง่ายขึ้นมาก โดยต้องใช้สายไฟเพียงคู่เดียวไปยังพิน A4 (SDA) และ A5 (SCL) ของ Arduino
เครื่องอ่าน RFID MFRC-522 ใช้อินเทอร์เฟซ SPI ซึ่งใช้หมุดฮาร์ดแวร์แบบตายตัว 11 (MOSI), 12 (MISO) และ 13 (SCK) นอกจากนี้ยังต้องใช้สายการเลือกและรีเซ็ตทาสซึ่งฉันได้กำหนดให้หมุด 10 และ 9 ตามลำดับ
ตัวเข้ารหัสแบบโรตารี่ต้องใช้พินคู่หนึ่ง เพื่อประสิทธิภาพสูงสุด จะเป็นการดีที่สุดถ้าพินเหล่านี้รองรับการขัดจังหวะภายนอก ดังนั้นฉันจึงใช้พินดิจิทัล 2 และ 3 คุณยังสามารถคลิกตัวเข้ารหัสเป็นสวิตช์ และฉันได้ต่อสิ่งนี้เข้ากับพิน 4 แม้ว่าจะไม่ใช่ ที่ใช้ในโค้ดนี้ คุณอาจพบว่ามีประโยชน์ในการเพิ่มคุณสมบัติเพิ่มเติม
เพื่อความสะดวก ฉันใช้บล็อกตัวเชื่อมต่อ WAGO 222-series เหล่านี้เป็นตัวเชื่อมต่อแบบ snap-shut ที่ให้วิธีที่แข็งแกร่งและง่ายต่อการเชื่อมต่อที่ใดก็ได้ระหว่าง 2 ถึง 8 สายเข้าด้วยกัน และสะดวกมากสำหรับโครงการ Arduino ที่ต้องใช้โมดูลหลายตัวเพื่อแชร์กราวด์หรือสาย 5V หรือที่คุณมีอุปกรณ์หลายตัวบน บัส I2C หรือ SPI เดียวกันพูด
แผนภาพแสดงให้เห็นว่าทุกอย่างเชื่อมต่อเข้าด้วยกันอย่างไร
ขั้นตอนที่ 3: การก่อสร้าง
ฉันสร้างเคสพิมพ์ 3 มิติแบบพื้นฐานเพื่อใช้ติดตั้งอุปกรณ์อิเล็กทรอนิกส์ ฉันวางแม่เหล็กไว้ด้านหลังเพื่อให้เครื่องสามารถยึดเข้ากับด้านข้างของตู้เย็นได้ เช่นเดียวกับรายการที่พิมพ์ก่อนหน้านี้ ฉันยังปล่อยให้ซ็อกเก็ต USB เปิดเผย เนื่องจากจะใช้สิ่งนี้หากจำเป็นต้องเพิ่มงานใหม่ลงในระบบ หรือเพื่อเข้าสู่ระบบและดาวน์โหลดชุดข้อมูลที่แสดงงานที่เสร็จสมบูรณ์ ฯลฯ
ฉันไม่ได้บันทึกไฟล์ STL หลังจากพิมพ์ แต่มีเคสที่คล้ายกันมากมาย (และน่าจะดีกว่า!) ที่มีอยู่ใน thingiverse.com อีกทางหนึ่ง คุณสามารถสร้างกล่องไม้ที่สวยงาม หรือใช้กล่องกระดาษแข็งเก่าหรือภาชนะทัปเปอร์แวร์เพื่อจัดเก็บอุปกรณ์อิเล็กทรอนิกส์
ขั้นตอนที่ 4: รหัส
โค้ดที่แสดงความคิดเห็นแบบเต็มนั้นแนบมากับการดาวน์โหลดด้านล่าง ต่อไปนี้คือประเด็นสำคัญบางประการที่ควรทราบ:
ฉันได้สร้างโครงสร้างแบบกำหนดเอง "งาน" ซึ่งเป็นหน่วยข้อมูลที่ห่อหุ้มคุณสมบัติทั้งหมดของงานไว้ในเอนทิตีเดียว งานประกอบด้วยชื่อ ซึ่งจะเป็นลักษณะที่ปรากฏบนจอ LCD (และด้วยเหตุนี้จึงจำกัดอักขระไว้ที่ 16 ตัว) ความถี่ที่ต้องดำเนินการ และเวลาที่พวกเขาทำเสร็จล่าสุดเมื่อใดและโดยใคร
งานโครงสร้าง {
ถ่าน taskName[16]; // ชื่อสั้น "เป็นมิตร" สำหรับงานนี้ตามที่จะปรากฏบนจอแสดงผล int repeatEachXDays; // ความสม่ำเสมอในวันที่มีงานนี้ซ้ำ 1=รายวัน, 7=รายสัปดาห์ และอื่นๆ ที่ไม่ได้ลงนามเป็นเวลานาน LastCompletedTime; // Timestamp ที่งานนี้เสร็จสิ้นล่าสุดใน lastCompletedBy; // ID ของบุคคลที่ทำภารกิจนี้สำเร็จครั้งล่าสุด };
โครงสร้างข้อมูลหลักเรียกว่า "taskList" ซึ่งเป็นอาร์เรย์ของงานที่แยกจากกัน คุณสามารถกำหนดงานที่คุณต้องการได้ที่นี่ ซึ่งเริ่มต้นด้วยค่า 0 สำหรับเวลาที่เสร็จสิ้นล่าสุด และ -1 สำหรับ ID ของผู้ใช้ที่ดำเนินการครั้งล่าสุด
งาน taskList [numTasks] = {
{ "ทำความสะอาดรถ", 7, 0, -1 }, { "เปลี่ยนผ้าปูที่นอน", 14, 0, -1}, { "ตัดหญ้า", 7, 0, -1 }, { "ฮูเวอร์", 3, 0, -1 }, { "สุนัขเดิน", 1, 0, -1 }, { "ห้องนอนที่เป็นระเบียบ", 7, 0, -1 }, { "พืชน้ำ", 2, 0, -1 }, { "ชั้นบน ห้องน้ำ", 7, 0, -1}, { "ห้องน้ำ D/บันได", 7, 0, -1 }, { "ฮูเวอร์", 3, 0, -1 }, { "ฝักบัวสะอาด", 7, 0, -1 }, };
ในส่วนค่าคงที่ที่ด้านบนของโค้ด มีค่าไบต์เดียวที่เรียกว่า "eepromSignature" ค่านี้ใช้เพื่อกำหนดว่าข้อมูลที่จัดเก็บใน EEPROM นั้นถูกต้องหรือไม่ ถ้าคุณเปลี่ยนโครงสร้างของรายการ taskList โดยการเพิ่มหรือเอางานออก หรือเพิ่มฟิลด์เพิ่มเติม เช่น คุณควรเพิ่มค่านี้ คุณสามารถคิดว่ามันเหมือนกับระบบการนับเวอร์ชันพื้นฐานสำหรับข้อมูล
ไบต์ const eepromSignature = 1;
เมื่อเริ่มต้นโปรแกรมจะพยายามโหลดข้อมูลที่จัดเก็บไว้ใน EEPROM หากตรงกับลายเซ็นของข้อมูลที่กำหนดไว้ในโค้ด
เป็นโมฆะ restoreFromEEPROM () {
int checkByte = EEPROM.read(0); ถ้า (checkByte == eepromSignature) { EEPROM.get (1, รายการงาน); } }
จอแสดงผล LCD และโมดูล RTC ใช้อินเทอร์เฟซ I2C เพื่อสื่อสารกับ Arduino สิ่งนี้ต้องการให้ทุกอุปกรณ์มีที่อยู่ I2C ที่ไม่ซ้ำกัน ฉันได้ลองใช้บอร์ดแสดงผลขนาด 16x2 ที่แตกต่างกันสองสามแบบ และบางอันดูเหมือนจะใช้ที่อยู่ 0x27 ในขณะที่บอร์ดอื่นๆ ที่ดูเหมือนเหมือนกันนั้นใช้ 0x3f หากคุณพบว่าจอแสดงผลของคุณแสดงเฉพาะชุดสี่เหลี่ยมและไม่มีข้อความ ให้ลองเปลี่ยนค่าที่อยู่ที่กำหนดไว้ในโค้ดที่นี่:
LiquidCrystal_PCF8574 จอแอลซีดี (0x27);
เมื่อตรวจพบแท็ก RFID โค้ดจะอ่านตัวระบุ 4 ไบต์ และใช้เพื่อค้นหาผู้ใช้ที่เกี่ยวข้องจากตารางของผู้ใช้ที่รู้จัก หากแท็กไม่เป็นที่รู้จัก ตัวระบุ 4 ไบต์จะถูกส่งไปยังคอนโซลมอนิเตอร์แบบอนุกรม:
int GetUserFromRFIDTag (ไบต์ RFID){
สำหรับ (int i=0; i<numusers; {<numUsers; i++) { if(memcmp(userList.rfidUID, RFID, sizeof userList.rfidUID) == 0) { return userList.userID; } } Serial.print(F("ตรวจพบการ์ด RFID ที่ไม่รู้จัก: ")); สำหรับ(ไบต์ i=0; i<4; i++) { Serial.print(RFID<0x10 ? " 0": " " "); Serial.print (RFID , HEX); } กลับ -1; }
ในการกำหนดแท็กให้กับผู้ใช้ คุณควรคัดลอก ID ที่แสดงและแทรกค่า 4 ไบต์ลงในอาร์เรย์ผู้ใช้ที่ด้านบนของโค้ด ถัดจากผู้ใช้ที่เกี่ยวข้อง:
const user list [numUsers] = { { 1, "Ginny", {0x00, 0x00, 0x00, 0x00}}, { 2, "Harry", {0x12, 0x34, 0x56, 0x78}}, { 3, "รอน", {0xE8, 0x06, 0xC2, 0x49}}, { 4, "เฮอร์ไมโอนี่", {0x12, 0x34, 0x56, 0x78}}, {5, "Alastair", {0x12, 0x34, 0x56, 0x78}}, };
ขั้นตอนที่ 5: การใช้งาน
หากคุณมาไกลถึงขนาดนี้ การใช้งานระบบควรมาจากโค้ดโดยปริยาย ผู้ใช้สามารถหมุนปุ่มหมุนเพื่อเลื่อนดูรายการงานที่มีอยู่ได้ตลอดเวลา งานบ้านที่เกินกำหนดจะมีเครื่องหมายดอกจันอยู่หลังชื่องาน
เมื่อเลือกงานที่ต้องทำแล้ว ผู้ใช้สามารถสแกน fob RFID ที่เป็นเอกลักษณ์ของตนเองผ่านเครื่องอ่านเพื่อทำเครื่องหมายว่างานเสร็จสมบูรณ์ ID ของพวกเขาและเวลาปัจจุบันจะถูกบันทึกและบันทึกลงใน EEPROM ของ Arduino
ในการตั้งค่าแท็ก RFID ที่ถูกต้องในครั้งแรก คุณควรรันภาพร่างโดยต่อกับมอนิเตอร์อนุกรม Arduino สแกนแต่ละแท็กและจดค่า UID ฐานสิบหก 4 ไบต์ที่แสดงบนจอภาพอนุกรม จากนั้นแก้ไขรายชื่อผู้ใช้ที่ประกาศไว้ที่ด้านบนของโค้ดเพื่อกำหนด ID แท็กนี้ให้กับผู้ใช้ที่เหมาะสม
ฉันได้พิจารณาเพิ่มฟังก์ชันการทำงานเพื่อพิมพ์รายงานที่แสดงงานทั้งหมดที่ผู้ใช้ทำเสร็จสิ้นในช่วงสัปดาห์ที่ผ่านมา เพื่อจัดสรรรางวัลค่าขนมที่เหมาะสมในแต่ละสัปดาห์ อย่างไรก็ตาม ดูเหมือนว่าลูกๆ ของฉันจะพอใจกับความแปลกใหม่ของการใช้ระบบจนลืมรางวัลค่าขนมไปได้เลย! นี้จะเป็นส่วนเสริมที่ค่อนข้างง่ายอย่างไรก็ตามและเหลือเป็นแบบฝึกหัดสำหรับผู้อ่าน:)
แนะนำ:
Embedded Window Manager: 10 ขั้นตอน
Embedded Window Manager: โปรเจ็กต์นี้แสดงวิธีการใช้ตัวจัดการหน้าต่างด้วยหน้าต่างที่ทับซ้อนกันแบบเคลื่อนย้ายได้บนไมโครคอนโทรลเลอร์ที่ฝังตัวพร้อมแผง LCD และหน้าจอสัมผัส มีแพ็คเกจซอฟต์แวร์ที่มีจำหน่ายทั่วไปให้ทำ แต่ต้องใช้เงินและใกล้จะถึง
TOYL Task Tracker: 3 ขั้นตอน (พร้อมรูปภาพ)
TOYL Task Tracker: อย่าเพิ่งเกลียดเมื่อคุณกำลังวางแผนที่จะทำงานหรือแย่กว่านั้น อยู่ในระหว่างเซสชั่นการทำงานและการแจ้งเตือนจะเข้ามาในโทรศัพท์ของคุณ - "การตรวจสอบอย่างรวดเร็ว" จะกลายเป็นชั่วโมงต่อมา นอกจากนี้ คุณรู้หรือไม่ว่าคุณทำงานบางอย่างที่เกี่ยวข้องกับเ
Multi Task Raspberry 1 B (คลาวด์ส่วนตัว + สถานีตรวจอากาศ): 4 ขั้นตอน
Multi Task Raspberry 1 B (Personal Cloud + Weather Station): เมื่อก่อนฉันจำได้ว่ามี RPiB สำรองหลังจากซื้อเวอร์ชันที่ใหม่กว่า เมื่อนึกถึงความเป็นส่วนตัวเมื่อเก็บไฟล์สำรองไว้ ฉันจึงตัดสินใจมีเซิร์ฟเวอร์คลาวด์ของตัวเอง พอใจกับผลลัพธ์ที่ดี แต่ไม่พอใจกับการสูญเสียศักยภาพจาก R
Password Manager, Typer, Macro, Payload ทั้งหมดในที่เดียว!: 11 ขั้นตอน (พร้อมรูปภาพ)
Password Manager, Typer, Macro, Payload… All in ONE!: ATTENTION PLEASE:หากคุณมีปัญหากับการผลิตอุปกรณ์นี้ (pcb, การบัดกรีหรืออื่น ๆ ) โปรดส่งข้อความส่วนตัวที่นี่หรือส่งอีเมลมาที่ [email protected]. ฉันยินดีที่จะส่ง pcbs หรืออุปกรณ์ตัวใดตัวหนึ่งที่ฉันผลิต
Task Zero: 7 ขั้นตอน (พร้อมรูปภาพ)
Task Zero: การใช้ชีวิตในสังคมที่ให้ความสำคัญกับประสิทธิภาพและเน้นความสำเร็จสูง เราอาจลืมไปว่ายังมีชีวิตอยู่ข้างงาน Task Zero เป็นเรื่องเกี่ยวกับงานก่อนงานแรก งาน 0: รักษาชีวิตส่วนตัวของคุณ อย่าเลื่อนงานเหล่านั้นที่ปลูกฝัง