meerdere NTC's

Hallo,

Ik ben sinds kort bezig met arduino.
ik wil om te beginnen een deftige thermometer maken waar ik mijn vier verschillende temperaturen op een touchscreen kan laten komen. (nadien nog wat uitbreidingen ivm functionaliteit enz…)

op een arduino mega heb ik mn temperatuur al op het scherm, maar bij mn uno heb ik met het scherm geen pins meer over voor sensoren… kan ik dit oplossen?

Ik heb nu aan de uno een QC1602A gehangen, waarmee het wel werkt. maar dit is niet m’n bedoeling.

Is het ook mogelijk om meerdere NTC 10K sensoren op mn uno te hangen? voorlopig krijg ik er maar 1 op…

Achteraf wil ik werken met pt100 of digitale sensoren, maar mn proefopstelling is met NTC 10K’s

Alvast bedankt van een complete arduino-beginner :slight_smile: :o :o




Hoi Proost, welkom en proost !

[edit]Foto's hier maar weer verwijderd, 2 keer direct na elkaar alles laten zien is een beetje teveel van het goede[/edit]

Als je meerdere analoge signalen wil kunnen binnen halen, dan kun je denken aan analoge multiplexers.
Die zijn er à la 4051/4052/4053, maar ook in een 16 poorts 4067.
Die laatste heeft met zijn 16 ingangen misschien een beetje veel aansluit mogelijkheden, maar je hoeft ze natuurlijk niet allemaal te gebruiken.
Je kunt deze dingen gebruiken als je bijvoorbeeld een keer per seconde (of misschien wel met nog grotere tussenpauzes) de verschillende waardes wil binnen halen.
Om zestien ingangen te kunnen adresseren, hebt je dan wel 4 bits nodig, als het er (veel) minder zijn dan kun je bits laten vervallen.
Dus 8 is 3 bits en 4 is 2 bits.
Ik ken een toepassing waar men instellingen met een stuk of 10 potmeters maakt, en waar bij het opstarten van het apparaat eenmalig de instellingen worden ingelezen door op deze manier heel snel langs alle potmeters te wandelen.
Dat gaat zo snel dat niemand er iets van merkt dat dat gebeurt.

Dit soort trucs kun je ook uithalen met digitale sensoren, maar meestal kun je die dingen zelf al een eigen adres geven en via een of andere databus uitlezen.

Je hebt dus behalve die ene analoge ingang van je Arduino, ook wat aanstuur aansluitingen nodig.
In geval van de 4067 dus 4 pinnen.
Je wist uiteraard al dat analoge ingangen die je niet gebruikt, ook gebruikt kunnen worden als digitale in- of uitgang...
Verder kun je I2C port expanders gebruiken.
Die dingen worden aangestuurd via pinnen A4 en A5 (I2C dus) op je Uno, en bieden je daarvoor 8 extra digitale uitgangen.
Ik zou daarmee geen grafisch display aansturen, maar voor andere signalen die minder snel hoeven te zijn kan dat een hele uitkomst zijn.
Het zijn de dingen die ook gebruikt worden voor de I2C tweedraads 1602 LCDs.

Overigens zie ik op de foto's bij je barebone Arduino wat mogelijke twijfelachtige soldeer punten.
Das wel aan de componenten zijde dus het kan best zijn dat het aan de andere kant wel goed gesoldeerd is.
Zorg ervoor dat bij solderen, de tin voldoende uitgevloeid is (in geval je dat nog niet wist).
Oh, en een poes van 52 graden Celsius lijkt me ook niet helemaal de bedoeling...

je hebt 6 analoge ingangen, meerdere kan via mas zijn manier, of digitaal met ds sensoren.
je zult wel beter denken aan converters want de signalen zijn erg klein.

Merci alvast voor de reacties en goede tips.

Ik kan dan wel 6 NTC's gewoon op mn uno hangen?
Hoe kan ik ze dan uitlezen of weergeven op m'n seriele monitor?
Ik had vanalles wat geprobeerd, maar krijg het niet klaar...

@Mas3: de reden van de 'hete poes' is dat er, toen ik de foto nam, geen sensor aangesloten was. (Gek dat ie dan random waarden gaat displayen...)

De barebone is inderdaad gesoldeerd aan de onderzijde.

Ik denk dat je andere tips me nog goed van pas zullen komen tijdens m'n uitbreidingsfase..

Je hebt 6 analoge poorten. Nu heb je een NTC aan een analoge poort hangen (A0..A5). Dat staat in je sketch dat je een analoge read doet.
Als dit nog te ingewikkeld voor je is zou je eens kunnen overwegen wat van die basis tutorials te bekijken in de IDE. Daar zijn ze juist voor.

Nou, nee hoor Proost.
Dat ie (bijna) random waarden gaat weergeven is normaal en heeft te maken met het ontwerp van de analoge ingangen.
Het betekent dat ze redelijk gevoelig zijn, en ruis oppikken als er niets is aangesloten.
Wanneer je een uitbreidbaar systeem wil maken (zodat je er altijd nog een sensor bij kunt prikken), dan houd je daar dus rekening mee.
Je kunt hoogohmige weerstanden nemen en die met die poort verbinden.
Deze weerstanden kies je dusdanig uit, dat je een meetwaarde zou krijgen die je met een sensor nooit zou kunnen bereiken onder normale omstandigheden.
Dat is dan vaak een uitleeswaarde van 0 of 1023, respectievelijk de minimale en maximale waardes.
In dat geval zou ik een 100 K weerstand pakken, en de ingang aan GND verbinden.
Dan lees je met je Arduino vrijwel zeker een 0 uit.
Je kunt dan je sketch laten zeggen dat er op die poort geen sensor aangesloten zal zijn, en daar navenant op reageren.
Je krijgt dan dus geen spookwaarden meer te zien zoals nu.
Als je dit doet, en je sluit er wel een sensor op aan, dan beïnvloed je dus de waardes die je terug gaat lezen.
Daarom kies je hiervoor een dergelijke (zeer) hoogohmige weerstand, zodat je dat effect zoveel mogelijk beperkt.
Je kunt ook kiezen om de waarde zoveel mogelijk in het midden te laten uitkomen.
Dan dus 2 weerstanden aan de ingang, de ene naar 5 volt, de anderen naar GND.
Dan lees je altijd een waarde uit die rond 512 ligt.
Het zou zomaar kunnen zijn dat dat precies in de range zit waar je het meeste wil meten, waardoor je dan dus niet kan concluderen dat er geen sensor is aangesloten.
Een en ander is wel afhankelijk van toleranties en de omgeving, maar om dat ook te beschrijven gaat me voor nu een beetje te ver.

Hoi NicoVerduin, ik heb dat al op verschillende manieren geprobeerd, maar krijg dat niet klaar :frowning:
deze had ik:

#include <LiquidCrystal.h>
#include <Thermistor.h>

#define RSPin 6
#define EnablePin 7
#define DS4 9
#define DS5 10
#define DS6 11
#define DS7 12

#define LCDColumns 16
#define LCDRows 2

LiquidCrystal lcd(RSPin, EnablePin,DS4,DS5,DS6,DS7);
Thermistor temp(0);

void setup()
{
lcd.begin(LCDColumns, LCDRows); //Configure the LCD
lcd.setCursor(1,0);
lcd.print(“Proost digital”);
lcd.setCursor(2,1);
lcd.print(“temp control”);
Serial.begin(9600);
delay(4000);
}

void loop()
{
int temperature = temp.getTemp();
lcd.begin(LCDColumns, LCDRows); //Configure the LCD
lcd.setCursor(0,0);
lcd.print("SENSOR 1: “);
lcd.setCursor(12,0);
lcd.print(temperature);
lcd.println(” C " );
lcd.setCursor(0,1);
lcd.print("SENSOR 2: “);
lcd.setCursor(9,1);
lcd.print(“00,00”);
lcd.println(” C " );
delay(1000);

Ik dacht dan, ah ik zet
Thermistor temp(0);
Thermistor temp(1);

maar die werkt niet…

Ik kom er echt niet uit…

Mas3: dat ga ik doen! handige oplossing!

Volgens mij heb je de thermistors gedefinieerd op een digitale pin. Dus Thermistor temp(0) moet zijn Thermistor temp (A0) zijn enz.
En temp moet ook voor elke pin een andere naam krijgen.

hij steekt toch in mijn analoge pin A0, en deze werkt...

Dan is het alleen de dubbele naamgeving... Neemt niet weg dat het handiger is om het A0 te noemen enz. Je ziet de verwarring..

Inderdaad.
Maar krijg er nog steeds geen sensor bij op... :frowning:

Inderdaad, dat werkt zo niet.

Snip:

Thermistor temp(0);

Snip:

int temperature = temp.getTemp();

Deze 2 dingen zijn dus waar je mee aan het werken bent.
Misschien moet je eens denken aan temp0(0), temp1(1) enzovoorts ?

Je gebruikt een library genaamd thermistor, maar die zie ik niet terug in mijn IDE.
Als ik ga zoeken, dan vind ik wel iets over thermistor, maar dat is niet wat jij gebruikt.
Ik zie ook thermistor2, thermistor3 en thermistor4, maar alleen de 4 versie lijkt over een library te gaan.
De anderen gaan over hoe je de waarde binnenhaalt, en welke formules je er allemaal op los moet laten om tot een temperatuur te komen.
Bij jou word dat door een library gedaan.
Dus waar heb je dit vandaan, en staat daar niet iets meer vermeld ?
Wijs daar eens naar zodat er eens gekeken kan worden hoe dat werkt.

MAS3:
is het deze welke je wou zien?
thermistor.cpp
en onderaan thermistor.h
ik had daar ook al wat dingen in geprobeerd, maar het lukt me echt niet...
Ik kan wel gewoon de analoge pin veranderen, maar het lukt niet om een tweede toe te voegen.
Alvast bedankt voor jullie reacties!

/**************************************************************/
/* max mayfield  */
/* mm systems  */
/* max.mayfield@hotmail.com  */
/*  */
/* code based from code on Arduino playground found here:  */
/* http://www.arduino.cc/playground/ComponentLib/Thermistor2 */
/**************************************************************/

/* ======================================================== */

#include "Arduino.h"
#include "Thermistor.h"

//--------------------------
Thermistor::Thermistor(int pin) {
 _pin = pin;
}

//--------------------------
double Thermistor::getTemp() {
 // Inputs ADC Value from Thermistor and outputs Temperature in Celsius
 int RawADC = analogRead(_pin);

 long Resistance;
 double Temp;

 // Assuming a 10k Thermistor.  Calculation is actually: Resistance = (1024/ADC)
 Resistance=((10240000/RawADC) - 10000);

 /******************************************************************/
 /* Utilizes the Steinhart-Hart Thermistor Equation: */
 /*    Temperature in Kelvin = 1 / {A + B[ln(R)] + C[ln(R)]^3} */
 /*    where A = 0.001129148, B = 0.000234125 and C = 8.76741E-08 */
 /******************************************************************/
 Temp = log(Resistance);
 Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
 Temp = Temp - 273.15;  // Convert Kelvin to Celsius

 // - TESTING OUTPUT - remove lines with * to get serial print of data
 //Serial.print("ADC: "); Serial.print(RawADC); Serial.print("/1024");  // Print out RAW ADC Number
 //Serial.print(", Volts: "); printDouble(((RawADC*4.860)/1024.0),3);   // 4.860 volts is what my USB Port outputs.
 //Serial.print(", Resistance: "); Serial.print(Resistance); Serial.print("ohms");
 

 // Uncomment this line for the function to return Fahrenheit instead.
 //Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert to Fahrenheit

 return Temp;  // Return the Temperature
}

/* ======================================================== */

en thermistor.h

/**********************************************************************************/
/* Thermistor -- manages a 10k Thermistor in the follwing circuit:  */
/*      */
/* (Ground) ---- (10k-Resister) -------|------- (Thermistor) ---- (+5v)  */
/*                                          |  */
/*                                      Analog Pin  */
/*  */
/* code based from code on Arduino playground found here:  */
/* http://www.arduino.cc/playground/ComponentLib/Thermistor2  */
/*  */
/* max mayfield  */
/* mm systems  */
/* max.mayfield@hotmail.com  */
/**********************************************************************************/

#ifndef Thermistor_h
#define Thermistor_h

#include "Arduino.h"
#include "math.h"


class Thermistor {
public:
Thermistor(int pin);
double getTemp();
private:
int _pin;
};

#endif

Inderdaad, dat is wat ik wilde bekijken en de library die je gebruikt is wat er op de Arduino site als thermistor2 word besproken.
Daar zie je namelijk staan dat je de functie aanroept met de pin nummer tussen haakjes erbij.

Je roept in jouw code de functie thermistor aan, koppelt de variabele temp daar aan, en ingang (0).
Daarmee zou het eerder voorgestelde dus mogelijk moeten zijn:
Gebruik variabelen die voor jou duidelijk zijn.
Dat kan dus zijn temp0, temp1 enzovoorts, maar het kan ook zijn werkhuis, wc, zolder, weetikveel zijn.
Jouw probleem dat je eerder had, was dat je telkens de variabele temp vult met de gegevens van een andere sensor.
En dan gooi je dus de waarde van de vorige sensor weg.

Je kunt zaken efficiënter afhandelen in je code, maar dat maakt een en ander volgens mij voor jou niet overzichtelijker.
Over het verfijnen van je code kan er altijd later nog worden nagedacht, nadat je een en ander eenmaal werkend hebt.

Verder is deze library (net zoals alle voorbeelden die ik voorbij heb zien komen) dus met een 10 K thermistor naar 5 volt, en een 10 K weerstand naar de GND, waarmee je dus een variabele spanningsdeler creëert.
Daarmee kun je dus je schakeling geheel voorbereiden zoals ik eerder voorgesteld had, zodat je die 10 K naar GND altijd al met de analoge ingang verbindt.
Dan heb je dus wanneer er geen thermistor is aangesloten altijd een waarde van nul wat dan leidt tot de conclusie: geen sensor aangesloten.