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