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.



Mittari kalibroitiin kiehuvalla vedellä (100 °C) ja vedellä, jossa jäämurkaa seassa (0 °C). Näiden pisteiden perusteella lukemaa piti ohjelmallisesti pudottaa yhdellä asteella. Mittari ei näytä asteen desimaaleja ja se on nykyisellään tarkooitukseensa nähden varsin tarkka. Näyttää samaa kuin lähellä oleva lasiputkimittari.

Kirkkauden säätöä varten mittarissa on valovastus, joka mittaa ympäristön valoisuuden ja säätää näytön kirkkautta vastaavasti; mitä valoisampaa ulkona, sen kirkkaamalle näyttö säädetään. Valovastus osoittautui huonoksi valinnaksi tähän tarkoitukseen. Se toimii kyllä, mutta on äärimmäisen hidas. Näyttö pitää sammuttaa kokonaan noin sekunniksi, jotta valovastus ei mittaa näytön omaa valoa. Fotodiodi tai -transistori toimisi tässä nopeammin ja kykenisi mittaamaan ympäröstön valoa sammuttamalla näyttö vain ehkä vain sekunnin sadasosan ajaksi, jolloin kirkkauden sädän voisi tehdä täysin huomaamattomasti.

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);
}






Kommentit

  1. Minä rakensin aikoinaan lämpömittarin johon tarvitsi transistorin 2222. Näyttö oli puolen tulitikkuaskin kokoinen.

    VastaaPoista

Lähetä kommentti

Tämän blogin suosituimmat tekstit

Vacuum Tube Tesla Coil Staccato Controller with Arduino

Linnunpöntön porttilaskuri

Käämintäkone