Anfänger bräuchte mal Unterstützung

Hallo,

Ich bin gerade dabei mir eine Rolladensteuerung zu Programmieren, ich habe mich da mit ein paar Schnipsel im Forum Weitergeholfen (Ich hoffe ich darf das).
Derzeit habe ich 8 Taster angeschlossen und jeden den ich drücke, zieht das Relais für eine Gewisse Zeit an, und fällt wieder ab, die Zeit stelle ich dann bei bedarf ein.

Die Schaltung geht soweit ganz gut auf dem Schreibtisch, nur meine Frage ist es jetzt, ich brauche 33 Eingänge als Taster, ich haben den Mega2560
Digital 22 bis 53 sind derzeit die Relais angeschlossen
Taster hab ich erst einmal zum Testen an 2 bis 9 Angeschlossen.
Die Relais sind LOW Aktiv

Ich habe derzeit nur 3 kleine Fragen.

  1. Das Relais soll erst beim Loslassen des Tasters anziehen, damit kann ich später machen das nach 2sec. Druck der 2. Rolladen z.b. in der Küche mitfährt, also Drücken <2 Sec. Rolladen Küche1 Fährt Runter -- Tastendruck >2 sec. Rolladen Küche2 fährt dann mit Runter, und das gleiche gilt auf für auf.

  2. Wärend der Fahrt vom Rolladen möchte ich bei Tastendruck das der Rolladen wieder stehen bleibt.

  3. Wie kann ich die 33 Taster oder mehr daran anschliesen und auch getrennt abfragen? ich dachte da an die Tastatur- Marix, also Taster an 0 bis 7 und 8 bis 12 ergibt 40 Tasten? oder gibt es was besseres?

Ich weiß das sind viele Fragen, aber für jede noch so kleine Hiefe bin ich Dankbar

Anbei mein Programm ---- Bitte nicht lachen :~

#define E1   2  //Taster Küche1 ab
#define E2   3  //Taster Küche1 auf
#define E3   4  //Taster Küche2 ab
#define E4   5  //Taster Küche2 auf
#define E5   6  //Taster Esszimmer ab
#define E6   7  //Taster Esszimmer auf
#define E7   8  //Taster Wohnzimmer1 ab
#define E8   9  //Taster Wohnzimmer1 auf

#define Au1   22   // Relais Küche1 ab
#define Au2   23   // Relais Küche1 auf
#define Au3   24   // Relais Küche2 ab
#define Au4   25   // Relais Küche2 auf
#define Au5   26   // Relais Esszimmer ab
#define Au6   27   // Relais Esszimmer auf
#define Au7   28   // Relais Wohnzimmer1 ab
#define Au8   29   // Relais Wohnzimmer2 auf

// Weitere Relais bis Anschluß 53

long timer_1 = 0;  // Timmer für die Relais
long timer_2 = 0;
long timer_3 = 0;
long timer_4 = 0;
long timer_5 = 0;
long timer_6 = 0;
long timer_7 = 0;
long timer_8 = 0;

boolean z1 = 0;
boolean z2 = 0;
boolean z3 = 0;
boolean z4 = 0;
boolean z5 = 0;
boolean z6 = 0;
boolean z7 = 0;
boolean z8 = 0;

// Timer Steuerung **************************************

boolean ctr_timer(long &timer, unsigned int waitTime)
{
  if(timer < millis()) {
    timer = millis() + waitTime;
    return true;
  } 
  else {
    return false;
  }
  
  
}
void setup() 
{
  for(int i=22;i<=53;i++)  // PortAusgang 22 bis 53 als Ausgang
  {
    pinMode (i, OUTPUT);
    digitalWrite(i, HIGH);
  }
  for(int i=2;i<=9;i++)    // Port Eingang 2 bis 8 als Eingang
  {
    pinMode (i, INPUT);
    digitalWrite(i, LOW);
  }

}
void loop()
{ 
  // Taster Küche1 ab ***********************************************
  if(digitalRead(E1)) {
    z1      = true;
    timer_1 = 0;
  }  
  if(ctr_timer(timer_1, 3000)) {
    if(z1 == true) {
      z1 = false;
      digitalWrite(Au1, LOW);  // Rolladen Küche1 fährt ab
    } 
    else {
      digitalWrite(Au1, HIGH);
    }
  }

  // Taster Küche1 auf ************************************************  
  if(digitalRead(E2)) {
    z2      = true;
    timer_2 = 0;
  }  
  if(ctr_timer(timer_2, 3000)) {
    if(z2 == true) {
      z2 = false;
      digitalWrite(Au2, LOW);  // Rolladen Küche1 fährt auf
    } 
    else {
      digitalWrite(Au2, HIGH);
    }
  }

  // Taster Küche2 ab ************************************************
  if(digitalRead(E3))
  {
    z3      = true;
    timer_3 = 0;
  }  
  if(ctr_timer(timer_3, 3000)) {
    if(z3 == true) {
      z3 = false;
      digitalWrite(Au3, LOW);  // Rolladen Küche2 fährt ab
    } 
    else {
      digitalWrite(Au3, HIGH);
    }
  }

  // Taster Küche2 auf ************************************************ 
  if(digitalRead(E4)) {
    z4      = true;
    timer_4 = 0;
  }  
  if(ctr_timer(timer_4, 3000)) {
    if(z4 == true) {
      z4 = false;
      digitalWrite(Au4, LOW);  // Rolladen Küche2 fährt auf
    } 
    else {
      digitalWrite(Au4, HIGH);
    }
  }
  // Esszimmer ab ************************************************ 
  if(digitalRead(5)) {
    z5      = true;
    timer_5 = 0;
  }  
  if(ctr_timer(timer_5, 3000)) {
    if(z5 == true) {
      z5 = false;
      digitalWrite(Au5, LOW);  // Rolladen Esszimmer fährt ab
    } 
    else {
      digitalWrite(Au5, HIGH);
    }
  }
  // Taster Esszimmer auf ************************************************ 
  if(digitalRead(6)) {
    z6      = true;
    timer_6 = 0;
  }  
  if(ctr_timer(timer_6, 3000)) {
    if(z6 == true) {
      z6 = false;
      digitalWrite(Au6, LOW);  // Rolladen Esszimmer fährt auf
    } 
    else {
      digitalWrite(Au6, HIGH);
    }
  }
  // Wohnzimmer1 ab ************************************************ 
  if(digitalRead(7)) {
    z7      = true;
    timer_7 = 0;
  }  
  if(ctr_timer(timer_7, 3000)) {
    if(z7 == true) {
      z7 = false;
      digitalWrite(Au7, LOW);  // Rolladen Wohnzimmer1 fährt ab
    } 
    else {
      digitalWrite(Au7, HIGH);
    }
  }
  // Wohnzimmer1 auf ************************************************ 
  if(digitalRead(8)) {
    z8      = true;
    timer_8 = 0;
  }  
  if(ctr_timer(timer_8, 3000)) {
    if(z8 == true) {
      z8 = false;
      digitalWrite(Au8, LOW);  // Rolladen Wohnzimmer1 fährt auf
    } 
    else {
      digitalWrite(Au8, HIGH);
    }
  }
  // *****************************************************************
}

[EDIT]Code Tags eingefügt. Uwe [/EDIT]

Hallo,

Du könntest I²C-Portexpander vom Typ PCF8574 bzw. PCF8574A verwenden.
Die stellen Dir jeweils 8 Ein- oder Ausgänge zur Verfügung, es können jeweils 8 Stck. davon am I²C-Bus adressiert werden.

Diese Bausteine verwende ich gerne, wenn die Ein- bzw. Ausgänge knapp werden.

Gruß

Martin

Danke für eine Schnelle Antwort,

erhalte ich da jeden Tastendruck nur einmal? was ist wenn ich 2 Tasten Dücke erhalte ich den Binären werd von den 2 Taster?

gruß Hans

Hallo Hans,

ja, Du bekommst den entsprechenden Wert, wenn mehrere Taster gedrückt sind!

Beim PCF8574 ist es nur so, dass der interne Pullup-Widerstände hat, d.h. die Taster ziehen einfach den zugehörigen Anschluss auf Masse.
Wenn Du also einen PCF8574 ohne gedrückten Taster abfragst, bekommst Du als Rückgabewert 255!

Ich habe das in einem Projekt so gelöst, dass ich dann den Rückgabewert mittels Exclusiv-Oder-Funktion filtere, dann bekomme ich eine logische 1 für jeden gedrückten Taster, also in etwa so:

Tastencode = (Rueckgabe ^ 255)

Hast Du also z.B. die Taster an Port 0 und Port 2 gedrückt, bekommst Du als Rückgabewert 5 (20+22=5).

Gruß

Martin

de-salvatore:
Hallo,

Ich bin gerade dabei mir eine Rolladensteuerung zu Programmieren, ich habe mich da mit ein paar Schnipsel im Forum Weitergeholfen (Ich hoffe ich darf das).

Nein, Du Darfst die Codeschnippsel nur anschauen, von weitem... :wink: :wink:
Natürlich darfst Du Code vom Forum nehmen und für Deine Projekte verwenden. :slight_smile: :slight_smile:

de-salvatore:
Derzeit habe ich 8 Taster angeschlossen und jeden den ich drücke, zieht das Relais für eine Gewisse Zeit an, und fällt wieder ab, die Zeit stelle ich dann bei bedarf ein.

Die Schaltung geht soweit ganz gut auf dem Schreibtisch, nur meine Frage ist es jetzt, ich brauche 33 Eingänge als Taster, ich haben den Mega2560
Digital 22 bis 53 sind derzeit die Relais angeschlossen
Taster hab ich erst einmal zum Testen an 2 bis 9 Angeschlossen.
Die Relais sind LOW Aktiv

Was bedeutet LOW aktiv? Ausgang LOW Relais angezogen? Kein Problem.

de-salvatore:
Ich habe derzeit nur 3 kleine Fragen.

Ich habe irgendwie Zweifel, daß 33 Tasten die einzeln einen Rolladen bewegen das "Yellow of the Egg" sind. :wink:
Ich sehe es schöner eine etwas schickere Art die einzelnen Motore anzusteuern zu finden. zb eine Taste den Raum auszuwählen und 3-4 Tasten (wieviele es halt braucht für jeden Rolladen) dazu noch alle runter alle hoch alle halb.

Eine Tastaturmatix ohne Dioden hat den Nachteil, daß immer nur 1 Taste gedrückt werden kann. Mit je einer Diode pro Taste können auch mehrere/alle Tasten gleichzeitig erkannt werden.
X ist immer eine Taste. Du kannst eine Array verwenden und mußt so die Funktion nur einmeal schreiben und für alle Tasten wiederholen.

loop(){ 
if (Taste X gedrückt && Statustastex==0)
{
Startzeitx = millis();
Statustastex = 1; 
}

if(Taste X losgelassen && Statustastex==1)  {
  if (millis()-Startzeitx > 2 sek) {
    Rolladenrauf(x)}
  else {
    Rolladenrunter(x)}

if ((tastex gedrückt && statusrolladen == 1)||(millis()-Startzeitx > zeitaktivRolladenx) {
digitalwrite (pinx,HIGH);  //relais für Rolladen x
statusrolladen =0;
}
}

Rolladenrauf(int x)
{
zeitrolladenx = millis();
statusrolladen =1;
digitalwrite (pinx,LOW);  //relais für Rolladen x
}

Rolladenrunterf(int x)
{
zeitrolladenx = millis();
statusrolladen =1;
digitalwrite (pinx2,LOW);  //relais für Rolladen x
}

Ich hoffe ich habe keinen Gedankenfehler gemacht.
Grüße Uwe

Hallo Uwe, Danke erst einmal.

Ich werde es Morgen mal Testen, soweit ich das Umsetzen kann.
Ja die Relais schalten mit LOW

Wenn alles fertig ist, soll die Programmierung so sein...(wenn ich das je schaffe in der Programmierung)

Jeder Rolladen 11 Stück und 2 Markiesen sollen je einen Taster AUF / AB am Fenster haben.
Zwei Gruppen-Taster und einen Hauptaster,

Die Funktion wird so sein --- Taster am Fenster auf / ab <2sec. lässt den Rolladen fahren auf / ab
Tasten druck >2sec. soll den 2. Zugehörigen Rolladen (z.b. Wohnzimmer hat 2 Rolladen) mitfahren auf / ab
werden beide Tasten >5sec. ab gedrückt sollen alle Rolladen Runter, Markiesen rein, Licht Terrasse aus.
werden beide Tasten >5sec. auf gedrückt sollen alle Rolladen Hochfahren, Markiese bleibt drin, und das Terrassenlicht bleibt aus.

Gruppentaster 1 soll nur das EG schliesen oder Öffnen
Gruppentaster 2 soll nur das OG schliesen oder Öffnen
Hauttaster gedrückt macht das gleiche wie Beide Tasten auf / ab gedrückt
Lichttaster Terrasse soll Licht ein / Aus schalten, Tastendruck >10sec. läst die Rolladen bei der Terrasse zur Hälfte Hochfahren, falls durch die Nachtschaltung (Sonnenuntergang) man sich ausgesperrt hat.

Wollte nur mal so als hintergrundwissen mal gesagt haben.

Danke erst einmal für alles.

Gruß Hans

Hallo,

Ich habe es mal versucht, leider bekomme ich es nicht gebacken in diesem Abschnitt einfach nur eine Toogle Schaltung zu bekommen, jedem tastendruck das Relais on und off betätigen, wenn ich nichts mache fällt es von alleine wieder ab, das geht ja.

so gut sind meine Kennnisse noch nicht, um alles so zu verstehen.

für die Unterstützung von euch bin ich dankbar.

gruß
Hans

// Taster Küche1 auf ************************************************
if(digitalRead(E2)) {
z2 = true;
timer_2 = 0;
}
if(ctr_timer(timer_2, 3000)) {
if(z2 == true) {
z2 = false;
digitalWrite(Au2, LOW); // Rolladen Küche1 fährt auf
}
else {
digitalWrite(Au2, HIGH);
}
}