Informazioni su Attiny...

Altra domanda... se rompo troppo ditemelo!! : )))) Ma come faccio a regolare la luminosità dei led dal transistor?? Devo comandare il pin dove c'è la base del transistor?? ma così la PWM va bene?? '-.-

EDIT:Ho provato con un C33740 (manca la B?) la resistenza sulla base è di 22k e il led non è luminoso come quando ho fatto le prove senza transistor... Ho provato co resistenze di valori diversi sulla base e ho visto che cambiava luminosità... E così ho tirato via la resistenza :D quanta bella luce... e allora mi chiedo... serve sta resistenza?

Vediamo di riordinare le idee.

1) un pin di un Atmega non può erogare più di qualche decina di mA. Per sicurezza è bene stare sempre sui 20 mA, se si passano i 40 mA il GPIO del pin si brucia.

2) 10 led su un pin non li puoi montare: assorbono 200 mA. Dalla 1) capisci che il chip fa una brutta fine.

3) ti serve un transistor usato come interruttore, ossia lo fai lavorare in saturazione. Per far lavorare un transistor in saturazione devi fornirgli sulla base una corrente proporzionata alla corrente collettore/emettitore che devi pilotare. Per far ciò devi sapere come funzionano i transistor ed a cosa servono i suoi parametri, ad esempio Hfe, che è il guadagno di corrente del transistor. Ossia il rapporto fra la corrente pilotata e la corrente pilota. Se hai ad esempio un Hfe di 100, per dire, e vuoi pilotare 100 mA, basta fornire 1 mA di corrente alla base. La resistenza sulla base serve proprio per regolare questa corrente.

4) detto questo, ti devi prendere il datasheet del tuo transistor e poi fai un salto qui: http://www.gioblu.com/tutorials/elettronica/138-usiamo-i-trasnistor-come-un-interruttore e ti fai i tuoi calcoli ;)

leo72: 4) detto questo, ti devi prendere il datasheet del tuo transistor e poi fai un salto qui: http://www.gioblu.com/tutorials/elettronica/138-usiamo-i-trasnistor-come-un-interruttore e ti fai i tuoi calcoli ;)

Hai per caso un altro link a disposizione?? Questo non va... mi da l'errore 404 e mi parte l'antivirus... Grazie!!

E’ vero, strano…
cmq parti da qui:
http://www.gioblu.com/tutorials/elettronica
ed apri il link n° 28

leo72:
E’ vero, strano…
cmq parti da qui:
http://www.gioblu.com/tutorials/elettronica
ed apri il link n° 28

Il pc ha voglia di scherzare oggi… Io uso opera, ho aperto il link in chrome e va… scusa e grazie!! : D
Tornerò a disturbarti per i chiarimenti!! :wink:

Niente, ad assere sincero non ci ho capito nulla... io non so ancora quale transistor prendere e di conseguenza che resistenza usare... so che ci saranno 10 led bianchi alta luminosità , 1 attiny e basta... Come faccio a sapere che resistenza ci metto? Guardando l'articolo che mi hai postato non ci ho capito nulla... :S

Prenditi un BC337 che regge fino a 800 mA. Poi metti una resistenza da 1 K sulla base e prova così. Va senz'altro.

leo72:
Prenditi un BC337 che regge fino a 800 mA.
Poi metti una resistenza da 1 K sulla base e prova così. Va senz’altro.

Ok, grazie!! :wink:

Ho una domanda sulla programmazione, devo gestire 6 effetti di luce in fade… e l’ho fatto così:

case 1:
for (valoreFade = 0 ; valoreFade < 52; valoreFade++) {   
    analogWrite(LED, valoreFade);

    delay(100);    
  }  
                           
break;

case 2:
for (valoreFade = 51 ; valoreFade < 103; valoreFade++) {   
    analogWrite(LED, valoreFade);

    delay(100);    
                      
  }   
   
break;

Però c’è un problema… quando fa il case 1 va tutto bene, il led resta acceso e ok… quando gli faccio fare il case 2 quando ripete il ciclo mi fa “lampeggiare” il led… cioè, riparte da valoreFade = 51 arriva a 103 e continua sempre così… come posso fare per bloccare la cosa?!

Visto che mi sto arrangiando nella programmazione, spero di essermi spiegato abbastanza bene… in realtà non volevo il vostro aiuto… ma non ci salto fuori!! =(

mmm non vedo errori magari qualche variabile dichiarata male posta l'intero codice :D

Ecco qui :smiley:

#include <CapSense.h>
#define LED 11
 CapSense cs_4_2 = CapSense(4,2);
 int i = 0;
 int valoreFade = 0;
 void setup()
 {
pinMode(LED,OUTPUT);
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
 }
 void loop()
 {
long total = cs_4_2.capSense(30);
delay(15);
if (total >60)
{
i++;
} 

switch (i)
{
case 1:
for (valoreFade = 0 ; valoreFade < 52; valoreFade++) {   
    analogWrite(LED, valoreFade);

    delay(100);    
  }  
                           
break;

case 2:
for (valoreFade = 51 ; valoreFade < 103; valoreFade++) {   
    analogWrite(LED, valoreFade);     

    delay(100);    
                  
  }   
   
break;

case 3:
for (valoreFade = 102 ; valoreFade < 154; valoreFade++) {   
    analogWrite(LED, valoreFade);    

    delay(10);    
               
  }   
   
break;

case 4:
for (valoreFade = 153 ; valoreFade < 205; valoreFade++) {   
    analogWrite(LED, valoreFade);     
 
    delay(10);    

  }   
   
break;

case 5:

    for (valoreFade = 204 ; valoreFade < 256; valoreFade++) {   
    analogWrite(LED, valoreFade); 

    delay(10);    
                        
  }   
   
break;

case 6:
for(valoreFade = 255 ; valoreFade > -1; valoreFade--) {  
    analogWrite(LED, valoreFade);    
 
   delay(15);    
                           
  }   
    
i=0;
break;
}
 }

maggio93: Però c'è un problema... quando fa il case 1 va tutto bene, il led resta acceso e ok... quando gli faccio fare il case 2 quando ripete il ciclo mi fa "lampeggiare" il led.. cioè, riparte da valoreFade = 51 arriva a 103 e continua sempre così... come posso fare per bloccare la cosa?!

per "bloccare la cosa" intendi che una volta arrivato a 103 resta lì fermo aspettando delle variazioni sul capSense? o che da 103 torna gradualmente a 51 in modo da non lampeggiare quando va a ripetere il caso 2?

?R: per "bloccare la cosa" intendi che una volta arrivato a 103 resta lì fermo aspettando delle variazioni sul capSense?

Esatto, in patica voglio che toccando il filo (capsense) la prima volta il led vada da 0 a 51, e se io non tocco deve restare acceso, non tornare a 0 e poi di nuovo a 51 facendo così un ciclo infinito... se tocco invece la seconda volta deve andare da 51 a 102 e uguale a prima, se non tocco il led una volta raggiunto il valore 102 deve restare acceso... non tornare a 51 e poi a 102... se mi riesci ad aiutare mi fai un gran favore, io non ci salto fuori e non so come fare.. :D Grazie a te e a tutti gli altri che rispondono a questo topic!! ;)

Devi mettere qualche variabile e gestire i vari eventi con quella. Basta un flag: arrivato a 51, lo imposti a 1 ed al successivo controllo eseguire il fading fino a 100. Qui lo passi a 2. Al successivo passaggio al controllo, verifichi dov'è: se è a 2 continui da 101 ecc...

PS: Sarebbe buona cosa scaricarsi una guida o prendere un libro che insegni il C. Ci sono sempre degli esempi allegati che spiegano man mano che avanzi nella lettura cosa stai facendo.

leo72:
Devi mettere qualche variabile e gestire i vari eventi con quella.
Basta un flag: arrivato a 51, lo imposti a 1 ed al successivo controllo eseguire il fading fino a 100. Qui lo passi a 2. Al successivo passaggio al controllo, verifichi dov’è: se è a 2 continui da 101 ecc…

{
case 1:
if (flag == 1) valoreFade = 52;
for (valoreFade = 0 ; valoreFade < 52; valoreFade++) {   
    analogWrite(LED, valoreFade);
if (valoreFade == 52) flag = 1;
    delay(100);    
  }  
                           
break;

case 2:
for (valoreFade = 51 ; valoreFade < 103; valoreFade++) {   
    analogWrite(LED, valoreFade);     
if (valoreFade == 103) flag = 2;
    delay(100);    
                  
  }   
   
break;

case 3:
for (valoreFade = 102 ; valoreFade < 154; valoreFade++) {   
    analogWrite(LED, valoreFade);    
if (valoreFade == 154) flag = 3;
    delay(10);    
               
  }   
   
break;

Circa così?? :S Per la guida ci sto pensando… e mi sa che seguirò il tuo consiglio dopo questo progettino!! :S :wink:

Così però stai mettendo dei case, non ti servono poi i check sul flag interni al case. Se hai diversi schemi di fading e ciò che vuoi fare deve stare solo dentro ad uno di questi, devi fare:

switch.....
  case 1:
    .....
  case 2:
    switch flag
      case 0:
        ..
      case 1:
        ..

ecc...

leo72: Così però stai mettendo dei case, non ti servono poi i check sul flag interni al case. Se hai diversi schemi di fading e ciò che vuoi fare deve stare solo dentro ad uno di questi, devi fare:

switch.....
  case 1:
    .....
  case 2:
    switch flag
      case 0:
        ..
      case 1:
        ..

ecc...

Niente... non ci riesco, mi potresti fare un esempio su una parte del codice? Perchè proprio non so cosa fare... :S Poi ti farò una statua!! xD

il problema del capSense è che non è proprio come un pulsante, ovvero tu pensi di premere una volta ma non sai quante volte il programma va a leggere quel tocco, dovresti controllare che sia rilasciato il “contatto” sul capSense prima di andare a leggere se è premuto di nuovo, ma può funzionare anche come hai fatto tu, questa è solo un’avertenza…

comunque puoi fare che la variabile non viene impostata ogni volta, ma mantiene il valore, tipo così:

#include <CapSense.h>
#define LED 11
 CapSense cs_4_2 = CapSense(4,2);
 int i = 0;
 int valoreFade = 0;
 void setup()
 {
pinMode(LED,OUTPUT);
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
 }
 void loop()
 {
long total = cs_4_2.capSense(30);
delay(15);
if (total >60)
{
i++;
} 

switch (i)
{
case 1:
for (valoreFade = 0 ; valoreFade < 52; valoreFade++) {   
    analogWrite(LED, valoreFade);

    delay(100);    
  }  
                           
break;

case 2:
for (valoreFade = valoreFade ; valoreFade < 103; valoreFade++) {   
    analogWrite(LED, valoreFade);     

    delay(100);    
                  
  }   
   
break;

case 3:
for (valoreFade = valoreFade ; valoreFade < 154; valoreFade++) {   
    analogWrite(LED, valoreFade);    

    delay(10);    
               
  }   
   
break;

case 4:
for (valoreFade = valoreFade ; valoreFade < 205; valoreFade++) {   
    analogWrite(LED, valoreFade);     
 
    delay(10);    

  }   
   
break;

case 5:

    for (valoreFade = valoreFade ; valoreFade < 256; valoreFade++) {   
    analogWrite(LED, valoreFade); 

    delay(10);    
                        
  }   
   
break;

case 6:
for(valoreFade = valoreFade ; valoreFade > -1; valoreFade--) {  
    analogWrite(LED, valoreFade);    
 
   delay(15);    
                           
  }   
    
  i=0;
 break;
 }
}

così si ricorda il valore precedente che aveva assunto e riparte da lì :wink:

?R:
il problema del capSense è che non è proprio come un pulsante, ovvero tu pensi di premere una volta ma non sai quante volte il programma va a leggere quel tocco, dovresti controllare che sia rilasciato il “contatto” sul capSense prima di andare a leggere se è premuto di nuovo, ma può funzionare anche come hai fatto tu, questa è solo un’avertenza…

comunque puoi fare che la variabile non viene impostata ogni volta, ma mantiene il valore, tipo così:

#include <CapSense.h>

#define LED 11
CapSense cs_4_2 = CapSense(4,2);
int i = 0;
int valoreFade = 0;
void setup()
{
pinMode(LED,OUTPUT);
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
}
void loop()
{
long total = cs_4_2.capSense(30);
delay(15);
if (total >60)
{
i++;
}

switch (i)
{
case 1:
for (valoreFade = 0 ; valoreFade < 52; valoreFade++) { 
    analogWrite(LED, valoreFade);

delay(100);   
  } 
                         
break;

case 2:
for (valoreFade = valoreFade ; valoreFade < 103; valoreFade++) { 
    analogWrite(LED, valoreFade);

delay(100);   
                 
  } 
 
break;

case 3:
for (valoreFade = valoreFade ; valoreFade < 154; valoreFade++) { 
    analogWrite(LED, valoreFade);

delay(10);   
             
  } 
 
break;

case 4:
for (valoreFade = valoreFade ; valoreFade < 205; valoreFade++) { 
    analogWrite(LED, valoreFade);

delay(10);


 
break;

case 5:

for (valoreFade = valoreFade ; valoreFade < 256; valoreFade++) { 
    analogWrite(LED, valoreFade);

delay(10);   
                       
  } 
 
break;

case 6:
for(valoreFade = valoreFade ; valoreFade > -1; valoreFade–) { 
    analogWrite(LED, valoreFade);

delay(15);   
                         
  } 
   
  i=0;
break;
}
}



così si ricorda il valore precedente che aveva assunto e riparte da lì ;)

Col codice che mi hai dato il problema persiste… come posso fare? :S

lampeggia ancora? :roll_eyes:
apparte che guardando meglio il caso 0 lo fa solo all’inizio… prova con questo:

#include <CapSense.h>
#define LED 11
 CapSense cs_4_2 = CapSense(4,2);
 int i = 0;
 int valoreFade = 0;
 void setup()
 {
pinMode(LED,OUTPUT);
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
 }
 void loop()
 {
long total = cs_4_2.capSense(30);
delay(15);
if (total >60)
{
if(i<=6) i++;
else i=0;
} 

switch (i)
{
case 1:
for (valoreFade = valoreFade ; valoreFade < 52; valoreFade++) {   
    analogWrite(LED, valoreFade);

    delay(100);    
  }  
                           
break;

case 2:
for (valoreFade = valoreFade ; valoreFade < 103; valoreFade++) {   
    analogWrite(LED, valoreFade);     

    delay(100);    
                  
  }   
   
break;

case 3:
for (valoreFade = valoreFade ; valoreFade < 154; valoreFade++) {   
    analogWrite(LED, valoreFade);    

    delay(10);    
               
  }   
   
break;

case 4:
for (valoreFade = valoreFade ; valoreFade < 205; valoreFade++) {   
    analogWrite(LED, valoreFade);     
 
    delay(10);    

  }   
   
break;

case 5:

    for (valoreFade = valoreFade ; valoreFade < 256; valoreFade++) {   
    analogWrite(LED, valoreFade); 

    delay(10);    
                        
  }   
   
break;

case 6:
for(valoreFade = valoreFade ; valoreFade > -1; valoreFade--) {  
    analogWrite(LED, valoreFade);    
 
   delay(15);    
                           
  }   
 break;
 }
}

Ciao ?R ho risolto... però purtroppo non ho avuto modo di provare il tuo codice... ho perso un po' di tempo da solo e non ho guardato sul forum... mi è stato utile però il tuo consiglio del valoreFade=valoreFade :D poi è venuto fuori un altro problema che ho risolto!! :D Grazie mille! ;) Da questa volta mi tocca studiare senno @leo72 mi ammazza!! xD Per la parte del codice ho risolto!! SIIIIIII