Hallo Leute,
Ich habe als Projekt eine Grundumsatzmessung zu realisieren mit verschiedenen Sensoren.
Da aber der CO2 und der O2 unterschiedlich lang messen müssen muss (CO2 sowei berechnung des Flusses 20ms und O2 nur alle 5s).
Wenn ich das Programm mit Delay() ausführe wie bisher, sind die Messungen jedoch zu langsam und zu ungenau da die Sensoren verschiedene ansprechzeiten haben.
Ich verwende einen Arduino UNO und dachte daran dieses Problem mit einem Interrupt zu lösen.
Da ich mich mit arduino so gut wie kaum auskenne und mit den Angaben zu Interrupts nicht viel anfangen konnte wollte ich euch um Tipps oder mögliche Hilfestellungen bitten um mein Problem lösen zu können.
Ich hoffe ihr könnt mir weiterhelfen.
Hier mein Derzeitiger Programmcode:
#include <SDP6x.h>
#include <SoftwareSerial.h>
#include <Wire.h>
char buf[50];
int state = 0;
float difPressure;
String co2wert;
String o2wert;
int i = 0;
float dt = 0.06;
float volumen = 0;
float pres1 = 0;
float pres2 = 0;
float dif = 0;
int n = 0;
float avolumen = 0;
int l = 0;
float flow = 0.0;
SoftwareSerial co2Serial(2, 3);
SoftwareSerial o2Serial(4, 5);
void setup() {
Serial.begin(9600);
co2Serial.begin(9600);
o2Serial.begin(9600);
Wire.begin();
difPressure = 0.0;
}
void loop() {
while(true){
i = i + 1;
l = l + 1;
// Geradengleichung 25Pa Sensor.....fluss = 0.143267 * difPressure + 0.003008;
// Ausgabe des Differenzdruckes:
difPressure = SDP6x.GetPressureDiff();
Serial.print("Differenzdruck: ");
Serial.print(difPressure);
Serial.print(" Pa ");
// Ausgabe und Brechnung des Volumsfluss:
flow = 0.12137 * difPressure + 0.026848;
Serial.print(" Volumenfluss: ");
Serial.print(flow);
Serial.print(" l/s ");
// Ausgabe und Berechnung des Volumens:
if (i == 1) {
pres1 = 0.12137 * difPressure + 0.026848;
}
if (i > 1) {
pres2 = 0.12137 * difPressure + 0.026848;
dif = (pres2 + pres1)/2;
volumen = volumen + dif * dt;
pres1 = pres2;
// Serial.print(" Volumen: ");
// Serial.print(volumen);
}
if (difPressure < 0.1) {
if (l > 0) {
n = n + 1;
avolumen = volumen;
volumen = 0;
l = 0;
}
}
// Ausgabe und Berechnung der O2 und CO2 Konzentrationen:
// Ausgabe und Berechnung der O2-Konzentration
o2Serial.listen();
if (o2Serial.isListening()) {
Serial.print(" O2: ");
sprintf(buf, "M 0 \r\n");
sprintf(buf, "O\r\n");
o2Serial.print(buf); //Befehl wird dem Sensor übergeben
delay(80);
while (o2Serial.available()) {
char c = o2Serial.read();
if (c == 'O' && state == 0) {
state = 1;
}
else if (state == 1) { // blank after Z is ignored
state = 2;
}
else if (state == 2) {
o2wert = c;
state = 3;
}
else if (state == 3) {
o2wert = o2wert + c;
state = 4;
}
else if (state == 4) {
o2wert = o2wert + c;
state = 5;
}
else if (state == 5) {
o2wert = o2wert + c;
state = 6;
}
else if (state == 6) {
o2wert = o2wert + c;
Serial.print((float)o2wert.toInt()/10,3);
Serial.print(" % ");
state = 0;
}
}
}
Serial.print(" O2 Ausatem: ");
Serial.print(((float)o2wert.toInt()/10)-((float)co2wert.toInt()/1000));
Serial.print(" % ");
// Ausgabe und Berechnung der CO2-Konzentration
co2Serial.listen();
if (co2Serial.isListening()) {
Serial.print(" CO2: ");
sprintf(buf, "K 1 \r\n");
sprintf(buf, "Z\r\n");
co2Serial.print(buf);
delay(80);
while (co2Serial.available()) {
char c = co2Serial.read();
if (c == 'Z' && state == 0) {
state = 1;
}
else if (state == 1) {
state = 2;
}
else if (state == 2) {
co2wert = c;
state = 3;
}
else if (state == 3) {
co2wert = co2wert + c;
state = 4;
}
else if (state == 4) {
co2wert = co2wert + c;
state = 5;
}
else if (state == 5) {
co2wert = co2wert + c;
state = 6;
}
else if (state == 6) {
co2wert = co2wert + c;
Serial.print((float)co2wert.toInt()/1000,3);
Serial.print(" % ");
Serial.print(" ");
Serial.println(" ");
state = 0;
}
}
}
//Berechnen des Grundumsatzes:
if(avolumen > 0.1){
Serial.print(" VolZug: ");
Serial.print(avolumen);
Serial.print(" Grundumsatzumsatz: ");
Serial.print((((float)o2wert.toInt()/10)-((float)co2wert.toInt()/1000))*4.83*avolumen);
Serial.println(" kcal/kg ");
}
}
}