Simulierte Rolladensteuerung

Hallo,

ich möchte eine Steuerung die abhängig von einem Fotowiderstand ein Relais ansteuert. Jetzt sollen allerdings noch zwei Schalter für oben und unten als Endschalter eingebaut werden. Kann mir da jemand helfen den Code zu erweitern?

int eingang= A1; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int LED = 10; //Das Wort „LED“ steht jetzt für den Wert 10
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert

void setup()//Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. Das benötigt man, um sich den tatsächlich ausgelesenen Wert später im serial monitor anzeigen zu lassen.
pinMode (LED, OUTPUT); //Der Pin mit der LED (Pin 10) ist jetzt ein Ausgang
//Der analoge Pin muss nicht definiert werden.
}

void loop()
{//Mit dieser Klammer wird der Loop-Teil geöffnet.
sensorWert =analogRead(eingang); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
Serial.print("Sensorwert = " ); //Ausgabe am Serial-Monitor: Das Wort „Sensorwert: „
Serial.println(sensorWert); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den serial monitor gesendet.

if (sensorWert > 512 ) //Wenn der Sensorwert über 512 beträgt….
{
digitalWrite(LED, HIGH); //…soll die LED leuchten…
}

else //andernfalls…
{
digitalWrite(LED, LOW); //….soll sie nicht leuchten.
}

delay (50);//Eine kurze Pause, in der die LED an oder aus ist

}

MfG,

Kai

Da solltest Du Dir erst mal prinzipiell klar werden ob Schalter oder Taster und wie Du diese anschließen willst:
-- nach GND mit (internem) PULLUP
-- nach +5V mit externem PULLDOWN

Dann nimmst Du Dir das Tasterbeispiel aus Deiner IDE und probierst erst mal aus, wie Du 1 oder 2 Taster ohne den Rest zum Laufen bringst.

Gruß Tommy

Hallo Kai,

als Erstes mal benutze Define um Ein-/Ausgänge zu bezeichnen. Eine Integer Variable benötigt zuviel unnötigen Speicherplatz.

kai2310:

int eingang= A1; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)

int LED = 10; //Das Wort „LED“ steht jetzt für den Wert 10

Ich hab das jetzt mal so verstanden die LED soll leuchten wenn der Sensorwert über 512 beträgt, und wenn der Taster unten betätigt wird soll diese aufhören zu leuchten da dann der Rollladen unten ist. Ich habe meinen Code jetzt mal mit 2 Ausgängen geschrieben. Einer fürs hoch und der andere fürs runterfahren.

Wenn der Senorwert über 512 ist fährt der Rollladen runter.
Hier ist mal mein ungetesteter Code:

#define eingang  A1 //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
#define obenEnde A2 //Pins am besten immer mit define definieren da mit int zuviel Speicher unnötigt verbraucht wird.
#define untenEnde A3
#define Runter 10;
#define Hoch 11
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert

void setup()//Hier beginnt das Setup.
{
  Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. Das benötigt man, um sich den tatsächlich ausgelesenen Wert später im serial monitor anzeigen zu lassen.
  pinMode (Hoch, OUTPUT); //Der Pin mit der Relais für die Motorrichtung Oben
  pinMode (Runter, OUTPUT); //Der Pin mit der Relais für die Motorrichtung Unten
  pinMode(obenEnde, INPUT); //Der Pin mit dem Endschalter oben
  pinMode(untenEnde, INPUT);  //Der Pin mit dem Endschalter unten
  //Der analoge Pin muss nicht definiert werden.
}

void loop()
{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
  sensorWert = analogRead(eingang); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
  Serial.print("Sensorwert = " ); //Ausgabe am Serial-Monitor: Das Wort „Sensorwert: „
  Serial.println(sensorWert); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den serial monitor gesendet.

  if (sensorWert > 512 ) //Wenn der Sensorwert über 512 beträgt….
  {
    while (digitalRead(untenEnde) == LOW) //Solange der Endschalter unten nicht gedrückt wurde
    {
      digitalWrite(Runter, HIGH);   //fährt der Rolladen runter
    }
    digitalWrite(Runter, LOW);  //Danach schält das Relais aus
    digitalWrite(Hoch, LOW);    //Danach schält das Relais aus
  }
  else //andernfalls…
  {
    while (digitalRead(obenEnde) == LOW)  //Solange der Endschalter oben nicht gedrückt wurde
    {
      digitalWrite(Hoch, HIGH);   //fährt der Rollladen hoch
    }
    digitalWrite(Runter, LOW);  //Danach schält das Relais aus
    digitalWrite(Hoch, LOW);    //Danach schält das Relais aus
  }
}

Wie ich das sehe bzw vermute bist du ein relativer Anfänger, daher der Tipp. Pull-Up und Pull-Down mal im internet nachlesen und auch so umsetzten.

MfG bdorer

bdorer:
als Erstes mal benutze Define um Ein-/Ausgänge zu bezeichnen. Eine Integer Variable benötigt zuviel unnötigen Speicherplatz.

Gerade diesen Rat halte ich für falsch.

Der bessere Rat wäre: Benutze Konstanten (in Flash) und diese nur so groß, wie benötigt.
Also

// alt
int eingang= A1; 
int LED = 10;

// besser
const byte eingang= A1; 
const byte LED = 10;

Gruß Tommy

Ja ich bin noch Anfänger, aber ich brauch das für ein Schulprojekt in zwei Wochen und wollte halt mal eine funktionierende Grundlage. Ich teste jetzt mal den Code von bdorer.

Gruß Kai

Tommy56:
Gerade diesen Rat halte ich für falsch.

Der bessere Rat wäre: Benutze Konstanten (in Flash) und diese nur so groß, wie benötigt.
Also

// alt

int eingang= A1;
int LED = 10;

// besser
const byte eingang= A1;
const byte LED = 10;




Gruß Tommy

Warum wenn ich fragen darf?

Ich persönlich finde es übersichtlicher, aber wenn man als Kommentar //I/O-Definitionen drüber schriebt kann ich mit das auch übersichtlicher vorstellen.

Habe es nur so in der Berufsschule gelernt

MfG bdorer

bdorer:
Hallo Kai,

als Erstes mal benutze Define um Ein-/Ausgänge zu bezeichnen. Eine Integer Variable benötigt zuviel unnötigen Speicherplatz.

Ich hab das jetzt mal so verstanden die LED soll leuchten wenn der Sensorwert über 512 beträgt, und wenn der Taster unten betätigt wird soll diese aufhören zu leuchten da dann der Rollladen unten ist. Ich habe meinen Code jetzt mal mit 2 Ausgängen geschrieben. Einer fürs hoch und der andere fürs runterfahren.

Wenn der Senorwert über 512 ist fährt der Rollladen runter.
Hier ist mal mein ungetesteter Code:

#define eingang  A1 //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)

#define obenEnde A2 //Pins am besten immer mit define definieren da mit int zuviel Speicher unnötigt verbraucht wird.
#define untenEnde A3
#define Runter 10;
#define Hoch 11
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert

void setup()//Hier beginnt das Setup.
{
  Serial.begin(9600); //Die Kommunikation mit dem seriellen Port wird gestartet. Das benötigt man, um sich den tatsächlich ausgelesenen Wert später im serial monitor anzeigen zu lassen.
  pinMode (Hoch, OUTPUT); //Der Pin mit der Relais für die Motorrichtung Oben
  pinMode (Runter, OUTPUT); //Der Pin mit der Relais für die Motorrichtung Unten
  pinMode(obenEnde, INPUT); //Der Pin mit dem Endschalter oben
  pinMode(untenEnde, INPUT);  //Der Pin mit dem Endschalter unten
  //Der analoge Pin muss nicht definiert werden.
}

void loop()
{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
  sensorWert = analogRead(eingang); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
  Serial.print("Sensorwert = " ); //Ausgabe am Serial-Monitor: Das Wort „Sensorwert: „
  Serial.println(sensorWert); //Ausgabe am Serial-Monitor. Mit dem Befehl Serial.print wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den serial monitor gesendet.

if (sensorWert > 512 ) //Wenn der Sensorwert über 512 beträgt….
  {
    while (digitalRead(untenEnde) == LOW) //Solange der Endschalter unten nicht gedrückt wurde
    {
      digitalWrite(Runter, HIGH);  //fährt der Rolladen runter
    }
    digitalWrite(Runter, LOW);  //Danach schält das Relais aus
    digitalWrite(Hoch, LOW);    //Danach schält das Relais aus
  }
  else //andernfalls…
  {
    while (digitalRead(obenEnde) == LOW)  //Solange der Endschalter oben nicht gedrückt wurde
    {
      digitalWrite(Hoch, HIGH);  //fährt der Rollladen hoch
    }
    digitalWrite(Runter, LOW);  //Danach schält das Relais aus
    digitalWrite(Hoch, LOW);    //Danach schält das Relais aus
  }
}





Wie ich das sehe bzw vermute bist du ein relativer Anfänger, daher der Tipp. Pull-Up und Pull-Down mal im internet nachlesen und auch so umsetzten. 

MfG bdorer

Warum werden die Taster an den Analogen Pins angeschlossen und nicht an den Digitalen?

kai2310:
Warum werden die Taster an den Analogen Pins angeschlossen und nicht an den Digitalen?

Das ist in diesem Fall egal jeder Analoge Pin kann auch als digitaler Eingang funktionieren, allerdings kann kein digitaler Pin als analog Eingang funktionieren. Ich habe die Taster frei gewählt. Du kannst also auch einen anderen Verwenden.

Schau dir aber auch mal die Pull-Up und Pull-Down Geschichte an, diese wird die sehr helfen.

MfG bdorer

Ich persönlich finde es übersichtlicher, aber wenn man als Kommentar //I/O-Definitionen drüber schriebt kann ich mit das auch übersichtlicher vorstellen.

Oben drüber /*** Pinbelegung  ***/ oder so was ähnliches, ist eine gute Idee.

Tommy ging es um const byte vs. int

Das zweite ist eine Variablendefinition, die ihren Wert während der Laufzeit ändern kann.
Das erste sagt dem Compiler, dass der Wert sich nicht ändern wird. Damit hat er mehr Möglichkeiten, den generierten Code zu optimieren. ( Da der Wert sich nicht ändert, ist const byte=3; und const int=3; schonmal das erste, was optimiert wird: 3 bleibt 3 und passt also in ein Byte, beides ist also das gleiche )

byte statt int zu schreiben zeigt anderen menschlichen Lesern, dass du dir Gedanken über den Datentyp gemacht hast, und hilft dir, unsinnige Werte wie -1 oder 999 gleich als Fehler markiert zu bekommen.

bdorer:
Warum wenn ich fragen darf?

Ich persönlich finde es übersichtlicher, aber wenn man als Kommentar //I/O-Definitionen drüber schriebt kann ich mit das auch übersichtlicher vorstellen.

Habe es nur so in der Berufsschule gelernt

MfG bdorer

  1. Weil #define eine reine Textersetzung ist. Du nimmst damit dem Compiler die Möglichkeit der Typprüfung.
  2. Weil für die Pins byte ausreichen groß ist, da es nicht mehr als 256 Pins gibt
  3. Weil mit dem Zusatz const die Konstante im Flash und nicht im RAM angelegt wird.

Es hindert Dich ja keiner sinnvolle Kommentare (die zum Inhalt passen sollten) dazu zu schreiben.

Nicht alles, was an Berufsschulen gelehrt wird, muss die ultimative Wahrheit sein.

Gruß Tommy

Nicht alles, was an Berufsschulen gelehrt wird, muss die ultimative Wahrheit sein.

Gruß Tommy
[/quote]

Ja klar das weis ich, darum Frage ich ja auch nach um über meine Fehlinformationen aufgeklährt zu werden.

Dankeschön :smiley:

Nichts gegen Berufsschulen, wenn dort mit Arduinos gespielt wird.

#define eingang A1 //Das Wort „eingang" steht jetzt für den Wert „A0" (Bezeichnung vom Analogport 0)

Schlimmer als der Streit#definegegenconst byte ist natürlich der falsche Kommentar.
Was#define an sich bedeutet oder A0, sollte sehr bald klar sein und ist daher eher überflüssig in einem Kommentar. Was genau am Pin A1 ( oder A0 ? ) anzuschließen ist, ist erheblich interessanter. Wenn es sinnvoll in eine Zeile und wenige Worte passt.

Eine Übersicht über die verwendeten Pins am Anfang eines Sketches, und zwar in der Form von tatsächlich verwendeten Anweisungen, statt alter und nie aktualisierter Kommentare, ist eine gute Sache.

Und dann istconst byteeine Idee besser als#define

Kann man nach dem Code von bdorer die Taster wieder loslassen wenn sie einmal betätigt wurden oder werden die sozusagen durch den "Rollladen" gehalten?

Edit: Also die Schaltung läuft jetzt fürs erste, aber ich komm bestimmt bald nochmal auf euch zurück.

Gruß Kai

const int == #define
Nimmt nicht mehr und nicht weniger Platz.
Aber bei dem Sketch wäre es wie Reis zählen.

skorpi080:
const int == #define

Diese Aussage ist definitiv falsch.

#define ist eine reine Textersetzung, const int ist eine Angabe, bei der der Compiler den Tüp prüfen und optimieren kann.

Gruß Tommy

Diese Aussage ist nicht "direkt" von mir, hab ich hier von "größeren" mal gelesen.
Wer genau es war, kann ich mal suchen, wenns euch interessiert.

Von wem sie ist, ändert nichts am Inhalt, zumindest in dieser absoluten Form.

Gruß Tommy

kai2310:
Kann man nach dem Code von bdorer die Taster wieder loslassen wenn sie einmal betätigt wurden oder werden die sozusagen durch den "Rollladen" gehalten?

Edit: Also die Schaltung läuft jetzt fürs erste, aber ich komm bestimmt bald nochmal auf euch zurück.

Gruß Kai

Rein Theoretisch wird der Taster ja nicht "losgelassen" da der Endtaster ja solange gedrückt ist wie der Rollladen unten bzw. oben ist. Wenn der Rollladen erstmal unten ist drückt dieser den Endtaster unten solange bis der Rollladen wieder hochgefahren wird. Und das gleiche mit dem Endtaster oben.

Klar könnte man den Code so umschreiben, damit man die Taster wieder loslassen könnte, allerdings sehe ich keinen Sinn dahinter. Da es in der Realität auch nicht anderst ist.

Die Frage ist doch eher, soll der Motor wieder weiterlaufen, wenn der Endschalter nicht mehr anspricht, oder soll er aus bleiben, bis er wieder gestartet wird. ( In welche Richtung auch immer )

Hier gibt es kein "Motor starten": der Rolladen fährt je nach Helligkeit entweder komplett hoch oder runter, bis in den zugehörigen Endschalter. Eine einmal als gewünscht festgestellte Richtung wird bis zum Erreichen des Endschalters durchgezogen.

Wenn du die Endschalter durch Taster ersetzt, fährt der Motor immer, wenn der erwartete Taster nicht betätigt ist, beim Betätigen wird höchstens ,bei wechselnder Helligkeit, das andere Relais aktiviert.

Du gehst übrigens von Endschaltern aus, die beim Erreichen der Endlage schliessen.
Aus Sicherheitsgründen ist das im echten Leben meist umgekehrt.

Auch werden Relais gern mal "Active-LOW" angesteuert.