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