Microswitch while-loop

Goedemiddag,
Ik ben al een tijdje bezig om een de deur van het kippenhok automatisch open en dicht te laten gaan.
Ik loop nu tegen het probleem aan dat ik de microswitch niet goed werkend krijg. Ik zou graag de motor willen laten stoppen met draaien als de microswitch ingedrukt wordt.

In de code staat de volgende regel:

while (currentLine.endsWith("GET /L") && limitSwitch.getState() == LOW) {

Door deze regel wil ik graag de DC motor laten draaien als de URL eindigt op /L en als de schakelaar niet ingedrukt is. Als de schakelaar ingedrukt wordt zou deze while statement moeten stoppen, maar helaas gaat het motortje gewoon door met draaien.

Voor de microswitch gebruik ik de ezButton library. Ik heb mijn code bijgevoegd.

Weet iemand wat er fout gaat?

Een fijne dag nog!

#include <ezButton.h>
#include <SPI.h>
#include <WiFiNINA.h>
#include <Dusk2Dawn.h>
#include <Wire.h>
#include "RTClib.h"


char ssid[] = "xxxxxxxxx";
char pass[] = "xxxxxxxxx";
int status = WL_IDLE_STATUS;
WiFiSSLClient client;
WiFiServer server(80);
ezButton limitSwitch(6);

int motor1 = 7;
int motor2 = 8;
int ENB = 5;

int currentsec;
int zonsopkomst;
int zonsopkomstsec;
int zonsondergang;
int zonsondergangsec;
int deurdicht;
int deurdichtstop;
int deuropen;
int deuropenstop;
const char * deurstatus;

DateTime now;

RTC_DS3231 rtc;

void setup() {
  Serial.begin(115200);

  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
  
  server.begin();
  
  rtc.begin();

  limitSwitch.setDebounceTime(50);
  
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //rtc.adjust(DateTime(2022, 7, 16, 22, 7 , 0));

}

void loop() {
  limitSwitch.loop();
  now = rtc.now();
  Dusk2Dawn thuis(xx.xxxx, x.xxxx, 1);
  zonsopkomst = thuis.sunrise(now.year(), now.month(), now.day(), true);
  zonsopkomstsec = zonsopkomst * 60;
  zonsondergang = thuis.sunset(now.year(), now.month(), now.day(), true);
  zonsondergangsec = zonsondergang * 60;
  currentsec = (now.hour() * 3600 + now.minute() * 60 + now.second());
  deuropen = zonsopkomstsec - 900;
  deuropenstop = zonsopkomstsec - 893;
  deurdicht = zonsondergangsec + 900;
  deurdichtstop = zonsondergangsec + 960;
  char zonsopkomsttijd[6];
  char zonsondergangtijd[6];
  Dusk2Dawn::min2str(zonsopkomsttijd, zonsopkomst);
  Dusk2Dawn::min2str(zonsondergangtijd, zonsondergang);

  char tijd[] = "hh:mm";

  status = WiFi.begin(ssid, pass);
  IPAddress ip = WiFi.localIP();
  
  Serial.println("Tijd: ");
  Serial.println(now.toString(tijd));
  Serial.println("Zonsopkomst: ");
  Serial.println(zonsopkomsttijd);
  Serial.println("Zonsondergang: ");
  Serial.println(zonsondergangtijd);
  Serial.println("IP Address: ");
  Serial.println(ip);
  Serial.println();
  delay(1000);
  
  if (currentsec >= deurdicht && currentsec <= deurdichtstop) {
    digitalWrite(motor1, HIGH);
    digitalWrite(motor2, LOW);
    analogWrite(ENB, 74);
    deurstatus = "dicht.";
  }

  else if (currentsec >= deuropen && currentsec <= deuropenstop) {
    digitalWrite(motor1, LOW);
    digitalWrite(motor2, HIGH);
    analogWrite(ENB, 185);
    deurstatus = "open.";
  }
  else {
    digitalWrite(motor1, LOW);
    digitalWrite(motor2, LOW);
  }

  WiFiClient client = server.available();

  if (client) {
    String currentLine = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n') {

          if (currentLine.length() == 0) {
            client.println("<html>");
            client.print("<body>");
            client.print("<center>");
            client.print("<style>");
            client.print("body{font-size: 18px;}");
            client.print("</style>");
            client.print("<meta http-equiv=\'refresh\' content=\'30\'>");
            client.println();
            client.print("Tijd: ");
            client.print(tijd);
            client.print("<\p>");
            client.print("Zonsopkomst: ");
            client.print(zonsopkomsttijd);
            client.print("<\p>");
            client.print("Zonsondergang: ");
            client.print(zonsondergangtijd);
            client.print("<\p>");
            client.print("Deur is ");
            client.print(deurstatus);
            client.print("</center>");
            client.print("</body>");
            client.print("</html>");
            break;
          }
          else {
            currentLine = "";
          }
        }
        else if (c != '\r') {
          currentLine += c;
        }

        limitSwitch.loop();        
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(motor1, HIGH);
          digitalWrite(motor2, LOW);
          analogWrite(ENB, 185);
          delay(7000);
          deurstatus = "open.";
          client.print("<html>");
          client.print("<script>");
          client.print("setInterval(function(){ window.location.href = '/'; }, 2000);");
          client.print("</script>");
          client.print("</html>");
        }

        while (currentLine.endsWith("GET /L") && limitSwitch.getState() == LOW) {
          digitalWrite(motor1, LOW);
          digitalWrite(motor2, HIGH);
          analogWrite(ENB, 74);
          deurstatus = "dicht.";
          client.print("<html>");
          client.print("<script>");
          client.print("setInterval(function(){ window.location.href = '/'; }, 2000);");
          client.print("</script>");
          client.print("</html>");
        }
      }
    }
    client.stop();
  }
}

Is deze voorwaarde ooit waar?

Houdt dit de knop in een lage staat?

Ik denk het wel, jij niet? De microswitch is altijd óf == HIGH óf == LOW

Die loop is nodig, anders wordt er nooit gecontroleerd of de knop pressed of released is.

Thanks voor het meedenken!

Volgens mij moet het wel, maar de motor (motor 2?) loopt niet. Als u een positieve "debug"-afdruk kunt krijgen die aangeeft dat aan de voorwaarde is voldaan, ligt het probleem ergens anders.

Ik heb een vriend met een paar dozijn kippen. Hij doet Arduino soundbending als muzikant. Ik zal blij zijn als uw project klaar is, dus ik zou hem kunnen informeren.

Motor1 en motor2 zijn de verschillende richtingen van de motor, dus als motor2 uit staat zet ik motor1 aan, en zo kan het motortje 2 verschillende kanten op draaien.

Ik zal straks even Serial.print checken, goede tip!

Dan moet er maar op jouw woord geloofd worden.
Maar "meten is weten".
Dat kun je op meerdere manieren doen:
Met een multimeter lijkt me het eenvoudigst.
Ook twee LEDjes die laten zien of ie HIGH is, of dat ie LOW is.
Maar wanneer je toch al de serial monitor gaat gebruiken voor debugging (een zeer sterke hulp hierin), kun je daar ook de staat van die ingang laten zien.
Wees je er van bewust dat als ie niet HIGH is, dat dat nog niet betekent dat het LOW is.
Maar nogmaals, wij hebben geen idee hoe je de switch bedraad hebt.

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