Hi Jörg,

Zitat Zitat von HeXPloreR Beitrag anzeigen
Verlinke doch mal woher genau das Beispiel stammt.
Also das Beispiel stammt von hier: https://blog.silvertech.at/arduino-7...ige-ansteuern/


zu dem Array/segmente selbst kann ich jetzt nichts weiter sagen, außer das es anscheinen Zählvariablen enthält die sich vermutlich auf den zu steuerneden Pin in einem Zweidimensionalem Array beziehen.
Um genau zu sein auf zwei Zweidimensionale Arrays, das stammt ja auch von mir und das hatte ich verstanden.


Weiter kann dir sagen das auf Gleicheit (==) mit 1 geprüft wird, der Operator dahinter ( ?: ) nennt sich "tenärer Operator" und kürzt eine if - else Abfrage aufs absolute minimum ein - zur Lasten der anfänglichen Verständlichkeit.Bedingung ? Anweisung1 : Anweisung2; Wenn Bedingung wahr ( nicht 0 ) ist , wird Anweisung1 (High) ausgeführt, sonst bei 0 die Anweisung2 (Low).
Vielen Dank! jetzt habe ich es verstanden und finde ich auch genial... Da macht das Programmieren noch mehr Spass, wenn man weiß um was es geht.



Ich würde vermuten das es hier in Verbindung mit digitalWrite zur Steuerung von mehreren Pins (als software PWM) benutzt wird.
Nee nicht ganz. Ok ich lade mal die Funktion hoch. Es geht um eine 5 stellige 13 Segmentanzeige wobei diese von zwei Mega 2560 gesteuert wird und der Code ist für den Mega Nr.1
Die Anzeige ist ca. 2m auf 0,5m groß und die Segmente werden über 230Volt LED Lampen befeuert. Durch die nötige und verbauten Schaltungen fällt das Multiplexen leider flach. Mehrere Versuche die Anzeige zu Multiplexen gingen daneben, so das ich jetzt jedes Segment seperat ansteuere..

Da hätte ich auch gleich noch ne Frage: Zum Schluß der Funktion habe ich den Befehl: Serial.print("Error"); welches er auch auf den Monitor bringt, jedoch der Rest wird nicht mehr ausgeführt und das Programm springt sehr weit nach oben. Ist das jetzt Zufall, ein Fehler in meinem Code oder macht das Wort Error was aktives?

Und wenn ich jetzt das "==1)?HIGH:LOW)" sehe, dann könnte man doch die ganzen If Abfragen in meiner Funktion etwas zusammenfassen oder funktioniert das dann nicht?

Gruß Marco


PHP-Code:
/*
* Copyright (c) 2015 Marco Steinhauser. All rights reserved 
*
* Funktion Pin Anzeige
*
* Test Programm für eine 5 stellige 13 Segment Anzeige mit Doppelpunkt, Punkt, KM/H
* und Sekunden. Aufgeteilt auf zwei Arduino 2560 MEGA R3


* Für den Arduino 2560 MEGA R3 Nr.1 
*

* Steuert die Digitalen Pins der Ziffern X4, X5 und X6 an und aktiviert die Digitalen Ausgänge
* für die Zahlen 0-9, KM/H und SEK. Für die Ziffern X1 und X2 sowie den Punkt und Doppelpunkt
* werden die Zahlen über den I²C Bus an den Mega Nr. 2 übergeben.
* Zur Kontrolle werden die Zustände der digitalen Ausgänge auf dem Serial Monitor angezeigt. 

* Version 2.2
*
*      Vers. 1.0 vom 27 März 2015
*         V. 1.0 Das Programm wurde an Hand eines Beispiel Program aus dem Internet
*                entworfen und dient zur Kontrolle ob die Digitalen Ausgänge auch so
*                angesteuert werden wie gewünscht. 
*
*      Vers. 1.1 vom 28 März 2015
*         V. 1.1 Das Programm wurde an die Funktion "Zahl Auswerten" angepasst.  
*
*
*      Vers. 2.2 vom 30 März 2015
*         V. 2.0 Das Programm wurde in die Funktion "Pin Anzeige" geändert.  
*         V. 2.1 Es wurden die Fallunterscheidungen für die 6 stellige Einzelzahl implementiert.  
*         V. 2.2 Zu Testzwecken wurden die Funktionen "empfangeZahl" und "bestimmeZahl" implementiert.
*  
**/
byte digipin[34]={6,7,13,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,};
  
// Digital-Ausgänge deklarieren


byte ziffer[3][11] = {
{
43,44,45,46,47,48,49,50,51,52,13}, // Ziffer 0 = X4
{33,34,35,36,37,38,39,40,41,42,13}, // Ziffer 1 = X5
{22,23,24,25,26,27,28,29,30,31,32}, // Ziffer 2 = X6
};



byte segmente[14][11] = {

{
1,1,1,1,1,1,1,0,1,1,0}, // segmente 0 = Zahl 0
{1,0,0,0,0,0,0,0,1,1,0}, // segmente 1 = Zahl 1
{1,1,1,0,1,1,1,1,1,0,1}, // segmente 2 = Zahl 2
{1,1,1,0,1,0,1,1,1,1,1}, // segmente 3 = Zahl 3
{1,0,1,1,1,0,0,1,1,1,0}, // segmente 4 = Zahl 4
{1,1,1,1,1,0,1,1,0,1,1}, // segmente 5 = Zahl 5
{1,1,1,1,1,1,1,1,0,1,1}, // segmente 6 = Zahl 6
{1,0,1,0,0,0,1,1,1,1,0}, // segmente 7 = Zahl 7
{1,1,1,1,1,1,1,1,1,1,1}, // segmente 8 = Zahl 8
{1,1,1,1,1,0,1,1,1,1,1}, // segmente 9 = Zahl 9
{1,1,1,1,1,1,1,1,0,0,1}, // segmente 10 = Buchstabe E
{1,1,1,1,1,1,0,0,1,1,1}, // segmente 11 = Buchstabe U 
{1,1,1,1,1,0,1,1,0,1,1}, // segmente 12 = Buchstabe S
{1,1,1,1,1,1,1,1,1,1,0}, // segmente 13 = Buchstabe A
};


long eingangszahl=0;    //Die Variable für den Empfang der Einganszahl deklarieren und den Wert 0 zuweisen.

long a =0;

long divisor=100000;       // Variable Divisor deklarieren und Wert zuweisen. Dieser Wert muss mit der
                             // Anzahl der Stellen des Einganswerts übereinstimmen.

long teilzahl=0;             // Variable für die zwischen Schritte deklarieren

int i=0;                     // Variable für die Zählerschleife deklarieren
int j=0;

byte einzelzahl[6];          // Variable für das Ergebnis deklarieren. Es werden die einzelnen Werte der
                             // achtstelligen Zahl in einer Feld-Variable gespeichert 

void setup() 
{
Serial.begin(9600);

  for(
int i 0i<34i++){
    
pinMode(digipin[i], OUTPUT); //Digital Pins als Ausgang aktivieren
  
};
  
  for(
int j 0j<11j++){
    
digitalWrite(ziffer[0][j], (segmente[11][j]==1)?HIGH:LOW);
    
digitalWrite(ziffer[1][j], (segmente[12][j]==1)?HIGH:LOW);
    
digitalWrite(ziffer[2][j], (segmente[13][j]==1)?HIGH:LOW);
  }
  
Serial.print("USA"); Serial.println("");
  for (
int i 034i++){
      
Serial.print(digitalRead(digipin[i]));
  }
  
Serial.println(""); 

delay(2000);

}

void loop() 
{

  
  
eingangszahl=0;

empfangZahl();

delay (1000);

bestimmeZahl(); // Aufruf der Funktion innerhalb des Programms

delay (1000);

pinAnzeige(); 

}


void empfangZahl(){
  
Serial.flush();
Serial.println("Bitte 6 stellige Zahl eingeben:");
  while (
Serial.available() == 0)
  {
  
// Macht nichts! Wartet bis eine Zahl empfangen wird.
  
}
  while (
Serial.available() > 0)
  {
    
eingangszahl eingangszahl 10;
    
a=Serial.read()-'0';
    
eingangszahl eingangszahl a;
    
delay (5);
  }
Serial.print("Die empfangene Zahl ist:");
Serial.println(eingangszahl);
}

void bestimmeZahl ()   // Funktion zum Auswerten einer 8 stelligen Zahl
{
for (
int i=0i<6i++){
 
   
teilzahl=(eingangszahl/divisor);  

   
divisor=(divisor/10);  

    if (
teilzahl >=10) {
      
teilzahl=(teilzahl%10); 
    }   
  
einzelzahl[i] = (teilzahl);    
  }
  
divisor=100000;
  
Serial.println ("Die Einzelzahlen sind:");

  for (
int i=0;i<6;i++){
  
Serial.println (einzelzahl[i]); 
  }
}

void pinAnzeige()
{
  for(
int i 0i<34i++)
    
digitalWrite(digipin[i],LOW); //Digitale Ausgäng ausschalten
  
 
     
 
    
if (einzelzahl[0]==1){      //erste Stelle ist 1 = Uhrzeit

      
Serial.print("Uhrzeit"); Serial.println("");
      
Serial.print("DoppelPunkt"); Serial.println("");
      
delay(1000);
      
      for(
int i=0i<10i++){
        if (
einzelzahl[3]==i){      //vierte Stelle 0-9 = Ziffer X4 Zahl 0-9
          
for(int j 0j<11j++){
           
digitalWrite(ziffer[0][j], (segmente[i][j]==1)?HIGH:LOW);
           
Serial.print(digitalRead(ziffer[0][j]));
          }
          
Serial.println("");
        }
        if (
einzelzahl[4]==i){      //fünfte Stelle 0-9 = Ziffer X5 Zahl 0-9
          
for(int j 0j<11j++){
            
digitalWrite(ziffer[1][j], (segmente[i][j]==1)?HIGH:LOW);
            
Serial.print(digitalRead(ziffer[1][j]));
          }
          
Serial.println("");
        }
      }
    }
    if (
einzelzahl[0]==2||einzelzahl[0]==3){    //erste Stelle ist 2 oder 3
      
      
if (einzelzahl[0]==2){      //erste Stelle ist 2 = Sekunden

      
digitalWrite(7,HIGH);  //aktiviert PIN 7 SEK 
      
Serial.print("PIN 7 SEK ="); Serial.println(digitalRead(7));
      
Serial.print("PIN 6 KM/H ="); Serial.println(digitalRead(6));
      
Serial.print("Punkt"); Serial.println("");
      
delay(1000);
      }
      if (
einzelzahl[0]==3){      //erste Stelle ist 3 = KM/H

        
digitalWrite(6,HIGH);  //aktiviert PIN 6 KM/H 
        
Serial.print("PIN 7 SEK ="); Serial.println(digitalRead(7));
        
Serial.print("PIN 6 KM/H ="); Serial.println(digitalRead(6));
        
Serial.println("");
        
delay(1000);
      }
      for(
int i 0i<10i++){
        if (
einzelzahl[3]==i){      //vierte Stelle 0-9 = Ziffer X4 Zahl 0-9
          
for(int j 0j<11j++){
           
digitalWrite(ziffer[0][j], (segmente[i][j]==1)?HIGH:LOW);
           
Serial.print(digitalRead(ziffer[0][j]));
          }
           
Serial.println("");
        }
        if (
einzelzahl[4]==i){      //fünfte Stelle 0-9 = Ziffer X5 Zahl 0-9
          
for(int j 0j<11j++){
            
digitalWrite(ziffer[1][j], (segmente[i][j]==1)?HIGH:LOW);
            
Serial.print(digitalRead(ziffer[1][j]));
          }
            
Serial.println("");
        }
        if (
einzelzahl[5]==i){      //sechste Stelle 0-9 = Ziffer X6 Zahl 0-9
          
for(int j 0j<11j++){
            
digitalWrite(ziffer[2][j], (segmente[i][j]==1)?HIGH:LOW);
            
Serial.print(digitalRead(ziffer[2][j]));
          }
          
Serial.println("");
        }      
      }
    }
  

    if (
einzelzahl[0]>=4&&einzelzahl[0]<=6){      //erste Stelle ist größer/gleich 4 = Fehler
      
      
Serial.print("Fehler");
      
Serial.println(""); 
      for(
int j 0j<11j++){
        
digitalWrite(ziffer[0][j], (segmente[10][j]==1)?HIGH:LOW);
        
Serial.print(digitalRead(ziffer[0][j]));
      }
      
Serial.println("");
        
      for(
int i 0i<10i++){
        if (
einzelzahl[4]==i){      //dritte Stelle 0-9 = Ziffer X1 Zahl 0-9
          
for(int j 0j<11j++){
            
digitalWrite(ziffer[1][j], (segmente[i][j]==1)?HIGH:LOW);
            
Serial.print(digitalRead(ziffer[1][j]));
            
          }
          
Serial.println("");
        }
        if (
einzelzahl[5]==i){      //dritte Stelle 0-9 = Ziffer X1 Zahl 0-9
          
for(int j 0j<11j++){
            
digitalWrite(ziffer[2][j], (segmente[i][j]==1)?HIGH:LOW);
            
Serial.print(digitalRead(ziffer[2][j]));
            
          }
          
Serial.println("");
        }
      }
    }
    
    if (
einzelzahl[0]==0||einzelzahl[0]>=7){      //erste Stelle ist 0 = Error
      
Serial.print("Error");
      
Serial.println("");
      for(
int j 0j<11j++){
        
digitalWrite(ziffer[0][j], (segmente[10][j]==1)?HIGH:LOW);
        
digitalWrite(ziffer[1][j], (segmente[3][j]==1)?HIGH:LOW);
        
digitalWrite(ziffer[2][j], (segmente[3][j]==1)?HIGH:LOW);
        
Serial.print(digitalRead(ziffer[0][j]));
        
Serial.print(digitalRead(ziffer[1][j]));
        
Serial.print(digitalRead(ziffer[2][j]));
      }
      
Serial.println("");
    }

- - - Aktualisiert - - -

Hallo Peter und Sisor,

vielen Dank für euere Antworten. Hatte mir schon gedacht das dieser Befehl die 1 und die 0 aus dem einen Array überträgt auf die digitalen Pins des anderen Array, da es ja auch funktioniert. Nur das wie war nicht klar. Aber Dank eueren Antworten bin ich jetzt wieder etwas schlauer...

Gruß Marco