15. Rekenen met de computer

15. Rekenen met de computer

Doel van deze Experience

In deze Experience gaan we uitleggen hoe een computer rekent en welke bewerkingen je hiermee kunt maken. Ook leer je hoe je je eigen functies kunt maken.

Wat heb je nodig?

  • Arduino bord
  • Multimeter met kabels
  • LDR
  • weerstand van 10kΩ
  • 2 spijkers en draad

De Experience

We hebben al bij de verschillende Experiences gezien dat we, op basis van bepaalde invloeden en waardes, “output” op een scherm kunnen plaatsen, of een LED kunnen laten branden. Om nu te kijken of er aan bepaalde voorwaarden wordt voldaan kunnen we rekenen met de computer. De rekenkundige voorbeelden die we hier behandelen zijn optellen, aftrekken, vermenigvuldigen en delen. Dit is precies hetzelfde als wat je op school hebt geleerd, bijvoorbeeld:

3 + 5 = 8
8 – 4 = 4
2 x 2 = 4
10 ÷ 5 = 2

Onderstaande tabel laat zien dat de computer net iets anders werkt dan wij als mens. In computertaal gebruiken we de “*” in plaats van de “x” voor het vermenigvuldigen, dit is een internationaal teken en zo weten we zeker dat de instructie niet verward wordt met de letter “x”. Voor het delen gebruiken we een schuine streep “/”.

rekenen

Je kunt dus op de computer bovenstaande berekeningen maken. Je kunt dit echter ook doen met de variabelen die we tijdens de vorige Experiences hebben geleerd.

 

Waar moet je op letten.

De berekeningen op de computer worden uitgevoerd afhankelijk van het gekozen datatype. Als een variabele een integer is dan zal na bijvoorbeeld een deling de uitkomst ook een integer zijn en zal deze worden afgerond. We hebben hier een aantal voorbeelden beschreven.

uitleg

 

Functies

Als een bepaalde instructie vaker voorkomt, kunnen we hier een functie van maken. Dit is een klein stukje code met een naam die we in het programma steeds kunnen gebruiken. We gaan dit uitleggen aan de hand van een omreken voorbeeld. Zoals je weet meten we de temperatuur in Europa in graden Celsius, afgekort als ºC. In de Verenigde staten van Amerika wordt de temperatuur echter weergegeven in graden Fahrenheit afgekort als ºF.  Hieronder zie je een tweetal thermometers, de linkse geeft de temperatuur aan in Celsius en de rechtste in Fahrenheit.

cel_fah

Er is een formule hoe je van Celsius naar Fahrenheit en van Fahrenheit naar Celsius kunt omrekenen;

formule2

We gaan dit controleren aan de hand van bovenstaande thermometer;

Bij 32ºF; (32-32)/1,8 = 0 / 1,8 = 0   –> dit klopt

Bij 212ºF; (212-32)/1,8 = 180 / 1,8 = 100   –> dit klopt

Je ziet dus dat als je deze formule in een functie plaatst, je deze steeds kunt gebruiken om om te rekenen.

We kunnen de volgende formule gebruiken om van Celsius naar Fahrenheit om te zetten.

formule1

Berekenen nu zelf of dit klopt, 100º C is …. º Fahrenheit.

Omzetten naar een functie

We kunnen deze berekening zetten in een functie die er als volgt uit ziet;

float celsiusToFahrenheit(float degreesCelsius){
return (degreesCelsius * 1.8) + 32;
}

  • De functienaam is “celsiusToFahrenheit” je ziet dat hij met hoofdletters is, in het Engels en ook goed beschrijft wat hij doet.
  • Het data type van de functie is “float”
  • De naam van de input is degreesCelsius en ook van het type “float”
  • Met de return en achterliggende formule wordt de uitkomst toegekend aan deze functie.

 

Opdracht 1

Probeer nu zelf de conversie van Fahrenheit naar Celsius in een stukje code te beschrijven.

Converteren van grafieken in een formule

We gebruiken de rekeninstructie ook om allerlei waardes die we straks gaan inlezen, om te zetten naar bruikbare informatie. Stel, we gaan een temperatuur sensor aansluiten die een bepaalde spanning afgeeft afhankelijk van de temperatuur.

temperatuur_spanningsgrafiekbullets

We hebben metingen gedaan en met de multimeter de spanning gemeten die de sensor afgeeft bij een bepaalde temperatuur. Deze waarden hebben in een grafiek gezet, dit zijn de bolletjes. Zoals je in bovenstaande grafiek ziet is er een lineair verband tussen de temperatuur en de spanning. Lineair betekent dat de grafiek een rechte lijn is en de verhouding tussen de spanning en de gemeten temperatuur overal gelijk is.  We kunnen daarom ook een rechte lijn door de verschillende punten heen trekken.

Bij 20 °C geeft de sensor een spanning van 10 mV
Bij 40 °C geeft de sensor een spanning van 60 mV

We kunnen deze grafiek gebruiken en omzetten in een formule. Worden de temperaturen lager dan 20ºC en hoger dan 40ºC dan weten we niet zeker of deze formule ook mogen gebruiken, het zou best kunnen dat de grafiek buiten de gemeten temperatuur niet linear is namelijk. De factor die we straks moeten gebruiken in het programma kunnen we eenvoudig vinden door het verschil uit te rekenen:

We zien dat als de temperatuur  20 graden hoger wordt (van 20º naar 40º), de spanning 50 mV stijgt ( van 10mV naar 60 mV) We delen nu deze 2 uitkomsten: 50 / 20 = 2,5. Dit is de factor die we straks gebruiken om de exacte temperatuur te meten.

Voorbeeld:

Meten we straks een spanning uit de sensor van 40 mV dan is de temperatuur:

40 mV – 10 mV = 30 mV verschil met de 20°C meting. We berekenen nu: 30 / 2,5 = 12

Als we deze 12 bij de 20 optellen zal de temperatuur 32 °C zijn. Als je gaat kijken in de grafiek dan klopt dit precies: 40 mV komt overeen met 32 °C.

Let op bij deze berekening, je mag dus niet 40 mV door 2,5 delen en dan concluderen dat de temperatuur 16 °C is. Dit kan alleen als de grafiek bij 0 °C ook 0 mV aangeeft en dat is hier niet het geval! Daarom gebruiken we hier het punt in de grafiek waarop 20 °C overeen komt met 10 mV.

Als we een schakeling gaan bouwen om de temperatuur te meten, geeft dit voorbeeld aan hoe je met optellen en delen een gemeten waarde kunt omzetten naar een temperatuur.

De functie van deze tabel is dus;

Temperatuur in ºC = 20 ºC  + ((gemeten spanning in mV – 10mV )/  2,5) 

Opdracht 2

Probeer deze omrekening in een stukje code te programmeren als functie. Via de seriële console kun je een getal intypen, je gemeten waarde in mV, hierna schrijf je de waarde naar de terminal in graden Celsius. Gebruik hiervoor alles wat je hebt geleerd in Experience 12.

De praktijk: het meten van de lichtsterkte

We gaan nu zelf aan de slag met een meting aan de LDR. In Experience 7 heb je geleerd dat we verschillende soorten weerstanden hebben, één hiervan is de LDR. Deze “Light Depending Resistor” heeft een weerstandswaarde die afhankelijk is van de hoeveelheid licht. De sterkte van het licht wordt weergegeven in Lux. Meer informatie hierover kun je hier vinden.

Om een beeld te krijgen van hoeveel lux een bepaalde situatie heeft, kunnen we de volgende waardes gebruiken:

  • Zonlicht: 100 000 lux
  • Daglicht, indirect zonlicht: 10 000 lux
  • Bewolkte dag: 1000 lux
  • Kantoor: 500 lux
  • Erg donkere dag: 100 lux
  • Schemering: 10 lux

Je ziet dat deze waardes nogal ver uit elkaar liggen. Als we de weerstand van de LDR gaan meten om dus zo het aantal Lux uit te rekenen, moeten we eerst weten hoeveel weerstand de LDR heeft in een bepaalde situatie. We kunnen zit zelf meten met de Multimeter. We noemen dit “ijken”, ofwel ervoor zorgen dat de uitkomsten die we straks gaan meten zo nauwkeurig mogelijk zijn.
We gaan dit in twee stappen doen eerst het ijken van de sensor en hierna het meten.

  1.  Voor we kunnen gaan meten moeten we weten wat de weerstand van de LDR is bij diverse omstandigheden. Hiervoor gebruiken we de multimeter. We zetten deze in de juiste stand en doen de volgende metingen;
  • Direct zonlicht               –> 200 Ω
  • Kantoor/huiskamer     –> 600 Ω
  • Buiten bewolkt             –> 1000 Ω

 

Opdracht 3

Sluit een LDR aan op de multimeter, zet deze op de stand “weerstand meten” en kijk of je ongeveer op dezelfde resultaten komt.

2. We bouwen de volgende schakeling met de Arduino en een tweetal weerstanden waarvan 1 de LDR is.

 

LDR aansluiting

We noemen deze schakeling een spanningsdeler. Je kunt de spanning over de LDR eenvoudig uitrekenen met de formule

 

spanningsdeler

Als de LDR 200Ω is dan zal de spanning over de LDR dus 0,098 V zijn.

spanningsdeleringevuld

In één van de volgende Experiences gaan we in detail uitleggen hoe het meten van Analoge waardes werkt. Voor nu hoef je alleen maar te weten dat deze ingang een spanning van 0 – 5 V omzet in een getal tussen de 0 en 1023. (Dit zijn 10 bits aangezien 2 tot de macht 10 gelijk is aan 1024, zie ook de Experience over binair rekenen).
Als we dit weten, weten we ook hoeveel de spanning is. We kunnen dit met een eenvoudige formule omrekenen:

U op A0 = (gemeten spanning / 1024) * 5 V

Voorbeeld:
Meten we 400, dan is de spanning (400 / 1024) x 5 V = 1,95 V
Meten we 750, dan is de spanning (750 / 1024) x 5 V = 3,66 V

Houd er rekening mee dat de LDR niet nauwkeurig is. We kunnen deze dus niet gebruiken om zeer nauwkeurig de lichtsterkte te meten, we kunnen deze wel gebruiken om het licht aan te doen als het te donker wordt. We laden deze sketch die de waarde uitleest en deze op het scherm print.

const int ldrPin=A0;

void setup() {
Serial.begin(9600);

}

void loop() {
int inputValue=analogRead(ldrPin);
Serial.println(inputValue);
delay(2000);
}

Als we dit hierna via Tools / Serial Monitor uitlezen (eerst een <Enter> geven), zien we de waardes die worden uitgelezen op het scherm verschijnen.

Deze waarde geeft dus nog niet de spanning aan, en al zeker niet het aantal Lux dat we meten. In een volgend voorbeeld gaan we dit berekenen. Anders dan bij de temperatuur grafiek is de grafiek van de LDR NIET lineair. Zoals je in onderstaande grafiek ziet is deze redelijk krom. De waarde is dan ook niet eenvoudig met een formule om te rekenen.

LDR grafiek

We gaan daarom in de Sketch een aantal waardegebruiken die we hebben gemeten bij het ijken en deze omrekenen naar de waardes die we op A0 kunnen meten. A0 is de analoge ingang op de Arduino. We hebben onderstaande tabel gemaakt;

  1. De omgeving en de weerstandswaarde zoals gemeten tijdens het ijken van de LDR.
  2. De berekende spanning over de LDR (bijv. 200 / (10.000+200))
  3. De verwachte waarde op de pin A0. 5V is een waarden van 1024. We kunnen deze dus uitrekenen door de berekende spanning waarde te delen door 5V en hierna te vermenigvuldigen met 1024. Bij 0,095 V; (0,095 / 5 ) * 1024 = 20.

spanningsdeleringevuld

Gebruik de volgende Sketch en laad deze in de Arduino (let op de “” tekens !) Je ziet hier een voorbeeld van een “if” en een “else” instructie.

//define a constant of data type int for the A0 pin
const int ldrPin = A0;

//values are taken from our calibration
const int directSunlightThreshold = 20;
const int officeThreshold = 58;
const int outsideThreshold = 93;

void setup() {
// Enable serial communication at 9600 baudrate
Serial.begin(9600);
}

void loop() {
//use the analogRead value to read the value between 0 and 1023 into variable inputValue
int inputValue = analogRead(ldrPin);
//simply write it to the Serial console
if (inputValue < directSunlightThreshold){
Serial.println(“Direct sunlight”);
}
else if (inputValue >=directSunlightThreshold && inputValue <= officeThreshold){
Serial.println(“Office /living room”);
}
else if (inputValue >=officeThreshold && inputValue <= outsideThreshold){
Serial.println(“Cloudy outside”);
}

//wait for 2 seconds
delay(200);
}

Opdracht 3: Zelf een sensor maken

bloempot
Op basis van deze informatie kunnen we heel eenvoudig een sensor maken die meet of de planten water nodig hebben. Water is een goede geleider en zal stroom doorlaten wanneer we er spanning op zetten. Als een bloempot heel droog is en dus water nodig heeft zal de weerstand hoog zijn, als de bloempot voldoende water heeft zal de weerstand lager zijn.
We kunnen dit eenvoudig zelf meten met behulp van een tweetal spijkers en aansluitdraden.
We pakken twee grote spijkers (deze zitten ook in de basis set) en sluiten deze aan met een rode en zwarte draad. We verwijderen de LDR en plaatsen de twee aansluitingen op de plaats van de LDR. Je past de Sketch aan en geeft hem een nieuwe naam die je zelf bedenkt.
Pas de tijd aan van de wachtloop naar 0,5 s. zodat je snel resultaten kunt zien. Als je een natte spons of handdoek pakt kun je beginnen met testen:
Als de spijkers los liggen meet je 1023, dat klopt, er loopt geen stroom en je meet de volle spanning.
Zet je de spijkers aan de uiteinden van de spons, dan meet je een lagere waarde.
Zet je de spijkers dichter bij elkaar dan verlaag je de weerstand en de spanning. Je ziet dat ook de waarde die je meet vermindert.
Wanneer je de spijkers tegen elkaar aanhoudt meet je de waarde 0, dit klopt want als je in het schema kijkt zie je dat we dan een kortsluiting maken en de meet pen A0 aan de massa hangen.
Als je de snoeren lang genoeg maakt kun je meten bij welke waarde je opnieuw water moet geven.

Maak op basis van deze gegevens een Sketch waarbij je drie niveau’s kunt meten. Te Droog, Te Nat, Normaal. Zet een bloempot op je bureau en ijk het systeem. Wat voor waardes meet je als het droog is ? giet er wat water bij, dit is de Normale toestand. Giet er nog extra water bij zodat hij veel te Nat is. Maak nu de sketch die op basis van deze gegevens in het display aangeeft “Te Droog”, of “Normaal” of “te Nat”.

 

Opdracht 4

Bij de opdracht van de LDR heb je gezien dat we een spanningsdeler hebben gemaakt met een weerstand van 10k. Doordat deze waarde zo hoog is kunnen we niet zo nauwkeurig meten. We hebben hier bij voorkeur een weerstand van rond de 1000 Ω. We gaan de volledige meting van de LDR nogmaals doen met deze nieuwe waardes;

  • Zet 5 weerstanden van 220 Ω in serie en MEET de echte waarde met de multimeter
  • Maak een tabel om de te verwachten spanningswaarde over de LDR en de waarde op A0 uit te rekenen. Je mag dit ook in Excel of een ander rekensheet doen.
  • Pas de sketch aan met de nieuwe waardes.

Wat heb je deze Experience geleerd;

  • De instructie If, else , while
  • Het vergelijken van waarden
  • Het rekenen met de Arduino.

 

 

TestenStatus

Een reactie plaatsen