Forum: Mikrocontroller und Digitale Elektronik Türsteuerung mit LED Matrix (ATMEGA2560)


von Christopher Willms (Gast)


Lesenswert?

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

von Eric (Gast)


Lesenswert?

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.

von Christopher Willms (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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 aller LED, ü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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.