Mit einer Thermosäule lasst die Leistung (Energie pro Sekunde) bzw. Intensität (Energie pro Sekunde und pro m²) von Wärmestrahlung bestimmen. Herzstück einer Thermosäule ist ein sog. Peltierelement. Dieses beruht auf der sog. thermo-elektrischen Spannung. Kombiniert man zwei Drahtstücke verschiedener Metalle und bringt die beiden Kontaktstellen auf unterschiedliche Temperatur, so misst man eine sog. Thermospannung. Beim Peltierelement sind viele solcher „Drahtstücke“ hintereinander und abwechselnd angeordnet, um den Effekt zu verstärken.
Strahlt man nun zum Beispiel mit einem Laser auf eine mit Russ geschwärzte Seite des Peltierelements, so wird dessen Strahlung absorbiert und diese Seite erwärmt sich geringfügig. Dadurch kann an den beiden Kabeln des Peltierelements eine ebenfalls sehr kleine Thermospannung U gemessen werden. Diese ist ein Maß für die absorbierte Strahlungsleistung P.
Um den Zusammenhang U = U(P) zu ermitteln, werden auf eine Seite des Peltierelements mehrere SMD-Widerstände in Serie aufgeklebt. Danach legt man an diese Widerstandsreihe eine bestimmte Spannung an, berechnet die elektrisch zugeführte Leistung P und misst die Thermospannung U. In meinem Fall erhielt ich die lineare Beziehung U = (1/11.26) · P. Eine Leistung von z.B. 20 mW erzeugte eine Thermospannung von 1.776 mV. Umgekehrt entspricht eine Spannung von 1 mV einer Strahlungsleistung von 11.26 mW. Diese Beziehung wird für die Bestimmung der Strahlungsleistung P im Arduino-Programm benötigt.
Das Peltierelement besitzt eine Fläche von 40 x 40 mm² = 1600 mm². Um auf die Strahlungsintensität (Leistung pro m²) schließen zu können, muss die am Peltierelement auftreffende Leistung einfach mit dem Faktor (1000000/1600) = 625 multipliziert werden. Beträgt etwa die am Peltierelement auftreffende Leistung 5 mW, so würden auf 1 m² genau 5 * 625 = 3125 mW = 3.125 W auftreffen, was dann einer Intensität von 3.125 W/m² entspricht.
Auf diese Weise kann zum Beispiel die Solarkonstante überprüft werden. Dies ist die Strahlungsintensität, welche die Sonne am Ort der Erde erzeugt. Sie liegt bei rund 1500 W/m². Weiters kann mit einem sog. Lesliewürfel das Stefan-Boltzmann-Gesetz überprüft werden. Ein schwarzer Strahler mit der Temperatur T und der Fläche A strahlt eine Leistung von P = σ · A · T^ 4 ab. Sigma ist die sog. Stefan-Boltzmann-Konstante, wobei gilt: σ = 5.67 · 10^–8 W/K^ 4·m².
Ist er nicht schwarz, so kommt noch der Emissionskoeffizient epsilon zum Tragen. Es gilt daher abschließend:
P = σ · ε · A · T^ 4
Ein Lesliewürfel besitzt auf seinem Mantel 4 unterschiedliche Oberflächen, z.B. schwarz, spiegelnd weiß usw. Diese besitzen einen unterschiedlichen Emissionskoeffizienten epsilon. Füllt man nun den Lesliewürfel mit heißem Wasser der Temperatur T, so kann man mit der Thermosäule je nach Ausrichtung des Würfels eine zur Strahlungsleistung proportionale Spannung messen. Trägt man U bzw. P gegen T^ 4 – T0^ 4 auf, so müsste man Geraden mit unterschiedlichen Steigungen (entsprechend dem epsilon der Würfelseite) erhalten.
Auch kann man das 1/r ^ 2 Abstandsgesetz der Strahlungsintensität überprüfen, indem man etwa eine Glühbirne im Abstand r von der Thermosäule postiert und dann U bzw. P in Abhängigkeit von r ermittelt.
Da die Ausgangsspannungen der Thermosäule sehr gering sind (im µV-mV Bereich), werden sie zunächst mit einem Operationsverstärker vom Typ AD8551 10-fach verstärkt. Erst dann gelangen sie zum AD-Wandlermodul ADS1115. Schlussendlich wird am Display die Thermospannung (in µV), die auf das Peltierelement insgesamt auftreffende Strahlungsleistung (in mW) und die pro m² auftreffende Strahlungsintensität (= Strahlungsleistung · 625; in W/m²) angezeigt.
Mit einem Taster können die angezeigten Werte auf 0 gesetzt werden, falls eine Spannung/Leistung/Intensität OHNE Strahlungsquelle angezeigt wird (= offset).
Vom Verein AATiS wird eine solche Thermosäule (https://www.aatis.de/content/bausatz/AS516_Thermo%E2%80%90S%C3%A4ule) zu einem sehr günstigen Preis angeboten!
Arduino-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
#include <LiquidCrystal_I2C.h> #include <Wire.h> #include <Adafruit_ADS1015.h> //Adafruit_ADS1015 ads1015; // Construct an ads1015 at the default address: 0x48 //Adafruit_ADS1115 ads1115(0x49); // construct an ads1115 at address 0x49 Adafruit_ADS1115 ads1115; // Construct an ads1115 at the default address: 0x48 int16_t adc0, adc1, adc2, adc3; float voltage; float Leistung; float Intensitaet; float offset; const int buttonPin = 2; // the number of the pushbutton pin int buttonState = 1; // variable for reading the pushbutton status LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display. ACHTUNG: Adresse kann auch 0x3F sein !!! // Anschlüsse: // GND - GND // VCC - 5V // SDA - ANALOG Pin 4 // SCL - ANALOG pin 5 // =========================== // ======= SETUP ========= // =========================== void setup() { offset = 0.0; // Initialisierung des offsets Serial.begin(9600); pinMode(buttonPin, INPUT); lcd.init(); // initialize the lcd lcd.backlight(); lcd.setCursor(0,0); lcd.print("Thermosaeule"); lcd.setCursor(0,1); lcd.print("uV-Meter"); delay(4000); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" "); //ads1015.begin(); // Initialize ads1015 ads1115.begin(); // Initialize ads1115 // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- // ads1115.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3 mV 0.1875 mV (default) // ads1115.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2 mV 0.125 mV // ads1115.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1 mV 0.0625 mV // ads1115.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5 mV 0.03125 mV // ads1115.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25 mV 0.015625 mV // ads1115.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125 mV 0.0078125 mV ads1115.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 0.0625mV } // =========================== // ======= LOOP ========= // =========================== void loop() { buttonState = digitalRead(buttonPin); // button for new offset if (buttonState == LOW) { offset = ads1115.readADC_SingleEnded(0) * 1.0; // Einlesen des aktuellen Wertes = offset offset = offset * 0.0625; offset = offset / 10.0; // offset-Spannung in mV vor der Verstärkung delay(100); } adc0 = ads1115.readADC_SingleEnded(0); /* adc1 = ads1115.readADC_SingleEnded(1); adc2 = ads1115.readADC_SingleEnded(2); adc3 = ads1115.readADC_SingleEnded(3); */ voltage = adc0 * 0.0625; // vom ADS1115 eingelesene Spannung in mV nach der Verstärkung voltage = voltage / 10.0; // reale Eingangsspannung in mV vor der Verstärkung (gain = 10) Leistung = (voltage - offset) * 11.26; // Auf den Sensor auftreffende Strahlungsleistung in mW. Kalibrierung hat ergeben: 11.26 mW/mV Intensitaet = (voltage - offset) * 7.0375; // Strahlungsintensität in W/m². Kalibrierung hat ergeben: 7.0375 W/m²/mV Serial.print("AIN0: "); Serial.println(adc0); Serial.print(" U = "); Serial.print(voltage*10.0,2); Serial.println(" mV"); /* Serial.print("AIN1: "); Serial.println(adc1); Serial.print("AIN2: "); Serial.println(adc2); Serial.print("AIN3: "); Serial.println(adc3); */ lcd.setCursor(0,0); lcd.print("U = "); lcd.print(voltage,2); lcd.print(" mV "); lcd.setCursor(0,1); lcd.print("I = "); lcd.print(Intensitaet,2); lcd.print(" W/m2 "); delay(3000); buttonState = digitalRead(buttonPin); // button for new offset if (buttonState == LOW) { offset = ads1115.readADC_SingleEnded(0) * 1.0; // Einlesen des aktuellen Wertes = offset offset = offset * 0.0625; offset = offset / 10.0; // offset-Spannung in mV vor der Verstärkung delay(100); } adc0 = ads1115.readADC_SingleEnded(0); voltage = adc0 * 0.0625; // vom ADS1115 eingelesene Spannung in mV nach der Verstärkung voltage = voltage / 10.0; // reale Eingangsspannung in mV vor der Verstärkung (gain = 10) Leistung = (voltage - offset) * 11.26; // Auf den Sensor auftreffende Strahlungsleistung in mW. Kalibrierung hat ergeben: 11.26 mW/mV Intensitaet = (voltage - offset) * 7.0375; // Strahlungsintensität in W/m². Kalibrierung hat ergeben: 7.0375 W/m²/mV lcd.setCursor(0,0); lcd.print("P = "); lcd.print(Leistung,1); lcd.print(" mW "); lcd.setCursor(0,1); lcd.print("I = "); lcd.print(Intensitaet,2); lcd.print(" W/m2 "); delay(3000); } |