Hallo liebe Community,
ich hoffe ihr könnt mir weiterhelfen, komme nach stundenlanger Fehlersuche einfach nicht vorran und hoffe ihr könnt mal über meinen Programmcode schauen.
Es handelt sich um folgendes Problem, ich habe eine Gewächshaussteuerung mit einem Arduino Nano gebaut, ich werte mittels Dht22 Temperatur und Luftfeuchtigkeit aus und steuere daraufhin Aktoren (Ultraschalnebler und Heizlüfter) über eine Transistorverstärkerschaltung die Relais an.
Mein Ultraschalnebler funktioniert einwandfrei, das Relais schaltet voll durch, allerdings der Transistor für den Heizlüfter schaltet nicht voll durch wenn dieses angesteuert wird, es liegt nur ca die häflte der Spannung an. Ich habe bereits ein Code rübergespielt indem ich nur alle Ausgänge (Relais) auf High schalte und zu testen ob ich villeicht ein Fehler auf meiner Platine habe, allerdings hat dann auch das Relais für den Heizlüfter voll durchgeschaltet. Nur wenn ich mein Programmcode draufspiele schaltet er nicht voll durch.
Somit lässt sich der Fehler auf mein Code einkesseln und ich hoffe ihr könnt mir weiterhelfen
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h> //Libaries einbinden
#define DS3231_ADDRESSE 0x68 //DS3231 Adresse geben
#define DHTPIN 2 //DHT Pin definieren
#define DHTTYPE DHT22 //DHT Typ definieren
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
float temp=0;
float potTemp=0;
float tempIst=0;
float tempAdd=0;
float luft=0;
float potLuft=0;
float luftIst=0;
float luftAdd=0; //Variabeln den Wert 0 geben
boolean buttonState=HIGH;
boolean merker=LOW; //Variabeln auf High/Low setzen
int menue=0;
int stundeAn=0;
int stundeAus=0;
int minuteAn=0;
int minuteAus=0;
int led = 12;
int heizung = 10;
int luefter = 6;
int nebler = 8;
int wasserstand = 4;
int potTempPin = A6;
int potLuftPin = A7;
int buttonMinute = A1;
int buttonStunde = A0;
int buttonMenue = 13; //Pins definieren
void setup()
{
pinMode(led,OUTPUT);
pinMode(heizung,OUTPUT);
pinMode(luefter,OUTPUT);
pinMode(nebler,OUTPUT);
pinMode(wasserstand,INPUT);
pinMode(potTempPin,INPUT);
pinMode(potLuftPin,INPUT);
pinMode(buttonMinute,INPUT);
pinMode(buttonStunde,INPUT);
pinMode(buttonMenue,INPUT); //definierte Pins als Eingang/Ausgang deklarieren
dht.begin(); //DHT22 starten
Wire.begin(); //Wire starten
//einstellenDS3231zeit(0,38,8,6,20,01,18); //aktuelle Zeit speichern
lcd.begin(20,4); //LCD Größe angeben
lcd.backlight(); //Hintergundbeleuchtung aktivieren
}
void loop()
{
byte sekunde,minute,stunde,wochentag,tag,monat,jahr;
leseDS3231zeit(&sekunde,&minute,&stunde,&wochentag,&tag,&monat,&jahr); //Daten vom DS3231 hohlen
temp = tempauslesen(temp,tempAdd); //Temperatur auslesen
potTemp = potTempauslesen(potTemp,potTempPin); //Potentiometer auslesen
luft = luftauslesen(luft,luftAdd); //Luftfeuchtigkeit auslesen
potLuft = potLuftauslesen(potLuft,potLuftPin); //Potentiometer auslesen
tempregel(luefter,heizung,temp,potTemp); //Temperatur regeln
luftregel(luefter,nebler,wasserstand,luft,potLuft); //Luftfeuchte regeln
buttonState = digitalRead(buttonMenue); //Taster einlesen
if((buttonState == HIGH) && (merker == LOW)) //Merker setzen wenn Taster gedrückt
{merker = HIGH;}
if((buttonState == LOW) && (merker == HIGH)) //Gucken ob Taster wieder losgelassen wurde
{menue++; //Menü hochzählen
if(menue==5)
{menue=0;}
merker = LOW;}
switch(menue) //Menü Wahl
{
case 0: //Startbildschirm
lcdausgabe(temp,luft);
zeigeZeit();
zeigeDatum();
break;
case 1: //Temperatur Anzeige
zeigetemp(temp,potTemp);
break;
case 2: //Luftfeuchtigkeits Anzeige
zeigeluft(luft,potLuft);
break;
case 3: //Einschaltzeit Anzeige
lcd.setCursor(0,0);
lcd.print("-- Einschaltzeit: --");
lcd.setCursor(0,1);
lcd.print("----- ");
if(stundeAn < 10){lcd.print("0");}
lcd.print(stundeAn);
lcd.print(":");
if(minuteAn < 10){lcd.print("0");}
lcd.print(minuteAn);
lcd.print(" Uhr ----");
zeigeZeit2();
break;
case 4: //Ausschaltzeit Anzeige
lcd.setCursor(0,0);
lcd.print("-- Ausschaltzeit: --");
lcd.setCursor(0,1);
lcd.print("----- ");
if(stundeAus < 10){lcd.print("0");}
lcd.print(stundeAus);
lcd.print(":");
if(minuteAus < 10){lcd.print("0");}
lcd.print(minuteAus);
lcd.print(" Uhr ----");
zeigeZeit2();
break;
}
if(menue==3)
{
if(digitalRead(buttonStunde)==HIGH) //Stunde der Einschaltzeit einstellen
{
stundeAn++;
delay(100);
if(stundeAn==25)
{stundeAn=1;}
}
if(digitalRead(buttonMinute)==HIGH) //Minute der Einschaltzeit einstellen
{
minuteAn++;
delay(100);
if(minuteAn==61)
{minuteAn=1;}
}
}
if(menue==4)
{
if(digitalRead(buttonStunde)==HIGH) //Stunde der Ausschaltzeit einstellen
{
stundeAus++;
delay(100);
if(stundeAus==25)
{stundeAus=1;}
}
if(digitalRead(buttonMinute)==HIGH) //Minute der Ausschaltzeit einstellen
{
minuteAus++;
delay(100);
if(minuteAus==61)
{minuteAus=1;}
}
}
if((stunde>=stundeAn)&&(minute>=minuteAn)) //Licht einschalten
{digitalWrite(led,HIGH);}
if((stunde>=stundeAus)&&(minute>=minuteAus)) //Licht ausschalten
{digitalWrite(led,LOW);}
}
void lcdausgabe(float temp,float luft)
{
lcd.setCursor(0,0); //Cursor setzen
lcd.print("Temperatur: "); //LCD schreibt "Temperatur: "
lcd.print(temp,1); //LCD gibt den Temperaturwert wieder
lcd.print(" C ");
lcd.setCursor(0,1);
lcd.print("Luftfeuchte: ");
lcd.print(luft,1);
lcd.print(" % ");
}
void zeigetemp(float temp,float potTemp)
{
lcd.setCursor(0,0);
lcd.print("Temperatur aktuell: ");
lcd.setCursor(0,1);
lcd.print("------ ");
lcd.print(temp,1);
lcd.print(" C ------");
lcd.setCursor(0,2);
lcd.print("Temperatur soll: ");
lcd.setCursor(0,3);
lcd.print("------ ");
lcd.print(potTemp,1);
lcd.print(" C ------");
}
void zeigeluft(float luft, float potLuft)
{
lcd.setCursor(0,0);
lcd.print("Luftfeuchte aktuell:");
lcd.setCursor(0,1);
lcd.print("------ ");
lcd.print(luft,1);
lcd.print(" % ------");
lcd.setCursor(0,2);
lcd.print("Luftfeuchte soll: ");
lcd.setCursor(0,3);
lcd.print("------ ");
lcd.print(potLuft,1);
lcd.print(" % ------");
}
float tempauslesen(float temp,float tempAdd)
{
for(int i=0;i<50;i++) //Schleife mit 50 durchläufen um Termperatur zu ermitteln
{
temp = dht.readTemperature(); //Temperatur auslesen
tempAdd = tempAdd + temp; //Temperatur mit Anzahl an durchläufen zusammenzählen
}
temp = tempAdd/50; //Temperatur durch Anzahl an durchläufen teilen um Mittel-
tempAdd = 0; //wert zu bilden
return temp; //Temperatur zurückgeben
}
float luftauslesen(float luft,float luftAdd)
{
for(int i=0;i<50;i++)
{
luft = dht.readHumidity();
luftAdd = luftAdd + luft;
}
luft = luftAdd/50;
luftAdd = 0;
return luft;
}
float potTempauslesen(float potTemp,byte potTempPin)
{
potTemp = analogRead(potTempPin); //Poti auslesen
potTemp = potTemp/10.23; //Potiwert umrechen auf 0-100
return potTemp; //Potiwert zurückgeben
}
float potLuftauslesen(float potLuft,byte potLuftPin)
{
potLuft = analogRead(potLuftPin);
potLuft = potLuft/10.23;
return potLuft;
}