Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

pV- diagram

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 ptp-t-diagram van een brandblusser bestuderen en gebruiken om de specifieke warmte verhouding γ\gamma te bepalen voor lucht.

Experiment (60 min)

In dit experiment vullen we een brandblusser met lucht (P1,T1=TatmP_1, T_1=T_{atm}). We laten de lucht snel ontsnappen (P2=Patm,T2P_2=P_{atm}, T_2), 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 (P3,T3=TatmP_3,T_3=T_{atm}).

In het eerste deel van het proces geldt:

T1γP11γ=T2γP21γT_1^\gamma P_1^{1-\gamma} = T_2^\gamma P_2^{1-\gamma}

ook wel bekend als ... , met γ\gamma de specifieke warmte verhouding: γ=CpCV\gamma=\frac{C_p}{C_V}.

Het tweede deel van het proces kan beschreven worden met de wet van Gay-Lussac:

P2T2=P3T3\frac{P_2}{T_2} = \frac{P_3}{T_3}

Onder de aanname dat T1=T3=TatmT_1 = T_3 = T_{atm} volgt hieruit:

γ=lnP1lnPatmlnP1lnP3\gamma=\frac{\ln{P_1}-\ln{P_{atm}}}{\ln{P_1}-\ln{P_3}}

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_fit
data1=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)
<Figure size 640x480 with 1 Axes>
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)

<Figure size 640x480 with 1 Axes>
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)
<Figure size 640x480 with 1 Axes>
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);
}