Wetterstation mit arduino Mega

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

Aber ich :slight_smile:

ESO ist Dein PIN und nicht das, was Du erwartest

ESO ist Dein PIN und nicht der Zustand!
Da hinter ESO eine Ziffer steht, die != 0 ist, ist sowohl ESO als auch ESU IMMER HIGH.

Und dann habe ich mich gefragt, was Deine ganzen Vergleiche sollen. Du hast doch die Zustände und kannst in jedem case darauf reagieren.

//-------------------------------------------------------------------Bibliotheken---------------------------------------------------------------------------------------
#include "DHT.h"
#include <Stepper.h>


//--------------------------------------------------------------------Pin definieren--------------------------------------------------------------------------------------
//Pin definierungen
#define DHTTYPE DHT22
const byte DHT22_Pin = 7; // DHT22 auf Pin 7 gesetzt
const byte endschalterOben = 6; // Taster oben auf Pin 6
const byte endschalterUnten = 5; // Taster unten auf Pin 7

//--------------------------------------------------------------------Variablen------------------------------------------------------------------------------------------
DHT dht(DHT22_Pin, DHTTYPE);
byte state_Vorhang = 0; // 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 ()
{
  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
  switch ( state_Vorhang )
  {
    case 0: // Vorhang unten
      myStepper1.setSpeed(0); // Geschwindkeit bei 0 = keine beweung
      if (temperature < 26 || (digitalRead(endschalterUnten) == LOW && digitalRead(endschalterOben) == LOW))
      {
        state_Vorhang = 1;
      }
      break ;
    case 1: // Vorhang fährt hoch
      myStepper1.setSpeed(10);
      myStepper1.step(stepsPerRevolution);
      if (digitalRead(endschalterOben) == HIGH )
      {
        state_Vorhang = 2;
      }
      break ;
    case 2: // Vorhang oben
      myStepper1.setSpeed(0);
      if (temperature > 26 )
      {
        state_Vorhang = 3;
      }
      break ;
    case 3: // Vorhang faehrt runter
      myStepper1.setSpeed(10);
      myStepper1.step(-stepsPerRevolution);
      if (digitalRead(endschalterUnten) == HIGH)
      {
        state_Vorhang = 0;
      }
      break ;
  }
}

Wie Du siehst, habe ich den Pins andere Namen gegeben... Nicht ohne Grund. :wink:

1 Like

Also überall Serial einbauen und gucken.
Meiner bei 5V und

myStepper1.setSpeed(10);

will nicht vernünftig darf nur Max 5 haben

Ich nehme mal an der Vorhang befindet sich nicht in einem Puppenhaus oder Fenstermodell.
Ist der 28BYJ 48 überhaupt stark genug für diese Anwendung?

Grüße Uwe

Das wird er rausfinden, wenn sich der Motor überhaupt erstmal bewegt, nachdem er nicht den PIN sondern den Status des PIN abfragt :wink:

ist stark genug :slight_smile:
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.

jop problem erkannt... muss den Stepper mit einem DC motor austauschen.
Stepper.h ist blockierend

Nö.
Schau mal in die mobatools gut dokumentiert und aktiver Maintainer.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.