LED 12V Mosfet Ansteuerung Hilfe beim Programm

Erstmal Hallo zusammen .
Ich bin Völlig neu in der Arduino Welt und habe für mich jetzt schon das Mega Projekt :S

zu meinen Vorhaben !

LED Stripe 2 Stück 1x Weiß 1x Blau

Ich möchte die pwm Steuerung nutzen um Meine led´s am aquarium zu steuern

Weiß soll bei Drücken des Schalters Hochdimmen und an bleiben bis der schalter ausgeschalten wird dann wieder runter dimmen das ganze sollte ca 2-5 minuten in anspruch nehmen .

das selbe möchte ich auch bei der Blauen led nur das bei abschaltung die led auf ca 20% dann weiter an bleibt und bei einschalten wieder auf 100% hoch geht

gibt es dafür schon ein skript vorgefertigt wo ich nur einige parameter ändern müsste ?

wäre euch dankbar für jede hilfe ( hardwäre) wird mir bereits geholfen !

lg

Hi

Zu PWM wird Es wohl Beispiele geben - Du musst halt 'nur' schauen, daß Du die PWM-Werte in der Zeit änderst, Die Du haben willst.
Wenn Du 6 Minuten von 0 bis 100% haben willst, wirst Du alle 3,6Sekunden den PWM-Wert um 1 Prozent erhöhen müssen.
(oder in entsprechend kürzerer Zeit eine entsprechend kleinere Einheit - akut kA, ob PWM mit 8bit (=256 Schritte) oder Mehr im Arduino läuft ... noch NIE benutzt.

Auch soltlest Du Dir das Beispiel Blink_without_delay anschauen - da Du sowohl weiße LEDs, wie auch Blaue dimmen willst - wenn sich die Dimmereien überschneiden können (oder gar sollen), wirst Du um millis() nicht herum kommen.

Einen fertigen Sketch, wo zwei Dimmwerte unabhängig voneinander mit separaten ENdwerten behandelt werden, wäre mir nicht bekannt - sollte Es wohl geben, bei der Komplexität dieses Problem wird aber 'selber machen' das 'danach suchen' zeitlich um Längen schlagen ;).

MfG

erst bitte mal selber probieren mit dem BlinkWithoutDelay Beispiel.
...
...
...
Dann habe ich mal mein BlinkBeispiel erweitert um dimmbare LEDs.

Ein neue Klasse DimLed
dazu zwei eigenen Objekte an Pin 10 und 11.

DimLed yourObjectName(Pin, Lowest_Dimmer_Value, Highest_Dimmer_Value, Intervall_Between_Steps_in_milliseconds)

Zwei Schalter mit internem Pullup auf A5 bzw A4.
Diese sind wegen Pullup gegen GND zu schalten.

PIN13 (die eingebaute LED) ... blink halt so einsam vorsich hin.

/* Blink a LED in a specific rhythm

  Turns on and off light emitting diodes (LED) connected to a digital pin,
  without using the delay() function. This means that other code can run at the
  same time without being interrupted by the LED code.
*/

class DimLed {
    byte state = 1;                    // 0 off, 1 up, 2 hold, 3 down
    unsigned long previousMillis;      // last blink timestamp
    uint16_t lowest = 00;               // minimum brightness of PWM LED
    uint16_t highest = 255;            // maximum brightness of PWM LED
    const byte ledPin;                 // a GPIO for the LED, on UNO only PIN 3 5 6 9 10 11 are PWM
    uint16_t intervall = 10;           // how fast should the led be dimmed (=milliseconds between steps)
    byte actual = 0;                   // actual PWM

  public:
    DimLed(byte attachTo, uint16_t _lowest = 0, uint16_t _highest = 255, uint16_t _intervall = 100):
      ledPin(attachTo),
      lowest (_lowest),
      highest (_highest),
      intervall (_intervall)
    {}
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    void set(uint16_t _lowest, uint16_t _highest) {           // modify on/off times during runtime
      lowest = _lowest;
      highest = _highest;
    }
    void setState(byte _state) {                              // set state externally
      state = _state;
    }
    byte getState() {                                         //returns the actual state of the LED
      return state;
    }
    void loop() {
      if (state == 1) {
        uint32_t currentMillis = millis();
        if (currentMillis - previousMillis >= intervall) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          actual++;
          if (actual >= highest) state = 2;        // higher end reached. Switch to hold state
          analogWrite(ledPin, actual);
          //Serial.print(F("D46 actual=");Serial.print(actual); Serial.print(F(" state=")); Serial.println(state);
        }
      }
      if (state == 3) {
        uint32_t currentMillis = millis();
        if (currentMillis - previousMillis >= intervall) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          actual--;
          if (actual <= lowest) state = 0;        // lower end reached. Switch to Idle state
          analogWrite(ledPin, actual);
          //Serial.print(F("D57 actual=");Serial.print(actual); Serial.print(F(" state=")); Serial.println(state);
        }
      }
    }
};

class BlinkLed {
    byte state = 1;                    // 0 off, 1 blink
    unsigned long previousMillis;      // last blink timestamp
    uint16_t on = 180;
    uint16_t off = 320;                // 180/320 is according ECE
    const byte ledPin;                 // a GPIO for the LED

  public:
    BlinkLed(byte attachTo, uint16_t _on = 180, uint16_t _off = 320):
      ledPin(attachTo),
      on (_on),
      off (_off)
    {}
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    void set(uint16_t _on, uint16_t _off) { // modify on/off times during runtime
      on = _on;
      off = _off;
    }
    void setState(byte _state) {           // 1 Switch on blinking; 0 switch off blinking
      state = _state;
    }
    void loop() {
      if (state) {
        uint32_t currentMillis = millis();
        if (digitalRead(ledPin) && currentMillis - previousMillis >= on) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          digitalWrite(ledPin, LOW);
        }
        else if (!digitalRead(ledPin) && currentMillis - previousMillis >= off) {
          // save the last time you blinked the LED
          previousMillis = currentMillis;
          digitalWrite(ledPin, HIGH);
        }
      }
    }
};


// declare your objects (assign GPIOs to you LEDs)

//DimLed yourName(Pin, Lowest_Dimmer_Value, Highest_Dimmer_Value, Intervall_Between_Steps_in_milliseconds)
DimLed myDimLedOne(9, 0, 255, 200);                   
DimLed myDimLedTwo(10, 20, 255, 500);                 // use only Pin 3 5 6 9 10 11 on Arduino UNO for PWM!!!

BlinkLed myBlinkLed(13);
//BlinkLed syncronBlinkLed(9, 500, 500);          // a simple blink LED on a GPIO with 500ms on, 500ms off
//RhythmLed topRKL(13);                            // a rhythm blink LED on a GPIO with 4 different on/off times
//RhythmLed outOffSyncRKL(11);                     // eine Rundumkennleuchte die wegen eines "Massefehlers" am Originalfahrzeugs eine leicht verschobene Blinkfrequenz hat ;-)

// Let's declare some SwitchButtons. 
const int SwitchOne_Pin = A5;                      
const int SwitchTwo_Pin = A4;


void setup() {
  // each LED object has to be called once in the setup
  myDimLedOne.setup();
  myDimLedTwo.setup();
  myBlinkLed.setup();                            
  //syncronBlinkLed.setup();
  //topRKL.setup();
  //outOffSyncRKL.setup();
  //                                             // Some example methods you can use in setup() or loop():
  //outOffSyncRKL.setIntervall(250, 90, 30, 400);  // modify the intervalls for this LED
  // syncronBlinkLed.setState(0);                // switch off a LED = stopp blinking
  // syncronBlinkLed.setState(1);                // switch on a LED = start blinking

  // we use the internal PULLUP, to close the Switch - connect to GND
  pinMode(SwitchOne_Pin, INPUT_PULLUP);
  pinMode(SwitchTwo_Pin, INPUT_PULLUP);
  Serial.begin(115200);    //only used for debug
}

void loop() {
  // each LED object has to be called once in the loop
  myDimLedOne.loop();
  myDimLedTwo.loop();
  
  myBlinkLed.loop();                             
  //syncronBlinkLed.loop();
  //topRKL.loop();
  //outOffSyncRKL.loop();

  // check the switches and act, if we are in the right state
  // we used INPUT_PULLUP - so closing a switch to GND give 0/ZERO
  byte currentState=myDimLedOne.getState();
  if (digitalRead(SwitchOne_Pin) == 0 && (currentState == 0 || currentState == 3)) myDimLedOne.setState(1);  // Switch is ON
  if (digitalRead(SwitchOne_Pin) == 1 && (currentState == 1 || currentState == 2)) myDimLedOne.setState(3);  // Switch is OFF

  currentState=myDimLedTwo.getState();
  if (digitalRead(SwitchTwo_Pin) == 0 && (currentState == 0 || currentState == 3)) myDimLedTwo.setState(1);  // Switch is ON
  if (digitalRead(SwitchTwo_Pin) == 1 && (currentState == 1 || currentState == 2)) myDimLedTwo.setState(3);  // Switch is OFF
  //
  // put here other code which needs to run:
}

edit: sketch gekürzt wegen 9000 Zeichen limit ... RhythmLed hat drann glauben müssen - ich hoffe es passt noch.

Hast Du überhaupt schon geprüft, ob (und wie) sich die LED Strips dimmen lassen?

Hallo zusammen

habe mal etwas zeit gehabt und gegoogelt

habe es schon mal in die richtung wenn schalter geschalten wird dann passiert was aber nicht ganz wie ich mir das vorstelle . ich hänge mal den code bisher mit an
darunter dann das problem

licht_an_aus_schalter_top.ino (440 Bytes)

hallo nochmal sorry für das doppelte einstellen ,

das problem ist das die led hoch dimmt wie gewünscht , aber dann anscheinend das ganz wieder neu startet

heist schalter an , led fahrt hoch und schaltet nach voller leuchtkraft ab und fängt neu an

evtl könnt ihr mir da helfen

lg

Your sketch will be much better readable if you give descriptive names to the states, instead of only numbers.
Dein Sketch wird viel besser verständlich mit Namen statt Nummern für die Zustände.

evtl könnt ihr mir da helfen

Hmm...

Lese bitte die "Nachtwächter Erklärung"

Hi

Binde doch bitte Deinen Sketch in Code-Tags hier ein - gerade 'Mobilisten' sollen mit nur hochgeladenen Sketchen Probleme haben.

Ohne mir Deinen Sketch angesehen zu haben - ich tippe auf einen Überlauf - Deine verwendete Variable ist nicht breit genug, um die zugewiesenen Werte aufzunehmen.

MfG

PS: Wenn der Nachtwächter die Erklärung liefert, wohl doch kein Überlauf (ebenfalls ungetestet)

int zaehler = 0;
int weisPin = 3;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(3, OUTPUT);
}
void loop() {
boolean schalter = false;
while ( schalter == false)
{
schalter = digitalRead(2);
}
zaehler++;
Serial.println(zaehler, DEC);
if (zaehler == 5) {
for (int helligkeit =1; helligkeit <= 255; helligkeit = helligkeit +1){
    analogWrite(weisPin, helligkeit);
delay(15); 
  }
//analogWrite(weisPin, LOW);
zaehler = 0;
}
}

Und wozu hast du eine While-Schleife in der Loop ?
Die Loop ist schon eine Schleife, die sollte dir reichen.

hi zusammen nun hab ich etwas gefunden mit kleinen änderungen wo das macht was ich möchte :slight_smile:

nur bekomm ich das mit dem blauen licht ned hin das es unabhanig arbeitet und das wenn ich schalter aus mach der wert X im blau bleibt zb 20%

danach habe ich noch vor meinen vliefliter motor damit anzusteuern , dieser arbeitet im 12V bereich und benötigt nur wenn schwimmer schaltet das er einschaltet und nachher wieder aus

könnt ihr mir noch tipps geben

ich bitte darum auch dran zu denken das ich in dem gebiet neu bin

diskus-power:
ich bitte darum auch dran zu denken das ich in dem gebiet neu bin

Wir auch....und wir können den aktuellen Sketch nicht sehen.

Und weiter ist dein Beitrag schlecht lesbar. Der wäre besser, wenn du auch mal Satzzeichen verwenden würdest, sowie auch Groß und Kleinschreibung beachten könntest.

sorry mein Fehler

Hier der code

#define VERZOEGERUNG sensorValue
const int buttonPin = 2; // Schalter Weiß Licht
const int buttonPin1 = 2;  //Schalter Blau Licht 
const int buttonPin2 = 2; //Schalter DC Motor Vliesfilter 
const int ledPin = 3; // Weiß led Stripe
const int ledPin1 = 11; //Blaue led Stripe
const int motorPin1 = 13; //Ausgang Motor Vliesfilter
const int sensorPin = 0; //Evt Bewegungsmelder 
uint32_t altMillis;
int fadeValue;
int sensorValue = 0;


void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(buttonPin1, INPUT_PULLUP);
}

void loop() {
  if (millis() - altMillis >= VERZOEGERUNG){
    altMillis=millis();
    sensorValue = analogRead(sensorPin);
    if (digitalRead(buttonPin)){
             if (fadeValue < 255) {
          fadeValue++;
        }
    }else{
      if (fadeValue > 0) {
        fadeValue--; 
      }
    }
    analogWrite(ledPin, fadeValue);
    analogWrite(ledPin1, fadeValue);
    
    
}

}

Hi

Deutsche Sprache - schwere Sprache - zum Glück wird 'Schreiben nach Gehör' gelehrt ... (ob Da statt dem h ein zweites e rein sollte?)

Wenn ich Dich recht verstehe, willst Du, daß die LED 'hoch fadet', wenn der Taster gedrückt ist - könnte der Sketch so auch machen.

Wie willst Du die LED wieder dunkler bekommen?
Akut nimmst Du dafür genau den gleichen Taster, eben wenn Dieser nicht gedrückt ist.

Somit hast Du genau zwei Zustände:

  • Taster gedrückt: LED heller machen, MAX-Wert nicht überschreiten
  • Taster nicht gedrückt: LED dunkler machen, MIN-Wert nicht unterschreiten.

Wenn Du Dir Das anders gedacht hast ... wie??

MfG

diskus-power:
sorry mein Fehler

Hier der code

Ich frage mich nur, wenn du im Web oder sonst wo etwas gefunden hast, warum fragst du nicht gleich den Autor ?
Der sollte seinen Sketch doch kennen.

hi postmaster-ino

ja genau aber das ganze halt mit 2 extra leds und 2 schaltern .

mit einen kanal geht es auch so schon

nur mit dem zweiten halt nicht :confused:

HotSystems:
Ich frage mich nur, wenn du im Web oder sonst wo etwas gefunden hast, warum fragst du nicht gleich den Autor ?
Der sollte seinen Sketch doch kennen.

danke für deine hinreichende info ! echt top

so kommt mann ans ziehl !

Und ignoriere bitte weiterhin eine saubere und lesbare Schreibweise.
Danke....

Hier im Forum bekommt jeder die Hilfe die er braucht - auch wenn er das nicht gleich bemerkt :wink: