Blue Flower

In questo articolo vedremo come controllare la luminosità dei displays TIL311 sfruttando l'ingresso Blank Input del TIL311 e le uscite PWM di Aduino. Sarà, inoltre, possibile visualizzare e monitorare tutte le grandezze acquisite ed elaborate dal programma mediante il monitor seriale dell'IDE di Arduino. Il programma proposto è una variante del programma presentato nell'articolo "Termometro con Arduino e display TIL311"  e si basa sullo shield TIL311_SHIELD2 ivi realizzato.

La luminosità dei due display si regola mediante il trimmer da 10k presente sulla scheda. Da displays spenti (trimmer ruotato tutto in senso orario) a massima luminosità (trimmer tutto ruotato in senso anti-orario)

Lo schema elettrico della shield

 

Lo shield TIL311_SHIELD2 

 

Il codice del programma (solo PWM)

 

//Autore: Vincenzo Maida
//Data: 31/03/2015 - Torino (Italy)
//Termometro ambiente con LM35 basato su shield con display TIL311 (TIL311_SHIELD2 AVANZATA)
//Controllo PWM della luminosita dei displays mediante trimmer


int pinLM35=A1; //pin sensore di temperatura LM35
double valoreSensore=0; //Valore letto dal sensore LM35
double tensione=0.0; //Valore di tensione corrispondente al valore letto dall'ADC
double temp=0; //Temperatura corrispondente al valore letto dall'LM35 (tensione)
double media=0.0; //Variabile per calcolo media
//Gestione PWM
int pinTrimmer=A0; //pin trimmer 10K
int valoreTrimmer=0; //Valore letto dall'ADC proporzionale alla tensione sul trimmer (0..1023)
//Display TIL311 (DP1 e DP2)
int BL1=5; //Input Blank (8) di DP1 Decine su uscita  PWM di Arduino. 0=Acceso; 1=Spento (attivo basso)
int pin1[] = {1,0,3,6};//Pin TIL311 Decina (Display 1 a sinistra). Segmenti A (3), B(2), C(13), D(12) del TIL 311 

int BL2=11; //Input Blank (8) di DP2 Unità su uscita  PWM di Arduino. 0=Acceso; 1=Spento (attivo basso)
int pin2[] = {8,7,9,12};//Pin TIL311 Unità (Display 2 a destra). Segmenti A(3), B(2), C(13), D(12) del TIL 311 
int TIL[][16]={
              {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
              {0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1},
              {0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1},
              {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1}
            };
//Variabili per gestione display
int d=0; //Contatore decine
int u=0; //Contatore unità
int i=0;

// the setup routine runs once when you press reset:
void setup() {                
  //Inizializza segmenti TIL311 di DP1 (Decine)
  for(i=0;i<4;i++){
  pinMode(pin1[i], OUTPUT);
  } 
  pinMode(BL1,OUTPUT);
  digitalWrite(BL1,LOW); //Accende il display decine
  
  //Inizializza segmenti TIL311 di DP2 (Unità)
  for(i=0;i<4;i++){
  pinMode(pin2[i], OUTPUT);
  } 
  pinMode(BL2,OUTPUT);
  digitalWrite(BL2,LOW); //Accende il display unità
 
}

// the loop routine runs over and over again forever:
void loop() {
  //Gestione PWM
  valoreTrimmer=analogRead(pinTrimmer); //Legge la tensione sul Trimmer
  delay(100); //Attende tempo di conversione
  analogWrite(BL1,valoreTrimmer/4); //Invia segnale PWM al Blank Input di Display decine
  analogWrite(BL2,valoreTrimmer/4); //Invia segnale PWM al Blank Input di Display unità
  //Legge sensore LM35
  //Calcola media di 50 acquisizioni per rendere più stabile ed immune ai rumori la lettura sul sensore LM35
  media=0;
  for(i=0;i<50;i++){
    valoreSensore=analogRead(pinLM35);
    media+=valoreSensore;
    delay(10);
  }
  media=media/50;
  tensione=media*5/1023; //Valore della tensione letta in ingresso
  temp=tensione*100;//Valore di tensione convertito in temperatura
  d=temp/10;//Calcolo le decine
  u=temp-(d*10);//Calcolo le unità
  //Aggiorna cife display
  //Display decine
  for(i=0;i<4;i++){
   digitalWrite(pin1[i],TIL[i][d]);
  }
  //Display unità
  for(i=0;i<4;i++){
   digitalWrite(pin2[i],TIL[i][u]);
  }
  delay(500);//Lettura ogni 500ms
}



 

 Il codice con monitoraggio seriale dei dati e delle variabili. Per aprire il monitor seriare andare sulla voce di menu Strmenti e poi selezionare Monitor seriale 

 Nota: L'uso del monitor seriale falsa la visualizzazione del numero del display delle decine in quanto le uscite digitali del monitor seriale (pin 0 e 1 di Arduino cioè RX e TX) coincidono con i dati A e B del TIL311 connessi agli stessi pin della seriale.

 

//Autore: Vincenzo Maida
//Data: 20/04/2015 - Torino (Italy)
//Termometro ambiente con LM35 basato su shield con display TIL311 (TIL311_SHIELD2 AVANZATA)
//Controllo PWM della luminosita dei displays mediante trimmer
//Monitoraggio dati acquisiti e variabili interne su monitor seriale


int pinLM35=A1; //pin sensore di temperatura LM35
double valoreSensore=0; //Valore letto dal sensore LM35
double tensione=0.0; //Valore di tensione corrispondente al valore letto dall'ADC
double temp=0; //Temperatura corrispondente al valore letto dall'LM35 (tensione)
double media=0.0; //Variabile per calcolo media
//Gestione PWM
int pinTrimmer=A0; //pin trimmer 10K
int valoreTrimmer=0; //Valore letto dall'ADC proporzionale alla tensione sul trimmer (0..1023)
//Display TIL311 (DP1 e DP2)
int BL1=5; //Input Blank (8) di DP1 Decine su uscita  PWM di Arduino. 0=Acceso; 1=Spento (attivo basso)
int pin1[] = {1,0,3,6};//Pin TIL311 Decina (Display 1 a sinistra). Segmenti A (3), B(2), C(13), D(12) del TIL 311 

int BL2=11; //Input Blank (8) di DP2 Unità su uscita  PWM di Arduino. 0=Acceso; 1=Spento (attivo basso)
int pin2[] = {8,7,9,12};//Pin TIL311 Unità (Display 2 a destra). Segmenti A(3), B(2), C(13), D(12) del TIL 311 
int TIL[][16]={
              {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
              {0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1},
              {0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1},
              {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1}
            };
//Variabili per gestione display
int d=0; //Contatore decine
int u=0; //Contatore unità
int i=0;
//variabili gestione monitor
unsigned long tempoCorrente,tempoIniziale;

// the setup routine runs once when you press reset:
void setup() {                
  //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  //Inizializza segmenti TIL311 di DP1 (Decine)
  for(i=0;i<4;i++){
  pinMode(pin1[i], OUTPUT);
  } 
  pinMode(BL1,OUTPUT);
  digitalWrite(BL1,LOW); //Accende il display decine
  
  //Inizializza segmenti TIL311 di DP2 (Unità)
  for(i=0;i<4;i++){
  pinMode(pin2[i], OUTPUT);
  } 
  pinMode(BL2,OUTPUT);
  digitalWrite(BL2,LOW); //Accende il display unità
  tempoIniziale=millis(); //Inizializza con valore corrente 
}

// the loop routine runs over and over again forever:
void loop() {
  //Gestione PWM
  valoreTrimmer=analogRead(pinTrimmer); //Legge la tensione sul Trimmer
  delay(100); //Attende tempo di conversione
  analogWrite(BL1,valoreTrimmer/4); //Invia segnale PWM al Blank Input di Display decine
  analogWrite(BL2,valoreTrimmer/4); //Invia segnale PWM al Blank Input di Display unità
  //Legge sensore LM35
  //Calcola media di 50 acquisizioni per rendere più stabile ed immune ai rumori la lettura sul sensore LM35
  media=0;
  for(i=0;i<50;i++){
    valoreSensore=analogRead(pinLM35);
    media+=valoreSensore;
    delay(10);
  }
  media=media/50;
  tensione=media*5/1023; //Valore della tensione letta in ingresso
  temp=tensione*100;//Valore di tensione convertito in temperatura
  d=temp/10;//Calcolo le decine
  u=temp-(d*10);//Calcolo le unità
  
  //Gestione monitor seriale (aggiorna ogni 10 sec)
  tempoCorrente=millis();
  if(tempoCorrente-tempoIniziale>10000){
    stampa();
    tempoIniziale=tempoCorrente;
  }
  //Aggiorna cife display
  //Display decine
  for(i=0;i<4;i++){
   digitalWrite(pin1[i],TIL[i][d]);
  }
  //Display unità
  for(i=0;i<4;i++){
   digitalWrite(pin2[i],TIL[i][u]);
  }
  delay(500);//Lettura ogni 500ms
}

void stampa(){
Serial.println("Stampa acquisizioni:");  
Serial.print("valoreTrimmer:");
Serial.println(valoreTrimmer);
Serial.print("valoreSensore LM35 (ultimo):");
Serial.println(valoreSensore);
Serial.print("media (media di 50 acquisizioni):");
Serial.println(media);
Serial.print("tensione (media*5/1023):");
Serial.println(tensione);
Serial.print("Temperatura in gradi Celsius:");
Serial.println(temp);
Serial.print("Decine (temp/10):");
Serial.println(d);
Serial.print("Unita' (temp-d*10):");
Serial.println(u);
Serial.println();
}

Per saperne di più sul PWM

https://www.arduino.cc/en/Tutorial/PWM

https://www.arduino.cc/en/Reference/AnalogWrite