Geht im großen und ganzen über ne fertige Bibliothek. Einschränkung hier ist allerdings, dass wegen dem Timing während der 1-Wire-Kommunikation alle Interrupt deaktiviert sein müssen. Ich denke aber fast, dass zur Erfassung der Impulse kein Interrupt nötig sein dürfte.
Da bei mir der Sensor seinen Wert jede Sekunde aktualisiert, mich der Wert aber eigentlich nur alle 5 Minuten interessiert war es mir egal.
Habe aber zur Sicherheit noch das deutlich schwankendere Analogsignal des Sensor mit ausgewertet.
Das Arduino-Programm ist dann recht übersichtlich:
Code: Alles auswählen
#include <DS18B20.h>
#include <OneWireHub.h>
volatile unsigned long aktueller_Impuls;
volatile unsigned long letzter_positiver_Impuls;
volatile unsigned long letzter_negativer_Impuls;
unsigned long letzter_negativer_Impuls_sp;
volatile unsigned long Impuls_high;
volatile unsigned long Impuls_low;
const unsigned long Aufloesung=5000;
const unsigned long Min_high=2;
const unsigned long Min_low=2;
const int PWM_Eingang=2;
const unsigned long Timeout=1500;
const int Analog_Eingang=0;
const unsigned long Analog_min=82; //~0,4V
const unsigned long Analog_max=409; //~2V
const int LED=13;
bool LED_Ausgang;
volatile unsigned long CO2_PWM;
unsigned long CO2_PWM_sp;
unsigned long CO2_Analog;
unsigned long CO2_Analog_sp;
unsigned long CO2_Analog_Diff=300;
float CO2_real;
const uint8_t pin_onewire { 3 };
auto hub = OneWireHub(pin_onewire);
auto ds18b20_pwm = DS18B20(0x28, 0x8F, 0xBD, 0x2A, 0x07, 0x00, 0x02); // DS18B20: Auswertung PWM
auto ds18b20_analog = DS18B20(0x28, 0x8F, 0xBD, 0x2A, 0x07, 0x00, 0x01); // DS18B20: Auswertung Analog
void setup() {
Serial.begin(9600);
pinMode(PWM_Eingang, INPUT);
pinMode(LED, OUTPUT);
// Interrupt definieren
attachInterrupt(digitalPinToInterrupt(PWM_Eingang), Zaehlen, CHANGE);
hub.attach(ds18b20_pwm);
hub.attach(ds18b20_analog);
Serial.println("Setup beendet");
}
void Zaehlen() {
aktueller_Impuls = millis();
if (digitalRead(PWM_Eingang)) {
Impuls_low = aktueller_Impuls - letzter_negativer_Impuls;
letzter_positiver_Impuls = aktueller_Impuls;
}
else {
Impuls_high = aktueller_Impuls - letzter_positiver_Impuls;
letzter_negativer_Impuls = aktueller_Impuls;
}
}
void loop() {
hub.poll();
if ((letzter_negativer_Impuls_sp != letzter_negativer_Impuls) && (Impuls_high > 0 ) && (Impuls_low > 0) && (Impuls_high < 1000 ) && (Impuls_low < 1000) && (Impuls_high + Impuls_low > 1000) && (Impuls_high + Impuls_low < 1010)) {
CO2_PWM = Aufloesung * (Impuls_high - Min_high) / (Impuls_high + Impuls_low - Min_high - Min_low);
letzter_negativer_Impuls_sp=letzter_negativer_Impuls;
}
CO2_Analog = (analogRead(Analog_Eingang) - Analog_min) * Aufloesung / (Analog_max - Analog_min);
if (CO2_PWM_sp!=CO2_PWM) {
LED_Ausgang = !LED_Ausgang;
digitalWrite(LED, LED_Ausgang);
CO2_PWM_sp = CO2_PWM;
// (CO2_real+55)*36
// CO2_real*40
CO2_real = (float)CO2_PWM / 40.0;
ds18b20_pwm.setTemperature(CO2_real);
}
else if (abs(CO2_Analog-CO2_Analog_sp)>CO2_Analog_Diff) {
CO2_Analog_sp = CO2_Analog;
// (CO2_real+55)*36
CO2_real = (float)CO2_Analog / 40.0;
ds18b20_analog.setTemperature(CO2_real);
}
}
Gruß,
Martin