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 anzuschließen (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 gefrorenem Kondensat bildet die langsam taut, erwartete ich mir einen Luftfeuchtigkeitswert im Bereich der Sättigung. (was dann auch deutlich im Plot zu sehen ist).