Hilfe beim programmieren

Hallo zusammen.
Ich möchte nachfolgenden Sketch auch für A1 und 9 sowie A2 und 10 laufenlassen-
das heist mit drei Lichtschranken unabhägig 3 Relais schalten.
Nachfolgendes funktioniert für ein Relais.
int ledPin;
int sensorPin;
int zustand;

void setup(){
pinMode(ledPin =A0, OUTPUT);
pinMode(sensorPin = 8, INPUT);

}
void loop() {
zustand = digitalRead(sensorPin);

if (zustand == HIGH) {
digitalWrite(ledPin,HIGH);
} else {
digitalWrite(ledPin,LOW);
}

}
Danke schon mal im vorraus.

Gruß Steffen

versuch das

int ledPin1;   
int sensorPin1; 
int zustand1;     

int ledPin2;   
int sensorPin2; 
int zustand2;     

int ledPin3;   
int sensorPin3; 
int zustand3;     


void setup()
{
  pinMode(ledPin1 =A0, OUTPUT); 
  pinMode(sensorPin1 = 8, INPUT);

  pinMode(ledPin2 =A1, OUTPUT); 
  pinMode(sensorPin2 = 9, INPUT);

  pinMode(ledPin3 =A2, OUTPUT); 
  pinMode(sensorPin3 = 10, INPUT);
 
}
void loop() 
{
  zustand1 = digitalRead(sensorPin1);
 
 
  if (zustand1 == HIGH) {
    digitalWrite(ledPin1,HIGH);
  } else 
{
    digitalWrite(ledPin1,LOW);
  }

{
  zustand2 = digitalRead(sensorPin2);
 
 
  if (zustand2 == HIGH)
 {
    digitalWrite(ledPin2,HIGH);
  } else 
{
    digitalWrite(ledPin2,LOW);
  }

{
  zustand3 = digitalRead(sensorPin3);
 
 
  if (zustand3 == HIGH)
 {
    digitalWrite(ledPin3,HIGH);
  } else 
{
    digitalWrite(ledPin3,LOW);
  }
 
}

Danke für die Antwort

exit status 1
'ledPin1' was not declared in this scope

obengenannten Fehler habe ich.

Hi Steffen

byte ledPin1 = A0;    
byte sensorPin1 = 8;
bool zustand1; 
byte ledPin2 = A1;    
byte sensorPin2 = 9; 
bool zustand2; 
byte ledPin3 = A2;    
byte sensorPin3 = 10; 
bool zustand3; 
    
 

void setup(){
  pinMode(ledPin1, OUTPUT);  
  pinMode(sensorPin1, INPUT);
  pinMode(ledPin2, OUTPUT);  
  pinMode(sensorPin2, INPUT);
  pinMode(ledPin3, OUTPUT);  
  pinMode(sensorPin3, INPUT);
  
} 
void loop() {
  zustand1 = digitalRead(sensorPin1);
  zustand2 = digitalRead(sensorPin2);
  zustand3 = digitalRead(sensorPin3); 
  
  
  if (zustand1 == HIGH) { 
    digitalWrite(ledPin1,HIGH); 
  } else { 
    digitalWrite(ledPin1,LOW); 
  }

  if (zustand2 == HIGH) { 
    digitalWrite(ledPin2,HIGH); 
  } else { 
    digitalWrite(ledPin2,LOW); 
  }

  if (zustand3 == HIGH) { 
    digitalWrite(ledPin3,HIGH); 
  } else { 
    digitalWrite(ledPin3,LOW); 
  }
 
}

Quick & Dirty und ungetestet, müsste aber funktionieren...

Grüsse Peter

Danke Peter.

das funktioniert.

Bin eben totaler Anfänger in der Richtung.

Werde mich bestimmt noch oft melden.

Das soll eine Blochsteuerung für die Modellbahn werden.

Lok schaltet 8 an und 10 aus , fährt weiter schaltet 9 an und 8 aus, fährt weiter und schaltet 10 an und 9 aus, fährt wieder zu 8.
Die Relais sollen dann jeweils die Fahrspannung für den Block schalten.

mal sehen ob ich das hinbekomme.

Gruß Steffen

Hallo zusammen.

ich muss nochmal nach Hilfe fragen.
Nachfolgender Sketch funktioniert. Jetzt soll aber :

beim abschalten von Relais 2 (A1) Relais 1 (A0) einschalten,
beim abschalten von Relais 3 (A2) Relais 2 (A1) einschalten,
beim abschalten von Relais 4 (A3) Relais 3 (A2) einschalten,
beim abschalten von Relais 1 (A0) Relais 4 (A3) einschalten.

byte ledPin1 = A0;    
byte sensorPin1 = 8;
bool zustand1;
byte ledPin2 = A1;    
byte sensorPin2 = 9;
bool zustand2;
byte ledPin3 = A2;    
byte sensorPin3 = 10;
bool zustand3;
byte ledPin4 = A3;
byte sensorPin4 = 11;
bool zustand4;    
 

void setup(){
  pinMode(ledPin1, OUTPUT);  
  pinMode(sensorPin1, INPUT);
  pinMode(ledPin2, OUTPUT);  
  pinMode(sensorPin2, INPUT);
  pinMode(ledPin3, OUTPUT);  
  pinMode(sensorPin3, INPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(sensorPin4, INPUT);
  
}
void loop() {
  zustand1 = digitalRead(sensorPin1);
  zustand2 = digitalRead(sensorPin2);
  zustand3 = digitalRead(sensorPin3);
  zustand4 = digitalRead(sensorPin4);
  
  if (zustand1 == LOW) {
    digitalWrite(ledPin1,HIGH);
  } else {
    //digitalWrite(ledPin1,LOW);
 
  }

if (zustand2 == LOW) {
    digitalWrite(ledPin2,HIGH);
  } else {
    //digitalWrite(ledPin2,LOW);

  }

  if (zustand3 == LOW) {
    digitalWrite(ledPin3,HIGH);
  } else {
    //digitalWrite(ledPin2,LOW);

  }

  if (zustand4 == LOW) {
    digitalWrite(ledPin4,HIGH);
  } else {
    //digitalWrite(ledPin4,LOW);
  }
}

Danke im vorraus für die Hilfe

Steffen

Du musst nur noch in die else abfrage des jeweiligen zustandes zb für A1 das Relais A0 Schalten

Sprich A1 High-> A0 LOW , A1LOW ->A0 High

wenn immer nur ein Relai High sein soll musst du den Zustand 1-4 abfragen unf für jeden fall was schreiben (so würde ich das machen

Also

Zustand1 H Zustand2 H Zustand3 H Zustand4 L -> A3H

das geht sicher auch viel toller und einfacher aber naja im Moment ist das ja nur ein zusammenbauen von Statusabfragen und anweisungen

Als blutiger Anfänger brauche ich schon male eine programmierte Zeile.
Das wird sonst bei mir nichts.

Gruß

Steffen

if (zustand1 == LOW) 

{
   digitalWrite(ledPin1,HIGH); //Relais A0 Anschalten
 } 
else 
{
   digitalWrite(ledPin1,LOW); // Relais A0 ausschalten
   digitalWrite(ledPin2,HIGH); // Relais A1 einschalten
 }

in "IF" kommt somit alles was passieren soll wenn man an der Schranke ist ZB A0 einschalten (evtl alle anderen Relais ausschalten

und in else dann das was passieren soll wenn man nicht an der Schranke ist . Sprich Relais A0 aus und A1 ein schalten . Auch hier belibig erweiterbar (zb noch durch ne LED die leuchtet wenn der Zug die schranke passiert etc .

was den code angeht den müsstest du dir dann schon für den rest selber zusammen fummeln und benenn mal ledPin in Relais1...4 um wenn mal ne Led dazu kommt kommste nachher durcheinander ^^

Google mal nach Arduino endlicher Automat. Das ist das was du brauchst.

Das klappt auch nicht wirklich.

byte ledPin1 = A0;    
byte sensorPin1 = 8;
bool zustand1;
byte ledPin2 = A1;    
byte sensorPin2 = 9;
bool zustand2;
byte ledPin3 = A2;    
byte sensorPin3 = 10;
bool zustand3;
byte ledPin4 = A3;
byte sensorPin4 =11;
bool zustand4;    
 

void setup(){
  pinMode(ledPin1, OUTPUT);  
  pinMode(sensorPin1, INPUT);
  pinMode(ledPin2, OUTPUT);  
  pinMode(sensorPin2, INPUT);
  pinMode(ledPin3, OUTPUT);  
  pinMode(sensorPin3, INPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(sensorPin4, INPUT);
}
void loop() {
  zustand1 = digitalRead(sensorPin1);
  zustand2 = digitalRead(sensorPin2);
  zustand3 = digitalRead(sensorPin3);
  zustand4 = digitalRead(sensorPin4);
  
  if (zustand1 == LOW) {
    digitalWrite(ledPin1,HIGH);
  } else {
    digitalWrite(ledPin1,LOW);
    digitalWrite(ledPin4,HIGH);
  }

  if (zustand2 == LOW) {
    digitalWrite(ledPin2,HIGH);
  } else {
    digitalWrite(ledPin2,LOW);
    digitalWrite(ledPin1,HIGH);
  }

  if (zustand3 == LOW) {
    digitalWrite(ledPin3,HIGH);
  } else {
    digitalWrite(ledPin3,LOW);
    digitalWrite(ledPin2,HIGH);
  }
  if (zustand4 == LOW) {
    digitalWrite(ledPin4,HIGH);
  } else {
    digitalWrite(ledPin4,LOW);
    digitalWrite(ledPin1,LOW);  
  }
}

Gruß Steffen

So viel einblick in den Arduino habe ich noch nicht.
Kann es vielleicht sein, das das was ich haben möchte mit analogen Ausgängen
und digitalen Eingängen garnicht geht?

Eigentlich möchte ich nur diese Schaltung mit hilfe des Arduinos umsetzen.

DieRelais sollen untereinander verriegelt sein und die Relaiskontakte geben die Fahrspannung ab.
Die Relais werden mit TCRT5000 (L) Reflektierender Optischer Sensor mit Transistor- Ausgang geschaltet.Die Koppler sitzen jeweils an der Trennstelle.

[url=http://[![|500x375](http://abload.de/img/mobile.65wqsqw.jpg)](Bild: mobile.65wqsqw.jpg - abload.de)

Gruß

Steffen

asco:
... mit analogen Ausgängen ...

Es geht mit digitalen Ausgängen, darum digitalWrite(). Der Pin A0 kann als analoger (PulsWeitenModulation) oder digitaler Pin definiert und genutzt werden.

if (zustand1 == LOW) {
    digitalWrite(ledPin1,HIGH);
  } else {
    digitalWrite(ledPin1,LOW);
    digitalWrite(ledPin4,HIGH);
  }

Das bedeutet, Dein optischer Sensor müßte sich über die gesamte Strecke des Blocks erstrecken, was er aber nicht tut. Tatsächlich kommen vom Sensor ein oder mehrere Impulse, wenn die Lok (oder was auch immer) diesen passiert. Daher siehe #9 brauchst Du einen endlichen Automaten mit Flankenerkennung.

asco:
DieRelais sollen untereinander verriegelt sein ...

Das wird nicht funktionieren, da die Lok an der Übergangsstelle stehen bleiben wird, da entweder der vorhergenende Block zu früh abgeschaltet oder der nächste zu spät eingeschaltet werden wird. Zwischen Einschalten und Abschalten wird eine Verzögerungszeit vergehen müssen, während der zwei Blocks mit Spannung versorgt werden müssen. Dies kannst Du ebenfalls mit Hilfe eines endlichen Automaten realisieren.

EDIT: Siehe #13, A0 ist natürlich ein analoger Eingang, wenn denn analog verwendet.

Der Pin A0 kann als analoger (PulsWeitenModulation) oder digitaler Pin definiert und genutzt werden.

A0 - A5 sind Analoge Eingänge (ADC), keine PWM Ausgänge. Können aber auch als digitale Pin's genutzt werden.

versuch es mal so:

const byte ledPin1 = A0;   
const byte sensorPin1 = 8;
bool zustand1;
const byte ledPin2 = A1;   
const byte sensorPin2 = 9;
bool zustand2;
const byte ledPin3 = A2;   
const byte sensorPin3 = 10;
bool zustand3;
const byte ledPin4 = A3;
const byte sensorPin4 = 11;
bool zustand4;   
 

void setup(){
  pinMode(ledPin1, OUTPUT); 
  pinMode(sensorPin1, INPUT);
  pinMode(ledPin2, OUTPUT); 
  pinMode(sensorPin2, INPUT);
  pinMode(ledPin3, OUTPUT); 
  pinMode(sensorPin3, INPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(sensorPin4, INPUT);
 
}
void loop() {
  zustand1 = digitalRead(sensorPin1);
  zustand2 = digitalRead(sensorPin2);
  zustand3 = digitalRead(sensorPin3);
  zustand4 = digitalRead(sensorPin4);
 
  if (zustand1 == LOW) 
     {digitalWrite(ledPin2,0);digitalWrite(ledPin3,0);digitalWrite(ledPin4,0);digitalWrite(ledPin1,HIGH);} //Led1 an, alle anderen aus

  if (zustand2 == LOW) 
     {digitalWrite(ledPin1,0);digitalWrite(ledPin3,0);digitalWrite(ledPin4,0);digitalWrite(ledPin2,HIGH);} //Led2 an, alle anderen aus

  if (zustand3 == LOW) 
     {digitalWrite(ledPin1,0);digitalWrite(ledPin2,0);digitalWrite(ledPin4,0);digitalWrite(ledPin3,HIGH);} //Led3 an, alle anderen aus

   
  if (zustand4 == LOW) 
     {digitalWrite(ledPin1,0);digitalWrite(ledPin2,0);digitalWrite(ledPin3,0);digitalWrite(ledPin4,HIGH);} //Led4 an, alle anderen aus

    
}

Such mal das Beispiel des Bahnübergangs, das hier vor kurzem war. Die letzte Version mit dem endlichen Automaten. Studiere das und versuche zu verstehen, was da wann abläuft. Da sind Lösungen für deine Probleme drin, von denen du noch gar nicht weißt, dass du sie bekommen wirst.
Dein Problem unterfordert den Arduino komplett, von daher brauchst du dir keine Gedanken zu machen.

Edit:Bahnübergang

Hallo ardubu.

Dein Sketch macht genau das, was ich haben wollte.
Habe es eben probiert.
Danke dafür und auch ein Danke an alle anderen die geholfen haben.
Ich setze mich damit mal auseinander um zu verstehen was da passiert.

Gruß Steffen :slight_smile: :slight_smile: :slight_smile: