In onderstaande video kan u zien dat we een grote bend - sensor hebben gemaakt dat we later in het project zullen gebruiken.
Door gebruik te maken van een "conductive rubber cord" (https://www.adafruit.com/product/519) kunnen we een analoog signaal creëeren. Het werkt eigenlijk als een soort potentiometer. In "relaxed state" is de weerstand ong. 137 ohms per cm. Hoe harder je trekt hoe groter de weerstand wordt. We hebben de code voor een thermal resistor (thermistor) gebruikt.
Analog Voltage Reading Method
To measure the temperature, we need to measure the resistance. However, a microcontroller does not have a resistance-meter built in. Instead, it only has a voltage reader known as a analog-digital-converter. So what we have to do is convert the resistance into a voltage, and we'll do that by adding another resistor and connecting them in series. Now you just measure the voltage in the middle, as the resistance changes, the voltage changes too, according to the simple voltage-divider equation. We just need to keep one resistor fixed
Say the fixed resistor is 10K and the variable resistor is called R - the voltage output (Vo) is:
Vo = R / (R + 10K) * Vcc
Where Vcc is the power supply voltage (3.3V or 5V)
Now we want to connect it up to a microcontroller. Remember that when you measure a voltage (Vi) into an Arduino ADC, you'll get a number.
ADC value = Vi * 1023 / Varef
So now we combine the two (Vo = Vi) and get:
ADC value = R / (R + 10K) * Vcc * 1023 / Varef
What is nice is that if you notice, if Vcc (logic voltage) is the same as the ARef, analog reference voltage, the values cancel out!
ADC value = R / (R + 10K) * 1023
It doesn't matter what voltage you're running under. Handy!
Finally, what we really want to do is get that R (the unknown resistance). So we do a little math to move the R to one side:
R = 10K / (1023/ADC - 1)
Lots of people have emailed me to tell me the above equation is wrong and the correct calculation is R = 10K*ADC / (1023 - ADC). Their equivalence is left as an exercise for the reader! ;)
Great, lets try it out. Connect up the thermistor as shown:
📷
Connect one end of the 10K resistor to 5V, connect the other end of the 10K 1% resistor to one pin of the thermistor and the other pin of the thermistor to ground. Then connect Analog 0 pin to the 'center' of the two.
// the value of the 'other' resistor#define SERIESRESISTOR 10000 // What pin to connect the sensor to#define THERMISTORPIN A0 void setup(void) { Serial.begin(9600);} void loop(void) { float reading; reading = analogRead(THERMISTORPIN); Serial.print("Analog reading "); Serial.println(reading); // convert the value to resistance reading = (1023 / reading) - 1; // (1023/ADC - 1) reading = SERIESRESISTOR / reading; // 10K / (1023/ADC - 1) Serial.print("Thermistor resistance "); Serial.println(reading); delay(1000);}
You should get responses that correspond to the resistance of the thermistor as measured with a multimeter
If you are not getting correct readings, check that the 10K resistor is placed between VCC and A0, and the thermistor is between A0 and ground. Check you have a 10K Thermistor and that you are using a 'standard' NTC thermistor. On a "5V" microcontroller like classic Arduino or Metro 328, use 5V for the VCC pin. On 3.3V microcontrollers like Feather or Arduino Zero, use 3.3V for the VCC pin.
If, when you heat up the thermistor, the temperature reading goes down, check that you don't have the two resistors swapped and check that you are using an NTC not PTC thermistor.
Better Readings
When doing analog readings, especially with a 'noisy' board like the arduino, we suggest two tricks to improve results. One is to use the 3.3V voltage pin as an analog reference and the other is to take a bunch of readings in a row and average them.
The first trick relies on the fact that the 5V power supply that comes straight from your computer's USB does a lot of stuff on the Arduino, and is almost always much noisier than the 3.3V line (which goes through a secondary filter/regulator stage!) It's easy to use, simply connect 3.3V to AREF and use that as the VCC voltage. Because our calcuations don't include the VCC voltage, you don't have to change your equation. You do have to set the analog reference but that's a single line of code
Taking multiple readings to average out the result helps get slightly better results as well, since you may have noise or fluctuations, we suggest about 5 samples.
Rewire as shown, the 10K resistor is still connected to the higher voltage, and the thermistor to ground
📷This sketch takes those two improvements and integrates them into the demo, you will have better, more precise readings.Note that this code specifies an EXTERNAL voltage reference. To work properly, you must make the additional connection to the AREF pin as shown in the diagram above. Download fileCopy Code
// which analog pin to connect#define THERMISTORPIN A0 // how many samples to take and average, more takes longer// but is more 'smooth'#define NUMSAMPLES 5// the value of the 'other' resistor#define SERIESRESISTOR 10000 int samples[NUMSAMPLES]; void setup(void) { Serial.begin(9600); // connect AREF to 3.3V and use that as VCC, less noisy! analogReference(EXTERNAL);} void loop(void) { uint8_t i; float average; // take N samples in a row, with a slight delay for (i=0; i< NUMSAMPLES; i++) { samples[i] = analogRead(THERMISTORPIN); delay(10); } // average all the samples out average = 0; for (i=0; i< NUMSAMPLES; i++) { average += samples[i]; } average /= NUMSAMPLES; Serial.print("Average analog reading "); Serial.println(average); // convert the value to resistance average = 1023 / average - 1; average = SERIESRESISTOR / average; Serial.print("Thermistor resistance "); Serial.println(average); delay(1000);}
Comments