LCD Display oder ausgänge

Hallo, würde gerne ein kleines Programm schreiben und auswählen können ob Pin 0-7 Ausgänge sind oder an diesen ein LCD angeschlossen wird.

Hintergrund: SPS senden 68 Byte zum Arduino darunter die ausgänge und 64 LCD zeichen (für 4x16)

habe das nun soweit, dass ich über Putty die ip ändern kann (setip:192.168.000.1) der speichert das denn in den EProm, nach einem Reset ist die neue IP da.

Nun dachte ich mir das so

if (modus == 1){ int LCD_RS = 2 int LCD_RW = ) ... } Else{ int DO1 = 0; int DO2 = 1; ... }

Problem ist ja nur das im Sketch dann die Variablen DO alle nicht initiallisiert werden oder?

hoffe ihr versteht mein vorhaben und habt ein paar ideen tipps

würde das Programm was auf dem Arduino dann kommt gerne universal nutzen. Wenn ich ein LCD anschließen möchte schreibt man über Putty setLCD true dann wer LCD modus Aktiv SetLCD false dann wären die Pins als ausgänge nutzbar.

von der SPS werden immer alle Daten übertragen

int LCD_RW = ) Was ist ')' ?

k-b-l: hoffe ihr versteht mein vorhaben

Nö, nicht so wirklich.

k-b-l: und habt ein paar ideen tipps

Falls Du denselben Sketch an denselben Pins mal mit LCD und mal ohne LCD verwenden möchtest, dann darfst Du keine statische Instanz für ein LiquidCrystal-Objekt im Programm erzeugen, sondern dann mußt Du die Objektinstanz aus der Objektklasse bei Bedarf dynamisch erzeugen und bei Nichtbedarf auch dynamisch wieder freigeben.

Was ist ')' ?

wschl 9 ;)

also stellt euch vor ich hätte 2 arduino unos

Arduino1 empfängt 65byte (64 Zeichen + 1Byte ausgänge) der Arduino hat KEIN LCD also sind die Pins 0-7 als Digital Output deklariert. steht in dem Ausgangsbyte nun 255 sind alle ausgänge 1

Arduino2 empfängt 65byte (64 Zeichen + 1Byte ausgänge) der Arduino hat aber ein LCD also sind die Pins 0-7 für das Display RW / RS / E / D4 / D5 / D6 / D7 deklariert. außerdem muss das LCD initialisiert werden.

Nun würde ich aber das gerne zusammenführen. das heißt: ich verbinde mich mit dem Serial Monitor. sende an den Arduino

SetLCD1 dann soll sich das Programm so verhalten wie beim Arduino2

SetLCD0 dann soll sich das Programm so verhalten wie beim Arduino1

Kannst du natürlich machen, wenn du willst. Mal abgesehen davon, dass sich auf dem Uno Pins 0/1 und Serial ins Gehege kommen. LCD.init könnte gemacht werden, wenn über Serial das entsprechende Kommando gesendet wurde. Alternativ 0 .. 7 als OUTPUT deklarieren.

Ich halte das allerdings für eher unsicher: Eine "so gravierende" Hardware-Änderung ( LCD oder 8 Digital-Ausgänge ) sollte eher auch den passenden Sketch erfordern, finde ich. Der könnte natürlich, im LCD-Fall, ein fälschlich gesendetes DigitalOut-Byte einfach ignorieren. Oder, im Digital-Fall, die 64 Byte Text ignorieren. ( Oder hab ich das falsch verstanden ? )

Ein Zwischending wäre, die Betriebsart (Undefiniert/LCD/DigitalOut) im EEPROM zu speichern, damit nicht bei jedem Reset erst die Grundeinstellung wieder gesetzt werden muss.

Ja genau

also entweder wedern die 64 lcd bytes ignoriert oder halt das eine ausgangsbyte

die Variable SetLCD1 oder SetLCD0 ist natürlich im eprom gespeichert.

du sagst ja beim UNO komme ich 0/1 mit dem TX Rx ins gehege.

dies aber ja nur wenn ich dort auch was ausgebe. Da ich ja die konfiguration vorher machen und sobald dann das Panel angeschlossen ist, komuniziert der nurnoch über das ethernetshield. im ganzen sketch kommen nur serial ausgaben wenn

Setip getip setmask getmast setgw getgw info SetLCD

empfangen wird

k-b-l: Nun würde ich aber das gerne zusammenführen. das heißt: ich verbinde mich mit dem Serial Monitor. sende an den Arduino

SetLCD1 dann soll sich das Programm so verhalten wie beim Arduino2

SetLCD0 dann soll sich das Programm so verhalten wie beim Arduino1

Du trollst doch!

Wenn Du den Arduino per Serial-Befehl von Serial auf LCD "umgeschaltet" hast, ist Serial doch tot!

Wie zum Teufel willst Du, nachdem Serial tot ist, dem Arduino wieder über Serial einen Befehl senden, dass er dann von LCD wieder auf Serial umschaltet?

Falls Dir digitale Pins auf dem Board fehlen: Hast Du denn schon die Analog-Pins in Deiner Schaltung verwendet?

genau, ich trolle!

vielleicht solltest du mal richtig lesen!

Nirgendwo steht das ich den Serial Tot machen

Daten kommen über Ethernet!!!!

ich habe im sketch lediglich keine Serial ausgabe außer wenn bestimmte befehle empfangen werden!

k-b-l: vielleicht solltest du mal richtig lesen!

Nirgendwo steht das ich den Serial Tot machen

Daten kommen über Ethernet!!!!

Herzlichen Dank für die Information zum Senden der Daten über Ethernet! Im Ausgangsposting, mit dem Du diesen Thread eröffnet hast, steht allerdings nichts von Ethernet. Später? Hm, ist mal ein Ethernetshield erwähnt.

Aber später schreibst Du glasklar das:

das heißt: ich verbinde mich mit dem Serial Monitor. sende an den Arduino

SetLCD1 dann soll sich das Programm so verhalten wie beim Arduino2

SetLCD0 dann soll sich das Programm so verhalten wie beim Arduino1

Also Du verbindest Dich mit dem Serial Monitor, sendest an den Arduino, und ich soll gefälligst lesen, dass Du die Daten über Ethernet sendest?

Ist schon klar. Danke für die Aufklärung, was ich lesen soll, wenn Du schreibst "ich verbinde mich mit dem Serial Monitor. sende an den Arduino". Ich weiß nun Bescheid.

genau, ich nutzen denn Serial lediglig um die konfiguration vorab zu ändern

Der hinweis mit TX und RX ist gut aber wenn keine daten über die Serielle schnittstelle im Betrieb erfolgt dann sollte ich den Pin 0 und Pin 1 ja ganz normal als output nutzen können.

k-b-l: ...wenn keine daten über die Serielle schnittstelle im Betrieb erfolgt dann sollte ich den Pin 0 und Pin 1 ja ganz normal als output nutzen können.

Gibt andersrum mehr Sinn: Wenn Pin 0 (RX) als Output genutzt wird, wirst du mit Serial nicht mehr viel empfangen.

Wie du (bzw. dein Arduino) da raus kommst, wenn im EEPROM schon ein Modus ausser "undefiniert" steht, ist mir übrigens nicht klar.

Das mit der SPS (65 byte über Ethernet) und der Konfiguration über Serial hab ich auch erst beim 2. Mal lesen gesehen. Unter Trollen verstehe ich allerdings was anderes. Hier bist du es, der sich selbst das Leben schwer macht.

Vielleicht habt ihr ja eine Bessere idee?

Ich habe mir gedachte Pin 0-7 als ausgänge zu nutzen, da dies 1 byte wär alternativ spricht ja auch nicht dagegen pin 2-9 zu benutzen

Klar kann ich einfach den nötigen sketch aufspielen (ist sicher das einfachste) nur wenn man das halt so lösen könnte ohne ein neuen sketch einzuspielen würde mich das interessieren

alternativ spricht ja auch nicht dagegen pin 2-9 zu benutzen

Ja. Alternativ könntest du über einen Pin als INPUT_PULLUP, den du entweder offen lässt oder mit GND brückst, den Modus umstellen. Diese Brücke könntest du direkt in ein Display Shield (oder Kabel zum LCD) integrieren: Aufstecken, Einschalten, Fertig -> wird automatisch erkannt.

Serial würde ich trotzdem für Test-Funktionen und Basis-Konfiguration (IP Adresse etc. ins EEPROM) frei lassen.

Ein Universal-Sketch, der alle Funktionen kann, hat sicher etwas für sich: Config - Serial lesen, - EEPROM schreiben,

Setup - EEPROM lesen - Ethernet config - LCD initialisieren oder ignorieren

Loop - LCD anzeigen oder digitalWrite

Soll die SPS auch Analog/Digital-Eingänge gesendet bekommen ?

Also kurz zum SPS Programm

Die SPS bekommt die Analogen eingänge in form von High- und Lowbyte A0 - A5 diese werden im SPS Programm wieder zum Integer 0-1023 zusammengesetzt. Die Analogen kann ich aber auch als Digital im SPS Programm nutzen, Wenn der wert 1023 ist dann bekomme ich quasi noch einen bit auf 1 gesetzt.

Die SPS Sendet außerdem ein Wort zu der dem Arduino der arduino schiebt dies wort in die Sendevariable. Die SPS vergleicht dann ob gesendeter Wert = Empfangener Wert ist (Kopplungsüberwachung)

In der SPS wird dann für jedes Displayfeld ein Byte hinterlegt. sowie ein Byte für 8 Ausgänge.

Deine idee mit dem Pullup ist eine gute idee! Darauf bin ich garnicht gekommen.

Wenn LCD gesteckt ignoriert der Arduino Qausi das empfangene Ausgangsbyte und berücksichtigt die LCD Bytes Wenn kein LCD gesteckt genau andersherum.

Nur muss ich doch im Setup die Pins deklarieren. kann ich da schon per if else einen Analogen Pin (der mit dem Pullup) auswerten?

kann ich da schon per if else einen Analogen Pin (der mit dem Pullup) auswerten?

Klar.

Sowas sollte auch gehen:

#define D0 2    // Pins 2 .. 9  OUTPUT , wenn (withLCD == false) 
 
#define RS  2
...
#define  D7   7 
#define LCDErkennung  8
boolean withLCD;
LiquidCrystal LCD(RS, EN, D4, D5, D6, D7);
void setup()
{ 
   pinMode(LCDErkennung, INPUT_PULLUP);
   withLCD =  (digitalRead(LCDErkennung) == LOW);
   if ( ! withLCD)
   {
      digitalWrite(LCDErkennung, LOW); // damit der Pin als OUTPUT nicht gleich HIGH ist
      for (int pin = D0; pin < D0+8; pin++)
         pinMode(pin, OUTPUT);   // 8 Pins ( 2 .. 9 ) auf OUTPUT schalten 
   }
   else
      LCD.begin(20,4);
}

Nachtrag:
Hab gerade gesehen, dass schon der Konstruktor
LiquidCrystal LCD(RS, EN, D4, D5, D6, D7);
an den Pins herumschaltet, indem er erstmal begin(16,1) aufruft.
Das könnte man - einfach aber unschön - durch eine kleine Modifikation in LiquidCrystal.cpp totlegen.
Aktiv wird das Display dann erst (eventuell) in setup mit LCD.begin(16,2);

Vielen Dank,

ich werde da mal Probieren was umzusetzen :slight_smile: