AstroFritz
Aktives Mitglied
Dann bin ich mal gespannt 
Aber ich. Und da hat es noch funktioniert. Ich will fair sein, sie haben einen offensichtlichen und einen logischen Fehler behoben.habe den aber auch vor dem Update nicht getestet.
1. PWM1 defaults to 79% power output upon power-up. When the ambient temperature is above 15°C, heating will automatically stop when the heater's temperature sensor temperature rises 7.5°C above the dew point.
2. When the ambient temperature is between 1°C and 15°C, heating will stop when the heater's temperature rises 10°C above the dew point.
3. When the ambient temperature is below 0°C, the heater remains on and stops when the temperature rises above 5°C. Users can flexibly adjust the default heating power by configuring the heater's PWM1 level when the temperature falls below the protection level.
Note:
Manual control is not available when the heater is in the protection mode.
The default PWM1 output is the intelligent defogger output port; PWM2 only supports manual settings.
Dass der PWM1-Output nicht mehr manuell angesteuert werden kann, ist wohl eine Designentscheidung.
1. PWM1 defaults to 79% power output upon power-up. When the ambient temperature is above 15°C, heating will automatically stop when the heater's temperature sensor temperature rises 7.5°C above the dew point.
2. When the ambient temperature is between 1°C and 15°C, heating will stop when the heater's temperature rises 10°C above the dew point.
3. When the ambient temperature is below 0°C, the heater remains on and stops when the temperature rises above 5°C. Users can flexibly adjust the default heating power by configuring the heater's PWM1 level when the temperature falls below the protection level.
Note:
Manual control is not available when the heater is in the protection mode.
The default PWM1 output is the intelligent defogger output port; PWM2 only supports manual settings.
Das ließt sich für mich irgendwie so als wenn die Box gar nicht den Taupunkt als Wert benutzt um die Taubänder zu steuern sondern einfach nur die Temperatur und das ist ja eigentlich nicht so doll. Grade wenn man mit einem Akku unterwegs ist will man ja, dass das Tauband nur an ist wenn es sein muss. So kann es dich durchaus sein, dass das Tauband auch an ist wenn es gar nicht an sein muss.
Auch hier wird die Luftfeuchtigkeit um gut 10% zu hoch ausgegeben. Liegt also anscheinend am Sensor...--- Messwerte ---
:: INA219 (Strom/Spannung) ::
Busspannung: 13.99 V
Lastspannung: 13.99 V
Shunt-Spannung: 0.41 mV
Strom: 4.00 mA
Leistung: 56.00 mW
:: SHT40 (Ambient T/H) ::
Temperatur (Ambient): 18.66 °C
Luftfeuchtigkeit: 57.95 %RH
:: DS18B20 (Objektivtemperatur) ::
Objektivtemperatur: 19.00 °C
-----------------------
#include <Arduino.h>
#include <Wire.h>
// INA219 - Strommesser
#include <Adafruit_INA219.h>
// Standardadresse 0x40
Adafruit_INA219 ina219(0x40);
// SHT40 - Ambient (Temperatur/Luftfeuchtigkeit)
#include <Adafruit_SHT4x.h>
// Standardadresse 0x44
Adafruit_SHT4x sht40 = Adafruit_SHT4x();
// DS18B20 - Objektivtemperatur
#include <OneWire.h>
#include <DallasTemperature.h>
#define DS18B20_PIN 23 // DS18B20 Datenpin an GPIO 23
OneWire oneWire(DS18B20_PIN);
DallasTemperature sensors(&oneWire);
// Timer-Variablen für das 10-Sekunden-Intervall
const long interval = 10000; // 10 Sekunden in Millisekunden
unsigned long previousMillis = 0;
// Adresse des DS18B20-Sensors (wird im Setup gefunden)
DeviceAddress objTempSensor;
bool ds18b20_gefunden = false;
// --- SETUP ---
void setup() {
Serial.begin(115200);
while (!Serial) delay(10);
Serial.println("--- ESP32 Sensor-Initialisierung gestartet ---");
// I2C-Bus starten (Standardpins ESP32: SDA=21, SCL=22)
Wire.begin();
// 1. INA219 Initialisierung
Serial.print("INA219 (0x40) Initialisierung... ");
if (!ina219.begin()) {
Serial.println("FEHLGESCHLAGEN! Ueberpruefen Sie die Verkabelung.");
} else {
// Optionale Konfiguration (32V Bus, 2A Maximalstrom)
ina219.setCalibration_32V_2A();
Serial.println("OK.");
}
// 2. SHT40 Initialisierung
Serial.print("SHT40 (0x44) Initialisierung... ");
if (!sht40.begin()) {
Serial.println("FEHLGESCHLAGEN! Ueberpruefen Sie die Verkabelung.");
} else {
sht40.setPrecision(SHT4X_HIGH_PRECISION);
Serial.println("OK.");
}
// 3. DS18B20 Initialisierung
Serial.print("DS18B20 (GPIO23) Initialisierung... ");
sensors.begin();
if (sensors.getDeviceCount() == 0) {
Serial.println("FEHLGESCHLAGEN! Kein DS18B20 gefunden.");
} else {
// Die Adresse des ersten Sensors speichern
if (sensors.getAddress(objTempSensor, 0)) {
// Setzt die Auflösung auf 10 Bit (ca. 375 ms Konvertierungszeit)
sensors.setResolution(objTempSensor, 10);
Serial.println("OK. Sensor-Adresse gespeichert.");
ds18b20_gefunden = true;
} else {
Serial.println("FEHLGESCHLAGEN! Sensor-Adresse konnte nicht gelesen werden.");
}
}
Serial.println("--- Initialisierung abgeschlossen. Starte Messungen. ---");
}
// --- LESEN DER SENSOREN ---
void readSensors() {
Serial.println("\n--- Messwerte ---");
// 1. INA219-Messungen
float busvoltage = ina219.getBusVoltage_V();
float shuntvoltage = ina219.getShuntVoltage_mV();
float current_mA = ina219.getCurrent_mA();
float power_mW = ina219.getPower_mW();
// Berechnung der Lastspannung
float loadvoltage = busvoltage + (shuntvoltage / 1000);
Serial.println(":: INA219 (Strom/Spannung) ::");
Serial.printf("Busspannung: %.2f V\n", busvoltage);
Serial.printf("Lastspannung: %.2f V\n", loadvoltage);
Serial.printf("Shunt-Spannung: %.2f mV\n", shuntvoltage);
Serial.printf("Strom: %.2f mA\n", current_mA);
Serial.printf("Leistung: %.2f mW\n", power_mW);
// 2. SHT40-Messungen
sensors_event_t humidity, temp;
// KORRIGIERTE ZEILE: Liest beide Werte gleichzeitig aus
sht40.getEvent(&humidity, &temp);
Serial.println("\n:: SHT40 (Ambient T/H) ::");
Serial.printf("Temperatur (Ambient): %.2f °C\n", temp.temperature);
Serial.printf("Luftfeuchtigkeit: %.2f %%RH\n", humidity.relative_humidity);
// 3. DS18B20-Messungen
Serial.println("\n:: DS18B20 (Objektivtemperatur) ::");
if (ds18b20_gefunden) {
sensors.requestTemperatures(); // Startet die Temperaturmessung
// Blockierend: Wartet auf die Konvertierung
float tempC = sensors.getTempC(objTempSensor);
if (tempC != DEVICE_DISCONNECTED_C) {
Serial.printf("Objektivtemperatur: %.2f °C\n", tempC);
} else {
Serial.println("FEHLER: DS18B20 Lesefehler oder Sensor getrennt.");
}
} else {
Serial.println("DS18B20 wurde im Setup nicht gefunden.");
}
Serial.println("-----------------------");
}
// --- LOOP ---
void loop() {
unsigned long currentMillis = millis();
// Alle 10 Sekunden (10000 ms) messen
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
readSensors();
}
}
Es hat mir keine Ruhe gelassen. Ich habe mich hingesetzt, das Pinmapping analysiert und eine eigene Lösung gebaut.Im Grunde muss man jetzt eigentlich "nur" das Pinmapping kennen um eine eigene Firmware zu schreiben....
Auch hier Dirk, als Beta Tester und User deiner Entwicklung, tausend Dank! Es funktioniert super, auch wenn ich es auf Grund der Wetterlage unterm Himmel jetzt zwei Wochen nimmer testen konnte. Aber was ich bis jetzt testen konnte, auch in zwei echten Astro Nächten, funktioniert hervorragend und der Funktionsumfang wird der eigentlich sehr guten Hardware endlich gerecht! Den die Firm- und Software von SvBony ist leider echter Vollmist!!Hallo zusammen,
anknüpfend an meinen letzten Beitrag hier:
Es hat mir keine Ruhe gelassen. Ich habe mich hingesetzt, das Pinmapping analysiert und eine eigene Lösung gebaut.
Das Ergebnis ist ein Open-Source-Projekt (SV241-Unbound), das den Controller deutlich flexibler macht. Es besteht aus zwei Komponenten:
- Custom Firmware (ESP32): Ersetzt die Original-Firmware komplett und erweitert die Funktionalität.
- ASCOM Alpaca Proxy: Eine Standalone-Anwendung für den PC. Sie verbindet sich via USB mit dem Controller und stellt ihn als Standard ASCOM-Device bereit. Das funktioniert nativ mit jeder Alpaca-fähigen Software (z.B. NINA) oder über einen generierten Treiber auch mit klassischer ASCOM-Software.
Die wichtigsten Features im Überblick:
- Outputs & Startup-States: Volle Kontrolle über 5x DC, 2x USB und den regelbaren 0-15V Ausgang. Wichtig für den Remote-Betrieb: Der Startup-Zustand jedes einzelnen Ports kann definiert werden (An, Aus oder deaktiviert).
- Sensorik & Kalibrierung: Monitoring von Stromverbrauch, Umgebungstemperatur/Luftfeuchte und Linsentemperatur. Falls die Werte abweichen, können sämtliche Sensor-Readings mit einem Offset korrigiert werden.
- Heizungssteuerung (Dew Control):
- Manuell: PWM 0-100%.
- PID Modus: Automatische Regelung basierend auf einem Zielwert über dem Taupunkt (z.B. Taupunkt + 3°C).
- Ambient Tracking: Sensorlose Anpassung basierend auf Umgebungstemperatur und Luftfeuchtigkeit.
- Interface: Der Proxy bietet ein Web-Dashboard zur Konfiguration und Telemetrie-Graphen zur Analyse.
Installation:
Ich habe versucht, das Flashen so einfach wie möglich zu machen. Der Proxy hat einen integrierten "First-Run Wizard". Wenn ihr einen Browser auf Chromium Basis (Chrome/Edge) nutzt, könnt ihr die Firmware direkt über das Web-Interface auf den ESP32 flashen – ganz ohne externe Tools.
Der Code und die Installer liegen auf GitHub: https://github.com/DIYAstro/SV241-Unbound
Ein großes Dankeschön geht an Brian, Ben und Lutz aus dem Forum hier für das geduldige Testen und das Feedback!
Schaut es euch gerne mal an, falls ihr mit der Original-Steuerung unzufrieden seid. Fragen und Feedback gerne hier in den Thread.
CS,
Dirk
Nur der Adjustierbare Spannungsausgang bringt die box zum pfeifen.
Ich vermisse auch einen Spenden Button ^^.