Go Down

Topic: Tasterprogramm (Read 3405 times) previous topic - next topic

Fehler beim kopieren würd ich sagen, bei mir gehts  8)
https://github.com/AndreasVan

Hermann_88

Hahaha sorry  :smiley-lol:

Ok das mit dem Dimmen haut jetzt super hin und den Automaten versteh ich jetzt auch schon besser. Ein Problem hab ich jetzt noch. Und zwar das eigentliche Projekt soll wie folgt ablaufen.

Mit dem einen Taster soll eine rgb in rot und blau, sprich violett, hochdimmen. Danach sollen die selben LED´s pulsweitenmoduliert über 2 analoge Eingänge gesteuert werden können. Zum Schluss soll dann durch den Taster die LED wieder runterdimmen. Die PWM habe ich selber geschafft zu programmieren. Nur wenn ich die zwei Programme zusammenfüge stören die sich gegenseitig und die LED beginnt zu flackern. Hast du da irgendwelche Tipps für mich oder sogar die Lösung?

Bin dir aber jetzt schon mal sehr dankbar. Ohne dich hätte ich das Projekt nicht einmal annähernd weitergebracht.

combie

Neue Bedingungen -- führt zu -- neuen Zuständen
Also: Den Automaten erweitern.


Nein, eine fertige Lösung habe ich nicht.

Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Hermann_88

Ok, aber prinzipiell würde das funktionieren?

combie

Male dir die Zustände auf Papier auf.
Male die Übergänge dazu.
Dann siehst du ob deine Logik funktioniert.
Gieße die Logik in Software.
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Hermann_88

Ok bisheriger stand ist wie folgt. Erstes Problem ist, wenn ie LED hochgedimmt hat und kein analog Input anliegt, ist die LED aus. Ich möchte das die LED auf dem Wert ist und von diesem Wert weg moduliert werden kann. Das nächste Problem ist, wenn der zweite Taster betätigt wird, leuchtet die LED ganz hell und dimmt dann erst herunter. Irgendwelche Ideen?

Derzeitiges Programm:

const unsigned int UpTaster    =  4; // Pin -- Taster -- GROUND
const unsigned int DownTaster  =  2; // Pin -- Taster -- GROUND
const unsigned int dimSpeed    = 50; // mS pro dimschritt
const int rot = A0;  // Analog input pin that the sensor is attached to
const int blau = A1;  // Analog input pin that the sensor is attached to

const int analogOutrot = 9; // Analog output pin that the LED is attached to
const int analogOutblau = 10; // Analog output pin that the LED is attached to
const int analogOutstaerke = 3;

int wert1 = 0;        // value read from the pot
int wert2 = 0;
int outputrot = 0;        // value output to the PWM (analog out)
int outputblau = 0;


struct Automat
{
  typedef enum  AutomatenStatus {A_On, A_Off, A_DimUp, A_DimDown,A_PWM};
  AutomatenStatus status;
  unsigned long lastHit;
  byte dim;
  Automat() // Konstruktor
  {
    pinMode(UpTaster, INPUT_PULLUP);
    pinMode(DownTaster, INPUT_PULLUP);
    pinMode(rot, INPUT);
    pinMode(blau, INPUT);
    lastHit = millis();
    dim     = 0;
    status  = A_Off;
    analogWrite(analogOutrot,dim);
    analogWrite(analogOutblau,dim);
  }
 
void handle()
{
  switch (status)
  {
    case A_Off:
      if (!digitalRead(UpTaster)) // low = taster gedrückt
      {
        status  = A_DimUp;
        lastHit = millis();
      }
      break;

    case A_DimUp: 
      if (millis() - lastHit > dimSpeed)
      {
        lastHit = millis();
        dim++;
        analogWrite(analogOutrot,dim);
        analogWrite(analogOutblau,dim);
      }
      if (dim == 255)
      {
        status = A_PWM ;
      }
      break;
     
      case A_PWM:
     
       wert1 = analogRead(rot);           
  // map it to the range of the analog out:
      outputrot = map(wert1, 0, 1023, 0, 255); 
 
  // change the analog out value:
  analogWrite(analogOutrot, outputrot);         
   
 
  wert2 = analogRead(blau);
  outputblau = map(wert2, 0, 1023, 0, 255);
  analogWrite(analogOutblau, outputblau);
  status = A_On;
     
   case A_On: if
      (!digitalRead(DownTaster)) // low = taster gedrückt
      {
        status  = A_DimDown;
        lastHit = millis();
      }
      break;

    case A_DimDown: 
      if (millis() - lastHit > dimSpeed)
      {
        lastHit = millis();
        dim--;
        analogWrite(analogOutrot,dim);
        analogWrite(analogOutblau,dim);
      }
      if (dim == 0)
      {
       status = A_Off;
      }
      break;
  }
}
};





Automat Dimmer;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
   Dimmer.handle();
 
}

combie

Quote
Irgendwelche Ideen?
Aber sicher!

Quote
Ich möchte das die LED auf dem Wert ist und von diesem Wert weg moduliert werden kann.
Wie soll das gehen?
Du könntest Motor betriebene Potis einsetzen. (welche sich selber auf die richtige Position drehen)
Oder anstelle der Potis auf Drehencoder setzen.
Oder die Bedienmannschaft so trainieren, dass sie das Poti vor dem runter dimmern ganz aufdreht.




Quote
Das nächste Problem ist, wenn der zweite Taster betätigt wird, leuchtet die LED ganz hell und dimmt dann erst herunter.
Wenn du meinem Dimmer Automaten den dim Wert vorbesetzt, dann läuft er auch ab da los, wenn der in einen Dim Zustand fällt.
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Hermann_88

Ok ich hab mich mit dem ganzen relativ lang herumprobiert. Dabei gibt es jetzt noch folgende Probleme. In der Case A_PWM (siehe Programm), ist die Pulsweitenmodulation eingebaut. Da ist es so, dass nur ein Wert ausgelesen wird. Ich möchte aber die LED´s durchgehend regeln können, bis der zweite Taster betätigt wurde. Wie mache ich das?

2. nachdem alle LED´s runtergedimmt haben, soll der ganze Zyklus von neuem starten. Danke für eure Hilfe im Voraus.

const unsigned int UpTaster    =  4; // Pin -- Taster -- GROUND
const unsigned int DownTaster  =  2; // Pin -- Taster -- GROUND
const unsigned int dimSpeed    = 50; // mS pro dimschritt
const int warm = A0;  // Analog input pin that the sensor is attached to
const int kalt = A1;  // Analog input pin that the sensor is attached to
const int staerke = A2;  // Analog input pin that the sensor is attached to
const int analogOutwarm = 9; // Analog output pin that the LED is attached to
const int analogOutkalt = 10; // Analog output pin that the LED is attached to
const int analogOutstaerke = 3;

int wert1 = 0;        // value read from the pot
int wert2 = 0;
int wert3 = 0;
int outputwarm = 0;        // value output to the PWM (analog out)
int outputkalt = 0;
int outputstaerke = 0;

struct Automat
{
  typedef enum  AutomatenStatus {A_On, A_Off, A_DimUp, A_DimDown,A_PWM};
  AutomatenStatus status;
  unsigned long lastHit;
  byte dim;
  Automat() // Konstruktor
  {
    pinMode(UpTaster, INPUT_PULLUP);
    pinMode(DownTaster, INPUT_PULLUP);
    pinMode(warm, INPUT);
    pinMode(kalt, INPUT);
    lastHit = millis();
    dim     = 0;
    status  = A_Off;
    analogWrite(analogOutwarm,dim);
    analogWrite(analogOutkalt,dim);
  }
 
void handle()
{
  switch (status)
  {
    case A_Off:
      if (!digitalRead(UpTaster)) // low = taster gedrückt
      {
        status  = A_DimUp;
        lastHit = millis();
      }
      break;

    case A_DimUp: 
      if (millis() - lastHit > dimSpeed)
      {
        lastHit = millis();
        dim++;
        analogWrite(analogOutwarm,dim);
        analogWrite(analogOutkalt,dim);
      }
      if (dim == 62)
      {
        status = A_PWM ;
      }
      break;
     
     case A_PWM:
     
      wert1 = analogRead(warm);           
      // map it to the range of the analog out:
      outputwarm = map(wert1, 0, 1023, 0, 255); 
 
      // change the analog out value:
      analogWrite(analogOutwarm, outputwarm);         
   
      wert2 = analogRead(kalt);
      outputkalt = map(wert2, 0, 1023, 0, 255);
      analogWrite(analogOutkalt, outputkalt);
      status = A_On;
      break; //!!!!!!!
    
   case A_On:
     if (!digitalRead(DownTaster)) // low = taster gedrückt
      {
        status  = A_DimDown;
        lastHit = millis();
      }
      break;

    case A_DimDown: 
      if (millis() - lastHit > dimSpeed)
      {
      Serial.print("A_DimDown: dim=");
      Serial.println(dim);
        lastHit = millis();
        dim--;
        //analogWrite(analogOutwarm,dim);
        //analogWrite(analogOutkalt,dim);
      Serial.print("A_DimDown: outputkalt=");
      Serial.println(outputkalt);
        analogWrite(analogOutwarm,outputwarm--);
        analogWrite(analogOutkalt,outputkalt--);
      if (outputwarm < 0) outputwarm=0;
      if (outputkalt < 0) outputkalt=0;
if(dim == -194){
       status = A_Off;
}
      break;
  }
}
}
};





Automat Dimmer;
void setup()
{
  Serial.begin(9600);
}

void loop()
{
   Dimmer.handle();
   wert3 = analogRead(staerke);
  outputstaerke = map(wert3, 0, 1023, 0, 255);
  analogWrite(analogOutstaerke, outputstaerke);
 
}

combie

Du solltest wirklich mal anfangen die Code BBCode Tags zu verwenden!
Bitte nutze sie.



Quote
Da ist es so, dass nur ein Wert ausgelesen wird. Ich möchte aber die LED´s durchgehend regeln können, bis der zweite Taster betätigt wurde. Wie mache ich das?
Mich wundert das nicht.
Der Automat bleibt nur für eine Runde in dem Zustand.
Warum?
Weil du in der Runde einen Zustandswechsel einleitest.
Ändere das.
Es ist offensichtlich, dass uns die Umstände alleine nicht glücklich oder unglücklich machen.
Es ist die Art unserer Reaktion darauf, die unsere Gefühle bestimmt.

Go Up