Lämpömittari 7-segmenttinäytöllä. ISO. - Osa 4.
Aika päivättää tätäkin blogia välillä. Blogithan on aina vain tauolla, niitä ei koskaan lopeteta.
Edellisessä postauksessa viittä vaille valmis lämpömittari on nyt ollut paikallaan ulkoseinällä pari talvea ja toiminut koko ajan ongelmitta. Se näkyy hyvin viereiselle tielle ja ainakin ohikulkijat katsovat mittarin suuntaan, ehkä siitä on hyötyäkin joillekin, vaikka näiden projektien päätarkoitus ei ole tlopputuloksen hyöty, vaan projekti itsessään on hyödyllinen.
Mittarin lukema päivitetään 15 minuutin välein, jolloin samalla sammutetaan näyttö, mitetaan ympäristön valaistus ja sytytetään näyttö uudelleen päivitetyllä lämpötilalukemalla ja kirkkaudella. Toimii hyvin näin, eikä sammuminen haittaa mitään. Päinvastoin, sen harvan kerran kun lyhyen sammumisen onnistuu näkemään, se kertoo samalla, että mittarin on hengissä ja toimii.
Adruinon Nanon luotettavuus on yllättänyt positiivisesti. Se on toiminut ilman yhtään häiriötä niin talven pakkasissa kuin kesien helteissäkin.
Alla on Arduinon koodi. Myönnän, en varmasti osaa ohjelmointikielen kaikkia koukeroita, saatan tehdä joitain asioita liian hankalasti ja saatan kirjottaa rumaa ja siivotonta koodia toisinaan. Jos se toimii, siivoan sitä vain varoen.
// Ulkoseinälämpömittari 1.0
// Arduino Nano / DS18B20
// 4.12.2021 - Kaj Luukko
// Kirjastot
#include
#include
//OneWire määritellään pinniin 2
OneWire oneWire(2);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
// Määritellään muuttujat
long mittausvali = 15; //Mittausväli minuuteissa
int a1=1,b1=0,c1=3,d1=4,e1=6,f1=7,g1=8;
int a2=19,b2=18,c2=17,d2=16,e2=15,f2=13,g2=12,h2=11;
int a3=9,b3=10;
int kirk = 5; //kirkkauden säätöön käytetty PWM-pinni
int kirkkaus = 255;
float luku,mittaus;
int eka,toka;
char merkki;
int valaistus = 0;
int numerot1[10][7]={
{1,1,1,1,1,1,0}, //0
//{0,0,0,0,1,1,0}, //1
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,0,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,1,0,1,1}, //9
};
int numerot2[13][8]={
{1,1,1,1,1,1,0,0}, //0
{0,1,1,0,0,0,0,0}, //1
{1,1,0,1,1,0,1,0}, //2
{1,1,1,1,0,0,1,0}, //3
{0,1,1,0,0,1,1,0}, //4
{1,0,1,1,0,1,1,0}, //5
{1,0,1,1,1,1,1,0}, //6
{1,1,1,0,0,0,0,0}, //7
{1,1,1,1,1,1,1,0}, //8
{1,1,1,1,0,1,1,0}, //9
{0,0,0,0,0,0,1,0}, //-
{0,0,0,0,0,0,1,1}, //+
{1,1,1,1,1,1,1,1} //kaikki
};
int numerot3[3][2]={
{1,0}, //-
{1,1}, //+
{0,0}, //ei mitään
};
void setup() {
mittausvali = mittausvali * 60000;
pinMode(a1,OUTPUT);
pinMode(b1,OUTPUT);
pinMode(c1,OUTPUT);
pinMode(d1,OUTPUT);
pinMode(e1,OUTPUT);
pinMode(f1,OUTPUT);
pinMode(g1,OUTPUT);
pinMode(a2,OUTPUT);
pinMode(b2,OUTPUT);
pinMode(c2,OUTPUT);
pinMode(d2,OUTPUT);
pinMode(e2,OUTPUT);
pinMode(f2,OUTPUT);
pinMode(g2,OUTPUT);
pinMode(h2,OUTPUT);
pinMode(a3,OUTPUT);
pinMode(b3,OUTPUT);
pinMode(kirk,OUTPUT);
analogWrite(kirk,0);
sammuta();
start();
}
void loop() {
sensors.requestTemperatures();
mittaus=sensors.getTempCByIndex(0);
mittaus = mittaus - 1; // Mittauksen kalibrointi (tarvittaessa)
//Etumerkin valinta
luku = mittaus;
merkki = 'p';
if (luku<0 -1="" 0.5="" aksinumeroisessa="" eka="" ensimm="" eteen="" etumerkki="" hajotus="" if="" isen="" ja="" kahteen="" ksinumeroisessa="" laitetaan="" luku="luku" luvussa="" m="" merkki="2;" numeron="" numeroon="" p="" paikalle="" ristys="" toka="luku-eka*10;" y="">0){
if (merkki=='m'){merkki=0;}
if (merkki=='p'){merkki=1;}
}
nauta_merkit();
//Mitataan valaistus
valaistus = analogRead(6);
//Lasketaan näytön kirkkaus valaistusmittauksen perusteella
kirkkaus = 0.24 * valaistus + 63;
if (kirkkaus > 255) {
kirkkaus = 255;
}
if (kirkkaus < 80) {
kirkkaus = 80;
}
kirkasta();
delay(mittausvali);
himmenna();
//Tämä tauko tarvitaan LDR:n hitauden takia, jotta mittaa ympäristöä eikä näyttöä itseään
delay(1500);
}
// Sammuttaa kaikki segmentit
void sammuta(){
digitalWrite(a1,LOW);
digitalWrite(b1,LOW);
digitalWrite(c1,LOW);
digitalWrite(d1,LOW);
digitalWrite(e1,LOW);
digitalWrite(f1,LOW);
digitalWrite(g1,LOW);
digitalWrite(a2,LOW);
digitalWrite(b2,LOW);
digitalWrite(c2,LOW);
digitalWrite(d2,LOW);
digitalWrite(e2,LOW);
digitalWrite(f2,LOW);
digitalWrite(g2,LOW);
digitalWrite(h2,LOW);
digitalWrite(a3,LOW);
digitalWrite(b3,LOW);
analogWrite(kirk,0);
}
// Sammuttaa näytön liukuvasti nollasta asetettuun kirkkauteen
void himmenna() {
for(int i=kirkkaus;i>=0;i--){
analogWrite(kirk,i);
delay(4);
}
}
// Sytyttää näytön liukuvasti nollasta asetettuun kirkkauteen
void kirkasta() {
for(int i=0;i<=kirkkaus;i++){
analogWrite(kirk,i);
delay(4);
}
}
void nauta_merkit() {
//Näytetään oikea merkki
digitalWrite(a1,numerot1[toka][0]);
digitalWrite(b1,numerot1[toka][1]);
digitalWrite(c1,numerot1[toka][2]);
digitalWrite(d1,numerot1[toka][3]);
digitalWrite(e1,numerot1[toka][4]);
digitalWrite(f1,numerot1[toka][5]);
digitalWrite(g1,numerot1[toka][6]);
//Näytetään keskimmäinen merkki
digitalWrite(a2,numerot2[eka][0]);
digitalWrite(b2,numerot2[eka][1]);
digitalWrite(c2,numerot2[eka][2]);
digitalWrite(d2,numerot2[eka][3]);
digitalWrite(e2,numerot2[eka][4]);
digitalWrite(f2,numerot2[eka][5]);
digitalWrite(g2,numerot2[eka][6]);
digitalWrite(h2,numerot2[eka][7]);
//Näytetään vasen merkki
digitalWrite(a3,numerot3[merkki][0]);
digitalWrite(b3,numerot3[merkki][1]);
}
// Ajetaan virran kytkemisen jälkeen yhden kerran
void start() {
sammuta();
eka=12;
toka=8;
merkki=1;
nauta_merkit();
kirkasta();
delay(1000);
himmenna();
kirkasta();
delay(1000);
himmenna();
kirkasta();
delay(1000);
himmenna();
sammuta();
delay(2000);
analogWrite(kirk,255);
for (int i=9;i>=0;i--){
delay(500);
eka=i;
toka=i;
nauta_merkit();
analogWrite(kirk,255);
delay(500);
analogWrite(kirk,0);
}
analogWrite(kirk,255);
delay(2000);
sammuta();
delay(2000);
}
0>
Minä rakensin aikoinaan lämpömittarin johon tarvitsi transistorin 2222. Näyttö oli puolen tulitikkuaskin kokoinen.
VastaaPoista