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); }
Minä rakensin aikoinaan lämpömittarin johon tarvitsi transistorin 2222. Näyttö oli puolen tulitikkuaskin kokoinen.
VastaaPoista