Hey zusammen, da bin ich wieder mit einem Problem.. vorab, ich benutze ein Arduino Mega + DHT22 Sensor + einen 28BYJ-48 Stepper und 2 (S5 5GL) Taster für dieses Projekt
Ziel ist es, dass es bei über 26 grad der Vorhang sich runterdreht durch den Stepper und bei unter 26 grad wieder hoch dreht.. Anhand von den 2 tastern (ESO = Endschalter oben, ESU Endschalter unten) sollte sich auch der arduino orientieren können, wo sich der Vorhang momentan befindet. Durch zahlreiche Tests und Kontrollen bewegt sich nichts. evtl liegt es an der Programmierung doch vlt sehe ich nicht richtig..
//-------------------------------------------------------------------Bibliotheken---------------------------------------------------------------------------------------
#include "DHT.h"
#include <Stepper.h>
//--------------------------------------------------------------------Pin definieren--------------------------------------------------------------------------------------
//Pin definierungen
#define DHTTYPE DHT22
#define DHT22_Pin 7 // DHT22 auf Pin 7 gesetzt
#define ESO 6 // Taster oben auf Pin 6
#define ESU 5 // Taster unten auf Pin 7
//--------------------------------------------------------------------Variablen------------------------------------------------------------------------------------------
DHT dht(DHT22_Pin, DHTTYPE);
int state_Vorhang = 0; // status Vorhang unten
int val_ESO = 0; // Taster oben, Status 0
int val_ESU = 0; // Taster unten Status 0
float humidity, temperature; // Definition der Temperatur und Luftfeuchtigkeit
const int stepsPerRevolution = 2038; //2038 Schritte sind 1 Umdrehung beim Stepper
Stepper myStepper1 = Stepper(stepsPerRevolution, 8, 10, 9, 11); //Stepper Pinbelegung
void setup () {
// put your setup code here , to run once :
Serial.begin(9600);
dht.begin();
pinMode ( ESO , INPUT ); // Taster oben als Eingang
pinMode ( ESU , INPUT ); // Taster unten als Einngang
pinMode ( DHT22_Pin, OUTPUT); // Fühler als Ausgang
}//---------------------------------------------------------------DHT22 Sensor Auslesung--------------------------------------------------------------------------------
void loop () {
val_ESO = digitalRead (ESO); //Liest Status ESO aus.
val_ESU = digitalRead (ESU); //Liest Status ESU aus.
humidity = dht.readHumidity(); //Liest/misst Feuchtigkeit
temperature = dht.readTemperature(); //Liest/misst Temperatur
Serial.print("Luftfeuchte: "); // Luftfeuchtigkeitsanzeige für den Serialmonitor
Serial.print(humidity); // Siehe Luftfeuchtigkeit
Serial.print("%, "); // Angabe in Prozent
Serial.print("Temperatur: "); //Temperaturanzeige für den Serialmonitor
Serial.print(temperature); //Siehe Temperatur
Serial.println("°C"); // Angabe in "C" = Celsius
delay(20); // Pause 20msek
//------------------------------------------------------------------- Status definierung für den Vorhang----------------------------------------------------------------
if ((state_Vorhang == 0 && temperature < 26 && ESU == HIGH) || (state_Vorhang == 0 && ESU == LOW && ESO == LOW)) { // Status 0 = Vorhang unten oder undefiniert
state_Vorhang = 1; // Status 1 = Vorhang faehrt hoch
} else if ( state_Vorhang == 1 && ESO == HIGH ) { // Status 2 = Vorhang oben
state_Vorhang = 2; // Status 3 = Vorhang faehrt runter
} else if ( state_Vorhang == 2 && temperature > 26 && ESO == HIGH ) { //ESO = Endschalter oben
state_Vorhang = 3; //ESU = Endschalter unten
} else if ( state_Vorhang == 3 && ESU == HIGH ) {
state_Vorhang = 0; // Vorhang ist unten
}
//------------------------------------------------------------------------- Befehlsausührung----------------------------------------------------------------------------
switch ( state_Vorhang ) {
case 0: // Vorhang unten
myStepper1.setSpeed(0); // Geschwindkeit bei 0 = keine beweung
break ;
case 1: // Vorhang fährt hoch
myStepper1.setSpeed(10);
myStepper1.step(stepsPerRevolution);
break ;
case 2: // Vorhang oben
myStepper1.setSpeed(0);
break ;
case 3: // Vorhang faehrt runter
myStepper1.setSpeed(10);
myStepper1.step(-stepsPerRevolution);
break ;
}
}
Pull Down Widerstände vorhanden? Du hast kein Taster nur Umschalter derS5 5GL ist ein Mikroschalter mit gemeinsamen Kontakt in der Mitte oder ? Ist der gut Verdrahtet ?
Der Widerstand um die 10K soll zw. Pin und GND (pull down) geschaltet werden.
Einfacher geht wen Du INPUT_PULLUP nimmst und gegen GND schaltest, nur die Logik ist umgekehrt
Pull Down widerstände sind vorhanden.. habe 20k ohm dafür verwendet.
Der S5 5GL hat 3 Anschlüsse ( C , NO und NC). ich habe C und NO angeschlossen, sind auch gut verdrahtet
Was für Treiber wird benutzt ?
Wurde versucht ohne ganzer Mimik damit den Vorhang bewegen?
Bau Dir in den case Serial Ausgabe ein dann wird gezeigt wo es klemmt
Treiber : ULN2003APG
der Stepper konnte mit dem Treiber Problemlos den Vorhang hoch und runter drehen.
Serial Ausgang werde ich im verlauf des Tages oder morgen noch machen. Danke
ist stark genug
wurde schon mehrmals getestet. wurde da ein bisschen kreativ.. eine leichte Holzstange und der Vorhang ist auch sehr leicht.. der 28BYJ 48 konnte problemlos hoch und runterfahren.
hab es noch ein bisschen angepasst und es funktioniert bis auf die Aktualisierung im Serial Monitor.
Wenn ich im case alle "mystepper1" mit einer Kommentarzeile definiere (siehe code), aktualisiert sich der Wert im Serial Monitor im zeitrahmen wie gewünscht. Doch, wenn ich die Kommentarzeile entferne in der case und es uploade, funktioniert zwar alles aber der Serial Monitor braucht 8 sekunden um es zu aktualisieren und das ist zu lange.
hast du da evtl eine Idee woran es liegen könnte?
//-------------------------------------------------------------------Bibliotheken---------------------------------------------------------------------------------------
#include "DHT.h"
#include <Stepper.h>
//--------------------------------------------------------------------Pin definieren--------------------------------------------------------------------------------------
//Pin definierungen
#define DHTTYPE DHT22
#define DHT22_Pin 7 // DHT22 auf Pin 7 gesetzt
int stateOben;
int stateU ;
const byte endschalterOben = 6; // Taster oben auf Pin 6
const byte endschalterUnten = 5; // Taster unten auf Pin 5
//--------------------------------------------------------------------Variablen------------------------------------------------------------------------------------------
DHT dht(DHT22_Pin, DHTTYPE);
int state_Vorhang = 4; // status Vorhang unten
float humidity, temperature; // Definition der Temperatur und Luftfeuchtigkeit
const int stepsPerRevolution = 2038; //2038 Schritte sind 1 Umdrehung beim Stepper
Stepper myStepper1 = Stepper(stepsPerRevolution, 8, 10, 9, 11); //Stepper Pinbelegung
void setup ()
{
// put your setup code here , to run once :
Serial.begin(9600);
dht.begin();
pinMode ( endschalterOben, INPUT ); // Taster oben als Eingang
pinMode ( endschalterUnten, INPUT ); // Taster unten als Einngang
pinMode ( DHT22_Pin, OUTPUT); // Fühler als Ausgang
}//---------------------------------------------------------------DHT22 Sensor Auslesung--------------------------------------------------------------------------------
void loop ()
{
stateOben = digitalRead(endschalterOben);
stateU = digitalRead(endschalterUnten);
humidity = dht.readHumidity(); //Liest/misst Feuchtigkeit
temperature = dht.readTemperature(); //Liest/misst Temperatur
Serial.print("Luftfeuchte: "); // Luftfeuchtigkeitsanzeige für den Serialmonitor
Serial.print(humidity); // Siehe Luftfeuchtigkeit
Serial.print("%, "); // Angabe in Prozent
Serial.print("Temperatur: "); //Temperaturanzeige für den Serialmonitor
Serial.print(temperature); //Siehe Temperatur
Serial.println("°C"); // Angabe in "C" = Celsius
Serial.print("endschalterOben: ");
Serial.print(stateOben);
Serial.print("endschalterUnten: ");
Serial.print(stateU);
Serial.println(" State_Vorhang:");
Serial.print(state_Vorhang);
delay(2000); // Pause 20msek
if (state_Vorhang == 0 && temperature < 29 && digitalRead(endschalterUnten)) { // Status 0 = Vorhang unten oder undefiniert
state_Vorhang = 1; // Status 1 = Vorhang faehrt hoch
} else if ( state_Vorhang == 1 && digitalRead(endschalterOben) == HIGH ) { // Status 2 = Vorhang oben
state_Vorhang = 2; // Status 3 = Vorhang faehrt runter
} else if ( state_Vorhang == 2 && temperature > 29 && digitalRead(endschalterOben) == HIGH ) { // Endschalter oben
state_Vorhang = 3; // Endschalter unten
} else if ( state_Vorhang == 3 && digitalRead(endschalterUnten) == HIGH ) {
state_Vorhang = 0; // Vorhang ist unten // Wenn kein fall zutrifft Fall 4
}else if (state_Vorhang == 4 && digitalRead(endschalterUnten) == LOW && digitalRead(endschalterOben) == LOW){
state_Vorhang = 1 ;
}
switch ( state_Vorhang )
{
case 0: // Vorhang unten
// myStepper1.setSpeed(0); // Geschwindkeit bei 0 = keine beweung
break ;
case 1: // Vorhang fährt hoch
// myStepper1.setSpeed(10);
// myStepper1.step(stepsPerRevolution);
break ;
case 2: // Vorhang oben
//myStepper1.setSpeed(0);
break ;
case 3: // Vorhang faehrt runter
//myStepper1.setSpeed(10);
//myStepper1.step(-stepsPerRevolution);
break ;
}
}
Warum zerpflückst Du das switch/case und baust Dir davor erneut Deine if / if else nur um den status zu setzen?
Das sind nicht 20ms sondern 2 Sekunden.
Kommentier die mal aus.
Und dann bedenke, das stepper.h blockierend ist.
Du wirst also eine gewisse Pause einrechnen müssen.