da ich bei mir zur Sicherheit meiner CO2-Flasche gerne den CO2 Gehalt in der Luft messen möchte (VOC fällt raus, da kein CO2 detektiert wird) wollte ich dies über einen Arduino als 1-Wire-Slave lösen. Der Arduino ließt den CO2-Sensor über PWM aus. Dies funktioniert soweit.
Nur die Simulation des Slave will nicht so wie sie soll.
Der Einfachheit halber wollte ich einfach einen DS18B20 simulieren und die Temperatur dann einfach umrechnen.
Als Bibliothek hab ich folgende verwendet: OneWireHub
Der gesamte Code wäre:
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;
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;
volatile unsigned long CO2_PWM;
unsigned long CO2_PWM_sp;
float CO2_real;
const uint8_t pin_onewire { 3 };
auto hub = OneWireHub(pin_onewire);
auto ds18b20 = DS18B20(DS18B20::family_code, 0x00, 0x00, 0xB2, 0x18, 0xDA, 0x00); // DS18B20: 9-12bit, -55 - +85 degC
void setup() {
Serial.begin(9600);
pinMode(PWM_Eingang, INPUT);
// Interrupt definieren
attachInterrupt(digitalPinToInterrupt(PWM_Eingang), Zaehlen, CHANGE);
hub.attach(ds18b20);
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;
if ((Impuls_high > 0 ) && (Impuls_low > 0)) {
CO2_PWM = Aufloesung * (Impuls_high - Min_high) / (Impuls_high + Impuls_low - Min_high - Min_low);
Serial.print("CO2: ");
Serial.println(CO2_PWM);
}
}
}
void loop() {
// following function must be called periodically
hub.poll();
// this part is just for debugging (USE_SERIAL_DEBUG in OneWire.h must be enabled for output)
if (hub.hasError()) hub.printError();
if (CO2_PWM_sp!=CO2_PWM) {
CO2_PWM_sp = CO2_PWM;
// (CO2_real+55)*36
CO2_real = (float)CO2_PWM / 36.0 - 55.0;
ds18b20.setTemperature(CO2_real);
Serial.println(CO2_real);
}
}
Daher wäre meine Frage ob evtl. jemand schon was ähnliches gemacht hat, oder ob es beim Timberwolf ähnlich wie beim WireGate noch die Möglichkeit gibt weitere Infos von den Sensoren anzuzeigen.
Gruß,
Martin