ich habe eine Motorsteuerung Programmiert die ab einer bestimmten Temperatur einen Spindelmotor ansteuert. Wenn dieser am Ende ist soll durch den größeren Stromfluss gemessen über Spannungsteiler der Motor stehen bleiben und einen Wert setzten um nicht immer wieder anzulaufen. Funtioniert soweit Temperatur hoch Motor läuft, Strom hoch Motor steht aber die statusKlappe wird nicht geändert dadurch läuft der Motor immer wieder an und bleibt stehen und so weiter
Wie sorge ich dafür das sich der Wert von Statusklappe ändert.
hier der code:
int abgasTemperatur = 3; //Temp Sensor Abgas an Pin 3
//Klappensteuerung
int klappenSteuerung1 = 11; //H rechts, L links
int klappenSteuerung2 = 12; //L rechts, H links
int freigabeKlappe = 13; // Freigabe Motorsteuerung
int klappenmotorSensor = 1; // Motorstrom
int statusKlappe = 1; // Klappe auf, 0 Klappe zu erhält wert 1
void setup ()
{
Serial.begin(9600); //initialisieren serielle Schnittstelle auf 9600 Baud
Serial.println("Start");
pinMode(klappenSteuerung1, OUTPUT);
pinMode(klappenSteuerung2, OUTPUT);
pinMode(freigabeKlappe, OUTPUT);
// Anheizklappe definiert
digitalWrite (freigabeKlappe, HIGH); //Klappensteuerung freigegeben
digitalWrite (klappenSteuerung1, LOW); // beide je L Motor steht
digitalWrite (klappenSteuerung2, LOW); // beide je L Motor steht
}
void loop()
{
//Abgastemperatur einlesen
int sensorLesen0 = analogRead(abgasTemperatur); //lesen den Sensorwert in Pin A3 ein
float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35); //Umrechnung in Grad Celsius bei Betriebsspannung von 5 Volt, -35 Korrektur des Meßwertes
//Stromaufnahme Klappenmotor einlesen
int strom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
// Ausgabe Seriell
Serial.print("Abgastemperatur ist: "); //Ausgabe auf serieller Konsole
Serial.print(temperatur);// oder temperatur
Serial.print(" C ");
Serial.print("Strom ist: ");
Serial.print(strom);
Serial.print(" A ");
Serial.print("Status Klappe= ");
Serial.println(statusKlappe);
delay (1000);// zum testen die Steuerung ausgebremst kommt wenns funktioniert weg
//Steuerung Klappenmotor nach Abgastemperatur
if (temperatur >= 250 && statusKlappe == 1)
{
digitalWrite (klappenSteuerung1, HIGH); // Temperatur >250 Motor läuft
}
if (strom >= 250) // Motor steht Strom größer 250( nicht A sondern wert!)
{
digitalWrite (klappenSteuerung1, LOW); //Motor steht
digitalWrite (klappenSteuerung2, LOW); //wieder
int stausKlappe = 0; // Status der Klappe
}
if (temperatur <= 50 && statusKlappe == 0)
{
digitalWrite (klappenSteuerung2, HIGH);
}
if (strom >= 250)
{
digitalWrite (klappenSteuerung2, LOW);
digitalWrite (klappenSteuerung1, LOW);
int stausKlappe = 1;
}
//Ende
}
Ich sehe nur, dass zweimal einer Variable "stausKlappe" entweder 0 oder 1 zugewiesen wird. Da hast Du Dich vertippt. Der Sketch kann so eigentlich gar nicht compiliert werden? Deklariert ist sie als "statusKlappe". Guck nochmal
Rechtschreibfehler sind raus, geht leider immer noch nicht:
int abgasTemperatur = 3; //Temp Sensor Abgas an Pin 3
//Klappensteuerung
int klappenSteuerung1 = 11; //H rechts, L links
int klappenSteuerung2 = 12; //L rechts, H links
int freigabeKlappe = 13; // Freigabe Motorsteuerung
int klappenmotorSensor = 1; // Motorstrom
int statusKlappe = 1; // Klappe auf, 0 Klappe zu erhält wert 1
void setup ()
{
Serial.begin(9600); //initialisieren serielle Schnittstelle auf 9600 Baud
Serial.println("Start");
pinMode(klappenSteuerung1, OUTPUT);
pinMode(klappenSteuerung2, OUTPUT);
pinMode(freigabeKlappe, OUTPUT);
// Anheizklappe definiert
digitalWrite (freigabeKlappe, HIGH); //Klappensteuerung freigegeben
digitalWrite (klappenSteuerung1, LOW); // beide je L Motor steht
digitalWrite (klappenSteuerung2, LOW); // beide je L Motor steht
}
void loop()
{
//Abgastemperatur einlesen
int sensorLesen0 = analogRead(abgasTemperatur); //lesen den Sensorwert in Pin A3 ein
float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35); //Umrechnung in Grad Celsius bei Betriebsspannung von 5 Volt, -35 Korrektur des Meßwertes
//Stromaufnahme Klappenmotor einlesen
int strom = analogRead(klappenmotorSensor); //lesen den Sensorwert in Pin A1 ein
// Ausgabe Seriell
Serial.print("Abgastemperatur ist: "); //Ausgabe auf serieller Konsole
Serial.print(temperatur);// oder temperatur
Serial.print(" C ");
Serial.print("Strom ist: ");
Serial.print(strom);
Serial.print(" A ");
Serial.print("Status Klappe= ");
Serial.println(statusKlappe);
delay (1000);
//Steuerung Klappenmotor nach Abgastemperatur
if (temperatur >= 250 && statusKlappe == 1)
{
digitalWrite (klappenSteuerung1, HIGH); // Temperatur >250 Motor läuft
}
if (strom >= 250) // Motor steht Strom größer 250( nicht A sondern wert!)
{
digitalWrite (klappenSteuerung1, LOW); //Motor steht
digitalWrite (klappenSteuerung2, LOW); //wieder
int statusKlappe = 0; // Status der Klappe
}
if (temperatur <= 50 && statusKlappe == 0)
{
digitalWrite (klappenSteuerung2, HIGH);
}
if (strom >= 250)
{
digitalWrite (klappenSteuerung2, LOW);
digitalWrite (klappenSteuerung1, LOW);
int statusKlappe = 1;
}
//Ende
}
Dein Problem ist das "int statusKlappe = 1" bzw. "int statusKlappe = 0"
Beispiel:
if (temperatur <= 50 && statusKlappe == 0)
{
digitalWrite (klappenSteuerung2, HIGH);
}
if (strom >= 250)
{
digitalWrite (klappenSteuerung2, LOW);
digitalWrite (klappenSteuerung1, LOW);
int statusKlappe = 1;
}
Durch das "int" vor dem Namen deklarierst Du eine lokale Varibale, welche die globale "überdeckt". Die lokale Variable ist aber bei jedem Durchlauf deiner loop-Funktion wieder "0". Lass das "int" weg und Du verwendest die globale Variable. Damit sollte es gehen.
Das Erreichen der beiden Endposition würde ich über Endschalter realisieren, nicht durch die Strommessung. Zur Sicherheit 2 Endschalter: einen für die Positionsmeldung an die Elektronik und einen 2. der später betätigt wird, um die Stromversorgung des Motors zu unterbrechen (Nothalt der manuell resetiert werden muß).
Nach der Kontrolle des Kodes hier ein bißchen ein "Flußdiagramm"
Temperatur hoch und Motor erreicht endposition un bleibt stehen:
float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35);
int strom = analogRead(klappenmotorSensor);
...
if (strom >= 250) // Motor steht Strom größer 250( nicht A sondern wert!)
{
digitalWrite (klappenSteuerung1, LOW); //Motor steht
digitalWrite (klappenSteuerung2, LOW); //wieder
int statusKlappe = 0; // Status der Klappe
}
...
if (strom >= 250)
{
digitalWrite (klappenSteuerung2, LOW);
digitalWrite (klappenSteuerung1, LOW);
int statusKlappe = 1;
}
um dann beim nächsten loop() -Durchlauf:
float temperatur = (5.0 * sensorLesen0 * 100 / 1024-35);
int strom = analogRead(klappenmotorSensor);
...
//Steuerung Klappenmotor nach Abgastemperatur
if (temperatur >= 250 && statusKlappe == 1)
{
digitalWrite (klappenSteuerung1, HIGH); // Temperatur >250 Motor läuft
}
den Motor wieder zu starten un dann im nächsten Loop() Durchlauf wieder zu stoppen ...
Endlagenschalte sind wegen der Einbausituation fast unmöglich
habe die Schleifen geändert nun geht es
ich habe auch eine Stromabfrage für einen größeren Stron eingebau die generell abschaltet und "händisch" wieder zugeschaltet werden muß
bringt eventuell mehr sicherheit für Motor und Endstufe
Ich schalte zur Zeit regulär bei 2,5A ab und Sicherheitsschaltung bei 3,5A die Endstufe kann 5A Belastung vertragen
ich finde halt die Abschaltung kontaktlos auch besser....