Probleme mit meinem Code.

Hey, :slight_smile:

ich sitze jetzt schon einige Stunden vor meinem PC und habe Probleme mit meiner Schaltung/Code. ::slight_smile:

Als kurze Einführung, hier ein paar Infos:

Mein Ziel ist es ein Autonomes Gewächshaus zu bauen. Dies soll sich von selber Belüften und wenn es zu kalt ist von selber beheizen. Ich hab im Internet eine ganze Weile nach Codes geschaut und dann einen passenden gefunden. Ich verwende einen NTC mit 10k und einem 10k Widerstand.

In dem kleinen Versuchsaufbau habe ich eine LED zum veranschaulichen genommen. Später wird diese durch ein Relais ersetzt und daran der Lüfter, sowie die Heizfolie angeschlossen.

Den Code aus dem Internet habe ich ein bisschen umgeschrieben, weil dort noch keine If-Abfrage vorhanden war. Hinter jede Zeile, die ich neu hinzu gefügt habe, habe ich ein Kommentar gemacht, in dem "NEU" steht.

Mein Lüfter soll angehen, wenn die Temperatur im Gewächshaus über 25 Grad Celsius hat. Die Heizfolie soll angehen, wenn die Temperatur auf 3 Grad gesunken ist.

Mein großes Problem ist, dass die LED macht, was sie will. Wenn ich die größer und die kleiner Zeichen ändere, ist sie ein mal die ganze Zeit an, auch wenn ich die Temperatur ändere, und beim anderen mal die ganze Zeit aus.
(Ich hoffe, ihr versteht, was ich euch sagen will. Es ist etwas schwierig zu erklären... ::slight_smile: )

Liegt mein Fehler darin, dass ich vielleicht die falsche Variable verwende, oder was mach ich falsch?
Ich bin gerade ein kleines bisschen verzweifelt... :disappointed_relieved:

Hier der Code:

int ThermistorPin = 0;
int Vo;
float R1 = 10000;
float logR2, R2, T, Tc, Tf;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

int LED = 12; //NEU
float TempC = Tc; //Variable für den Wert Tc  //NEU

void setup() {
Serial.begin(9600);
pinMode(LED,OUTPUT);  //NEU
}

void loop() {

  Vo = analogRead(ThermistorPin);
  R2 = R1 * (1023.0 / (float)Vo - 1.0);
  logR2 = log(R2);
  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
  Tc = T - 273.15; //Umrechnung in Celsius von Kelvin
  Tf = (Tc * 9.0)/ 5.0 + 32.0; //Umrechnung in Fahrenheit von Celsius 

  Serial.print("Temperature: "); 
  Serial.print(Tf);
  Serial.print(" F; ");
  Serial.print(Tc);
  Serial.println(" C");   

  delay(500);

  float Temperature = digitalRead(TempC);  //NEU
  
  if(Temperature > 25.00)      //NEU
  {                            //Größer als 25 Grad Celsius
   digitalWrite(LED,HIGH);     //NEU
    }
    else                       //NEU
    {
    digitalWrite(LED,LOW);     //NEU
    }
  
  
  
}

Vielen, vielen Dank schon mal im voraus :slight_smile:

Liebe Grüße
Leon Ranger

float Temperature = digitalRead(TempC); //NEU

if(Temperature > 25.00) //NEU
if(Tc > 25.00) //NEU

float Temperature = digitalRead(TempC); //NEU

digitalRead() liefert 0 oder 1, je nach Zustand des Eingangs, aber keine Temperatur als float. Ich glaube, anstatt "Temperature" solltest Du einfach die Variable "Tc" nehmen, die sollte die Temperatur enthalten.

float Temperature = digitalRead(TempC);  //NEU

Das ist falsch.
mit digitalRead bekommst immer eine Null oder eine Eins, nie eine Temperatur.

Wenn ich das richtig sehen, da berechnest du am Anfang eine Temperatur, die du in Tc speicherst.

Also solltest du unten auch auf Tc überprüfen.

if(Tc > 25.00)      //NEU

Nochwas: Wenn du immer auf > oder < 25°C überprüfst, wird deine Lüftung immer ständig an und aus gehen. Bau lieber eine Hysterese ein.

if (Tc > 27) {
    digitalWrite(LED, HIGH);    //NEU
  } 
  if (Tc < 23) {
    digitalWrite(LED, LOW);    //NEU
  }

Oder, besser:

const byte Schwelle_Luft = 25;           // Temperatur, bei die Lüftung eingeschaltet wird
  const byte Hysterese = 2;                  //  Hysterese um die Schaltschwellen etwas zu trennen
  
  if (Tc > Schwelle_Luft + Hysterese) {
    digitalWrite(LED, HIGH);    //NEU
  } 
  if (Tc < Schwelle_Luft - Hysterese) {
    digitalWrite(LED, LOW);    //NEU
  }

Hey,

vielen, vielen Dank.

jetzt hat alles funktioniert :slight_smile:

Ihr seid echt spitze!!!

Liebe Grüße
Leon Ranger