Ardoino, Mosfett, PID und Peltier

Hallo freunde der Einsen und nullen.

Ich habe mir vor kurzen einen Arduino gekauft und habe auch die eine oder andere Beispiel Schaltung zur Brust genommen. Habe mir jetzt ein paar Mosfets,Temperatursensoren, Labornetzteil und weiteres gekauft. und jetzt habe ich schon einproblem.

ich habe vor mit einem Peltierelement Wasser zukühlen. aber so weit bin ich noch nicht.

Ich habe es geschaft erfolgreich einen Code für 2 Sensoren und und den mosfet zuschreiben.
Also glaube ich. Aber die PID Reglung will einfach nicht funktionieren.

vielleicht kann mir wer helfen und mal übermeinen code zu schauen. und mir sagen was ich nicht richtig is.

Ich habe mir das so vorgestellt das eine kühler momentane Wassertemperatur und der anderen das gekühlte Wasser misst.
Die Temps werden mir richtig angezeigt. aber der Mosfet bekommt immer den wert 0. und schaltet nicht hoch. Woran liegt das ?

Hiermal mein code.

#include <OneWire.h>
#include <DallasTemperature.h>

// DS18B20 Sensoren
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MOSFET Steuerung
const int mosfetPin = 9; // MOSFET Pin für Peltier-Element

// PID-Konstanten (angepasst für deine Anwendung)
double Setpoint = 1.0; // Gewünschte Temperatur (1 Grad Celsius)
double Kp = 2.0;       // Proportionaler Anteil
double Ki = 0.5;       // Integraler Anteil
double Kd = 1.0;       // Differentialer Anteil

// PID-Objekt
double temperature; // Deklaration der Variable temperature außerhalb der loop()
double output;      // Deklaration der Variable output außerhalb der loop()

PID pid(&temperature, &output, &Setpoint, Kp, Ki, Kd, DIRECT);

// DS18B20 Sensoren Adressen
DeviceAddress address1 = { 0x28, 0x44, 0xBC, 0x96, 0x54, 0x22, 0x08, 0x46 };
DeviceAddress address2 = { 0x28, 0x69, 0x5F, 0x95, 0x54, 0x22, 0x08, 0xA6 };

void setup() {
  Serial.begin(9600);
  sensors.begin();
  
  pinMode(mosfetPin, OUTPUT);
  digitalWrite(mosfetPin, LOW);

  pid.SetMode(AUTOMATIC);
  pid.SetOutputLimits(0, 255); // Anpassen der Ausgabegrenzen an die MOSFET-Steuerung
}

void loop() {
  sensors.requestTemperaturesByAddress(address1);
  float temp1 = sensors.getTempCByIndex(0);

  sensors.requestTemperaturesByAddress(address2);
  float temp2 = sensors.getTempCByIndex(1); // Index 1 für den zweiten Sensor

  // Durchschnittliche Temperatur berechnen
  temperature = (temp1 + temp2) / 2.0;

  pid.Compute();

  // Debugging-Ausgaben
  Serial.print("Temperature 1: ");
  Serial.print(temp1);
  Serial.print(" C, Address 1: ");
  printAddress(address1);

  Serial.print("Temperature 2: ");
  Serial.print(temp2);
  Serial.print(" C, Address 2: ");
  printAddress(address2);

  Serial.print(" Average Temperature: ");
  Serial.print(temperature);
  Serial.print(" C, Setpoint: ");
  Serial.print(Setpoint);
  Serial.print(" Output: ");
  Serial.println(output);

  analogWrite(mosfetPin, output);

  delay(1000); // Wartezeit zwischen den Regelschleifen
}

void printAddress(DeviceAddress address) {
  for (int i = 0; i < 8; i++) {
    Serial.print(address[i], HEX);
    if (i < 7) {
      Serial.print(":");
    }
  }
  Serial.println();
}

tippe oder füge den Code hier ein

Hallo Pasafrags

Herzlichen Willkommen im besten Arduinoforum der Welt.

Schiebe auch mal den Schaltplan dazu rüber.

1 Like

Und kannst du das evtl. näher erklären.
Was meinst du mit "Wert 0" und "schaltet nicht hoch" ?
Und was für einen Mosfet verwendest du ?

ja mein Problem ist das ich ein Anfänger bin. Und ich wahrscheinlich erst mal kleine Brötchen backen sollte.

also ich wollte das der TempSensor1 das Wasser misst. und das TempSensor 2 das gekühlte Wasser misst. (Wasser gibt es in Moment noch nicht).
und der ( oder das) Mosfet steuert soll das Peltierelement steuern.

Und bis jetzt zeigt er im seriellen Monitor nur die Temperatur von den zweien Sensoren an. und errechnet eine Durchschnittstemperatur.

Temperature 1: 30.37 C, Address 1: 28:44:BC:96:54:22:8:46

Temperature 2: 26.25 C, Address 2: 28:69:5F:95:54:22:8:A6

Average Temperature: 28.31 C, Setpoint: 1.00 Output: 0.00

Und schraubt den Output nicht hoch.

Ich sehe schon das ich wahrscheinlich total auf dem Holzweg bin mit meinem Code.
Kann das sein ?

einen schalt plan gibt's nicht. den müsste ich erst machen.

wenn ich pid.SetOutputLimits(0, 255); // Anpassen der Ausgabegrenzen an die MOSFET-Steuerung

Auf zb. pid.SetOutputLimits(200, 255); // Anpassen der Ausgabegrenzen an die MOSFET-Steuerung
dann wird das Mosfet geschalten und das peltierelement geht dementsprechend an.

Ja bitte, das hilft dir und denen, die helfen möchten.

Was genau heißt das ?
Hast du da ein Trimmpoti, welches du mit einem Schraubendreher verändern musst ?

Und auch die anderen Fragen beantworten.

Schau mal wie die Pins werden gesteuert bestimmt nicht digitalWrite ( Pin, OUTPUT) das sollte dir der ko
Compieler um die Ohren hauen. Du musst erst im Setup den als OUTPUT definieren pinMode (Pin, OUTPUT) und im Loop digitalWrite ( Pin, HIGH )

Doch @fony , das ist im setup() drin.

Dan habe das übersehen bin mit Handy am schreiben
Jedoch im Loop ist falsch

Ok, kein Problem. :slight_smile:


also ich habe jetzt mal auf die schnelle ein plan gemacht wie ich das hier verkabelt habe.
habe versuche in 3 min mit fritzing was zu erstellen. installiert und und drauf los geplant.
statt auf den plan hier habe ich eine XY MOS genommen.
(habe das in fritzing nicht gefunden).
XY-MOS - Layout01.

ich hoffe das ihr damit was anfangen könnt...
Tut mir leid das ihr euch jetzt mit meinem gefährlich halbwissen rumschlagt..

MFG

Und Fragen beantwortest du grundsätzlich nicht ?

Fast hätte ich es vergessen. Die PID-Library vermisse ich in deinem Sketch.

sorry hab doch alles so gut wie es geht zu beantworten. oder habe ich was übersehen ?
sorry wenn ja..

Nö....meine Fragen hast du nicht beantwortet.

Widerstand für die DS haste?

sorry Fehler beim kopieren. is drin ganz oben.

#include <PID_v1.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// DS18B20 Sensoren
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// MOSFET Steuerung
const int mosfetPin = 9; // MOSFET Pin für Peltier-Element

// PID-Konstanten (angepasst für deine Anwendung)
double Setpoint = 1.0; // Gewünschte Temperatur (1 Grad Celsius)
double Kp = 2.0;       // Proportionaler Anteil
double Ki = 0.5;       // Integraler Anteil
double Kd = 1.0;       // Differentialer Anteil

// PID-Objekt
double temperature; // Deklaration der Variable temperature außerhalb der loop()
double output;      // Deklaration der Variable output außerhalb der loop()

PID pid(&temperature, &output, &Setpoint, Kp, Ki, Kd, DIRECT);

// DS18B20 Sensoren Adressen
DeviceAddress address1 = { 0x28, 0x44, 0xBC, 0x96, 0x54, 0x22, 0x08, 0x46 };
DeviceAddress address2 = { 0x28, 0x69, 0x5F, 0x95, 0x54, 0x22, 0x08, 0xA6 };

void setup() {
  Serial.begin(9600);
  sensors.begin();
  
  pinMode(mosfetPin, OUTPUT);
  digitalWrite(mosfetPin, LOW);

  pid.SetMode(AUTOMATIC);
  pid.SetOutputLimits(150, 255); // Anpassen der Ausgabegrenzen an die MOSFET-Steuerung
}

void loop() {
  sensors.requestTemperaturesByAddress(address1);
  float temp1 = sensors.getTempCByIndex(0);

  sensors.requestTemperaturesByAddress(address2);
  float temp2 = sensors.getTempCByIndex(1); // Index 1 für den zweiten Sensor

  // Durchschnittliche Temperatur berechnen
  temperature = (temp1 + temp2) / 2.0;

  pid.Compute();

  // Debugging-Ausgaben
  Serial.print("Temperature 1: ");
  Serial.print(temp1);
  Serial.print(" C, Address 1: ");
  printAddress(address1);

  Serial.print("Temperature 2: ");
  Serial.print(temp2);
  Serial.print(" C, Address 2: ");
  printAddress(address2);

  Serial.print(" Average Temperature: ");
  Serial.print(temperature);
  Serial.print(" C, Setpoint: ");
  Serial.print(Setpoint);
  Serial.print(" Output: ");
  Serial.println(output);

  digitalWrite(mosfetPin, output);

  delay(1000); // Wartezeit zwischen den Regelschleifen
}

void printAddress(DeviceAddress address) {
  for (int i = 0; i < 8; i++) {
    Serial.print(address[i], HEX);
    if (i < 7) {
      Serial.print(":");
    }
  }
  Serial.println();
}

4,7k ohm.

die Temperaturen werdenja gut ausgelesen.

Temperature 1: 28.94 C, Address 1: 28:44:BC:96:54:22:8:46

Temperature 2: 3.00 C, Address 2: 28:69:5F:95:54:22:8:A6

Average Temperature: 15.97 C, Setpoint: 1.00 Output: 0.0

Den setpoint hab ich zum Test auf 1 grad.
Nur wie gesagt der Output bewegt sich nicht. bleibt auf null..

Dann versuch doch mal den Ausgang zum Mosfet (den ich immer noch nicht kenne) direkt zu steuern. Ohne PID.

Du hast weiter das
analogWrite drinen es muß
digitalWrite ( deinpin, HIGH) sein
analogWrite ist für PWM, Plaitelemente
Mögen PWM nicht
Und wenn Dan analogWrite ( deinpin, PWM Wert)
PWM ist ab Null bis 255

ich habe doch ein bild hochgeladen mit dem Mosfet Modul.
Hier ist genau der MOS den ich verbaut habe.

pid.SetOutputLimits(150, 255);

wenn ich das eingebe dann schaltet das Modul
aber nicht automatisch.