Inhaltsverzeichnis:

Task Manager - ein Verwaltungssystem für Haushaltsaufgaben - Gunook
Task Manager - ein Verwaltungssystem für Haushaltsaufgaben - Gunook

Video: Task Manager - ein Verwaltungssystem für Haushaltsaufgaben - Gunook

Video: Task Manager - ein Verwaltungssystem für Haushaltsaufgaben - Gunook
Video: Arbeitsspeicher unter Windows - In Verwendung - Zugesichert - Verfügbar - Standby | EINFACH ERKLÄRT 2024, Juli
Anonim
Task Manager - ein Verwaltungssystem für Haushaltsaufgaben
Task Manager - ein Verwaltungssystem für Haushaltsaufgaben
Task Manager - ein Verwaltungssystem für Haushaltsaufgaben
Task Manager - ein Verwaltungssystem für Haushaltsaufgaben

Ich wollte versuchen, ein echtes Problem in unserem Haushalt (und, wie ich denke, das vieler anderer Leser) anzusprechen, nämlich wie ich meine Kinder für ihre Mithilfe bei der Hausarbeit einteilen, motivieren und belohnen kann.

Bisher haben wir ein laminiertes A4-Blatt seitlich am Kühlschrank geklebt. Es ist ein Raster von Aufgaben aufgedruckt, mit den dazugehörigen Taschengeldbeträgen, die für die Erledigung dieser Aufgabe verdient werden könnten. Die Idee ist, dass jedes Mal, wenn eines unserer Kinder bei einer Hausarbeit mithilft, ein Häkchen in diesem Kästchen gesetzt wird und wir am Ende jeder Woche das verdiente Geld zusammenzählen, die Tafel löschen und von vorne beginnen. Die Liste der Aufgaben ist jedoch veraltet und schwer zu ändern, wir denken manchmal nicht daran, das Board jede Woche sauber zu machen, und einige Aufgaben müssen mit unterschiedlicher Häufigkeit ausgeführt werden - einige würden idealerweise täglich erledigt werden, während andere vielleicht nur einmal im Monat. Also machte ich mich daran, ein Arduino-basiertes Gerät zu entwickeln, um diese Probleme anzugehen - meine Absicht war es, etwas zu schaffen, das das einfache Hinzufügen/Entfernen/Aktualisieren von Aufgaben ermöglicht, einen optimierten Mechanismus zum Aufzeichnen, wenn eine Aufgabe erledigt wurde, und zum Zuweisen von Guthaben zu den geeignete Person und eine Möglichkeit, verschiedene Zeitpläne und Häufigkeiten zu verfolgen, mit denen verschiedene Aufgaben ausgeführt werden müssen, und überfällige Aufgaben hervorzuheben. Und dieses anweisbare zeigt, wie das resultierende "Task Manager" -Gerät herauskam.

Schritt 1: Hardware

Hardware
Hardware
Hardware
Hardware

Das Projekt verwendet mehrere gut verwendete und dokumentierte Hardwarekomponenten:

  • Arduino UNO/Nano - das ist das "Gehirn" des Systems. Der integrierte EEPROM-Speicher wird verwendet, um den Status der Tasks zu speichern, auch wenn das System ausgeschaltet ist. Zur Vereinfachung der Verdrahtung habe ich den Nano auf einem Schraubschild montiert, aber Sie können stattdessen auch Crimpverbindungen an die GPIO-Pins löten oder verwenden, wenn Sie es vorziehen.
  • Echtzeituhr-Modul (RTC) - wird verwendet, um den Zeitstempel aufzuzeichnen, zu dem Aufgaben ausgeführt wurden, und durch Vergleichen der letzten Zeit mit der aktuellen Zeit, um festzustellen, welche Aufgaben überfällig sind. Beachten Sie, dass das Gerät, das ich erhalten habe, für die Verwendung mit einem wiederaufladbaren LiPo-Akku (LIR2032) ausgelegt ist. Ich verwende jedoch eine nicht wiederaufladbare CR2032-Batterie, daher musste ich ein paar Änderungen vornehmen, um den Ladestromkreis zu deaktivieren (Sie möchten nicht versuchen, eine nicht wiederaufladbare Batterie aufzuladen, oder Sie könnten einer Explosion ausgesetzt sein….). Insbesondere habe ich die Widerstände R4, R5 und R6 sowie die mit D1 gekennzeichnete Diode entfernt. Ich habe dann eine Lötbrücke erstellt, um über die Stelle zu schließen, an der R6 gewesen war. Diese Änderungen sind auf dem Foto unten dargestellt.
  • ISO14443 RFID-Lesegerät + ein Tag pro Benutzer - um das System zu "gamifizieren", hat jedes meiner Kinder seinen eigenen einzigartigen RFID-Tag. Die Auswahl einer Aufgabe und das anschließende Wischen des Tags über das Lesegerät ist der Mechanismus, der verwendet wird, um eine Aufgabe als abgeschlossen zu markieren
  • 16x2 LCD-Display - wird verwendet, um die Benutzeroberfläche des Systems bereitzustellen. Durch die Verwendung eines Boards, das über einen integrierten PCF8574A-Rucksack verfügt, kann das Board über eine I2C-Schnittstelle mit dem Arduino verbunden werden, was die Verkabelung deutlich vereinfacht.
  • Rotary Encoder - wird der Hauptsteuerknopf sein, den die Benutzer drehen, um verschiedene verfügbare Aufgaben auszuwählen
  • Wago-Steckverbinder - Diese Schnappsteckverbinder sind eine bequeme Möglichkeit, Komponenten miteinander zu verdrahten oder einfache Busse für mehrere Module zu erstellen, die jeweils eine gemeinsame Masse oder eine 5-V-Versorgung benötigen.

Schritt 2: Verkabelung

Verdrahtung
Verdrahtung

Das 16x2-LCD-Display und das DS1307 RTC verwenden beide eine I2C-Schnittstelle, was die Verkabelung viel einfacher macht und nur ein Paar Drähte zu den A4 (SDA) und A5 (SCL) Pins des Arduino benötigt

Der RFID-Leser MFRC-522 verwendet eine SPI-Schnittstelle, die feste Hardware-Pins 11 (MOSI), 12 (MISO) und 13 (SCK) verwendet. Es erfordert auch eine Slave-Select- und Reset-Leitung, die ich den Pins 10 bzw. 9 zugewiesen habe

Der Drehgeber benötigt ein Paar Pins. Für eine optimale Leistung ist es am besten, wenn diese Pins externe Interrupts verarbeiten können, also verwende ich die digitalen Pins 2 und 3. Sie können den Encoder auch als Schalter einklicken, und ich habe dies mit Pin 4 verdrahtet derzeit im Code verwendet wird, kann es nützlich sein, zusätzliche Funktionen hinzuzufügen

Der Einfachheit halber verwende ich Anschlussblöcke der Serie 222 von WAGO. Dies sind Schnappanschlüsse, die eine robuste, einfache Möglichkeit bieten, zwischen 2 und 8 Drähte miteinander zu verbinden, und sie sind sehr praktisch für Arduino-Projekte, bei denen mehrere Module eine gemeinsame Masse- oder 5-V-Leitung benötigen, oder wenn Sie mehrere Geräte an der gleichen I2C- oder SPI-Bus, sagen wir

Das Diagramm zeigt, wie alles miteinander verdrahtet ist.

Schritt 3: Konstruktion

Ich habe ein sehr einfaches 3D-gedrucktes Gehäuse erstellt, um die Elektronik unterzubringen. Auf der Rückseite habe ich einige Magnete angebracht, damit das Gerät an der Seite des Kühlschranks befestigt werden konnte, genau wie die vorherige gedruckte Liste. Ich habe auch den USB-Anschluss freigelassen, da dieser verwendet wird, wenn dem System neue Aufgaben hinzugefügt werden müssen oder um sich anzumelden und einen Datensatz mit abgeschlossenen Aufgaben usw. herunterzuladen.

Ich habe die STL-Dateien nach dem Drucken nicht gespeichert, aber es gibt viele ähnliche (und wahrscheinlich bessere!) Fälle auf thingiverse.com. Alternativ könntest du eine schöne Holzkiste bauen oder einfach eine alte Pappschachtel oder einen Tupperware-Behälter verwenden, um die Elektronik unterzubringen.

Schritt 4: Code

Code
Code

Der vollständig kommentierte Code ist unten als Download angehängt. Hier sind einige der wichtigsten Punkte, die Sie beachten sollten:

Ich habe eine benutzerdefinierte Struktur namens "Task" erstellt, die eine Dateneinheit ist, die alle Eigenschaften einer Aufgabe in einer einzigen Entität kapselt. Aufgaben bestehen aus einem Namen, wie sie im LCD-Display erscheinen (und damit auf 16 Zeichen begrenzt), der Häufigkeit, mit der sie ausgeführt werden müssen und wann und von wem sie zuletzt erledigt wurden

Aufgabe strukturieren {

char Aufgabenname[16]; // Der kurze, "freundliche" Name für diese Aufgabe, wie er auf dem Display erscheint int repeatEachXDays; // Regelmäßigkeit in Tagen, mit der diese Aufgabe wiederholt wird. 1=Täglich, 7=Wöchentlich usw. unsigned long lastCompletedTime; // Zeitstempel, zu dem diese Aufgabe zuletzt abgeschlossen wurde int lastCompletedBy; // ID der Person, die diese Aufgabe zuletzt abgeschlossen hat };

Die Hauptdatenstruktur heißt "taskList", die einfach ein Array von separaten Aufgaben ist. Hier können Sie beliebige Aufgaben definieren, die mit dem Wert 0 für den Zeitpunkt ihrer letzten Erledigung und -1 für die ID des Benutzers, der sie zuletzt ausgeführt hat, initialisiert werden

Aufgabe taskList[numTasks] = {

{ "Auto reinigen", 7, 0, -1 }, { "Bettwäsche wechseln", 14, 0, -1}, { "Rasen mähen", 7, 0, -1 }, { "Staubsauger", 3, 0, -1 }, { "Walk Dog", 1, 0, -1 }, { "Saubere Schlafzimmer", 7, 0, -1 }, { "Wasserpflanzen", 2, 0, -1 }, { "Upstairs toilette", 7, 0, -1}, { "D/Treppentoilette", 7, 0, -1 }, { "Hoover", 3, 0, -1 }, { "Saubere Dusche", 7, 0, -1 }, };

Im Abschnitt Konstanten oben im Code befindet sich ein einzelner Byte-Wert namens "eepromSignature". Dieser Wert wird verwendet, um zu bestimmen, ob die im EEPROM gespeicherten Daten gültig sind. Wenn Sie die Struktur des Elements taskList ändern, indem Sie beispielsweise Aufgaben hinzufügen oder entfernen oder zusätzliche Felder hinzufügen, sollten Sie diesen Wert erhöhen. Sie können es sich wie ein grundlegendes Versionsnummerierungssystem für die Daten vorstellen

const Byte eepromSignature = 1;

Beim Start versucht das Programm nur, im EEPROM gespeicherte Daten zu laden, wenn sie mit der Signatur der im Code definierten Daten übereinstimmen.

void restoreFromEEPROM() {

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

Das LCD-Display und das RTC-Modul verwenden eine I2C-Schnittstelle, um mit dem Arduino zu kommunizieren. Dies erfordert, dass jedes Gerät eine eindeutige I2C-Adresse hat. Ich habe ein paar verschiedene 16x2-Anzeigetafeln ausprobiert, und einige scheinen die Adresse 0x27 zu verwenden, während andere scheinbar identische Karten 0x3f verwenden. Wenn Sie feststellen, dass Ihr Display nur eine Reihe von Quadraten und keinen Text anzeigt, versuchen Sie, den im Code definierten Adresswert hier zu ändern:

LiquidCrystal_PCF8574 lcd(0x27);

Wenn ein RFID-Tag erkannt wird, liest der Code die 4-Byte-Kennung und versucht damit, den entsprechenden Benutzer aus der Tabelle der bekannten Benutzer zu suchen. Wenn das Tag nicht erkannt wird, wird die 4-Byte-Kennung an die serielle Monitorkonsole gesendet:

int GetUserFromRFIDTag(byte RFID){

for(int i=0; i<numusers; {<numUsers; i++) { if(memcmp(userList.rfidUID, RFID, sizeof userList.rfidUID)) == 0) { userList.userID zurückgeben; } } Serial.print (F ("Unbekannte RFID-Karte erkannt: ")); for (Byte i=0; i<4; i++) {Serial.print (RFID<0x10? "0": ""); Serial.print (RFID, HEX); } zurück -1; }

Um einem Benutzer ein Tag zuzuweisen, kopieren Sie die angezeigte ID und fügen den 4-Byte-Wert in das Benutzer-Array oben im Code neben dem entsprechenden Benutzer ein:

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

Schritt 5: Verwendung

Verwendungszweck
Verwendungszweck
Verwendungszweck
Verwendungszweck

Wenn Sie es bis hierher geschafft haben, sollte die Verwendung des Systems aus dem Code ziemlich implizit sein; Benutzer können jederzeit am Drehknopf drehen, um durch die Liste der verfügbaren Aufgaben zu blättern. Überfällige Aufgaben sind mit einem Sternchen hinter ihrem Titel gekennzeichnet.

Nachdem eine Aufgabe ausgewählt wurde, die ausgeführt werden soll, können Benutzer ihren eigenen einzigartigen RFID-Anhänger über das Lesegerät scannen, um die Aufgabe als abgeschlossen zu markieren. Ihre ID und die aktuelle Uhrzeit werden aufgezeichnet und im EEPROM des Arduino gespeichert.

Um zuerst die richtigen RFID-Tags einzurichten, sollten Sie die Skizze mit dem angeschlossenen seriellen Arduino-Monitor ausführen. Scannen Sie jedes Tag und notieren Sie sich den 4-Byte-Hex-UID-Wert, der auf dem seriellen Monitor angezeigt wird. Ändern Sie dann die oben im Code deklarierte Benutzerliste, um diese Tag-ID dem entsprechenden Benutzer zuzuweisen.

Ich überlegte, eine Funktion hinzuzufügen, um einen Bericht auszudrucken, der alle Aufgaben zeigt, die von Benutzern in der letzten Woche erledigt wurden, um jede Woche die entsprechende Taschengeldprämie zuzuweisen. Meine Kinder scheinen jedoch mit der Neuheit, das System zu benutzen, zufrieden zu sein, um die Taschengeldprämien völlig vergessen zu haben! Dies wäre jedoch eine ziemlich einfache Ergänzung und wird dem Leser als Übung überlassen:)

Empfohlen: