Arduino stripled

Salve a tutti, sto provando a realizzare una lampada con arduino ed 1 metro di stripled rgb, per amplificare il PWM di arduino uso dei bc337 la cui base è collegata ad arduino tramite una resistenza da 1kohm ed un pulldown di 10kohm per dare un riferimento a massa. Per regolare le intensità dei colori uso un potenziometro ed un bottone aggiuntivo per scegliere quale colore (fra rosso verde e blu) far variare. Tutto funziona bene se non il fatto che quando il PWM è al minimo le luci sono spente ma ogni tanto lampeggiano flebilmente come se arrivasse parzialmente corrente a tratti. ho provato ad inviare il segnale direttamente spegnendo il pin in maniera digitale ma non cambia nulla. Consigli? P.S. Invio il codice di prova con cui sto lavorando per una migliore comprensione.

int rpin = 5;   // pin RED
int gpin = 3;   // pin GREEN
int bpin = 6;   // pin BLU
int tasto= 4;  //pin tasto
const int analogInPin = A0;  // pin dei potenziometrivoid setup()


int coloreprovvisorio = 3;
int conta = 1;

int valred = 0;         // variable to store the read value
void setup()
{

  pinMode(bpin, OUTPUT);   // sets the pin as output
  pinMode(gpin, OUTPUT);   // sets the pin as output
  pinMode(rpin, OUTPUT);   // sets the pin as output
  pinMode(tasto, OUTPUT);
  pinMode(analogInPin, INPUT);   // sets the pin as Input

// Serial.begin(9600);
}

void loop()

{
  
  if(digitalRead(tasto)) 
{
    
  conta = conta + 1;
delay(1000);

if (conta  > 3 )
{ conta = 1;}

if (conta == 3)
{ coloreprovvisorio = bpin;}

if (conta == 2)
{ coloreprovvisorio = rpin;}

if (conta == 1)
{ coloreprovvisorio = gpin;}
}





//  Serial.println(valred / 4); 
  valred = analogRead(analogInPin);
if (valred==0) digitalWrite (coloreprovvisorio, LOW); else
  analogWrite(coloreprovvisorio, valred / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

}

perche' questo ?

pinMode(tasto, OUTPUT);

colpa del "copia e incolla" :p Grazie corretto, in pinMode(tasto, INPUT); ma il problema rimane.

ma non e' che ogni tanto la lettura sul potenziometro da' valori diversi da 0 ?

prova a stampare il valore

  valred = analogRead(analogInPin);
  valred = map(valred, 0, 1023, 0, 255);
  if (valred > 0 ) { 
  analogWrite(coloreprovvisorio, valred );  
  Serial.println(valred);
  }

e usa il MAP per convertire il valore letto e da dare al PWM

Con il tuo codice non ottengo mai zero ma solo 1 come valore minimo e la stripled non si spegne mai. Per risolvere ho provato cosi'

  valred = analogRead(analogInPin);
  if (valred==0) 
{digitalWrite (coloreprovvisorio, LOW); 
  Serial.println(valred);
}
  else
 { valred = map(valred, 0, 1023, 0, 255);
  if (valred > 0 ) { 
  analogWrite(coloreprovvisorio, valred );  

  }
  }

Sembra funzionare. Lo lascio un po' girare per vedere se va bene. Grazie dell'aiuto

Ok funziona, a questo punto il problema era la mia divisione per 4 anche se in fondo doveva comunque andar bene visto che cmq da monitor seriale ottenevo solo 0. Una cosa non mi è chiara però usando map perchè non riesco ad avere lo 0 nonostante la nuova mappatura va da 0 a 1023? il minimo valore che ottengo è 1.

non e' il MAP che non funziona, ma il valore letto sul pin A0

come lo hai collegato quel potenziometro ?

pin destro a massa, pin sinistro a 5v pin centrale ad analogic pin 0, con il serialwrite del valore letto ottengo valori tra 0 e 1024 correttamente.

  valred = analogRead(analogInPin);
  int k = valred;
//  if (valred==0)
//  { digitalWrite (coloreprovvisorio, LOW); 
//  }
//  else
 { valred = map(valred, 0, 1023, 0, 255);
  if (valred > 0 ) { 
  analogWrite(coloreprovvisorio, valred );  
  
  }
  }
  Serial.println(k);

ok come ti dicevo è uguale a 0 ma i led rimangono accesi anche se in maniera flebile In realtà stampando anche valred è giustamente uguale a 0 anche questo, non capisco proprio perchè i led non si spengano.

vero, non ci avevo mai fatto caso, ma il PWM va' spento, come fai tu con digitalWrite (coloreprovvisorio, LOW)

altrimenti, anche mandando un analogWrite(coloreprovvisorio, 0 ) c'e' comunque un segnale di alcuni µs

Ok svelato l'arcano. Metto risolto nel titolo magari è utile a qualcuno. Grazie mille per l'aiuto.

ho tolto il risolto perchè prestando maggiore attenzione mi sono accorto che sono ancora presenti degli istanti di accensione. Per debuggare ho provato cosi':

 delay (10);
  valred = analogRead(analogInPin);
  if (valred==0)
  { digitalWrite (coloreprovvisorio, LOW); 
  }
  else
 { valred = map(valred, 0, 1023, 0, 255);
  if (valred > 0 ) { 
  analogWrite(coloreprovvisorio, valred );  

  }
  }
   if (valred > 0 ) Serial.println(valred); 
}

ed ho avuto in 1 minuti 2 istanti in cui il monitor seriale segnava 1, per eliminare il dubbio di un potenziometro difettoso ho cortocircuitato la massa di arduino con il pin A0 in modo da avere un segnale sempre nullo, ma il problema è rimasto. Consigli o riflessioni sulla possibile causa? P.S. inoltre non è un problema di pwm il fatto che rimaneva acceso prima poichè con analogWrite(3, 0); il led sta spento normalmente.

con questo codice tutto funziona quindi mi fa pensare ad un problema di codice

void setup()
{
  //led Rosso
  pinMode(5, OUTPUT);
  //led verde
  pinMode(3, OUTPUT);
  //led blu
  pinMode(6, OUTPUT);

  //init seriale
  Serial.begin(9600);
}

void loop() {
  //se arrivano dati...
  if (Serial.available())
  {
    //leggi il carattere in arrivo
    byte data = Serial.read();

    if(data == 'q') //accende il led blu
      analogWrite(3, 255);
    else if (data == 'w') //spegne il led blu
      analogWrite(3, 0);

    if(data == 'a') //accende il led verde
      analogWrite(5, 255);
    else if (data == 's') //spegne il led verde
      analogWrite(5, 0);

    if(data == 'z') //accende il led rosso
     analogWrite(6, 255);
    else if (data == 'x') //spegne il led rosso
      analogWrite(6, 0);
  }
}

per la serie “fatti una domanda e datti una risposta” forse sono riuscito a risolvere, il problema di fondo è la lettura dell’adc che a causa di rumore non sempre è esattamente 0 ma legge 1, al che per eliminare questo rumore ho pensato di fare una media delle letture (tanto a 16mhz le letture del valore sono molto veloci) posto il codice sperando che questo sia quello definitivo, si accettano consigli e commenti sulla soluzione adottata.

int rpin = 5;   // pin RED
int gpin = 3;   // pin GREEN
int bpin = 6;   // pin BLU
int tasto= 4;  //pin tasto
const int analogInPin = A0;  // pin dei potenziometrivoid setup()


int coloreprovvisorio = 3;
int conta = 1;

int valred = 0;         // variable to store the read value
void setup()
{

  pinMode(bpin, OUTPUT);   // sets the pin as output
  pinMode(gpin, OUTPUT);   // sets the pin as output
  pinMode(rpin, OUTPUT);   // sets the pin as output
  pinMode(tasto, INPUT);
  pinMode(analogInPin, INPUT);   // sets the pin as Input

 Serial.begin(9600);
}

void loop()

{
  
  if(digitalRead(tasto)) 
{
    
  conta = conta + 1;
delay(1000);

if (conta  > 3 )
{ conta = 1;}

if (conta == 3)
{ coloreprovvisorio = bpin;}

if (conta == 2)
{ coloreprovvisorio = rpin;}

if (conta == 1)
{ coloreprovvisorio = gpin;}
}

valred=0;
  for (int i = 0; i<10; i++) {
    valred+= analogRead(analogInPin);
  }
valred = ((float)valred/10+0.5);
 valred = map(valred, 0, 1023, 0, 255);
  analogWrite(coloreprovvisorio, valred );  
  
  }

p.s. il lato negativo è che forse si perde qualcosa in risoluzione del potenziometro.