Innehållsförteckning:
Video: Task Manager - ett hushållssysselsystem: 5 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:44
Jag ville försöka ta itu med ett verkligt problem i vårt hushåll (och jag föreställer mig det hos många andra läsare), vilket är hur jag ska fördela, motivera och belöna mina barn för att de har hjälpt till med hushållssysslor.
Hittills har vi hållit ett laminerat ark A4 -papper fast vid sidan av kylskåpet. Den har ett rutnät med uppgifter tryckta på den, med tillhörande mängder fickpengar som kan tjänas in för att slutföra den uppgiften. Tanken är att varje gång ett av våra barn hjälper till med sysslor får de en bock i rutan och i slutet av varje vecka lägger vi ihop de intjänade pengarna, torkar brädan och börjar om. Listan över uppgifter är dock föråldrad och svår att ändra, vi kommer ibland inte ihåg att torka tavlan varje vecka, och vissa uppgifter måste utföras med olika frekvenser-vissa skulle helst göras dagligen, medan andra kanske bara är en gång i månaden. Så jag började skapa en Arduino -baserad enhet för att ta itu med dessa frågor - min avsikt var att skapa något som möjliggjorde enkel tillägg/borttagning/uppdatering av uppgifter, en strömlinjeformad mekanism för inspelning när en uppgift hade gjorts och tilldela kredit till lämplig person och ett sätt att hålla reda på olika scheman och frekvenser för vilka olika uppgifter måste utföras och markera försenade uppgifter. Och denna instruerbara visar hur den resulterande "Task Manager" -enheten kom ut.
Steg 1: Hårdvara
I projektet används flera välanvända och dokumenterade hårdvarukomponenter:
- Arduino UNO/Nano - detta är "hjärnorna" i systemet. Det inbyggda EEPROM -minnet kommer att användas för att spara arbetsläget även när systemet är avstängt. För enkel anslutning har jag monterat Nano på en skruvskärm, men du kan löda eller använda krympade anslutningar till GPIO -stiften istället om du föredrar det.
- Real -time Clock (RTC) -modul - används för att registrera tidsstämpeln vid vilken uppgifterna utfördes och, genom att jämföra den senaste tiden med den aktuella tiden, bestämma vilka uppgifter som är försenade. Observera att den enhet jag fick var utformad för att användas med ett laddningsbart LiPo -batteri (LIR2032). Jag använder dock ett icke-uppladdningsbart CR2032-batteri, så jag behövde göra några ändringar för att inaktivera laddningskretsen (du vill inte försöka ladda ett icke-uppladdningsbart batteri, annars kan du utsättas för en explosion …). Specifikt tog jag bort motstånden R4, R5 och R6, och dioden märkt D1. Jag skapade sedan en lödbro för att korta över där R6 hade varit. Dessa förändringar illustreras på bilden nedan.
- ISO14443 RFID-läsare + en tagg per användare- som ett sätt att "gamifiera" systemet, var och en av mina barn har sin egen unika RFID-tagg. Att välja en uppgift och sedan svepa deras tagg över läsaren är mekanismen som används för att markera en uppgift som slutförd
- 16x2 LCD -skärm - används för att tillhandahålla användargränssnittet till systemet. Genom att använda ett kort som har en integrerad PCF8574A -ryggsäck kan kortet anslutas via ett I2C -gränssnitt till Arduino, vilket förenklar ledningarna avsevärt.
- Rotary Encoder - kommer att vara huvudkontrollknappen som användare vrider för att välja olika tillgängliga uppgifter
- Wago -kontakter - dessa snap -shut -kontakter är ett bekvämt sätt att koppla ihop komponenter eller skapa enkla bussar för flera moduler som var och en kräver gemensam jord eller 5V -matning.
Steg 2: Kabeldragning
16x2 LCD -skärmen och DS1307 RTC använder båda ett I2C -gränssnitt, vilket är bekvämt eftersom det gör kablarna mycket enklare och kräver bara ett par ledningar som går till stiften A4 (SDA) och A5 (SCL) på Arduino
MFRC-522 RFID-läsaren använder ett SPI-gränssnitt som använder fasta hårdvarustift 11 (MOSI), 12 (MISO) och 13 (SCK). Det kräver också en slavval och återställningslinje, som jag har tilldelat stift 10 respektive 9
Den roterande kodaren kräver ett par stift. För optimal prestanda är det bäst om dessa stift kan hantera externa avbrott, så jag använder digitala stift 2 och 3. Du kan också klicka in givaren som en omkopplare, och jag har anslutit detta till stift 4. Även om det inte är det används för närvarande i koden, kan du hitta den användbar för att lägga till ytterligare funktioner
För enkelhets skull använder jag anslutningsblock i WAGO 222-serien. Dessa är snap-close-kontakter som ger ett robust, enkelt sätt att ansluta var som helst mellan 2 och 8 ledningar tillsammans, och är mycket praktiska för Arduino-projekt som kräver flera moduler för att dela en jord- eller 5V-linje, eller där du har flera enheter på samma I2C- eller SPI -buss, säg
Diagrammet illustrerar hur allt kopplas ihop.
Steg 3: Konstruktion
Jag skapade ett mycket enkelt 3D -tryckt fodral för att hysa elektroniken. Jag placerade några magneter på baksidan så att enheten kunde fästas på sidan av kylskåpet, precis som den tidigare tryckta listan var. Jag lämnade också USB -uttaget utsatt, eftersom det skulle användas om nya uppgifter behövde läggas till i systemet, eller för att logga in och ladda ner en uppsättning data som visar slutförda uppgifter etc.
Jag sparade inte STL -filerna efter utskrift, men det finns gott om liknande (och förmodligen bättre!) Fall tillgängliga på thingiverse.com. Alternativt kan du bygga en snygg trälåda, eller bara använda en gammal kartong eller tupperware -behållare för att hysa elektroniken.
Steg 4: Kod
Den fullständigt kommenterade koden bifogas som nedladdning nedan. Här är några av de viktigare punkterna att notera:
Jag har skapat en anpassad struktur, "uppgift", som är en dataenhet som inkapslar alla egenskaper för en uppgift i en enda enhet. Uppgifterna består av ett namn, som kommer att vara hur de visas på LCD -skärmen (och därmed begränsad till 16 tecken), hur ofta de måste utföras och när och av vem de senast slutfördes
struct uppgift {
char taskName [16]; // Det korta, "vänliga" namnet för denna uppgift som kommer att visas på displayen int repeatEachXDays; // Regularitet, i dagar, med vilken denna uppgift upprepas. 1 = Dagligen, 7 = Vecko etc. osignerad lång lastCompletedTime; // Tidsstämpel då denna uppgift senast slutfördes int lastCompletedBy; // ID för den person som senast genomförde denna uppgift};
Huvuddatastrukturen kallas "taskList", som helt enkelt är en rad separata uppgifter. Du kan definiera vilka uppgifter du vill ha här, som initialiseras med ett värde på 0 för den tidpunkt då de senast slutfördes och -1 för ID för användaren som senast utförde dem
task taskList [numTasks] = {
I sektionen konstanter högst upp i koden finns ett enda byte -värde som kallas "eepromSignature". Detta värde används för att avgöra om data som lagras på EEPROM är giltig. Om du ändrar strukturen för taskList -objektet genom att lägga till eller ta bort uppgifter eller lägga till ytterligare fält, säg, bör du öka detta värde. Du kan tänka på det som ett grundläggande versionsnumreringssystem för data
const byte eepromSignature = 1;
Vid start kommer programmet bara att försöka ladda data som lagras i EEPROM om det matchar signaturen för de data som definieras i koden.
void restoreFromEEPROM () {
int checkByte = EEPROM.read (0); if (checkByte == eepromSignature) {EEPROM.get (1, taskList); }}
LCD -displayen och RTC -modulen använder ett I2C -gränssnitt för att kommunicera med Arduino. Detta kräver att varje enhet har en unik I2C -adress. Jag har provat ett par olika 16x2 displaykort, och vissa verkar använda adressen 0x27, medan andra till synes identiska kort använder 0x3f. Om du tycker att din skärm bara visar en serie rutor och ingen text, försök ändra adressvärdet som definieras i koden här:
LiquidCrystal_PCF8574 lcd (0x27);
När en RFID-tagg upptäcks läser koden 4-bytes identifieraren och använder den för att försöka leta upp motsvarande användare från tabellen över kända användare. Om taggen inte känns igen, kommer 4 -byte -identifieraren att skickas till den seriella bildskärmskonsolen:
int GetUserFromRFIDTag (byte RFID ) {
for (int i = 0; i <numusers; i ++) = "" {<numUsers; i ++) {if (memcmp (userList .rfidUID, RFID, sizeof userList .rfidUID) == 0) {return userList .userID; }} Serial.print (F ("Okänt RFID -kort upptäckt:")); för (byte i = 0; i <4; i ++) {Serial.print (RFID <0x10? "0": ""); Serial.print (RFID , HEX); } return -1; }
För att tilldela en tagg till en användare bör du kopiera det visade ID: t och infoga 4-bytes-värdet i användarmatrisen högst upp i koden, bredvid motsvarande användare:
const user userList [numUsers] = {{1, "Ginny", {0x00, 0x00, 0x00, 0x00}}, {2, "Harry", {0x12, 0x34, 0x56, 0x78}}, {3, "Ron", {0xE8, 0x06, 0xC2, 0x49}}, {4, "Hermione", {0x12, 0x34, 0x56, 0x78}}, {5, "Alastair", {0x12, 0x34, 0x56, 0x78}},};
Steg 5: Användning
Om du har kommit så här långt bör användningen av systemet vara ganska implicit från koden; när som helst kan användarna vrida på vridknappen för att rulla genom listan över tillgängliga uppgifter. Arbete som är försenade är markerade med en asterisk efter titeln.
Efter att ha valt en syssla att utföra kan användarna sedan skanna sin egen unika RFID -fob över läsaren för att markera uppgiften som slutförd. Deras ID och den aktuella tiden kommer att spelas in och sparas i EEPROM på Arduino.
För att först ställa in rätt RFID -taggar bör du köra skissen med Arduino seriell bildskärm ansluten. Skanna varje tagg och notera det 4-byte hex-UID-värdet som visas på den seriella bildskärmen. Ändra sedan användarlistan som deklareras högst upp i koden för att tilldela denna tagg -ID till lämplig användare.
Jag övervägde att lägga till funktionalitet för att skriva ut en rapport som visar alla uppgifter som slutförts av användaren under den senaste veckan för att fördela lämplig fickpengebelöning varje vecka. Men som det händer, verkar mina barn vara nöjda med nyheten att använda systemet för att helt ha glömt bort pengarna! Detta skulle dock vara ett ganska enkelt tillägg och lämnas som en övning för läsaren:)
Rekommenderad:
TOYL Task Tracker: 3 steg (med bilder)
TOYL Task Tracker: Hatar du inte det bara när du planerar att arbeta eller ännu värre, är mitt i en arbetspass och en avisering kommer in på din telefon - en "snabb kontroll" blir timmar senare. Vet du också hur mycket tid du arbetar med vissa uppgifter i relation till
Cable Manager: 6 steg
Cable Manager: Som IT -student kommer alla och ber mig om en kabel till sin telefon, till internet, … Så jag ville ha ett enkelt sätt för dem att hitta kabeln de behöver utan min hjälp. Det är därför jag skapade kabelhanteraren. Detta koncept utvecklas som en sista
Virtual Organizer Code: Culminating Task (Vanessa): 10 steg
Virtual Organizer Code: Culminating Task (Vanessa): I min kod skapade jag en virtuell arrangör som skulle beräkna betyg och låta en användare skriva i händelser för varje dag i veckan. Koden är endast för demonstrationsändamål
Multi Task Raspberry 1 B (Personal Cloud + Weather Station): 4 steg
Multi Task Raspberry 1 B (Personal Cloud + Weather Station): För en tid sedan kom jag ihåg att det fanns en RPiB -reserv efter att ha köpt en nyare version. Tänkte på integritet när jag behöll mina backupfiler och bestämde mig för att ha en egen molnserver. Nöjd med bra resultat men inte nöjd med slöseriet med potential från R
Social Circle Relationship Manager: 7 steg (med bilder)
Social Circle Relationship Manager: Vad är det? Att hålla kontakten med alla viktiga personer i din sociala krets kan vara tufft, särskilt när du bor i en storstad, en arbetsnarkoman, en student eller allt ovan. Social Circle erbjuder ett sätt att hålla alla dina nära och kära i ett