Inhoudsopgave:

Taakbeheer - een huishoudelijk karweibeheersysteem - Ajarnpa
Taakbeheer - een huishoudelijk karweibeheersysteem - Ajarnpa

Video: Taakbeheer - een huishoudelijk karweibeheersysteem - Ajarnpa

Video: Taakbeheer - een huishoudelijk karweibeheersysteem - Ajarnpa
Video: Kleurcodes schoonmaak: welk reinigingsmiddel heb je nodig? 2024, Juli-
Anonim
Taakbeheer - een beheersysteem voor huishoudelijke taken
Taakbeheer - een beheersysteem voor huishoudelijke taken
Taakbeheer - een beheersysteem voor huishoudelijke taken
Taakbeheer - een beheersysteem voor huishoudelijke taken

Ik wilde proberen een echt probleem in ons huishouden aan te pakken (en, denk ik, dat van vele andere lezers), namelijk hoe ik mijn kinderen kan toewijzen, motiveren en belonen voor het helpen met huishoudelijke taken.

Tot nu toe hebben we een gelamineerd vel A4-papier aan de zijkant van de koelkast geplakt. Er staat een raster van taken op afgedrukt, met bijbehorende hoeveelheden zakgeld die verdiend kunnen worden voor het voltooien van die taak. Het idee is dat elke keer dat een van onze kinderen helpt met een klusje, ze een vinkje krijgen in dat vakje en aan het einde van elke week tellen we het verdiende geld op, vegen het bord af en beginnen opnieuw. De lijst met taken is echter verouderd en moeilijk te wijzigen, we denken er soms niet aan om het bord elke week schoon te vegen, en sommige taken moeten met verschillende frequenties worden uitgevoerd - sommige zouden idealiter dagelijks worden gedaan, terwijl anderen zijn misschien maar één keer per maand. Dus begon ik een op Arduino gebaseerd apparaat te maken om deze problemen aan te pakken - het was mijn bedoeling om iets te creëren waarmee taken gemakkelijk konden worden toegevoegd/verwijderd/bijgewerkt, een gestroomlijnd mechanisme voor het opnemen wanneer een taak was uitgevoerd en het toewijzen van krediet aan de geschikte persoon, en een manier om verschillende schema's en frequentie bij te houden waarmee verschillende taken moeten worden uitgevoerd, en achterstallige taken te markeren. En deze instructable laat zien hoe het resulterende "Taakbeheer" -apparaat uitkwam.

Stap 1: Hardware

Hardware
Hardware
Hardware
Hardware

Het project maakt gebruik van verschillende veelgebruikte en gedocumenteerde hardwarecomponenten:

  • Arduino UNO/Nano - dit is het "brein" van het systeem. Het ingebouwde EEPROM-geheugen wordt gebruikt om de status van taken op te slaan, zelfs wanneer het systeem is uitgeschakeld. Voor het gemak van bedrading heb ik de Nano op een screwshield gemonteerd, maar je kunt in plaats daarvan solderen of gekrompen verbindingen gebruiken met de GPIO-pinnen als je dat liever hebt.
  • Real-Time Clock (RTC)-module - wordt gebruikt om de tijdstempel vast te leggen waarop taken zijn uitgevoerd en, door de laatste tijd te vergelijken met de huidige tijd, te bepalen welke taken te laat zijn. Merk op dat het apparaat dat ik heb ontvangen is ontworpen om te worden gebruikt met een oplaadbare LiPo-batterij (LIR2032). Ik gebruik echter een niet-oplaadbare CR2032-batterij, dus ik moest een paar wijzigingen aanbrengen om het oplaadcircuit uit te schakelen (je wilt niet proberen een niet-oplaadbare batterij op te laden, anders krijg je te maken met een explosie….). In het bijzonder heb ik de weerstanden R4, R5 en R6 verwijderd en de diode gemarkeerd met D1. Ik maakte toen een soldeerbrug te kort over waar R6 was geweest. Deze wijzigingen worden geïllustreerd in de onderstaande foto.
  • ISO14443 RFID-lezer + één tag per gebruiker - als een manier om het systeem te "gamificeren", heeft elk van mijn kinderen zijn eigen unieke RFID-tag. Een taak selecteren en vervolgens hun tag over de lezer vegen, is het mechanisme dat wordt gebruikt om een taak als voltooid te markeren
  • 16x2 LCD-scherm - wordt gebruikt om de gebruikersinterface van het systeem te bieden. Door een bord te gebruiken dat een integrale PCF8574A-rugzak heeft, kan het bord via een I2C-interface worden aangesloten op de Arduino, wat de bedrading aanzienlijk vereenvoudigt.
  • Rotary Encoder - zal de belangrijkste bedieningsknop zijn waaraan gebruikers zullen draaien om verschillende beschikbare taken te selecteren
  • Wago-connectoren - deze snap-shut-connectoren zijn een handige manier om componenten met elkaar te verbinden of om eenvoudige bussen te maken voor verschillende modules die elk een gemeenschappelijke aarde of 5V-voeding nodig hebben.

Stap 2: Bedrading

Bedrading
Bedrading

Het 16x2 LCD-scherm en de DS1307 RTC gebruiken beide een I2C-interface, wat handig is omdat het de bedrading veel eenvoudiger maakt en er slechts een paar draden nodig zijn die naar de A4 (SDA) en A5 (SCL) pinnen van de Arduino gaan

De MFRC-522 RFID-lezer maakt gebruik van een SPI-interface, die gebruikmaakt van vaste hardware-pinnen 11 (MOSI), 12 (MISO) en 13 (SCK). Het vereist ook een slave-selectie- en resetlijn, die ik respectievelijk aan pinnen 10 en 9 heb toegewezen

De roterende encoder vereist een paar pinnen. Voor optimale prestaties is het het beste als deze pinnen externe interrupts aankunnen, dus ik gebruik digitale pinnen 2 en 3. Je kunt de encoder ook als een schakelaar inklikken, en ik heb deze op pin 4 aangesloten. die momenteel in de code wordt gebruikt, vindt u het misschien handig om extra functies toe te voegen

Voor het gemak gebruik ik WAGO 222-serie aansluitblokken. Dit zijn snap-shut-connectoren die een robuuste, gemakkelijke manier bieden om overal tussen 2 en 8 draden met elkaar te verbinden, en zijn erg handig voor Arduino-projecten waarbij meerdere modules een grond- of 5V-lijn nodig hebben, of waar je meerdere apparaten op de dezelfde I2C- of SPI-bus, zeg maar

Het diagram illustreert hoe alles in elkaar zit.

Stap 3: constructie

Ik heb een zeer eenvoudige 3D-geprinte behuizing gemaakt om de elektronica te huisvesten. Ik plaatste wat magneten op de achterkant zodat het apparaat aan de zijkant van de koelkast kon worden bevestigd, net zoals de vorige afgedrukte lijst was. Ik liet ook de USB-aansluiting open, omdat deze zou worden gebruikt als er nieuwe taken aan het systeem moesten worden toegevoegd, of om in te loggen en een set gegevens te downloaden met voltooide taken enz.

Ik heb de STL-bestanden niet opgeslagen na het afdrukken, maar er zijn tal van vergelijkbare (en waarschijnlijk betere!) gevallen beschikbaar op thingiverse.com. Je kunt ook een mooie houten kist bouwen, of gewoon een oude kartonnen doos of tupperwarecontainer gebruiken om de elektronica in op te bergen.

Stap 4: Coderen

Code
Code

De volledig becommentarieerde code is hieronder als download bijgevoegd. Hier zijn een paar van de belangrijkste punten om op te merken:

Ik heb een aangepaste structuur gemaakt, "taak", een gegevenseenheid die alle eigenschappen van een taak in een enkele entiteit inkapselt. Taken bestaan uit een naam, zoals ze op het LCD-scherm verschijnen (en dus beperkt tot 16 tekens), de frequentie waarmee ze moeten worden uitgevoerd en wanneer en door wie ze voor het laatst zijn voltooid

taak structureren {

char taaknaam[16]; // De korte, "vriendelijke" naam voor deze taak zoals die op het scherm int repeatEachXDays zal verschijnen; // Regelmaat, in dagen, waarmee deze taak wordt herhaald. 1=Dagelijks, 7=Wekelijks etc. unsigned long lastCompletedTime; // Tijdstempel waarop deze taak voor het laatst is voltooid int lastCompletedBy; // ID van de persoon die deze taak het laatst heeft voltooid };

De belangrijkste gegevensstructuur wordt "taskList" genoemd, wat eenvoudigweg een reeks afzonderlijke taken is. U kunt hier de taken definiëren die u wilt, die worden geïnitialiseerd met een waarde van 0 voor het tijdstip waarop ze voor het laatst zijn voltooid, en -1 voor de ID van de gebruiker die ze het laatst heeft uitgevoerd

taak taskList[numTasks] = {

{ "Schone auto", 7, 0, -1 }, { "Velgen wisselen", 14, 0, -1}, { "Gazon maaien", 7, 0, -1 }, { "Hoover", 3, 0, -1 }, { "Loop hond", 1, 0, -1 }, { "Ruime Slaapkamers", 7, 0, -1 }, { "Waterplanten", 2, 0, -1 }, { "Boven toilet", 7, 0, -1}, { "D/traptoilet", 7, 0, -1 }, { "Hoover", 3, 0, -1 }, { "Schone douche", 7, 0, -1 }, };

In de constantensectie bovenaan de code is er een enkele bytewaarde genaamd "eepromSignature". Deze waarde wordt gebruikt om te bepalen of de op EEPROM opgeslagen gegevens geldig zijn. Als u de structuur van het item taskList wijzigt, bijvoorbeeld door taken toe te voegen of te verwijderen of extra velden toe te voegen, moet u deze waarde verhogen. Je kunt het zien als een eenvoudig versienummeringssysteem voor de gegevens

const byte eepromSignature = 1;

Bij het opstarten probeert het programma alleen gegevens te laden die zijn opgeslagen in EEPROM als deze overeenkomen met de handtekening van de gegevens die in de code zijn gedefinieerd.

void restoreFromEEPROM() {

int checkByte = EEPROM.read(0); if (checkByte == eepromSignature) {EEPROM.get(1, taskList); } }

Het LCD-scherm en de RTC-module gebruiken een I2C-interface om met de Arduino te communiceren. Dit vereist dat elk apparaat een uniek I2C-adres heeft. Ik heb een aantal verschillende 16x2 displayborden geprobeerd, en sommige lijken het adres 0x27 te gebruiken, terwijl andere schijnbaar identieke borden 0x3f gebruiken. Als u merkt dat uw display alleen een reeks vierkanten en geen tekst toont, probeer dan de adreswaarde die in de code hier is gedefinieerd, te wijzigen:

LiquidCrystal_PCF8574 lcd (0x27);

Wanneer een RFID-tag wordt gedetecteerd, leest de code de 4-byte-identifier en gebruikt deze om te proberen de corresponderende gebruiker op te zoeken in de tabel met bekende gebruikers. Als de tag niet wordt herkend, wordt de ID van 4 bytes naar de seriële monitorconsole gestuurd:

int GetUserFromRFIDTag(byte RFID){

for(int i=0; i<numusers; {<numUsers; i++) {if(memcmp(userList.rfidUID, RFID, sizeof userList.rfidUID) == 0) { return userList.userID; } } Serial.print(F("Onbekende RFID-kaart gedetecteerd: ")); for(byte i=0; i<4; i++) {Serial.print(RFID<0x10 ? " 0": " "); Serial.print(RFID, HEX); } retourneer -1; }

Om een tag aan een gebruiker toe te wijzen, moet u de weergegeven ID kopiëren en de 4-byte-waarde invoegen in de gebruikersarray bovenaan de code, naast de overeenkomstige gebruiker:

const gebruiker userList[numUsers] = { { 1, "Ginny", {0x00, 0x00, 0x00, 0x00}}, { 2, "Harry", {0x12, 0x34, 0x56, 0x78}}, { 3, "Ron", {0xE8, 0x06, 0xC2, 0x49}}, { 4, "Hermelien", {0x12, 0x34, 0x56, 0x78}}, { 5, "Alastair", {0x12, 0x34, 0x56, 0x78}}, };

Stap 5: Gebruik:

Gebruik
Gebruik
Gebruik
Gebruik

Als je zo ver bent gekomen, zou het gebruik van het systeem redelijk impliciet uit de code moeten blijken; gebruikers kunnen op elk moment aan de draaiknop draaien om door de lijst met beschikbare taken te bladeren. Taken die achterstallig zijn, zijn gemarkeerd met een asterisk achter hun titel.

Nadat ze een taak hebben gekozen om uit te voeren, kunnen gebruikers hun eigen unieke RFID-fob over de lezer scannen om de taak als voltooid te markeren. Hun ID en de huidige tijd worden geregistreerd en opgeslagen in de EEPROM van de Arduino.

Om eerst de juiste RFID-tags in te stellen, moet u de schets uitvoeren met de Arduino seriële monitor aangesloten. Scan elke tag en noteer de 4-byte hex UID-waarde die wordt weergegeven op de seriële monitor. Wijzig vervolgens de gebruikerslijst die bovenaan de code is gedeclareerd om deze tag-ID aan de juiste gebruiker toe te wijzen.

Ik overwoog functionaliteit toe te voegen om een rapport af te drukken met alle taken die de gebruiker de afgelopen week heeft voltooid, om elke week de juiste zakgeldbeloning toe te wijzen. Toevallig lijken mijn kinderen echter tevreden te zijn met de nieuwigheid van het gebruik van het systeem om de zakgeldbeloningen volledig te vergeten! Dit zou echter een vrij eenvoudige toevoeging zijn en wordt overgelaten als een oefening voor de lezer:)