LED Lampe per Interrupt manuell über POTI dimmen

Hallo, ich habe bislang eine LED Beleuchtung für mein Aquarium programmiert. Per RTC wird die Zeit ausgelesen, zu definierten Uhrzeiten automatisch ein- oder ausgefaded. Das ganze passiert in einer IF-Befehlskette.

Diese Schaltung möchte ich nun durch die Möglichkeit die Lampe per POTI manuell zu dimmen erweitern. Bin mir nur noch nicht sicher wie ich das realisieren könnte. Wäre ein Interrupt hier angebracht? D.h. sobald ich das POTI drehe wird der Loop unterbochen und das Interrupt ausgeführt, also die LED gedimmt.

Hierzu habe ich natürlich ein paar Fragen, dich klären muss: - wenn die LED bei zB 155 von 255 steht, wie stell ich sicher, dass beim drehen des POTIs genau bei diesem Wert begonnen wird? - Wenn die LED im DIM Vorgang ist und ich nun das POTI drehe, würde die dann nach Beendendes Interrupts nicht wieder in die Schleife springen und wieder da weiter dimmen, wo ich unterbrochen habe? Wie müsste ich das vermeiden?

Vielen Dank für eure Hilfe bei meinen Überlegungen. Der Code ist leider zu lang zum Posten

Gruß Thorsten

Anstatt eines potis würde ich einen Encoder nehmen. Klarer Vorteil mann kann an jedem belibigem Wert starten und den Wert dann erhöhen bzw. "erniedrigen" :D und man hat keinen Endanschlag. Ich benutze gerne diesen hier: http://www.pollin.de/shop/dt/Njg2OTU3OTk-/Bauelemente_Bauteile/Passive_Bauelemente/Potentiometer_Trimmer/Encoder_PANASONIC_EVEQDBRL416B.html Mit dieser Lösung arbeitet man mit einem Interupt der "schaut" ob man rechts (plus) oder links(minus) dreht und dementsprechend den Wert inkrementiert oder dekrementiert. Falls du dafür eine Funktion brauchst kann ich dir gerne weiterhelfen. Und der Ensoder hat noch einen pushbutton mit dem man etwas Umschalten kann z.B. ob Manueller oder Automatischer Modus

Danke. Klingt gut. D.h. wenn der BUtton gedrückt ist, ich aber nicht mehr den Regler drehe, springt der nicht zurück in die Schleife? Das wäre ja schon ne Lösung. Gruß

Man könnte
z.B. Knopf drücken Manueller Modus ist Scharf(Interupt wird aktiviert)(irgendeine Anzeige LED an) man kann der Wert mit Links/Rechtsdrehen beeinflussen.
Wenn länger als 5s nicht passiert(kein Drehen) rücksprung in den Automatik Modus (evtl Wert aus Manuellen Modus übernehmen und mit dem Weitermachen) das Drehen bewirkt dann nichts.

Nur so als Gedanken

alles klar, werd mir die mal ordern und damit rumspielen. <bei Fragen meld ich mich dann noch mal.
Krieg ich die auch woanders? Hab die bei Reichelt nicht gefunden.
Eigentlich brauch ich noch ReedRelais Wechselschalter 5V, die find ich bei Pollin leider nicht
Gruß

Die Dinger schimpfen sich bei Reichelt > Drehimpulsgeber < ==>dann findest du a einiges.
Der STEC12E08 ist vergleichbar, zwar was kleiner und du musst halt noch einen Knopf dafür Mitbestellen, da der bei diesem Typ noch nicht drauf ist. Aber damit hast du schon was zum Spielen.

hallo currymuetze

Noch ein paar Grundsatzantworten.

Mit einem analogen Signal kann man keinen Interrupt auslösen.

Du kannst Deine Steuerung mit einem Potentiometer machen, dann aber muß die Programmierung anders sein. Du mußt dauernd den Spannungswert am Potentiometer messen und wenn eine Änderung eintritt dann dementsprechend das Programm ausführen.

Viele Grüße Uwe

hi, gibt es denn alternativen? Eigentlich hatte mir der gedanke das per interrupt zu machen schon gefallen. Gruß

Deswegen ja auch der Ansatz mit dem Encoder. Mit dem kannst du halt per Interrupt was Steuern. Großer Vorteil du musst dich nicht ständig um die Überwachung kümmern

Hi, habe mir die Dinger mal bestellt und werde das mal ausprobieren. Hast du die schon mal eingebunden? Kannst mir mal nen Beispielcode schicken? Hoffe, dass ich mich dann am WE damit auseinander setzen kann.

Gruß

Gerne stelle ich meinen Code zur verfügung als denkanstoss kann man das immer gebrauchen.

int Wert=12;
int B=3;
int A=2;

void setup (){
  attachInterrupt(0,CHAInt,CHANGE);        // Aufrufen Interrupt in Abhänigkeit von kanal 1 
  pinMode(A,INPUT);                              // Kanal A muss unbedingt auf DI2 da hier der InteruptEingang 0 ist
  pinMode(B,INPUT);                              //Kanal B
  digitalWrite(A,HIGH);                           // interne Pull UP aktiviern (pull downschaltung des Encoders
  digitalWrite(B,HIGH);                           //  ""
}

void loop(){

>Hier kommt dein Code hin<

}

void CHAInt (){
  int Aread=0;
  int Bread=0;
  Aread=digitalRead(A);
  Bread=digitalRead(B);
  if (Aread==HIGH && Bread==LOW||Aread==LOW && Bread==HIGH){
    Wert++;  // <=Hier her kommt der Code für deine Werte bei Rechtsdrehen
  }
  if (Aread==LOW && Bread==LOW ||Aread==HIGH&& Bread==HIGH){
    Wert--;  <=Hier her kommt der Code für deine Werte bei Linksdrehen

  }
}

Der interne Taster ist hier nicht mit im Programm um den müsstest du dich noch kümmern, da bei mir die Funtion des Tasters anders belegt ist.

Eine Frage hab ich noch: Ich habe gelesen, dass es nur 2 Interrupt Eingänge gibt. Seh ich das richtig, dass ich somit eigentlich nur 2 POTIs zum Interrupt nutzen kann? Ich habe ja 4 LED Ketten, die ich jeweils einzeln per POTI steuern möchte. Wie geh ich da am besten vor? Gruß

Lies Dir das mal durch: http://www.arduino.cc/playground/Main/PcInt bzw. http://www.arduino.cc/playground/Main/PinChangeInt

Sieht auf den ersten Blick sehr komplex aus. Ich werde wohl zunächst je einen Interrupt PIN für 2 LED Stripes nutzen. Also Interrupt1 steuert dann DigOut 7+8 und Interrupt2 steuert DigOut 9+10. Das sollte ja mit dem Board einfach umzusetzen sein? Sollte mir für den Anfang erst mal reichen. Alles weitere muss ich dann mal tiefer reinschauen. Gruß

Was spricht dagegen 1* Encoder drücken man kann Wert1 ändern ein weiteres mal drücken man kann den Wert2 ändern " " " Wert3 ändern " " " Wert4 ändern 10 sekunden nichts gemacht normal (automatik betrieb) Vorteil: 1 Interupt genutzt und nur ein bisschen Programm geschrieben. Alles ziemlich einfach rauzufinden :grin: :grin:

Hört sich gut an, war mir nicht bewusst, dass man so eine Logik an den Interrupts nutzen kann. Werd mich am WE mal mit beschäftigen.

Würds dann aber aktuell so machen, da ich eh die Interrupts nciht anderweite benötige (bislang): Int1: 1 mal drücken: blau1 + blau2 2 mal drücken: blau1 3 mal drücken: blau2 Int2: 1 mal drücken: weiß1 + weiß2 2 mal drücken: weiß1 3 mal drücken: weiß2

=> so kann ich mit einem Klick schnell alles ändern und mit weiteren Klicks fein abstimmen. Hoffe, dass ich mit dem Coding klar komme

Gruß und Danke für den Hinweis

Man muss sich nur klar sein das beim Aufruf eines Interrupts “nur” eine Funktion (die mal selbst schriebt)) ausgeführt wird.
Man kann innerhalb dieser Funktionen globale Variabeln halt genauso verändern wie in aufgerufene Funktionen aus dem Programm bzw innerhalb der Loop.

Das krieg ich hoffentlich hin. Werd mich am WE mal ranmachen, hoffe dass ich die Potis heute bekomme. Bei Fragen meld ich mich mal

GRuß