Hallo,
ich bin neu hier und mache eine Ausbildung zum Elektroniker für Geräte
und Systeme. Ich bin am Ende des zweiten Lehrjahres und arbeite mit
einem Arduino Mega 2560. Ich möchte ein Projekt realisieren, welches mit
einem RFID Sensor über ein Relais ein Türschloss ansteuert. Dieser Teil
funktioniert.
Mein Meister hat sich mein Projekt angeschaut und hat mich gefragt, ob
ich es vorne an unserer Eingangstüre installieren möchte. Jeder Azubi
bekommt einen eigenen RFID Chip, um dann Zugang zur Werkstatt zu
bekommen. Damit neue Chips hinzugefügt werden können, habe ich mir
überlegt den Code des jeweiligen Chips in den EEPROM des ATMEGA's zu
speichern. Wird nun ein Chip vorgehalten, wird der Code mit dem EEPROM
verglichen und die Türe öffnet sich. Damit die Azubis aber keine zwei
RFID Chips benötigen und es bei uns einen "Pieper" gibt, um die
Anwesenheit zu kontrollieren, muss ich nun noch eine LED-Matrix die 14x4
groß ist, einbauen und genau da liegt mein Problem.
Ich habe mir überlegt, mit einem Max7219 Baustein, diese Matrix
anzusteuern. Gesagt, getan...jedoch leuchtet dann immer nur die
jeweilige LED und wenn jemand neues kommt, brennt dann nur die vom
neuen.
Meine nächste Idee wäre es, die 14 LEDs mit 2^x zu bezeichnen. Die erste
LED hätte dann den Binärwert 1, die nächste den Wert 2 und so weiter.
Kommt nun der erste Azubi, brennt seine LED und der Wert wird in einem
Speicher zwischengespeichert. Kommt der nächste Azubi aus dem Lehrjahr,
wird der neue Wert mit dem Wert aus dem Zwischenspeicher addiert, zb.
1+2 (also LED 1 und LED 2) und im Programm ist hinterlegt, dass bei dem
Endwert "3" die 1. und die 2. LED brennen. Hier habe ich nur das
Problem, dass ich 2^14 Möglichkeiten habe und es sehr viel Aufwand wäre,
diese alle zu hinterlegen.
Als dritte Möglichkeit bliebe noch, jede LED einzelnd anzusteuern, hier
müsste ich die Schaltung jedoch erst mit einem Schieberegister erweitern
um genug Ports zu Verfügung zu haben.
Es wäre mir lieber, die erste Idee umzusetzen, jedoch weiß ich nicht, ob
es so klappt wie ich es möchte. Hat da jemand vielleicht eine Idee?
Schon einmal vielen Danke!
Grüße
Chris
Christopher Willms schrieb:> Meine nächste Idee wäre es, die 14 LEDs mit 2^x zu bezeichnen. Die erste> LED hätte dann den Binärwert 1, die nächste den Wert 2 und so weiter.> Kommt nun der erste Azubi, brennt seine LED und der Wert wird in einem> Speicher zwischengespeichert. Kommt der nächste Azubi aus dem Lehrjahr,> wird der neue Wert mit dem Wert aus dem Zwischenspeicher addiert, zb.> 1+2 (also LED 1 und LED 2) und im Programm ist hinterlegt, dass bei dem> Endwert "3" die 1. und die 2. LED brennen.
Wunderbar. Ds ist die korrekte Lösung zu deinem Problem.
Was passiert aber wenn zwei Azubis gleichzeitig kommen? Einer öffnet die
Tür, geht durch und der 2. kommt dirket nach ohen sich "anzumelden"...
Und wie sollen die Azubis sich wieder abmelden?
> Hier habe ich nur das> Problem, dass ich 2^14 Möglichkeiten habe und es sehr viel Aufwand wäre,> diese alle zu hinterlegen.
Was ist daran "sehr viel Aufwand"? Du brauchst 1 (ein!) 16-bit Variable,
dessen Wert du an einem Ausgang in ein Schieberegister schiebst. Das
Schieberegister steuert die 14 LEDs.
Morgens muss jeder Azubi einmal "piepsen", danach ist es egal. Von daher
sollte das kein Problem sein.
Ich habe angenommen, dass es viel Aufwand wäre, die verschiedenen
Möglichkeiten rauszuschreiben. Wie genau müsste ich das denn mit der
einen Variablen denn machen?
Danke für deine Hilfe!
Christopher Willms schrieb:> Morgens muss jeder Azubi einmal "piepsen", danach ist es egal. Von daher> sollte das kein Problem sein.>> Ich habe angenommen, dass es viel Aufwand wäre, die verschiedenen> Möglichkeiten rauszuschreiben. Wie genau müsste ich das denn mit der> einen Variablen denn machen?
Du hast EINE 16 Bit Variable, die du aufs Schieberegister rausgibst. In
dieser 16 Bit Variablen setzt du oder löscht du das jeweilige Bit, um
die zugehörige LED leuchten oder nicht leuchten zu lassen. Ist diese
Manipulation erledigt, dann wird der komplette 16 Bit Wert erneut mit
allen Bits auf das Schieberegister ausgegeben.
Bitoperationen!
Genauso, wie du an einem Port 1 Bit setzen oder löschen kannst, genauso
kannst du das auch in einer 16 Bit Variablen.
Wenn also der Azubi mit der Nummer 5 kommt, dann weisst du damit, dass
in deiner 'LED-Status-Variablen' das Bit Nummero 5 zu setzen ist (oder
zu löschen, wenn deine LED bei einer 0 am Ausgang leuchten).
Wenn der Azubi mit der Nummer 12 geht, dann wird das Bit Nummer 12 in
dieser Status Variablen wieder auf 0 gesetzt (oder auf 1, je nachdem wie
die LED angeschlossen sind).
Da gibt es also keine 'Möglichkeiten'. Kennst du die 'Nummer' des Azubi,
dann kennst du damit auch die Nummer des Bits, das zu setzen bzw. zu
löschen ist. Die 'Möglickeiten', die sich ergeben, weil da 15 Azubi
jeweils ihr eigens Bit haben, die ergeben sich ganz von alleine, weil du
nur das jeweilige Bit setzt bzw. löscht.
Christopher Willms schrieb:> Ich habe mir überlegt, mit einem Max7219 Baustein, diese Matrix> anzusteuern. Gesagt, getan...jedoch leuchtet dann immer nur die> jeweilige LED und wenn jemand neues kommt, brennt dann nur die vom> neuen.
Denkst du nicht, dass dieser Baustein ein wenig witzlos wäre, wenn dem
wirklich so wäre?
Auch hier - selbe Technik: Du musst den MAX schon mit dem entsprechenden
Datenwort füttern, damit die gewünschten LED brennen. Das bedeutet, dass
du dir im Programm den aktuellen Zustand aller LED in einer Variablen
merkst und wenn eine LED zusätzlich leuchten soll, dann kommt die zu
diesem Zustands-Set dazu; der MAX wird angewiesen diesen neuen Zustand
aller LED anzuzeigen.
Dein Haupt-Gedankenfehler liegt darin, dass du nicht bedenkst, dass es
sich bei dem Teilbereich deiner Aufgabe nicht darum handelt, einzelne
LED ein bzw auszuschalten. Du hast einen Zustand allerLED, über den
du im Programm Buch führen musst. Soll eine LED eingeschaltet werden,
dann wird in diesem 'Zustand aller LED' diese eine eingeschaltet und der
komplette neue Zustand an die Ausgabe übermittelt.
Womit wir wieder bei Bitoperationen wären.