"8-Bit" Eingang, Texte definieren und speichern

Hallo,
letztens habe ich einen Thread geöffnet, um LPT Daten auszulesen und zu speichern.
Das ganze Thema hat sich jetzt etwas geändert, daher ein neues Thema.

Also, aktuell ist ein Converter angeschlossen, der aus einfachen 8 Kontakten, die als Bits genutzt werden, vordefinierte (also eingebrannte) Texte bildet und diese via LPT ausdruckt. Das Gerät soll nun ersetzt werden.

Was soll jetzt der Arduino machen?
D0-D7 sind die 8-Bit Eingänge. Bit nicht als Dateneingang, sondern als einfacher Eingang.
Für 46 Bit-Kombinationen sollen Texte vordefiniert werden, das ist zwar ne Menge Tipparbeit, muss aber sein.
Diese Texte sollen dann in einer Text-Datei mit Zeitstempel gesichert werden, entweder pro Tag eine Datei mit dem Datum als Namen oder pro Kalenderwoche, wobei Tag, denke ich, am einfachsten ist...sofern das überhaupt machbar ist.
Ob auf SD oder USB gespeichert werden soll, ist Banane.

Beispiel:
(Eingänge: D0-D1-D2-D3-D4-D5-D6-D7)

Eingänge: 1-0-0-0-0-0-0-0
Text: 16.11.2017 17:01:54 - Schieber D geöffnet

Eingänge: 1-0-1-1-0-0-1-0
Text: 16.11.2017 17:02:43 - Schieber E geöffnet

Eingänge: 1-1-1-0-0-1-0-0:
Text: 17.11.2017 00:05:21 - Motorschutz Schieber D hat ausgelöst.

Ich hoffe, dass es soweit verständlich ist, was ich meine.

Da ich von Arduino nicht all zu viel Ahnung habe, bitte ich zu entschuldigen, wenn ich mit Beispielen aus anders funktionierenden Sketches teilweise nix anfangen kann und ggf. noch einmal nachfragen muss.
Da die Community hier aber großartig ist, hoffe ich, dass wir es hinbekommen.

Gruß,
Jannomag

Was für einen Arduino hast du vorgesehen ?
Ich befürchte fast, mit einem Uno o.ä. wird das direkt nichts.
Wenn du die Texte auf einer SD-Karte speicherst und diese daraus abrufst, könnte es funktionieren.

Jannomag:
.. daher ein neues Forum.

.. daher ein neues Thema.

Jannomag:
(Eingänge: D0-D1-D2-D3-D4-D5-D6-D7)

Beim UNO und anderen Arduinos sind D0 und D1 für USB belegt, können also nicht benutzt werden, wenn auch USB verwendet wird.

Konzept:

  • Ein Feld mit 46 konstanten Texten im Programmspeicher ablegen.
  • Bits einlesen und in eine Zahl verwandeln. Diese Zahl als Index verwenden.
  • Mit dem Index Text aus dem Feld holen.
  • Datum von RTC holen.
  • Text zusammen mit Datum ausgeben.

HotSystems:
Ich befürchte fast, mit einem Uno o.ä. wird das direkt nichts.

UNO:

const unsigned char TEXT[46][40] PROGMEM = {
  {"Schieber D geoeffnet"},
  {"Schieber E geoeffnet"},
  {"Motorschutz Schieber D hat ausgeloest"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"123456789012345678901234567890123456789"},
  {"vorletze Zeile"},
  {"ENDE 6789012345678901234567890123456789"},
};
void setup()
{
  Serial.begin(9600);
  for (byte z = 0; z < 46; z++) {
    for (byte s = 0; s < 40; s++) {
      char zeichen = pgm_read_byte(&(TEXT[z][s]));
      if (zeichen >= ' ') {
        Serial.print(zeichen);
      }
    }
    Serial.println();
  }
}

void loop(){}
Der Sketch verwendet 3.682 Bytes (11%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 200 Bytes (9%) des dynamischen Speichers, 1.848 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.

Oder meinst Du was anderes als die Speichergröße?

Ohhhh.....danke für die Aufklärung, agmue.

Hätte ich jetzt nicht vermutet, aber bin jetzt doch angenehm überrascht.

Forum geändert in Thema - keine Ahnung, warum ich das geschrieben hab, ist mir natürlich bewusst, dass es Thema heißt und ich meinte auch, dass ich das so geschrieben hab :smiley:

Welcher Arduino spielt erstmal keine Rolle, ich habe jedoch nur Unos und Nanos zum testen. Das sind, wegen des Preises und meiner Kaputtspielerei, günstige China-Klone, aber für das fertige Projekt wird später was richtiges gekauft.
Geld spielt da auch keine so große Rolle, da es nicht meins ist, sondern das der Firma.

D0 und D1 müssen ja nicht verwendet werden, gibt ja noch genug.

Bitte hilf mir mal beim Verständnis von u.a. "TEXT[46][40]". Woher die 40? Es kann sein, dass noch ein paar Texte hinzukommen oder entfernt werden, daher muss ich das Programm später auch bearbeiten können.

Die Zeit ist da auch schon eingebunden?

Den Rest verstehe ich soweit und es sieht vielversprechend aus. Ich werde es später mal testen, weiß nur nicht, ob ich das heute schaffe.

Jannomag:
Bitte hilf mir mal beim Verständnis von u.a. "TEXT[46][40]". Woher die 40? Es kann sein, dass noch ein paar Texte hinzukommen oder entfernt werden, daher muss ich das Programm später auch bearbeiten können.

Der längste von Dir angegebene Text "Motorschutz Schieber D hat ausgeloest" hat 37 Zeichen plus LineFeed, also 38, da lag 40 willkürlich gewählt in der Nähe.

Der Sketch soll nur zeigen, daß 46 Texte mit maximal 39 Buchstaben + '\0' in einen UNO hineinpassen. Das hatte HotSystems angezweifelt, geht aber. Erste Hürde genommen :slight_smile:

Diese Texte kannst Du selbstverständlich auch bearbeiten.

Jannomag:
Die Zeit ist da auch schon eingebunden?

Nein, die kommt ja aus einem Uhrenbaustein wie DS3231. Internet, Funk aus Frankfurt oder GPS gingen auch, macht die Sache aber komplizierter, kannst Du Dir für später aufheben.

Was mir noch unklar ist: Du schreibst von 46 Meldungen, hast mit acht Bits aber 255 Möglichkeiten. Wie geht das zusammen?

agmue:
Der längste von Dir angegebene Text "Motorschutz Schieber D hat ausgeloest" hat 37 Zeichen plus LineFeed, also 38, da lag 40 willkürlich gewählt in der Nähe.

Ich hab die Texte jetzt nicht im Kopf, kann sein, dass da auch längere bei sind. Wäre es denn einfach mit der Erhöhung der Zahl 40 möglich?

agmue:
Was mir noch unklar ist: Du schreibst von 46 Meldungen, hast mit acht Bits aber 255 Möglichkeiten. Wie geht das zusammen?

255 Meldungen werden nicht benötigt und nicht genutzt.
Ich habe in Papierform uralte Dokumente vorliegen, wo 44 (ja, 44) Texte definiert werden. Insgesamt sind dort 96 Meldungen als möglich aufgelistet, jedoch leer gelassen. Wenn man nun der SPS sagt, eine Bit-Kombination auszugeben, die das Meldungs-IC nicht kennt, gibt es nur z.B. "Text Nr. 56" aus.

Das hat noch einen weiteren Nachteil, und jetzt komme ich auf die 46:
Vor 3 Jahren habe ich zwei Meldungen neu einprogrammiert, nach Kundenwunsch - das Betrifft einen Fehler in der Notauskette.
Wenn der Fehler auftritt, dann druckt der Drucker nur "Text Nr. 45" und "Text Nr. 46" aus. Die Kollegen wissen jedoch, worum es sich bei den Meldungen handelt, daher nicht so wild.

Die Möglichkeit der Nachpflege solcher Texte mit einem Arduino ist da natürlich ein riesiger Vorteil.

Die Definerung der Meldungen scheint ja also nicht so das große Problem darzustellen.

Wie sieht es da mit dem Speichern in einzelnen Dateien mit bestimmten Namen aus?
Die Protokolle müssen UNBEDINGT gespeichert werden, da diese enorm wichtig sind.
Da es aber in der Umweltabteilung meiner Firma liegt, wollen die natürlich auf Papier verzichten.
Aktuell werden etwa 7m Papier pro Monat ausgedruckt, wobei der Drucker immer knapp 10 Zeilen pro Meldung verbraucht und zwischen den Meldungen knapp 10 Zeilen Platz gelassen wird.

Jannomag:
Ich hab die Texte jetzt nicht im Kopf, kann sein, dass da auch längere bei sind. Wäre es denn einfach mit der Erhöhung der Zahl 40 möglich?

Ja, durchaus. In Kombination mit 256 nur teilweise genutzten Texten wird dann aber schon eine Menge Programmspeicher verwendet (256 Texte mit 80 Zeichen):

const uint16_t TEXTZEILEN = 256, TEXTSPALTEN = 81;
const unsigned char TEXT[TEXTZEILEN][TEXTSPALTEN] PROGMEM = {
  {"123456789012345678901234567890123456789"},
  {"Text Nr. 1"},
  {"Text Nr. 2"},
  {"Text Nr. 3"},
  {"Text Nr. 4"},
  {"Text Nr. 5"},
  {"Text Nr. 6"},
  {"Text Nr. 7"},
  {"Text Nr. 8"},
  {"Text Nr. 9"},
  {"Text Nr. 10"},
  {"Text Nr. 11"},
  {"Text Nr. 12"},
  {"Text Nr. 13"},
  {"Text Nr. 14"},
  {"Text Nr. 15"},
  {"Text Nr. 16"},
  {"Text Nr. 17"},
  {"Text Nr. 18"},
  {"Text Nr. 19"},
  {"Text Nr. 20"},
  {"Text Nr. 21"},
  {"Text Nr. 22"},
  {"Text Nr. 23"},
  {"Text Nr. 24"},
  {"Text Nr. 25"},
  {"Text Nr. 26"},
  {"Text Nr. 27"},
  {"Text Nr. 28"},
  {"Text Nr. 29"},
  {"Text Nr. 30"},
  {"Text Nr. 31"},
  {"Text Nr. 32"},
  {"Text Nr. 33"},
  {"Text Nr. 34"},
  {"Text Nr. 35"},
  {"Text Nr. 36"},
  {"Text Nr. 37"},
  {"Text Nr. 38"},
  {"Text Nr. 39"},
  {"Text Nr. 40"},
  {"Text Nr. 41"},
  {"Text Nr. 42"},
  {"Text Nr. 43"},
  {"Text Nr. 44"},
  {"Text Nr. 45"},
  {"Text Nr. 46"},
  {"Text Nr. 47"},
  {"Text Nr. 48"},
  {"Text Nr. 49"},
  {"Text Nr. 50"},
  {"Text Nr. 51"},
  {"Text Nr. 52"},
  {"Text Nr. 53"},
  {"Text Nr. 54"},
  {"Text Nr. 55"},
  {"Text Nr. 56"},
  {"Text Nr. 57"},
  {"Text Nr. 58"},
  {"Text Nr. 59"},
  {"Text Nr. 60"},
  {"Text Nr. 61"},
  {"Text Nr. 62"},
  {"Text Nr. 63"},
  {"Text Nr. 64"},
  {"Text Nr. 65"},
  {"Text Nr. 66"},
  {"Text Nr. 67"},
  {"Text Nr. 68"},
  {"Text Nr. 69"},
  {"Text Nr. 70"},
  {"Text Nr. 71"},
  {"Text Nr. 72"},
  {"Text Nr. 73"},
  {"Text Nr. 74"},
  {"Text Nr. 75"},
  {"Text Nr. 76"},
  {"Text Nr. 77"},
  {"Text Nr. 78"},
  {"Text Nr. 79"},
  {"Text Nr. 80"},
  {"Text Nr. 81"},
  {"Text Nr. 82"},
  {"Text Nr. 83"},
  {"Text Nr. 84"},
  {"Text Nr. 85"},
  {"Text Nr. 86"},
  {"Text Nr. 87"},
  {"Text Nr. 88"},
  {"Text Nr. 89"},
  {"Text Nr. 90"},
  {"Text Nr. 91"},
  {"Text Nr. 92"},
  {"Text Nr. 93"},
  {"Text Nr. 94"},
  {"Text Nr. 95"},
  {"Text Nr. 96"},
  {"Text Nr. 97"},
  {"Text Nr. 98"},
  {"Text Nr. 99"},
  {"Text Nr. 100"},
  {"Text Nr. 101"},
  {"Text Nr. 102"},
  {"Text Nr. 103"},
  {"Text Nr. 104"},
  {"Text Nr. 105"},
  {"Text Nr. 106"},
  {"Text Nr. 107"},
  {"Text Nr. 108"},
  {"Text Nr. 109"},
  {"Text Nr. 110"},
  {"Text Nr. 111"},
  {"Text Nr. 112"},
  {"Text Nr. 113"},
  {"Text Nr. 114"},
  {"Text Nr. 115"},
  {"Text Nr. 116"},
  {"Text Nr. 117"},
  {"Text Nr. 118"},
  {"Text Nr. 119"},
  {"Text Nr. 120"},
  {"Text Nr. 121"},
  {"Text Nr. 122"},
  {"Text Nr. 123"},
  {"Text Nr. 124"},
  {"Text Nr. 125"},
  {"Text Nr. 126"},
  {"Text Nr. 127"},
  {"Text Nr. 128"},
  {"Text Nr. 129"},
  {"Text Nr. 130"},
  {"Text Nr. 131"},
  {"Text Nr. 132"},
  {"Text Nr. 133"},
  {"Text Nr. 134"},
  {"Text Nr. 135"},
  {"Text Nr. 136"},
  {"Text Nr. 137"},
  {"Text Nr. 138"},
  {"Text Nr. 139"},
  {"Text Nr. 140"},
  {"Text Nr. 141"},
  {"Text Nr. 142"},
  {"Text Nr. 143"},
  {"Text Nr. 144"},
  {"Text Nr. 145"},
  {"Text Nr. 146"},
  {"Text Nr. 147"},
  {"Text Nr. 148"},
  {"Text Nr. 149"},
  {"Text Nr. 150"},
  {"Text Nr. 151"},
  {"Text Nr. 152"},
  {"Text Nr. 153"},
  {"Text Nr. 154"},
  {"Text Nr. 155"},
  {"Text Nr. 156"},
  {"Text Nr. 157"},
  {"Text Nr. 158"},
  {"Text Nr. 159"},
  {"Text Nr. 160"},
  {"Text Nr. 161"},
  {"Text Nr. 162"},
  {"Text Nr. 163"},
  {"Text Nr. 164"},
  {"Text Nr. 165"},
  {"Text Nr. 166"},
  {"Text Nr. 167"},
  {"Text Nr. 168"},
  {"Text Nr. 169"},
  {"Text Nr. 170"},
  {"Text Nr. 171"},
  {"Text Nr. 172"},
  {"Text Nr. 173"},
  {"Text Nr. 174"},
  {"Text Nr. 175"},
  {"Text Nr. 176"},
  {"Text Nr. 177"},
  {"Text Nr. 178"},
  {"Text Nr. 179"},
  {"Text Nr. 180"},
  {"Text Nr. 181"},
  {"Text Nr. 182"},
  {"Text Nr. 183"},
  {"Text Nr. 184"},
  {"Text Nr. 185"},
  {"Text Nr. 186"},
  {"Text Nr. 187"},
  {"Text Nr. 188"},
  {"Text Nr. 189"},
  {"Text Nr. 190"},
  {"Text Nr. 191"},
  {"Text Nr. 192"},
  {"Text Nr. 193"},
  {"Text Nr. 194"},
  {"Text Nr. 195"},
  {"Text Nr. 196"},
  {"Text Nr. 197"},
  {"Text Nr. 198"},
  {"Text Nr. 199"},
  {"Text Nr. 200"},
  {"Text Nr. 201"},
  {"Text Nr. 202"},
  {"Text Nr. 203"},
  {"Text Nr. 204"},
  {"Text Nr. 205"},
  {"Text Nr. 206"},
  {"Text Nr. 207"},
  {"Text Nr. 208"},
  {"Text Nr. 209"},
  {"Text Nr. 210"},
  {"Text Nr. 211"},
  {"Text Nr. 212"},
  {"Text Nr. 213"},
  {"Text Nr. 214"},
  {"Text Nr. 215"},
  {"Text Nr. 216"},
  {"Text Nr. 217"},
  {"Text Nr. 218"},
  {"Text Nr. 219"},
  {"Text Nr. 220"},
  {"Text Nr. 221"},
  {"Text Nr. 222"},
  {"Text Nr. 223"},
  {"Text Nr. 224"},
  {"Text Nr. 225"},
  {"Text Nr. 226"},
  {"Text Nr. 227"},
  {"Text Nr. 228"},
  {"Text Nr. 229"},
  {"Text Nr. 230"},
  {"Text Nr. 231"},
  {"Text Nr. 232"},
  {"Text Nr. 233"},
  {"Text Nr. 234"},
  {"Text Nr. 235"},
  {"Text Nr. 236"},
  {"Text Nr. 237"},
  {"Text Nr. 238"},
  {"Text Nr. 239"},
  {"Text Nr. 240"},
  {"Text Nr. 241"},
  {"Text Nr. 242"},
  {"Text Nr. 243"},
  {"Text Nr. 244"},
  {"Text Nr. 245"},
  {"Text Nr. 246"},
  {"Text Nr. 247"},
  {"Text Nr. 248"},
  {"Text Nr. 249"},
  {"Text Nr. 250"},
  {"Text Nr. 251"},
  {"Text Nr. 252"},
  {"Text Nr. 253"},
  {"Text Nr. 254"},
  {"Text Nr. 255"},
};

void setup()
{
  Serial.begin(9600);
  for (uint16_t z = 0; z < TEXTZEILEN; z++) {
    for (uint16_t s = 0; s < TEXTSPALTEN; s++) {
      char zeichen = pgm_read_byte(&(TEXT[z][s]));
      if (zeichen >= ' ') {
        Serial.print(zeichen);
      }
    }
    Serial.println();
  }
}

void loop(){}
Der Sketch verwendet 22.580 Bytes (70%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 200 Bytes (9%) des dynamischen Speichers, 1.848 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.

Erstelle mal die komplette Liste, dann hat man konkrete Werte für ein Konzept. Möglicherweise kann man die ganz langen Texte etwas kürzen.

Jannomag:
Wie sieht es da mit dem Speichern in einzelnen Dateien mit bestimmten Namen aus?

Prinzipiell kein Problem, macht die Bibliothek SdFat auch mit längeren Dateinamen.

Am Besten aus JahrMonatTag einen Teil des Dateinamens bilden, wie z.B. log_20171117.txt

Gruß Tommy

Jannomag:
Die Protokolle müssen UNBEDINGT gespeichert werden, da diese enorm wichtig sind.

Ich denke da wird es mindestens nötig sein ein Display oder eine andere Art von "Lebenszeichen" vorzusehen ?

In dem anderen Thread hieß es die Signale kommen von einer SPS. Da wird man eine solide Form der Pegelwandlung vorsehen müssen, wenn das 24 V Signale sind. Damit nicht ein Überspannungsimpuls den Arduino killt. Eventuell wäre das auch was für einen "Controllino" das sind fertige Arduino Module im Hutschienengehäuse, mit eingebauter 24 V Pegelwandlung. Da gibt es auch Modelle mit eingebauter RTC, meines Wissens nach aber keins mit eingebautem SD-Slot. Es gibt sie aber mit eingebautem Ethernet, da könnte man die Daten auch auf einen Server schreiben. Der könnte auch auf Ausfälle überwachen ...

Muss das Ding irgenwie zertifiziert werden ? Eventuell macht eine zweite modernere SPS mit Speicherkartenmodul eher Sinn.

Wenn man viel Speicher braucht und sowieso die Eingänge über Pegelwandler kommen, könnte man auch den Teensy 3.5 (oder 3.6) in Betracht ziehen, da wären auch Micro-SD Slot und eine RTC direkt schon vorhanden.

Bei "24V" und "Pegelwandlung" fallen mir gleich Optokoppler ein, da zusätzlich noch eine galvanische Trennung möglich wird.

So, sorry für die späte Antwort, jedoch wollte ich meinen Urlaub mal genießen.

Danke auch für die Antworten.

agmue:
Erstelle mal die komplette Liste, dann hat man konkrete Werte für ein Konzept. Möglicherweise kann man die ganz langen Texte etwas kürzen.
Prinzipiell kein Problem, macht die Bibliothek SdFat auch mit längeren Dateinamen.

Kann ich erst Ende nächster Woche, da ich dann erst wieder in der Firma bin. Hoffentlich finde ich Zeit dafür.
Durchaus kann man einige Texte kürzen, diese sind nicht im Wortlaut wichtig sondern nur in der Bedeutung.

ArduFE:
Ich denke da wird es mindestens nötig sein ein Display oder eine andere Art von "Lebenszeichen" vorzusehen ?

In dem anderen Thread hieß es die Signale kommen von einer SPS. Da wird man eine solide Form der Pegelwandlung vorsehen müssen, wenn das 24 V Signale sind. Damit nicht ein Überspannungsimpuls den Arduino killt. Eventuell wäre das auch was für einen "Controllino" das sind fertige Arduino Module im Hutschienengehäuse, mit eingebauter 24 V Pegelwandlung. Da gibt es auch Modelle mit eingebauter RTC, meines Wissens nach aber keins mit eingebautem SD-Slot. Es gibt sie aber mit eingebautem Ethernet, da könnte man die Daten auch auf einen Server schreiben. Der könnte auch auf Ausfälle überwachen ...

Muss das Ding irgenwie zertifiziert werden ? Eventuell macht eine zweite modernere SPS mit Speicherkartenmodul eher Sinn.

Wenn man viel Speicher braucht und sowieso die Eingänge über Pegelwandler kommen, könnte man auch den Teensy 3.5 (oder 3.6) in Betracht ziehen, da wären auch Micro-SD Slot und eine RTC direkt schon vorhanden.

Controllino wurde mir auch schonmal gesagt. Wäre eine Idee, möglich ist es. Jedoch muss vorher das Programm auf einem Uno laufen, da ich den Kram bereits zu Hause liegen hab.
Erst, wenn das alles zu 100% läuft, kann ich mir um die Hardware Gedanken machen - denn die ist ja das geringste Problem.

SPS ist zu teuer und ich hab auch nicht die Möglichkeiten die zu Programmieren. Da meine Firma, bzw. meine Abteilung, nicht mit SPS arbeitet, haben wir weder die Kabel noch die Software dafür.
Daher warte ich auch mal auf einen "Crash" der SPS um zu sehen, was dann passiert...

Wegen den 24V hab ich mir eine Transistor-Schaltung erdacht.
Als REG1 schwebt mir ein LM7805 vor, Transistoren probiere ich noch aus. Basiswiderstände hab ich in der Schaltung vergessen, sind aber auf dem Platinenlayout drauf.
Oben sind die 24V Ausgänge der SPS, unten die Eingänge des Arduinos.
Die LEDs dienen lediglich zur Funktionskontrolle.
Grund für diese Schaltung ist wieder, dass ich fast alles dafür da hab. Der 7805 kostet selbst bei Conrad nicht viel und ist daher jeder Zeit für mich erreichbar.

Benötigen die LEDs nicht Vorwiderstände und die Ausgänge (DIGITAL) je einen PullDown-Widerstand?

Zweimal vier Optoloppler in einem IC, versorgt von 5V des UNO, fände ich einfacher.

agmue:
Benötigen die LEDs nicht Vorwiderstände und die Ausgänge (DIGITAL) je einen PullDown-Widerstand?

Zweimal vier Optoloppler in einem IC, versorgt von 5V des UNO, fände ich einfacher.

R1 ist der Widerstand für die LEDs.

Die PullDown-Widerstände hab ich vergessen, das stimmt...die vergesse ich jedes Mal, wenn ich mit Arduino arbeite, da ich nicht verstehe, warum Arduino die braucht und das nicht anders gelöst wurde :smiley:

Welche ICs meinst du? Optokoppler habe ich auch schon in Betracht gezogen, jedoch wegen der vorhandenen Bauteile zu Hause erstmal nicht eingeplant.

Jannomag:
R1 ist der Widerstand für die LEDs.

Ich habe gelernt, jede LED braucht ihren eigenen Widerstand.

Jannomag:
Welche ICs meinst du?

Ich habe mal bei Conrad, weil von Dir erwähnt, nach Optokopplern gesucht und vier in einem IC gefunden. Was Du auswählst, ist eine Frage der passenden Spezifikation und des Preises.

agmue:
Ich habe gelernt, jede LED braucht ihren eigenen Widerstand.
Ich habe mal bei Conrad, weil von Dir erwähnt, nach Optokopplern gesucht und vier in einem IC gefunden. Was Du auswählst, ist eine Frage der passenden Spezifikation und des Preises.

Ein Widerstand reicht, muss nur richtig dimensioniert sein (in dem Fall 56 Ohm).

Bei Conrad habe ich z.B. den ILQ615 gefunden.
Soweit ich das verstanden hab, ist die Eingangsspannung bei 1,5V mit einem max. Strom von 60mA.
Das heißt, ich benötige pro Eingang noch einen 375Ω Vorwiderstand ( (24V - 1,5V) / 0,06A ).
Ist also nur minimal weniger Arbeit, man kann die ICs lediglich bei einem Defekt leichter tauschen und die Haltbarkeit ist vielleicht etwas höher.

Sonst irgendwelche überwiegenden Vorteile eines Optokopplers für diesen Einsatz?

Die 5V würde ich weiterhin mit dem LM7805 erzeugen, welcher bis 1,5A kann.

Jannomag:

Ich habe gelernt, jede LED braucht ihren eigenen Widerstand.

Ein Widerstand reicht, muss nur richtig dimensioniert sein (in dem Fall 56 Ohm).

Jede Led braucht ihren eigenen Vorwiderstand. Ein gemeinsamer ginge höchstens, wenn alle Leds gleich geschaltet werden, was am Sinn der Schaltung vorbeiginge. Außerdem wäre das auch elektrisch ungünstig, da die Leds leicht unterschiedliche Schwellspannungen haben können, so dass durch die Led mit der geringsten wesentlich mehr Strom als vorgesehen fließt. Alternativ kann man den Widerstand für eine Led dimensionieren. Dann können zwar alle Acht unterschiedlich angesteuert werden, aber die Leuchtkraft variiert nach Zahl der gleichzeitig leuchtenden Leds. Bei 8 leuchtenden Leds wird es funzelig.

So wie ich es verstanden habe, leuchtet doch max. eine der acht, zusammen mit der Powerled. Somit sollte auch ein Vorwiderstand reichen

Jannomag:
Sonst irgendwelche überwiegenden Vorteile eines Optokopplers für diesen Einsatz?

Galvanische Trennung: Auf meinem Schreibtisch kaum notwendig, im industriellen Umfeld gebräuchlich. Die Hutschienen-Arduino-Nachbauten haben auch Optokoppler drin. Da ich Deine Anwendung nicht genau genug kenne, kann ich nicht beurteilen, was da notwendig ist und was nicht. Auch kann ich nicht einschätzen, wie genau Du das beurteilen kannst, da Du offensichtlich etwas tust, was nicht zu Deinen beruflichen Aufgaben gehört. Willst Du das wirklich? Diese Frage solltest Du bitte nochmal in Ruhe überdenken. Ich würde jeder LED einen Widerstand spendieren und Optokoppler verwenden.

Und Du machst, was Du für richtig erachtest und verantwortest das :slight_smile:

ElEspanol:
So wie ich es verstanden habe, leuchtet doch max. eine der acht, zusammen mit der Powerled. Somit sollte auch ein Vorwiderstand reichen

Es gibt 46 verschiedene relevante Texte, theoretisch aber 255. In #6 ist das erklärt.

ElEspanol:
So wie ich es verstanden habe, leuchtet doch max. eine der acht, zusammen mit der Powerled. Somit sollte auch ein Vorwiderstand reichen

Ich habe verstanden, dass ein Binär-Code übertragen wird. Also leuchten verschiedene Anzahlen.