Arduino LCD Thermometer
Recentelijk heb ik een nieuw Arduino project (on-stream) gedaan, namelijk het maken van een LCD thermometer. Hiermee bedoel ik dan het aansturen van een temperatuursensor waarbij de temperatuur weergegeven wordt op een LCD display. Later in het proces heb ik het display zo aangepast dat de kleuren en de teksten veranderen per temperatuur groep. In deze post zie je mijn gebruikte temperatuur groepen voor het “normale” Nederlandse weer. Wil je de sensor echter gebruiken om de temperatuur van je processor te meten dan kun je gemakkelijk de temperatuur groepen aanpassen naar koude, normale en hete waardes voor de processor. Let’s go!
Voor dit project heb je een aantal onderdelen nodig, namelijk:
- Arduino (ik werk met een UNO)
- Grove Board
- Grove Temperature Sensor v1.2 (meet van -40 tot 125 graden Celcius)
- Grove LCD RGB Backlight (JHD1313M3)
- Grove bekabeling
De reden dat ik gebruik maak van de Grove onderdelen is omdat ik ze heb. . . simpel! Dat is ook het grote voordeel van Grove onderdelen het is allemaal simpel aan te sluiten. Door 1 kabel aan te sluiten voorzie je het aangesloten apparaat van stroom, signaal en ground en je hebt geen resistors nodig. Dit project is prima uit te voeren met losse onderdelen en een breadboard. De code zal hiermee slechts op een paar onderdelen veranderen. Het aansluiten is echter meer werk omdat je dan elke onderdeel moet aansluiten met een stroom, ground en signaal pin op de Arduino. Ook moet je uitrekenen of resistors nodig zijn voor de onderdelen zodat ze niet overbelast worden. Bij ons is het aansluiten dus een eitje. Dit doen we als volgt:
We schuiven het Grove Board over de Arduino Uno en vervolgens bevestigen we de temperatuursensor aan de A0 (analoge input 0) en het LCD display aan de I2C pin. De I2C bus is gekozen omdat we hier te maken hebben met synchrone seriële data. De aansluiting is dus supereenvoudig. Nog even een belangrijke opmerking, zorg ervoor dat je het Grove Board volt schakelaar op 5V zet. Op 3V zal het LCD display te weinig power ontvangen en geen tekst kunnen laten zien.
Nu de hardware aangesloten is ziet dit er als volgt uit:
Het word nu tijd om ons druk te maken over de code waarmee we de apparaten aan gaan sturen.
Arduino LCD Thermometer Sketch
Laten we eerst de basisonderdelen uit de sketch bekijken. Allereerst moeten we een aantal libraries toevoegen. Wire.h voegen we toe om over I2C te kunnen communiceren. Math.h hebben we nodig om de gelezen volts om te zetten naar temperatuur en de rgb_lcd.h library gebruiken we om het LCD scherm aan te kunnen sturen.
#include <Wire.h> //Include wire library to communicate with the I2C bus #include <math.h> #include "rgb_lcd.h" //Include LCD library |
Vervolgens definiëren we een aantal variabelen. De uitleg van de variabele staat vermeld achter de variabele. De thermistor is de elektrische weerstand van de temperatuursensor welke afhankelijk is van de temperatuur. Deze definiëren we om later de gelezen volts succesvol om te kunnen zetten in graden Celcius. Ook definiëren we de default kleuren voor het LCD scherm.
//Variables float temp; //Define the temp float variable float tempf; //Define the Fahrenheit float variable int sensor = 0; // sensor analog pin 0 const int R0 = 100000; //Define Resistence float variable R0 = 100k int B=4275; //B value of the thermistor rgb_lcd lcd; float colorR = 255; float colorG = 252; float colorB = 6; |
Binnen de eenmalige setup loop definieren we o.a. het LCD display. We vertellen de Arduino dat deze 2 rijen en 16 kolommen heeft. Vervolgens zeggen we dat de actieve positie rij 0 en kolom 0 is (de eerste positie links bovenin) en dat we daar het woord “Temp: “ printen.
void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Set LCD Color lcd.setRGB(colorR, colorG, colorB); //goto first column (column 0) and first line (Line 0) lcd.setCursor(0,0); //Print at cursor Location lcd.print("Temp: "); |
In de loop gaan we de temperatuur lezen en printen in op het LCD Display. Allereerst wijzen we variabele A toe aan de analoge input. Vervolgens bereken we de huidige resistentie van de temperatuursensor welke we toewijzen van de R variabele. Dan gaan we de actuele temperatuur berekenen. Dit gebeurt middels een ingewikkelde formule waarmee de gelezen volts omgerekend worden naar graden Celcius. Tenslotte laten we deze temperatuur zien op rij 0, kolom 8.
//assigning a variable to the analog output of tempsensor int a = temp = analogRead(sensor); //get the resistance of the sensor; float R = 1023.0/a-1.0; R = R0*R; //Calculating temperature in Celcius float temp = 1.0/(log(R/R0)/B+1/298.15)-273.15; //move the cursor to position 8 on row 1 lcd.setCursor(8,0); //print the temperature in Celsius lcd.print(temp); |
Tenslotte wachten we 5 seconden alvorens de loop opnieuw start en opnieuw de temperatuur meer. De temperatuur wordt dus 12x per minuut gelezen en geupdate:
//wait 5 seconds delay(5000); |
De gehele sketch ziet er nu als volgt uit:
/* Temperature Sensor Arduino with Groove LCD Display en Temperature Sensor V1.2 2018 Copyright (c) Jarno Baselier & Seeed Technology Inc. All right reserved. Author:Jarno Baselier 2018-09-28 */ #include <Wire.h> //Include wire library to communicate with the I2C bus #include <math.h> #include "rgb_lcd.h" //Include LCD library //Variables float temp; //Define the temp float variable int sensor = 0; // sensor analog pin 0 const int R0 = 100000; //Define Resistence float variable R0 = 100k int B=4275; //B value of the thermistor //Variables to define default background color of LCD rgb_lcd lcd; float colorR = 255; float colorG = 252; float colorB = 6; void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Set LCD Color lcd.setRGB(colorR, colorG, colorB); //goto first column (column 0) and first line (Line 0) lcd.setCursor(0,0); //Print at cursor Location lcd.print("Temp: "); } /* Read the temperature from the sensor, change it to Celsius and display it on the first row. Then change it again to Fahrenheit and display it on the second row. Repeat the process every 5 seconds */ void loop() { //assigning a variable to the analog output of tempsensor int a = temp = analogRead(sensor); //get the resistance of the sensor; float R = 1023.0/a-1.0; R = R0*R; //Calculating temperature in Celcius float temp = 1.0/(log(R/R0)/B+1/298.15)-273.15; //move the cursor to position 8 on row 1 lcd.setCursor(8,0); //print the temperature in Celsius lcd.print(temp); //wait 5 seconds delay(5000); } /********************************************************************************************************* END FILE *********************************************************************************************************/ |
Door het toevoegen van een extra loop aan het einde van de sketch definiëren we de temperatuurgroepen. De volgende groepen heb ik gedefinieerd:
- >24 – Hoger dan 24 graden
- >=23 – Hoger of gelijk aan 23 graden (dus tussen 23 en 24 graden)
- >=20 – Hoger of gelijk aan 20 graden (dus tussen 20 en 23 graden)
- >=10 – Hoger of gelijk aan 10 graden (dus tussen 10 en 20 graden)
- >=0 – Hoger of gelijk aan 0 graden (dus tussen 0 en 10 graden)
- <0 – Lager dan 0 graden
Op deze volgorde loopen we door de temperatuur groepen heen. Als het warmer is dan 24 graden dan doe actie, zo niet is het warmer dan 23 graden en doe actie, zo niet is het warmer dan 20 graden etc. Als we van kou naar warm gaan werkt het niet. De sketch zou dan kijken of het kouder is dan 0 graden en zo niet dan doorgaan. De sketch zou dan kijken of het warmer is dan 0 graden. Dit klopt meestal en dus wordt de actie uitgevoerd. Ook als het 23 graden is. Het is warmer dan 0 graden en dus wordt de actie uitgevoerd welke we bij “>=0” hebben gedefinieerd en niet de actie van “>=23”. We gaan dus door de groepen loopen van warm naar koud.
De acties die we op basis van temperatuur gaan uitvoeren is het weergeven van een bericht op de 2e regel van het LCD display en het veranderen van de kleur van het LCD display. Deze loop ziet er dan als volgt uit:
if (temp >= 24) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("F*cking HEET!"); colorR = 255; colorG = 0; colorB = 0; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 23) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("Lekker, lekker!"); colorR = 253; colorG = 171; colorB = 42; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 20) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("I like this!"); colorR = 252; colorG = 255; colorB = 0; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 10) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("Lente in aantocht!"); colorR = 255; colorG = 162; colorB = 212; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 0) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("Kacheltje aan!"); colorR = 233; colorG = 233; colorB = 233; lcd.setRGB(colorR, colorG, colorB); } else if (temp <= 0) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("F*king KOUD!"); colorR = 6; colorG = 146; colorB = 255; lcd.setRGB(colorR, colorG, colorB); } |
De gehele sketch is dan als volgt:
/* Temperature Sensor Arduino with Groove LCD Display en Temperature Sensor V1.2 2018 Copyright (c) Jarno Baselier & Seeed Technology Inc. All right reserved. Author:Jarno Baselier 2018-09-28 */ #include <Wire.h> //Include wire library to communicate with the I2C bus #include <math.h> #include "rgb_lcd.h" //Include LCD library //Variables float temp; //Define the temp float variable int sensor = 0; // sensor analog pin 0 const int R0 = 100000; //Define Resistence float variable R0 = 100k int B=4275; //B value of the thermistor //Variables to define default background color of LCD rgb_lcd lcd; float colorR = 255; float colorG = 252; float colorB = 6; void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Set LCD Color lcd.setRGB(colorR, colorG, colorB); //goto first column (column 0) and first line (Line 0) lcd.setCursor(0,0); //Print at cursor Location lcd.print("Temp: "); } /* Read the temperature from the sensor, change it to Celsius and display it on the first row. Then change it again to Fahrenheit and display it on the second row. Repeat the process every 5 seconds */ void loop() { //assigning a variable to the analog output of tempsensor int a = temp = analogRead(sensor); //get the resistance of the sensor; float R = 1023.0/a-1.0; R = R0*R; //Calculating temperature in Celcius float temp = 1.0/(log(R/R0)/B+1/298.15)-273.15; //move the cursor to position 8 on row 1 lcd.setCursor(8,0); //print the temperature in Celsius lcd.print(temp); /* print the temperature in Fahrenheit lcd.print(tempf); */ //print message based on the temperature if (temp >= 24) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("F*cking HEET!"); colorR = 255; colorG = 0; colorB = 0; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 23) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("Lekker, lekker!"); colorR = 253; colorG = 171; colorB = 42; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 20) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("I like this!"); colorR = 252; colorG = 255; colorB = 0; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 10) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("Lente in aantocht!"); colorR = 255; colorG = 162; colorB = 212; lcd.setRGB(colorR, colorG, colorB); } else if (temp >= 0) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("Kacheltje aan!"); colorR = 233; colorG = 233; colorB = 233; lcd.setRGB(colorR, colorG, colorB); } else if (temp <= 0) { lcd.print(" "); //Reset 2nd row lcd.setCursor(0,1); lcd.print("F*king KOUD!"); colorR = 6; colorG = 146; colorB = 255; lcd.setRGB(colorR, colorG, colorB); } //wait 5 seconds delay(5000); } /********************************************************************************************************* END FILE *********************************************************************************************************/ |
Je temperatuurmeter ziet er nu toch echt een stuk flitsender uit: