Simple question to loop

Hello,

if have this code:

// Version for ESP8266

int P_FET_Q1 = 4; //D2
int N_FET_Q4 = 0; //D3

int P_FET_Q3 = 13; // D7
int N_FET_Q2 = 15; // D8

const int switch1 = 5; //7
int switchval1 = 1;

unsigned long previousMillis = 0;                   // will store last time updated
const long interval = 2000;                        // interval at which to run   muss 15000 sein

bool clockwiseval = true;

void setup() {

  Serial.begin(115200);

  pinMode(switch1, INPUT);


  pinMode(P_FET_Q1, OUTPUT);  //der linke Mosfet oben
  pinMode(N_FET_Q2, OUTPUT);  //der linke Mosfet unten
  pinMode(P_FET_Q3, OUTPUT);  //der rechte Mosfet oben
  pinMode(N_FET_Q4, OUTPUT);  //der rechte Mosfet unten
}

void loop() {
  switchval1 = digitalRead(switch1);
  // Serial.println(switchval1);

  counterclockwise();
  clockwise();
  if ( switchval1 == 0 ) {
    Serial.println("Switch 1 aktiviert");
  }

}


void counterclockwise()
{
  if ( switchval1 != 0) {
    digitalWrite(N_FET_Q4, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
    digitalWrite(P_FET_Q1, LOW);
    //delay(1000);
    digitalWrite(N_FET_Q2, HIGH); //beide Mosfets von aktionsbereich 2 werden deaktiviert
    digitalWrite(P_FET_Q3, HIGH);
    // delay(4000);
  }
  else
  {
    digitalWrite(N_FET_Q2, LOW); //beide Mosfets von aktionsbereich 2 werden deaktiviert
    digitalWrite(P_FET_Q3, LOW);
    clockwiseval = false;
  }
}

void clockwise()
{

  if (clockwiseval == false) {

    unsigned long currentMillis = millis();

    // save the last time you blinked the LED
    //   if ((currentMillis - previousMillis) > interval) {

    if (currentMillis - previousMillis <= interval) {

      Serial.println("clockwise while started");
      digitalWrite(N_FET_Q2, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
      digitalWrite(P_FET_Q3, LOW);
      //delay(1000);
      digitalWrite(N_FET_Q4, HIGH); //beide Mosfets von aktionsbereich 2 werden deaktiviert
      digitalWrite(P_FET_Q1, HIGH);
      // delay(4000);
      previousMillis = currentMillis;
    }
    else
    {
      digitalWrite(N_FET_Q2, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
      digitalWrite(P_FET_Q3, LOW);
      digitalWrite(N_FET_Q4, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
      digitalWrite(P_FET_Q1, LOW);

      Serial.println("clockwise end");
      clockwiseval = true;
    }
  }

}

as soon as I activate the switch it should go to clockwise() to move the DC motor clockwise for to seconds (interval).
I have some mistake in this code. It just execute this part as soon as the switch is activated and not for just 2 seconds... :frowning:

anyone out there?

The reason it doesn't stop after 2 seconds is because you are setting previousMillis to currentMillis every time and therefore you never execute the else code block. You should set previousMillis when you read the switch. Try the following version. I couldn't compile or test myself.

// Version for ESP8266

int P_FET_Q1 = 4; //D2
int N_FET_Q4 = 0; //D3

int P_FET_Q3 = 13; // D7
int N_FET_Q2 = 15; // D8

const int switch1 = 5; //7
int switchval1 = 1;

unsigned long previousMillis = 0;                   // will store last time updated
const long interval = 2000;                        // interval at which to run   muss 15000 sein

bool clockwiseval = true;

void setup() {

  Serial.begin(115200);

  pinMode(switch1, INPUT);


  pinMode(P_FET_Q1, OUTPUT);  //der linke Mosfet oben
  pinMode(N_FET_Q2, OUTPUT);  //der linke Mosfet unten
  pinMode(P_FET_Q3, OUTPUT);  //der rechte Mosfet oben
  pinMode(N_FET_Q4, OUTPUT);  //der rechte Mosfet unten
}

void loop() {
  switchval1 = digitalRead(switch1);
  // Serial.println(switchval1);

  counterclockwise();
  clockwise();
  if ( switchval1 == 0 ) {
    Serial.println("Switch 1 aktiviert");
  }

}


void counterclockwise()
{
  if ( switchval1 != 0) {
    digitalWrite(N_FET_Q4, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
    digitalWrite(P_FET_Q1, LOW);
    //delay(1000);
    digitalWrite(N_FET_Q2, HIGH); //beide Mosfets von aktionsbereich 2 werden deaktiviert
    digitalWrite(P_FET_Q3, HIGH);
    // delay(4000);
  }
  else
  {
    digitalWrite(N_FET_Q2, LOW); //beide Mosfets von aktionsbereich 2 werden deaktiviert
    digitalWrite(P_FET_Q3, LOW);
    clockwiseval = false;
    previousMillis = millis();
  }
}

void clockwise()
{

  if (clockwiseval == false) {

    unsigned long currentMillis = millis();

    // save the last time you blinked the LED
    //   if ((currentMillis - previousMillis) > interval) {

    if (currentMillis - previousMillis <= interval) {

      Serial.println("clockwise while started");
      digitalWrite(N_FET_Q2, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
      digitalWrite(P_FET_Q3, LOW);
      //delay(1000);
      digitalWrite(N_FET_Q4, HIGH); //beide Mosfets von aktionsbereich 2 werden deaktiviert
      digitalWrite(P_FET_Q1, HIGH);
      // delay(4000);
    }
    else
    {
      digitalWrite(N_FET_Q2, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
      digitalWrite(P_FET_Q3, LOW);
      digitalWrite(N_FET_Q4, LOW);  //beide Mosfets von aktionsbereich 1 werden deaktiviert
      digitalWrite(P_FET_Q1, LOW);

      Serial.println("clockwise end");
      clockwiseval = true;
    }
  }

}
1 Like

Also, how is your switch wired? Do you have a pullup resistor?

it's an end stop switch. do I need any resistor to connect this switch to D1 of an esp8266?

Thank you, that's it! it is working now! thanks a lot!

Most switches will be connected or not. When not connected the input is floating unless there is a pull up or pull down resistor. I believe on the ESP8266 you can use pin mode INPUT_PULLUP to enable the internal pullup resistor then you won't need an external resistor. However, I'm not an ESP8266 expert.

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