Šoreiz autors ir izveidojis elektrisko principiālo shēmu, kuru var izmantot, lai noteiktu, piemēram, istabas temperatūru. Shēmas darbības princips ir balstīts uz ATmega328P sērijas mikrokontrollera, izmantojot termosensoru, kur tiek nolasīts temperatūras sensora izejas spriegums, kurš tālāk, izmantojot mikrokontrolleri, tiek pārveidots temperatūrā, kura pēc tam tiek attēlota uz 7 segmentu displejiem. Tā kā mikrokontrollerim ir ierobežots izvadu skaits, tad, izmantojot bipolāros tranzistorus, protams, mikrokontrolleri to vadībai, tiek veikta 7 segmentu displeju multipleksēšana.
Displeji tiek pārslēgti tik ātri, ka cilvēkam liekas, ka displeji ir nepārtraukti ieslēgti.
1.1.att. Termometra tests, izmantojot prototipēšanas plati
1.2.att. Termometra elektriskā principiālā shēma
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include<avr/io.h>
#include<util/delay.h>
#include <avr/interrupt.h>
void Init_ADC();
unsigned int Read_ADC();
void Num_to7SEG(unsigned int Num);
void LED_on();
void LED_off();
void FAN_on();
void FAN_off();
void First_SEG_on();
void First_SEG_off();
void Second_SEG_on();
void Second_SEG_off();
void Third_SEG_on();
void Third_SEG_off();
int main(){
DDRB=0x3F;
DDRD=0xFF;
DDRC=0x00;
unsigned int desmiti=0, ADC_value=0, vieni=0, temperatura=0;
int j=0;
_delay_ms(50);
Init_ADC();
while(1){
ADC_value = Read_ADC();
for (j=0;j<100;j++){
temperatura = ADC_value/2.05;
if(temperatura>=30){
FAN_on();
LED_on();
}
else{
FAN_off();
LED_off();
}
desmiti = temperatura/10;
vieni = temperatura%10;
Num_to7SEG(desmiti);
First_SEG_on();
_delay_ms(5);
First_SEG_off();
Num_to7SEG(vieni);
Second_SEG_on();
_delay_ms(5);
Second_SEG_off();
Third_SEG_on();
_delay_ms(5);
Third_SEG_off();
}
}
return 0;
}
void LED_on(){
PORTD |= (1<<PD5);
}
void LED_off(){
PORTD &= ~(1<<PD5);
}
void First_SEG_on(){
PORTD |= (1<<PD1);
}
void First_SEG_off(){
PORTD &= ~(1<<PD1);
}
void Second_SEG_on(){
PORTD |= (1<<PD2);
}
void Second_SEG_off(){
PORTD &= ~(1<<PD2);
}
void Third_SEG_on(){
PORTD |= (1<<PD4);
PORTD |= (1<<PD0);
PORTB = 0x23;
}
void Third_SEG_off(){
PORTD &= ~(1<<PD4);
}
void FAN_on(){
PORTD |= (1<<PD3);
}
void FAN_off(){
PORTD &= ~(1<<PD3);
}
void Num_to7SEG(unsigned int Num){
switch(Num){
case (0):
PORTD &= ~(1<<PD0);
PORTB = 0x3F;
break;
case (1):
PORTD &= ~(1<<PD0);
PORTB = 0x06;
break;
case (2):
PORTD |= (1<<PD0);
PORTB = 0x1B;
break;
case (3):
PORTD |= (1<<PD0);
PORTB = 0x0F;
break;
case (4):
PORTD |= (1<<PD0);
PORTB = 0x26;
break;
case (5):
PORTD |= (1<<PD0);
PORTB = 0x2D;
break;
case (6):
PORTD |= (1<<PD0);
PORTB = 0x3D;
break;
case (7):
PORTD &= ~(1<<PD0);
PORTB = 0x07;
break;
case (8):
PORTD |= (1<<PD0);
PORTB = 0x3F;
break;
case (9):
PORTD |= (1<<PD0);
PORTB = 0x2F;
break;
default:
PORTD &= ~(1<<PD0);
PORTB = 0x3F;
break;
}
}
void Init_ADC(){
ADMUX=(1<<REFS0); // Iestata atbalsta sprieguma vertibu (Vcc jeb +5 V)
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Iespejo ACP izmantosanu
// Atlauj ACP ar frekvences dalitaju 128
}
/* ADC takts frekvence =
16000000/128 = 125000
=125KHz */
unsigned int Read_ADC(){
ADMUX |= 0x00;
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));
return (ADC);
// Tiek atgriezta ACP vertiba
}