Go Down

Topic: 30 Taster einlesen mit i2c oder shiftRegister? (Read 11611 times) previous topic - next topic

beginner34

Hallo zusammen,
ich möchte ca. 30 Taster einlesen und bin mir nicht sicher welche Methode nun besser ist. Das ganze soll später mal eine Haussteuerung werden. Mein gedanke ist nun das ganze auf zu teilen, auf mehrere ATmegas. z.B Licht ein Mega, Rolladen ein Mega usw.
Ich möchte mir eine Platine erstellen mit 30 LEDs und 30 Tastern( später sollen das Lichtschalter(Taster) werden) um damit das Programm schreiben und testen zu können.
Meine Frage ist nun, ist es besser mit schieberegistern das ganze zu machen ( shiftIN und shiftOUT) oder doch lieber mit i/o expander(i2c). Da es sich um Taster handelt ist eine ständige Abfrage nötig( alle 50ms?) und auch gleichzeitig das setzen der Ausgänge. Es sollen je 4 Register verwendet werden und die zustände jedes mal in einer Vari. gespeichert werden und dann gleich gesetzt werden. Es wird nur AN oder AUS geschaltet! kein Dimmen!

MfG  Marco

sschultewolter

Ich hoffe mal, mit Mega ist hier ein Atmega < 2560 gemeint. Ansonsten wird das Atomrakten auf Spatzen schießen :D

Ob nun I2C oder SPI ist eigentlich egal, wenn du keine besonderen Anforderungen hast. Der Atmega hat im vergleich zu den Attinys doch beides verfügbar.
Gab letztens irgendwo einen IC, der einem das Debouncen bereits erledigte. Den würde ich mir mal ansehen.

Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Serenifly


Gab letztens irgendwo einen IC, der einem das Debouncen bereits erledigte. Den würde ich mir mal ansehen.

https://www.sparkfun.com/products/11502

Doc_Arduino

Hallo,

dafür werden jedoch 3,3V Ub benötigt. Nur zur Info. Und warum soll ein Mega2560 Overkill sein? Was wissen wir was er alles noch einprogrammieren möchte. So eine Haussteuerung kann mit der Zeit sehr umfangreich werden. Mein Projekt ist schon bei 39kB Flash. Ein Uno wäre schon lange zu klein. Dabei habe ich den Code schon wieder abgespeckt. Zudem ein Mega2560 sehr viel Freiräume läßt.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

sschultewolter

Allein schon weil er von mehreren spricht!

39kB ist schon viel. Vermutlich viele Serielle Ausgaben dabei?
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Doc_Arduino

Hallo,

okay, wenn es mehrere µC werden sollen, dann wäre das Geldverschwendung.   ;)

Ja, es sind noch viele serielle Ausgaben dabei. Fast alle mit (F( ... )) .  Einige können davon ganz am Ende noch raus bzw. kommentiere ich aus. Nur unter 30kB werde ich nicht mehr kommen. Ein paar Kleinigkeiten kommen noch dazu. Man wird nie fertig. Irgendwas fällt einem immer noch ein.   :)

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

beginner34

Hallo zusammen,

ich wollte eigentlich einen Atmega8 für jede Platine verwenden. Als Zentrale kommt ein Mega2560.
So soll eine Platine mit 6 Registern (3x Licht  out;   3x Schalter  in) das ganze Licht steuern und nichts weiter( Komunikation mit dem Mega2560)
Damit möchte ich jede Aufgabe einzeln auf einer Platine. So kann ich nach und nach weiter Aufbauen.
Was ist nun besser oder einfacher zu programmieren "shiftregister" oder i/o expander i2c?
Wenn ich alle 50ms die Eingänge abfrage, muß ich dann noch entprellen?

MfG  Marco

Doc_Arduino

Hallo,

Du möchtest viele "Atmega8  Bauteine" im Haus verteilen. Jeder Baustein bekommt 6 digitale Aufgaben?  3x Licht  out und  3x Schalter  in sind 6 Bit. Ein Register bzw. Port hat überlicherweise 8 Bit. Ein Atmega8 benötigt dafür keine Porterweiterung. Wofür dann die "shiftregister" oder i/o expander? Hast Du irgendwas verwechselt?

Wegen Deinen 50ms Abfragezeit. Ich glaube da irrst Du ein wenig im dunkeln. Du mußt Deine Taster entprellen. Das ist unabhängig Deiner Abfragezeit. Beim entprellen wird eine Zustandsänderung überwacht. Das machst Du am einfachsten mit der Bounce2 Library.  https://github.com/thomasfredericks/Bounce-Arduino-Wiring
Und den Durchlauf der loop machst Du eben so schnell es geht. Sodass nur die "Entprellzeit" die große Geige spielt. Ohne zusätzliche Verzögerung. Also anders gesagt. Die Entprellzeit stellst Du meinetwegen zwischen 30 und 50ms ein. Je nach Qualität der Taster auch anders + Reserve, denn die Kontakte "altern" auch. Die loop muß permanent durchlaufen. Kein einziges delay. In der Bounce2 Library sind paar schöne Beispiele drin, solltet Du mal anschauen und durchprobieren.

Nur wie möchtest Du die vielen Atmega8's am zentralen Mega2560 verbinden. Haste Dir darüber schon Gedanken gemacht?

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Eisebaer

hi,

warum nicht das entprellen durch die art der abfrage erledigen?
wenn er alle 50 millis die taster abfragt und zweimal hintereinander das gleiche ergebnis bekommt, ist das entprellen erledigt.daß er dazu delays verwenden will, seh' ich nirgends in dem, was er geschrieben hat.

die kommunikation würd' mich auch interessieren, bastel da selbst grad an einer ähnlichen sache.

achtung, die atmega8 sind nicht ganz gleich wie die atmega328. shiftPWM zum dimmen der lampen geht da zb nicht.

gruß stefan

skorpi080


Hallo zusammen,
Es wird nur AN oder AUS geschaltet! kein Dimmen!

MfG  Marco


Atmega8 hab ich auch "im ganzen Haus" verteilt.
Schau hier.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Doc_Arduino

Hallo,

er fragte ob er die Tasten entprellen muß. Muß er.

Ich hatte ihn so verstanden das er nur aller 50ms die Taster einmal abfragt. Das wäre aber keine Entprellung.
Das mit dem, er soll keine delays verwenden habe ich vorbeugend erwähnt. Ich weis ja nicht wie er das mit den aller 50ms wirklich meint.

Wenn er aller 50ms die Taster abfragt und mit dem vorherigen Zustand vergleich, ist das jedoch auch keine Entprellung. In dem Moment der Abfrage kann das Zufall sein. War es nachprellen oder eine Signalstörung. Entprellung bedeutet, ich drücke den Taster, das wird erkannt und erst ab jetzt, wegen erkannter Zustandsänderung warte ich die eingestellte Entprellzeit ab und vergleiche nochmal ob das Signal immer noch gleich ist oder nicht. Wenn gleich, dann ist der Taster wirklich gedrückt wurden. Wenn nicht, war es blinder Alarm. Man muß die Taste immer solange drücken wie die eingestellte Entprellzeit. Bis 100ms empfinde ich noch als angenehm. Kommt natürlich auch auf den Taster drauf an wie lange er prellt.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

skorpi080

playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

beginner34

Hi,
ich meinte auf 1 Platine ist 1 mega8( oder höher) und 8 Register (4 für in und 4 für out). Dieser  macht nur Register einlesen und  entsprechend die Ausgänge setzten. Und er soll, wenn sich etwas geändert hat, die Änderung an den Mega senden und dieser gibt es dann grafisch irgendwie aus(ist der letzte Punkt bei meiner Planung).

Die ganzen Platinen werden später in einem alten PC Gehäuse platz finden ( ähnlich einem CD Ständer) und  neben dem Schaltschrank stehen. Jeder Lichtschalter bekommt einen eigenen Pin am Register( Matrix, ist nicht möglich)

Im Haus sollen ca. 25  Lichtschalter verteilt sein, diese werden mit 12V versorgt. Jede Lampe(220V) bekommt ein eigene Leitung und Stromstoßrelais (12V / 220V ). So kann ich die Anlage auch ohne Platine betreiben. ganz normal. 
Ich bin mir nicht ganz sicher, was nun besser ist: Die taster werden mit optokopler an das Register angschlossen, wenn ich jetzt mit shiftIN auslese, dann kann ich i2c für die kommunikation der Platinen verwenden. Oder ich verwende i/o expander und nehme dann serial für die Platinen. Was lässt sich nun besser schreiben?

Entprellen:  da komme ich gerade nicht mit, wenn ich alle 100ms lese und den Wert speicher und vergleiche, dann sollte doch das prellen erledigt sein??  Muss die Schaltung ein ganz normaler PullDown Widerstand sein? zwischen Taster und Optokopler?

Delay: kommt bei mir nicht vor!   ;)


MfG   Marco

sschultewolter

Quote
Entprellen:  da komme ich gerade nicht mit, wenn ich alle 100ms lese und den Wert speicher und vergleiche, dann sollte doch das prellen erledigt sein??  Muss die Schaltung ein ganz normaler PullDown Widerstand sein? zwischen Taster und Optokopler?



Das klappt so nicht zuverlässig. Was ist, wenn ein Taster innerhalb der 100ms gedrückt und wieder losgelassen wurde? Von wo kommt die 12V Steuerspannung? Wenn dass das gleiche NT ist, was auch die Atmegas versorgt, kannste die Optokoppler weglassen und einen Spannungsteiler einsetzen.

Für Stromstoßrelais brauchst du aber Lichttaster ;)
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

beginner34

Hi,
12V kommt von einem  Trafo für Hutschiene und versorgt die Relais. (extra)
Ja, es sind ganz normale Lichtschalter(taster).

MfG  Marco

Go Up