Dieses Blog durchsuchen

HYT939 und NTC an Matlab über Arduino


In den letzten Blogeinträgen habe ich mit dem Arduino einen NTC-Widerstand  über einen Spannungsteiler an den Analogeingang des Arduino-UNO angeschlossen und ihn als eigenständiges Programmchen am Arduino als Temperatursensor laufen lassen. Die aktuellen Messwerte wurden auf einem LC-Display angezeigt. Dann habe ich die selbe Hardware über die Matlab Software und das "Arduino for Matlab"-Package betrieben und mittels Matlabcode direkt den Temperaturverlauf geloggt. Im vorhergehenden Blog war dann ein kombinierter Temperatur und Luftfeuchtigkeitssensor (Type HYT939) an der Reihe, der über den I²C Bus am Arduino seine Daten lieferte und wieder am LCD ausgegeben hat.

In diesem Bericht kommt nun wieder Matlab ins Spiel. Hier habe ich versucht, beide Sensoren, den NTC am Analogeingang und den HYT am I²C Bus, gleichzeitig auszulesen. Das sollte über einen mehrere Minuten andauernden Zeitraum passieren, wobei die Messwerte gleich mitgeloggt werden, um sie danach in einem Vergleichsdiagramm zu plotten. Der Hardwareaufbau ist wieder ganz einfach. Der NTC ist in Serie mit einem 2k2 Widerstand geschaltet. Die Enden des Spannungsteilers gehen an die +5V Versorgung und GND und der Teilerpunkt wird an den A0 - Eingang des Arduino Uno angeschlossen. Der HYT bekommt ebenfalls seine 5V vom Arduino selbst und an A4 und A5 ist der I²C anzuschliessen (genaue Pinbelegung s. vorgehenden Bericht). Jetzt fehlt noch das Matlab-Script. Es ist hier einzusehen:

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 % Beispielscript um mit ArduinoUno einen Temperaturverlauf aufzuzeichnen  
 % Sensoren an A0 (Spannungsteiler mit NTC) und HYT939 an I2C  
 % 03/2016 by I.Bihlo  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 a = arduino('com4','Uno','libraries','I2C')  
 analogpin=0; %Anschlusspin analog des UNO  
 analog=0; %Variable für den Analogwert festlegen  
 nn=600; %anzahl der messpunkte  
 addr='0x28'; %addresse für digitalsensor  
 bus=i2cdev(a, addr) %i2c object erzeugen  
 %ein paar konstanten für die weiteren berechnungen  
 r=2200; %Spannungsteilerwiderstand  
 rt=0; %das wird der errechnete widerstand des NTC  
 urt=0; %das wird der errechnete Spannungsabfall am NTC  
 % konstanten für berechnung der Temperatur aus NTC Widerstand  
 % B25=3977K  
 a1=3.354016E-03;  
 b1=3.2569850E-04;  
 c1=2.61013E-06;  
 d1=6.38309e-08;  
 rref=2200;  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 % Lesen des I2C Bus  
 % Lesen eines Temperaturabhängigen Widerstandes am Analog Eingang A0  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 for x=1:nn  
 %%%% Analog   
 analog(x)=readVoltage(a, analogpin); %Liest den AnalogIn von A0 und gibt in Volt aus  
 urt(x)=5-analog(x); %spannungsabfall am NTC   
 rt(x)=(r/analog(x))*urt(x); %widerstand des NTC  
 pause(0.5);  
 %%%%Digital  
 data = read(bus, 4); %4 byte von i2c auslsesen  
 pause(0.5);  
 %Rohdaten aus Puffer lesen und zusammenbauen  
 humrawh=dec2bin(data(1),8); %byte 1 auf 8bit festlegen in binär wandeln  
 humrawl=dec2bin(data(2),8); %byte 2 auf 8bit festlegen in binär wandeln  
 humrawall=strcat(humrawh,humrawl); % beide bins concentenaten  
 humraw=bin2dec(humrawall); % die ganze kette wieder in dec wandeln  
 %tempraw=uint16(data(3))*256+uint16(data(4));  
 temprawh=dec2bin(data(4),8);  
 temprawl=dec2bin(data(3),8);  
 temprawall=strcat(temprawl,temprawh);  
 temprawall=temprawall(1:14); %% die letzten beiden bits abschneiden  
 tempraw=bin2dec(temprawall);  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 % Humidity berechnen lt. Datenblatt  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 hum(x)=double(100/(16384-1))*double(humraw);  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 % Temperatur berechnen lt. Datenblatt  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
 temp(x)=double(165/(16384-1))*double(tempraw)-40.0;  
 %berechung der analogtemperatur  
 rvsrref(x)=rt(x)/rref;   
 tempa(x)=1/(a1+(b1*log(rvsrref(x)))+(c1*(log(rvsrref(x)^2)))+(d1*(log(rvsrref(x)^3))));  
 tempc(x)=tempa(x)-273.15 %Kelin in Celsius umrechnen  
 pause(1);  
 end  
 clear a;  
 time=1:nn;  
 %plotten der daten  
 figure(1);  
 subplot(2,1,1);  
 plot(time,tempc,'m');  
 grid on; hold on;  
 %plot(time,analog,'b');  
 %plot(time,rt/1000,'r');  
 %plot(time,urt,'g');   
 plot(time,temp,'g');  
 legend('Temperatur NTC[°C]','Temperatur HYT939 [°C]');  
 %legend('Analogspannung des ADC','Widerstand des NTC in kOhm','Spannung am NTC','Temperatur [°C]');  
 subplot(2,1,2);  
 plot(time,hum,'m');  
 grid on; hold on;  
 legend('Rel Luftfeuchtigkeit HYT939 [%RH]');  
 %ende  

Nachdem der Code nun nach einigen Anpassungen läuft, habe ich beide Sensoren (wie am Titelbild zu sehen) nebeneinander angeordnet und vor Beginn der Messung mit Kältespray (Kälte75 von KontaktChemie) heruntergekühlt. Dann startete das Script und begann aufzuzeichnen. Im Ergebnis sollte der Verlauf der Erwärmung auf die Raumtemperatur zu sehen sein. Da die Kälte am Metallgehäuse des HYT sofort eine Schicht aus geforenem Kondensat bildet die langsam taut, erwartete ich mir einen Luftfeuchtigkeitswert im Bereich der Sättigung. (was dann auch deutlich im Plot zu sehen ist).