Go Down

Topic: LED, cosa accendere e quanto accendere (Read 801 times) previous topic - next topic

webian

Salve a tutti...come al solito, quando mi areno, faccio riferimento a voi e per questo vi chiedo di perdonarmi in quanto nella mia ignoranza, a volte proprio non ci arrivo.
Vengo al sodo:
Ho una lampada con all'interno 4 strisce al led, comandate da uno stadio di potenza.
Ovviamente lo stadio di potenza è comandato da un Arduino, che gestisce egregiamente (in pwm) la regolazione della luce erogata, ma il problema sorge quando devo unire due funzioni in unico listato.
Le strisce led sono 2 di luce bianca e 2 di luce gialla, e per comandare tutto ho a disposizione un potenziomentro e un pulsante.
Tramite il potenziomentro devo poter regolare la luminosità in maniera individuale (o bianco o giallo)
In definitiva se regolo il pot tutto a sinistra avrò la massima luminosita in luce bianca, se porto il pot al centro, tutti i led sono spenti e se porto il pot tuto a destra ho la massima luminosità gialla.
Con il punsante devo poter gestire 4 variabili (indipendentemente che si tratti di luce gialla o bianca)
variabile 1: accendo la striscia 1
variabile 2: accendo la striscia 2
variabile 3: accendo le strisce 1 e 2
variabile 4: spegne tutto

ringrazio anticipatamente tutti coloro che mi potranno suggerire link, e altre info per saltar fuori da questo mio problema.

grazie 1000 Webian
 

RobertoBochet

Simpatico, ma... quale sarebbe il problema? dove ti areni? cosa non riesci a fare?

webian

Eccomi qui con le due variabili.
Funzionano egregiamente entrambe (separatamente), ora non mi resta che inserirle tutte nello stesso sketch.
Il problema nasce proprio qui, non mi riesce di farle funzionara dovere, insieme.
Ho fatto una sketch ma funzionava solo la parte switch, un altro funzionava solo la parte PWM...in un altro andava tutto a casaccio.
Ho cercato di semplificar il più possibile il tutto (proporzionatamente alle mie conoscenze/esperienze) ma nulla.
avete qualche dritta da darmi?? grazie 1000

Code: [Select]


//componente regolazionePWM

 const int verde1 = 11;
    const int verde2 = 9;
    const int rosso1 = 10;
    const int rosso2 = 3;  
    const int pinpotenz = A0;  
    
    int potenzval;  
    int verdeval;
    int rossoval;
    
    void setup()
    {
    pinMode(verde1, OUTPUT);
    pinMode(verde2, OUTPUT);
    pinMode(rosso1, OUTPUT);
    pinMode(rosso2, OUTPUT);
    }
    void loop()
    {
    potenzval = analogRead(pinpotenz);
      
      if (potenzval > 511)
      {verdeval = map (potenzval,0,511,0,255);
      
      analogWrite (verde1, verdeval);
      analogWrite (verde2, verdeval);
      analogWrite (rosso1, 0);
      analogWrite (rosso2, 0);
    }
    
      if (potenzval < 512)
      {rossoval = map (potenzval,512,1023,255,0);
      
      analogWrite (rosso1, rossoval);
      analogWrite (rosso2, rossoval);
      analogWrite (verde1, 0);
      analogWrite (verde2, 0);
    }
    }






Code: [Select]


//componente selezione luci (switch)

 const int verde1 = 11;
    const int verde2 = 9;
    const int rosso1 = 10;
    const int rosso2 = 3;
    
    const int pulsant=2;
    const int debaunceDelay=250;
    byte stato=1;

    void setup() {
    pinMode(verde1, OUTPUT);
    pinMode(verde2, OUTPUT);
    pinMode(rosso1, OUTPUT);
    pinMode(rosso2, OUTPUT);  
    pinMode(pulsant, INPUT);
    }

    void loop() {

    if(digitalRead(pulsant))

    {

    if(stato<4) stato=stato+1;
    else stato=1;

    }
    
    switch(stato)
    { case 1:
    digitalWrite(verde1,LOW);
    digitalWrite(verde2,LOW);
    digitalWrite(rosso1,LOW);
    digitalWrite(rosso2,LOW);
    break;
    
  case 2:
    digitalWrite(verde1,HIGH);
    digitalWrite(verde2,HIGH);
    digitalWrite(rosso1,LOW);
    digitalWrite(rosso2,LOW);
    break;
    
  case 3:
    digitalWrite(verde1,LOW);
    digitalWrite(verde2,LOW);
    digitalWrite(rosso1,HIGH);
    digitalWrite(rosso2,HIGH);
    break;
    
   case 4:
    digitalWrite(verde1,HIGH);
    digitalWrite(verde2,HIGH);
    digitalWrite(rosso1,HIGH);
    digitalWrite(rosso2,HIGH);
    break;
    }

    {
    delay(25);
    }

    delay(debaunceDelay);

}


torn24

#3
Dec 10, 2015, 11:18 am Last Edit: Dec 10, 2015, 11:32 am by torn24
Non so se ho capito bene, ma il problema mi sembra, che da una parte decidi con un pulsante se accendere o spegnere una fila di led, dall'altra vuoi regolare la luminosità con un potenziometro, e sorge il problema, TU SPEGNI una fila di led col pulsante, e il potenziometro agisce ugualmente perché "non sa" che tu li hai voluti spegnere...

Io ho pensato di memorizzare all'interno di un array, i led che vuoi spegnere e quelli che vuoi accendere, poi quando agisci col potenziometro, tramite if() verifichi, se devono essere accesi oppure restare spenti.

Ti posto una modifica del tuo codice, NON so se funziona, perché non ho il circuito da provarli ;) però dovresti capire almeno la logica, e se fa a caso tuo, modificarlo e correggerlo, mi farebbe piacere una tua risposta sul forum comunque vada...


Esempio:
Code: [Select]





//componente selezione luci (switch)

    const int verde1 = 11;
    const int verde2 = 9;
    const int rosso1 = 10;
    const int rosso2 = 3;
    //------------

    const int pinpotenz = A0; 
   
    int potenzval; 
    int verdeval;
    int rossoval;
    const int pulsant=2;
    const int debaunceDelay=250;
    byte stato=1;
    int LedAccesoSpento[4]={0};// [0]=verde1 [1]=verde2  [2]=rosso1 [3]=rosso2
    void setup() {
    pinMode(verde1, OUTPUT);
    pinMode(verde2, OUTPUT);
    pinMode(rosso1, OUTPUT);
    pinMode(rosso2, OUTPUT); 
    pinMode(pulsant, INPUT);
    }

    void loop() {
    /* Gestione potenziometro */
  potenzval = analogRead(pinpotenz);
     
      if (potenzval > 511)
      {
 
      verdeval = map (potenzval,0,511,0,255);
          if(LedAccesoSpento[0]==1)//Solo se il led è acceso dal pulsante ne cambia valore
              analogWrite (verde1, verdeval);
  if(LedAccesoSpento[1]==1) //Solo se il led è acceso dal pulsante ne cambia valore
              analogWrite (verde2, verdeval);
          analogWrite (rosso1, 0);// Qui è sempre consentito, se il se il led è acceso spegne se è spento resta spento
          analogWrite (rosso2, 0);
      }
   
      if (potenzval < 512)
      {
      rossoval = map (potenzval,512,1023,255,0);
     
         
          analogWrite (verde1, 0);
          analogWrite (verde2, 0);
  if(LedAccesoSpento[2]==1)
      analogWrite (rosso1, rossoval);
  if(LedAccesoSpento[3]==1) 
              analogWrite (rosso2, rossoval);
       }
/* Gestione pulsante*/
    if(digitalRead(pulsant)==HIGH)
    {

        if(stato<4)
    stato=stato+1;
        else
      stato=1;

            switch(stato)//Questo switch deve essere eseguito solo se si preme il pulsante
    {
    case 1:
        digitalWrite(verde1,LOW);
LedAccesoSpento[0]=0;
        digitalWrite(verde2,LOW);
LedAccesoSpento[1]=0
        digitalWrite(rosso1,LOW);
LedAccesoSpento[2]=0;
        digitalWrite(rosso2,LOW);
LedAccesoSpento[3]=0;
        break;
   
       case 2:
   
        digitalWrite(verde1,HIGH);
LedAccesoSpento[0]=1;
        digitalWrite(verde2,HIGH);
LedAccesoSpento[1]=1
        digitalWrite(rosso1,LOW);
LedAccesoSpento[2]=0;
        digitalWrite(rosso2,LOW);
LedAccesoSpento[3]=0;
        break;
       case 3:
   
        digitalWrite(verde1,LOW);
LedAccesoSpento[0]=0;
        digitalWrite(verde2,LOW);
LedAccesoSpento[1]=0
        digitalWrite(rosso1,HIGH);
LedAccesoSpento[2]=1;
        digitalWrite(rosso2,HIGH);
LedAccesoSpento[3]=1;
        break;
       case 4:
   
    digitalWrite(verde1,HIGH);
LedAccesoSpento[0]=1;
        digitalWrite(verde2,HIGH);
LedAccesoSpento[1]=1
        digitalWrite(rosso1,HIGH);
LedAccesoSpento[2]=1;
        digitalWrite(rosso2,HIGH);
LedAccesoSpento[3]=1;
        break;
    }


    }
     
   
   
    delay(25);
   

    delay(debaunceDelay);

}

















webian

Questo sketch a me non passa la verifica, mi da parecchi errori nel Loop

torn24

Ciao, ho pensato che forse non servirebbe neanche un array in cui memorizzare i dati, basterebbe controllare nell'if se i pun sono low o high, comunque visto che ho fatto copia e incolla, per non digitare le stesse righe, mi sono scordato qualche punto e virgola ;, messaggio che IDE arduino indica ;)

Un tuo errore era di mettere lo switch, fuori dall'if, unendo i due listati, succedeva che lo switch veniva sempre eseguito, di conseguenza era sempre in contrasto col codice del potenziometro..
provalo e dimmi come va  :)  :)

posto il codice che si compila con arduino..


Code: [Select]


//componente selezione luci (switch)

    const int verde1 = 11;
    const int verde2 = 9;
    const int rosso1 = 10;
    const int rosso2 = 3;
    //------------

    const int pinpotenz = A0; 
   
    int potenzval; 
    int verdeval;
    int rossoval;
    const int pulsant=2;
    const int debaunceDelay=250;
    byte stato=1;
    int LedAccesoSpento[4]={0};// [0]=verde1 [1]=verde2  [2]=rosso1 [3]=rosso2
    void setup() {
    pinMode(verde1, OUTPUT);
    pinMode(verde2, OUTPUT);
    pinMode(rosso1, OUTPUT);
    pinMode(rosso2, OUTPUT); 
    pinMode(pulsant, INPUT);
    }

    void loop() {
    /* Gestione potenziometro */
  potenzval = analogRead(pinpotenz);
     
      if (potenzval > 511)
      {
 
      verdeval = map (potenzval,0,511,0,255);
          if(LedAccesoSpento[0]==1)//Solo se il led è acceso dal pulsante ne cambia valore
              analogWrite (verde1, verdeval);
  if(LedAccesoSpento[1]==1) //Solo se il led è acceso dal pulsante ne cambia valore
              analogWrite (verde2, verdeval);
          analogWrite (rosso1, 0);// Qui è sempre consentito, se il se il led è acceso spegne se è spento resta spento
          analogWrite (rosso2, 0);
      }
   
      if (potenzval < 512)
      {
      rossoval = map (potenzval,512,1023,255,0);
     
         
          analogWrite (verde1, 0);
          analogWrite (verde2, 0);
  if(LedAccesoSpento[2]==1)
      analogWrite (rosso1, rossoval);
  if(LedAccesoSpento[3]==1) 
              analogWrite (rosso2, rossoval);
       }
/* Gestione pulsante*/
    if(digitalRead(pulsant)==HIGH)
    {

        if(stato<4)
    stato=stato+1;
        else
      stato=1;

            switch(stato)//Questo switch deve essere eseguito solo se si preme il pulsante
    {
    case 1:
        digitalWrite(verde1,LOW);
LedAccesoSpento[0]=0;
        digitalWrite(verde2,LOW);
LedAccesoSpento[1]=0;
        digitalWrite(rosso1,LOW);
LedAccesoSpento[2]=0;
        digitalWrite(rosso2,LOW);
LedAccesoSpento[3]=0;
        break;
   
       case 2:
   
        digitalWrite(verde1,HIGH);
LedAccesoSpento[0]=1;
        digitalWrite(verde2,HIGH);
LedAccesoSpento[1]=1;
        digitalWrite(rosso1,LOW);
LedAccesoSpento[2]=0;
        digitalWrite(rosso2,LOW);
LedAccesoSpento[3]=0;
        break;
       case 3:
   
        digitalWrite(verde1,LOW);
LedAccesoSpento[0]=0;
        digitalWrite(verde2,LOW);
LedAccesoSpento[1]=0;
        digitalWrite(rosso1,HIGH);
LedAccesoSpento[2]=1;
        digitalWrite(rosso2,HIGH);
LedAccesoSpento[3]=1;
        break;
       case 4:
   
    digitalWrite(verde1,HIGH);
LedAccesoSpento[0]=1;
        digitalWrite(verde2,HIGH);
LedAccesoSpento[1]=1;
        digitalWrite(rosso1,HIGH);
LedAccesoSpento[2]=1;
        digitalWrite(rosso2,HIGH);
LedAccesoSpento[3]=1;
        break;
    }


    }
     
   
   
    delay(25);
   

    delay(debaunceDelay);

}
















webian

#6
Dec 10, 2015, 05:00 pm Last Edit: Dec 10, 2015, 05:13 pm by webian
dunque...
alcune cose vanno, altre no...
ho notato che la regolazione va molto a grandi passi e non è fluida (non so come mail)
e quando il potenziometro si trova al centro, per una frazione di rotazione del potenziometro, accende tutto al posto di aver zero luminosita su tutti i led

torn24

#7
Dec 10, 2015, 05:41 pm Last Edit: Dec 10, 2015, 05:51 pm by torn24
Non saprei, io ho pensato come unire i tuoi due codici, e se funzionavano mi aspettavo  che continuavano a farlo uniti...

webian

ci siamo....grazie mille del supporto...
ho combinato, ho solo cambiato questo...e gia mi soddisfa
ora resta solo un po' di lampeggio nel momento in qui passo al centro dell'escursione del potenz.
vediamo se qualche buon anima mi consiglia come risolver.


grazie  1000 Torn24

Code: [Select]


case 2:
   
        digitalWrite(verde1,HIGH);
LedAccesoSpento[0]=1;
        digitalWrite(verde2,LOW);
LedAccesoSpento[1]=0;
        digitalWrite(rosso1,HIGH);
LedAccesoSpento[2]=1;
        digitalWrite(rosso2,LOW);
LedAccesoSpento[3]=0;
        break;
       case 3:
   
        digitalWrite(verde1,LOW);
LedAccesoSpento[0]=0;
        digitalWrite(verde2,HIGH);
LedAccesoSpento[1]=1;
        digitalWrite(rosso1,LOW);
LedAccesoSpento[2]=0;
        digitalWrite(rosso2,HIGH);
LedAccesoSpento[3]=1;
        break;


Go Up