Hallo, vorsorglich habe ich, mit Mühe, mein erstes Arduino Programm gemacht. Und…
es funktioniert ;-))
// HW auf Funktion testen
// High-Aktiv
#define PIN_1 2 // Eingangspin für Taster
#define PIN_2 3 // Eingangspin für Taster
#define PIN_3 4 // Eingangspin für Taster
#define PIN_4 5 // Eingangspin für Taster
int LED_1=6;
int LED_2=7;
int LED_3=8;
int LED_4=9;
void setup()
{
pinMode (LED_1, OUTPUT); // LED L (Pin 6) als Ausgang
pinMode (LED_2, OUTPUT); // LED L (Pin 7) als Ausgang
pinMode (LED_3, OUTPUT); // LED L (Pin 8) als Ausgang
pinMode (LED_4, OUTPUT); // LED L (Pin 9) als Ausgang
pinMode (PIN_1, INPUT); // Pin als Eingang
pinMode (PIN_2, INPUT); // Pin als Eingang
pinMode (PIN_3, INPUT); // Pin als Eingang
pinMode (PIN_4, INPUT); // Pin als Eingang
}
void loop()
{
if (digitalRead(PIN_1)) // HIGH (1) oder LOW (0)
digitalWrite (LED_1, HIGH); // LED an
else
digitalWrite (LED_1, LOW); // LED aus
if (digitalRead(PIN_2)) // HIGH (1) oder LOW (0)
digitalWrite (LED_2, HIGH); // LED an
else
digitalWrite (LED_2, LOW); // LED aus
if (digitalRead(PIN_3)) // HIGH (1) oder LOW (0)
digitalWrite (LED_3, HIGH); // LED an
else
digitalWrite (LED_3, LOW); // LED aus
if (digitalRead(PIN_4)) // HIGH (1) oder LOW (0)
digitalWrite (LED_4, HIGH); // LED an
else
digitalWrite (LED_4, LOW); // LED aus
}
Ein guter Stil ist es, zu vermeiden, dass Bezeichner durchgezählt werden. (PIN_1, PIN_2 ...)
Ebenso ist doppelt geschriebener Code unnützer Code mit einer unnötig höheren Fehleranfälligkeit.
Und wenn man das für alle machen will, geht das auch mit ein paar Zeilen:
// HW auf Funktion testen
// High-Aktiv
struct WASZUSAMMENGEHOERT
{
const uint8_t tasterPin;
const uint8_t ledPin;
};
WASZUSAMMENGEHOERT paket[]
{
{2, 6,},
{3, 7,},
{4, 8,},
{5, 9,},
};
constexpr uint8_t anzahl {4};
void setup()
{
for (byte b = 0; b < anzahl; b++)
{
pinMode (paket[b].ledPin, OUTPUT);
pinMode (paket[b].tasterPin, INPUT);
}
}
void loop()
{
for (byte b = 0; b < anzahl; b++)
{ digitalWrite (paket[b].ledPin, digitalRead(paket[b].tasterPin)); } // LED nimmt Tasterstatus an
}
Jedes Bauteil ist eine Fehlerquelle, daher besser die intern vorhandenen PULLUP verwenden und die Taster statt an Vcc an GND anschliessen:
void setup() {
for (const WASZUSAMMENGEHOERT &p : paket)
{
pinMode (p.ledPin, OUTPUT);
pinMode (p.tasterPin, INPUT_PULLUP);
}
}
void loop() {
for (const WASZUSAMMENGEHOERT &p : paket)
{ digitalWrite (p.ledPin, !digitalRead(p.tasterPin)); } // LED nimmt Tasterstatus an
}
Man beachte das invertierende ! bei digitalRead [Aber das wurde bereits diskutiert]
Dann gibt es Leute, die lieben den Datentyp auto (und lassen den Compiler entscheiden, was der richtige Datentyp der Arbeitsvariablen p in den for-Schleifen ist) ,
aber aus erzieherischen Gründen kann man da durchaus explizit WASZUSAMMENGEHOERT hinschreiben
@ alle netten Helfer, darf ich mich an der Diskussion beteiligen?
Zu erst: Mit Plus oder Minus schalten?
In der Anfang der Elektronik wurde meistens mit Minus geschaltet, weil Minus mit der Masse verbunden ist und man damit einfach mit der Masse schalten konnte. (NPN) Technik.
Als sich die Digitale Elektronik verbreitete, wo 0=aus und 1=ein gilt, hatte die PNP Technik Vorrang bekommen.
Vorteil der PNP Logik:
Weil immer noch der Minus mit der Masse verbunden ist, bekommt man, beim schalten mit Plus, eine Drahtbruch Sicherung und die Fehler Suche wird vereinfacht.
Beispiel: Ein Sensor Kabel schleift so lange am Gehäuse, bis er einen Kurzschluss verursacht.
Die betroffene Maschine bleibt stehen, bis man den Kurzschluss findet und damit gleichzeitig die Ursache.
Bei einem NPN Sensor, wird der Kurzschluss als Signal gewertet, was verheerende Folgen haben kann.
Vielen Dank, für die rege Beteiligung. Ich wäre mit der "Ente" glücklich und ihr bietet mir einen "Rennwagen" an.
Ich wollte "nur" dokumentieren, das die Testschaltung funktioniert...
Natürlich bin für eure Ratschläge erfreut und sehr Dankbar...aber,
...irgendwie entfernt sich das Thema von der Aufgabe...
@combie, es ist mir nicht bekannt, das ich etwas verwechsle. Ich nehme immer noch an, das dieses Forum dazu dient, den bedürftigen einen Weg zu bieten, um sein Ziel zu ermöglichen.
Und...es gibt einige Wege um dies zu ermöglichen. Manche sind einfach, andere umständlich. Das einzige was zählt, ist...das Ziel zu erreichen und sich gegenseitig keine "Äste zwischen die Beine zu werfen".
Denn, das Team sollte man nicht verlassen um sein Ego zu behaupten.
Ich bin sicher, das Du dazu beitragen kannst und Bitte Dich, mir einen Weg zu zeigen, wie ich mein meinen Ziel
erreichen kann.
@wwerner, danke für Deinen Beitrag. Obwohl das Thema mit der Auslegung nicht viel, mit meiner Forum Frage zusammen gehört und von dem eigentlichem Thema ablenkt,
sind es NUR meine persönliche Erfahrungen, nach über 35 Jahren als Service Elektroniker,
ohne auf die, zu verwendete Technik anzugehen.
Natürlich ist es viel einfacher, die interne Wiederstande zu benutzen und die Maschinen Sicherheit damit zu gefährden. Es wurden schon einige Normen ausgegeben um die Schutzart
Erdung zu untergraben, aber…die ist immer noch zulässig!
Kannst Du mir helfen, mein Problem, siehe #1 zu lösen?
@my_xy_projekt, vielen Dank für Deine Unterstützung.Als Dummys habe ich alle Lösungen versucht. Die einzige, die funktioniert ist die Antwort #23.Alle andere Versuche Ändern mit einem Fehler.
Vielen Dank
Danke für die Bestätigung.
Daran werde ich mich auch weiter orientieren.
Momentan hast Du alle Kontakte als Schliesser vorgesehen.
Sind in der Schaltung auch alles Schliesser?
Und ich glaub meinen Fehler gefunden zu haben. Die ersten beiden Schritte in der Kette sind unkritisch.
Beim Zähler im dritten Schritt bin ich noch am rätseln, wie ich das löse ohne zusätzliche Variabe.
Leider waren die Züge heute viel zu anstregend und nicht überall mit WLan ausgerüstet.
Aber das bekommen wir hin.
@my_xy_projekt, es ist unglaublich schön, etwas von Dir zu lesen. Nun hasst Du mich “erwischt”.
Ich hoffe, aber bin mir nicht sicher, ich werde meine Schaltung kontrollieren.
Es ist schon so “alt”.
Ich finde es sehr gut, das man die Bahn verwenden kann und damit Zeit bekommt, sich mit anderen Themen widmen kann. Auch, wenn man dann, auf externe Dienste (Taxi, usw) angewiesen ist.
Ich war, (wegen der Menge an Messgeräten und möglichen Ersatzteilen ) auf das Auto angewiesen. Und…das man so fahren muss, damit man an die Bahn NICHT angewiesen Ist. ;-)
Die Lösung meines “Problems”, suche ich seit vielen Jahren selbst zu lösen.
Bitte, kein “Stress”. Ich hoffe, das ich die Lösung noch erleben werde.
Einen einfachen Zähler zu programmieren wäre mir möglich, aber Deine Schaltung und Matrix habe ich leider nicht verstanden. Aber wenn @my_xy_projekt eine Idee hat, bist Du bei ihm in guten Händen.
@agmue , danke sehr für Deine Antwort. Es tut mir leid, das Du die Aufgabe nicht verstehst.
Ein Drehgeber besteht aus eine Lochscheibe mit z.B. 100 Löchern und zusätzlich einem Loch auf eine andere Position. Die Löcher werden mit Gabellichtschranken abgetastet. Damit kann man (durch die Frequenz) die Maschinen Geschwindigkeit, mit dem Zählen der Löcher den Weg und mit dem Invertiertem Ausgang die Drehrichtung feststellen.
Je nach Bedarf haben optisch gleiche Drehgeber unterschiedlich viele Löcher je Umdrehung.
Die Aufgabe ist, festzustellen, wie viele Löcher der jeweilige Drehgeber hat.
Der Zähler muss mit der positiven Flanke des einer Taktes beginnen zu zählen
und mit der nächsten positiven Flanke stoppen.
Mit diesem Wissen soll die Schaltung lesbar sein. Hoffe ich… ;-)
PS Die Folgematrix beschreibt, (unabhängig von der zu verwendeten Hardware) der Weg,
damit man die Aufgabe lösen kann.
Sie hat der Vorteil, das sie auf kleinen Platz, der Lösungsweg beschreibt.