Introductie¶
Wanneer je een gas snel samenperst bij gelijkblijvende volume neemt de temperatuur toe. Wanneer je het gas vervolgens laat ontsnappen, neemt de temperatuur af omdat het gas arbeid verricht.
We gaan eigenschappen van dit proces bestuderen. In dit practicum ga je een -diagram van een brandblusser bestuderen en gebruiken om de specifieke warmte verhouding te bepalen voor lucht.
Experiment (60 min)¶
In dit experiment vullen we een brandblusser met lucht (). We laten de lucht snel ontsnappen (), in zo’n korte tijd dat we aannemen dat dit een adiabatisch proces is. Doordat het gas arbeid verricht zal het gas afkoelen. Wanneer we dan, kort na het ontsnappen van de lucht, de kraan weer dicht doen, zal de druk weer toenemen ().
In het eerste deel van het proces geldt:
ook wel bekend als ... , met de specifieke warmte verhouding: .
Het tweede deel van het proces kan beschreven worden met de wet van Gay-Lussac:
Onder de aanname dat volgt hieruit:
2: We wachten een tijd, omdat door de lucht in de blusser te doen de temperatuur hoger is dan die van de omgeving. Door te wachten, zal die temperatuur terug gaan naar die van de omgeving.
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fitdata1=np.loadtxt('DATA.CSV', unpack=True, delimiter=',', skiprows=1)
tijd=data1[0]/1000
a= 0.007629065914957156 #bar per bit
b= 0.32797564569575144 #systematische fout, beide gevonden in druk sensor ijken
druk=data1[1] * a -b #de geijkte waarde in bar
plt.figure()
plt.plot(tijd, druk)
plt.xlabel('$t$ (s)')
plt.ylabel('$P$ (bar)')
plt.show()
patm_1 = data1[1,500] * a - b #gekeken in de plot welk punt de data van de atmosfeer zou geven
p1_1 = data1[1,7000] * a-b #gekeken in de plot welk punt de data P1 zou geven
p3_1 = data1[1,7550] * a-b #aangezien p3 best klein is, gekeken in de data zelf welk punt de data van P3 geeft
def gamma_berekenen(atmosfeer,p1,p3):
return (np.log(p1)-np.log(atmosfeer))/(np.log(p1)-np.log(p3)) #np.log geeft een ln
gamma_1 = gamma_berekenen(patm_1,p1_1,p3_1)
print ('de eerste γ is', gamma_1)
de eerste γ is 1.1260964745356479
data2=np.loadtxt('DATA2.CSV', unpack=True, delimiter=',', skiprows=1)
tijd2=data2[0]/1000
druk2=data2[1]*a-b
plt.figure()
plt.plot(tijd2, druk2)
plt.xlabel('$t$ (s)')
plt.ylabel('$P$ (bar)')
plt.show()
patm_2 = data2[1,300] * a - b
p1_2 = data2[1,5500] * a-b
p3_2 = data2[1,7000] * a-b
def gamma_berekenen(atmosfeer,p1,p3):
return (np.log(p1)-np.log(atmosfeer))/(np.log(p1)-np.log(p3)) #np.log geeft een ln
gamma_2 = gamma_berekenen(patm_2,p1_2,p3_2)
print ('de tweede gevonden γ is',gamma_2)

de tweede gevonden γ is 1.2372069679368485
data3=np.loadtxt('DATA3.CSV', unpack=True, delimiter=',', skiprows=1)
tijd3=data3[0]/1000
druk3=data3[1] * a
#print(druk)
plt.figure()
plt.plot(tijd3, druk3)
plt.xlabel('$t$ (s)')
plt.ylabel('$P$ (bar)')
plt.show()
patm_3 = data3[1,300] * a - b
p1_3 = data3[1,5000] * a-b
p3_3 = data3[1,7000] * a-b
print(patm_3,p1_3,p3_3)
def gamma_berekenen(atmosfeer,p1,p3):
return (np.log(p1)-np.log(atmosfeer))/(np.log(p1)-np.log(p3)) #np.log geeft een ln
gamma_3 = gamma_berekenen(patm_3,p1_3,p3_3)
print ('de derde γ is', gamma_3)
0.28086093060724515 5.55254547784264 0.4792166443961312
de derde γ is 1.2180913878305522
Onze gemiddelde gamma ligt op ongeveer 1.115, wat best een afstand is van de gegeven gamma van 1.45. Een mogelijke verklaring hiervoor is een slecht geijkte druksensor, waarop dan ook een vrij hoge onzekerheid lag. Nog een andere optie is dat de temperatuur niet zo snel veranderde als verwacht, waardoor T1 en T3 niet gelijk waren aan T atmosfeer, wat ook voor een andere druk zorgt.
Arduino¶
Gebruikte arduino code, heb je verder niet nodig.
#include <SPI.h>
#include <SD.h>
const int drukpin = A1;
const int CS_PIN = SDCARD_SS_PIN;
const uint32_t SAMPLE_MS = 100; // log-interval
const char* FNAME = "DATA.CSV";
void blink(uint8_t times, uint16_t onMs, uint16_t offMs, uint16_t pauseMs) {
for (uint8_t i = 0; i < times; i++) {
digitalWrite(LED_BUILTIN, HIGH);
delay(onMs);
digitalWrite(LED_BUILTIN, LOW);
delay(offMs);
}
delay(pauseMs);
}
void fatalSd() {
while (1) blink(3, 100, 100, 600); // 3 snelle
}
void fatalFile() {
while (1) blink(2, 250, 250, 800); // 2 langzame
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(drukpin, INPUT);
// Geef voeding + SD wat tijd op batterij
delay(800);
// SD init met retries (zonder Serial kun je anders niks zien)
bool ok = false;
for (int attempt = 0; attempt < 5; attempt++) {
if (SD.begin(CS_PIN)) { ok = true; break; }
blink(1, 50, 50, 200); // klein "ik probeer" knipje
delay(300);
}
if (!ok) fatalSd();
// Bestand aanmaken + header schrijven (1x), dan sluiten
File f = SD.open(FNAME, FILE_WRITE);
if (!f) fatalFile();
// Als bestand leeg is, header toevoegen
if (f.size() == 0) {
f.println("time_ms,value");
}
f.close();
// korte bevestiging
blink(5, 60, 60, 300);
}
void loop() {
static uint32_t last = 0;
uint32_t now = millis();
if (now - last < SAMPLE_MS) return;
last = now;
int value = analogRead(drukpin);
File f = SD.open(FNAME, FILE_WRITE);
if (!f) fatalFile();
f.print(now);
f.print(',');
f.println(value);
f.close(); // <- belangrijk: file echt wegschrijven
// schrijf-indicatie
digitalWrite(LED_BUILTIN, HIGH);
delay(10);
digitalWrite(LED_BUILTIN, LOW);
}