Inhaltsverzeichnis:

Thermostat basierend auf Arduino - Gunook
Thermostat basierend auf Arduino - Gunook

Video: Thermostat basierend auf Arduino - Gunook

Video: Thermostat basierend auf Arduino - Gunook
Video: 🌡️5 простых терморегуляторов для вентилятора 2024, Juli
Anonim
Thermostat basierend auf Arduino
Thermostat basierend auf Arduino
Thermostat basierend auf Arduino
Thermostat basierend auf Arduino
Thermostat basierend auf Arduino
Thermostat basierend auf Arduino

Dieses Mal bauen wir ein Thermostat basierend auf Arduino, Temperatursensor und Relais. Sie finden es auf github

Schritt 1: Konfiguration

Aufbau
Aufbau

Die gesamte Konfiguration wird in Config.h gespeichert. Sie können PINs ändern, die Relais steuern, Temperatur, Schwellenwerte oder Timings lesen.

Schritt 2: Relais konfigurieren

Nehmen wir an, wir möchten 3 Relais haben:

  • ID:0, PIN: 1, Temperatursollwert: 20
  • ID:1, PIN: 10, Temperatursollwert: 30
  • ID:2, PIN: 11, Temperatursollwert: 40

Zunächst müssen Sie sicherstellen, dass die PIN Ihrer Wahl nicht bereits vergeben ist. Alle Pins sind in Config.h zu finden, sie werden durch Variablen definiert, die mit DIG_PIN beginnen.

Sie müssen Config.h bearbeiten und PINs, Schwellenwerte und Anzahl der Relais konfigurieren. Offensichtlich sind einige Eigenschaften bereits vorhanden, sodass Sie sie nur bearbeiten müssen.

Konstante statische uint8_t DIG_PIN_RELAY_0 = 1;konstante statische uint8_t DIG_PIN_RELAY_1 = 10; const statisch uint8_t DIG_PIN_RELAY_2 = 11;

const statisch uint8_t RELAYS_AMOUNT = 3;

const statisch int16_t RELAY_TEMP_SET_POINT_0 = 20;

const statisch int16_t RELAY_TEMP_SET_POINT_1 = 30; const statisch int16_t RELAY_TEMP_SET_POINT_2 = 40;

Jetzt müssen wir Relais und Controller einrichten, dies geschieht in RelayDriver.cpp

initRelayHysteresisController(0, DIG_PIN_RELAY_0, RELAY_TEMP_SET_POINT_0);initRelayHysteresisController(1, DIG_PIN_RELAY_1, RELAY_TEMP_SET_POINT_1); initRelayHysteresisController(2, DIG_PIN_RELAY_2, RELAY_TEMP_SET_POINT_2);

xxx

Schritt 3: Hysterese-Controller

Es ist das im obigen Beispiel gewählte, es hat einige zusätzliche Konfigurationen:

const statisch uint32_t RELAY_DELAY_AFTER_SWITCH_MS = 300000; // 5 Minuten konstant statisch uint32_t RHC_RELAY_MIN_SWITCH_MS = 3600000;

RELAY_DELAY_AFTER_SWITCH_MS gibt Wartezeit für das Schalten des nächsten Relais. Stellen Sie sich vor, dass die Konfiguration aus unserem Beispiel in einer 40-Grad-Umgebung funktioniert. Dies würde zur gleichzeitigen Freigabe aller drei Relais führen. Dies kann schließlich zu einem hohen Stromverbrauch führen - je nachdem, was Sie steuern, verbraucht beispielsweise der Elektromotor beim Start mehr Strom. In unserem Fall hat das Schaltrelais folgenden Ablauf: erstes Relais geht, 5 Minuten warten, zweites geht an, 5 Minuten warten, drittes geht an.

RHC_RELAY_MIN_SWITCH_MS definiert die Hysterese, dies ist die Mindestfrequenz, mit der ein bestimmtes Relais seinen Zustand ändert. Sobald es eingeschaltet ist, bleibt es mindestens für diese Zeit eingeschaltet und ignoriert Temperaturänderungen. Dies ist sehr nützlich, wenn Sie Elektromotoren steuern, da sich jeder Schalter negativ auf die Lebensdauer auswirkt.

Schritt 4: PID-Regler

PID-Regler
PID-Regler
PID-Regler
PID-Regler

Dies ist ein fortgeschrittenes Thema. Die Implementierung eines solchen Controllers ist eine einfache Aufgabe, das Finden der richtigen Amplitudeneinstellungen ist eine andere Geschichte.

Um den PID-Regler zu verwenden, müssen Sie initRelayHysteresisController(…..) in initRelayPiDController(….) ändern und die richtigen Einstellungen dafür finden. Sie finden sie wie gewohnt in Config.h

Ich habe einen einfachen Simulator in Java implementiert, damit es möglich ist, die Ergebnisse zu visualisieren. Es befindet sich im Ordner: pidsimulator. Unten sehen Sie Simulationen für zwei Controller PID und P. PID ist nicht perfekt stabil, da ich keinen ausgeklügelten Algorithmus angewendet habe, um die richtigen Werte zu finden.

Auf beiden Plots ist die erforderliche Temperatur auf 30 (blau) eingestellt. Die aktuelle Temperatur zeigt die Lesezeile an. Relais hat zwei Zustände EIN und AUS. Wenn es aktiviert ist, sinkt die Temperatur um 1,5, wenn es deaktiviert ist, steigt sie um 0,5.

Schritt 5: Nachrichtenbus

Nachrichtenbus
Nachrichtenbus
Nachrichtenbus
Nachrichtenbus
Nachrichtenbus
Nachrichtenbus
Nachrichtenbus
Nachrichtenbus

Verschiedene Softwaremodule müssen miteinander kommunizieren, hoffentlich nicht in beide Richtungen;)

Zum Beispiel:

  • Statistikmodul muss wissen, wann ein bestimmtes Relais ein- und ausgeht,
  • Durch Drücken einer Taste muss der Anzeigeinhalt geändert werden und es müssen auch Dienste ausgesetzt werden, die viele CPU-Zyklen verbrauchen würden, z. B. die Temperaturmessung vom Sensor,
  • nach einiger Zeit muss die Temperaturmessung erneuert werden,
  • und so weiter….

Jedes Modul ist an den Message Bus angeschlossen und kann sich für bestimmte Ereignisse registrieren und beliebige Ereignisse erzeugen (erstes Diagramm).

Im zweiten Diagramm sehen wir den Ereignisfluss beim Drücken der Taste.

Einige Komponenten haben einige Aufgaben, die regelmäßig ausgeführt werden müssen. Wir könnten ihre entsprechenden Methoden aus der Hauptschleife aufrufen, da wir Message Bus haben, ist es nur notwendig, das richtige Ereignis zu propagieren (drittes Diagramm)

Schritt 6: Bibliotheken

  • https://github.com/maciejmiklas/Thermostat
  • https://github.com/milesburton/Arduino-Temperature…
  • https://github.com/maciejmiklas/ArdLog.git

Empfohlen: