5049+ beoordelingen
Bestel voor 16:00 voor dezelfde dag verzending
14 dagen retour
NL
Particulier
Zakelijk
In dit project ga je leren hoe je een thermometer maakt met een Arduino. De temperaturen die gemeten worden gaan je laten zien op een zeven segmenten scherm. Als sensor gebruiken we een DS18B20 temperatuur sensor. Voor het zeven segmenten scherm gebruiken we een 2-digit 7-segment LED rood.
De DS18B20 is een digitale temperatuur sensor. Die makkelijk met een Arduino communiceert door één data pin. De linker pin van de sensor moet aangesloten worden op de GND (-). De middelste pin wordt aangesloten op een analoge data pin en de rechter word aangesloten op de VCC (5v). De DS18B20 is te krijgen in een waterdichte en een niet beschermde versie. De waterdichte versie wordt vaak gebruikt in vloeistoffen of vochtige ruimtes. De “kale” sensor wordt vaak gebruikt voor het meten van de buitentemperatuur.
De DS18B20 kan temperaturen meten tussen de -55 en de 125 graden Celsius. Met een nauwkeurigheid van 0,5 tussen de -10 en de 85. Het is niet aan te raden om de sensor bloot te stellen aan temperaturen boven de 100 graden Celsius. In principe is voor het gebruik van deze sensor alleen de GND en de data pin nodig. Alleen zijn de waardes dan zo laag dat ze niet te lezen zijn. Om de waardes hoger te maken moet er een “step-up” weerstand gebruikt worden. Dit is in het geval van deze sensor een 4,7K Ohm weerstand die tussen de VCC en de data-aansluiting wordt geplaatst.
Een 7-segmenten display komt in heel veel verschillende soorten en maten. Voor dit project gebruiken we een met 2 cijfers en 18 aansluit pins. De lay-out van de pins staan in de afbeelding hieronder. In dit project gebruiken we de DP aansluitingen niet. Zoals je kan zien in de afbeelding hieronder heeft elk “streepje” een eigen letter(s). In dit project is er geen ruimte voor eigen inbreng bij het aansluiten van het display. Zodra de volgorde niet hetzelfde is zal de codering niet goed werken.
Het display kan na lang gebruik redelijk warm worden. Dit kan onder de 80 graden Celsius geen kwaad.
Nu je alle onderdelen hebt kan je beginnen met het aansluiten van de onderdelen. Hieronder zie je een tekening hoe je de onderdelen aansluit op het Breadboard en de Arduino. let wel op dat je de DS18B20 goed aansluit, als je deze verkeerd om aansluit kan de sensor kapot gaan. De sensor heeft een platte en een bolle kant. De Platte kant is de voorkant. De ground pin zit dan aan de linker kant.
De meeste lijnen codering worden besteed aan de 7-segmenten display. Deze heeft veel codering nodig dit komt doordat er geen simpele bibliotheek voor is. Daarnaast bestaat de codering uit wat standaard lijnen en het aflezen van de sensor.
In het begin zorgen we dat alles goed opgezet word. Je moet de bibliotheken voor de sensor toevoegen. Daarna aangeven op welke pin de data binnenkomt. Vervolgens voer je die data in de bibliotheken. Nu komen we bij het gedeelte van de 7-segmenten display aan. We maken een array aan. In deze array moeten we aangeven hoeveel cijfers we gaan toevoegen in dit geval 10 (0-90. Ook moeten we aangeven hoeveel waardes er per cijfer is. Vervolgens ga je de gegevens per cijfer aangeven dit doe je door middel van HIGH of LOW. De 7 waardes die je gaat geven staat voor de 7 segmenten in het display (a, b, c, d, e, f, g). Als een segment op HIGH wordt ingesteld zal dat segment oplichten.
Als je dit allemaal gedaan hebt moeten we nog zorgen dat we de cijfers apart kunnen bedienen. Dit gaan we doen door een 3de en 4de void aan te maken. Deze void’s moeten we in het begin al oproepen. Nu de hele voorbereiding klaar is gaan we naar de setup. Hier starten we de sensor en de seriële communicatie. Daarna geven we aan welke pins input en welke output zijn, hierbij zijn pin 14 en 15 analoge pin A0 en A1.
Vervolgens kunnen we beginnen aan de hoofdcodering. Als eerste vragen we aan de sensor de waardes die hij meet. Daarna voegen we deze waardes aan een variabelen. Deze waarde is een getal met twee cijfers achter de komma. Dit is een probleem omdat we maar 2 cijfers kunnen laten zien. Voor het eerste cijfer (D1) moeten we de waarde delen door 10 en dan het eerste cijfer voor de komma pakken. Voor het tweede cijfer (D2) gebruiken we de normale waarde en pakken we het eerste cijfer voor de komma. Zo zou je bij een waarde van 23,45 op D1 2 krijgen en op D2 3 krijgen. Vervolgens moeten we deze cijfers nog vertalen zodat de juiste segmenten gaan branden. Dit doen we door te verwijzen naar de 3de en 4de void waar we deze vertaling gaan doen. Als laatste binnen de grote codering schrijven we de temperatuur op de seriële monitor.
Voor de 3de en 4de void wordt dezelfde codering gebruikt alleen een andere begin pin. Voor het werken van deze codering is het belangrijk dat de a t/m g van een cijfer ook achter elkaar aangesloten is. Dus van D1 zit a op pin 2 en g op pin 8. Zo kan je om naar het volgende segment te gaan gewoon 1 op tellen bij de variabele voor de pin.
Om de we beginnen de void met aangeven waar de a van dat cijfer zit aangesloten. Vervolgens maken we een for loop aan die zichzelf in totaal 7 keer afspeelt. Dit zodat je langs alle segmenten gaat en alle waardes die moeten ingevoerd worden. In deze loop beginnen we met vertellen wat hij moet doen met bij de eerste pin. Door te verwijzen naar de array. Elke keer dat deze void wordt herhaalt komt er 1 bij de pin bij dus gaat hij naar het volgende segment.
Dit werkt hetzelfde voor de 4de void. Alleen heeft hij dan een andere begin pin.
/*
Deze code gaan we gebruiken voor het programmeren van een thermometer.
De temperatuur gaan je laten zien op een 2-digit 7-segment Led.
Deze temperatuur wordt in graden celcius weergegeven.
Kijk op https://elektronicavoorjou.nl/arduino-info/arduino-projecten/ voor meer projecten met Arduino.
*/
// Deze twee library's zijn voor de temperatuur sensor.
#include <OneWire.h>
#include <DallasTemperature.h>
// Hier geven we aan dat de temperatuur sensor op A2 zit aangesloten.
#define DATA A2
// Hier geven we de nodige data aan de library's om van de data graden celcius te maken.
OneWire Data(DATA);
DallasTemperature sensor(&Data);
// Hier maken we een array aan voor de cijfer van de display.
int bcd_array[10] [7] =
{ //{A, B, C, D, e, f, g, dp},
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW}, // 0
{ LOW, HIGH, HIGH, LOW, LOW, LOW, LOW}, // 1
{ HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH}, // 2
{ HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH}, // 3
{ LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH}, // 4
{ HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH}, // 5
{ HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH}, // 6
{ HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW}, // 7
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH}, // 8
{ HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH} // 9
};
// Hier verwijzen we naar de 3de en 4de void die we hebben aangemaakt voor het schrijven op het 7-segment display.
void BCD0(int);
void BCD1(int);
void setup()
{
// Aanzetten van de sensor.
sensor.begin();
// Seriële communicatie starten.
Serial.begin(9600);
// Alle inputs en outputs aangeven.
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(A2, INPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
}
void loop()
{
// Waardes van sensor vragen.
sensor.requestTemperatures();
// Waarde aan variabel geven.
int temp = sensor.getTempCByIndex(0);
// Zorgen dan van 23 de 2 op het eerste cijfer komt en 3 op de tweede.
int D1 = (temp / 10) % 10;
int D2 = temp % 10;
delay(1000);
// Verwijzen naar de 3de en 4de void.
BCD0(D1);
BCD1(D2);
// Temperatuur schrijven op Seriële monitor.
Serial.println(temp);
}
// 3de void
void BCD0(int number)
{
// Aangeven op welke pin de D1 (a) staat.
int pin = 2;
// Begin bij digitale pin 2 en tel elke keer 1 op. Tot en met dat je bij de 6de pin komt.
// Elke herhaling gaat hij 1 stapje verder in de array.
for (int j = 0; j <= 6; j++)
{
// Led in display aanzetten op de hiervoor aangegeven pin. Wel of niet aan ligt aan de array.
digitalWrite(pin, bcd_array[number][j]);
pin++;
}
}
// Zelfde als BCD0 maar dan voor het 2de cijfer.
void BCD1(int number)
{
int pin = 9;
for (int j = 0; j <= 6; j++)
{
digitalWrite(pin, bcd_array[number][j]);
pin++;
}
}