eindeloopschakelaar moet de positie bepalen van de dc motr

Als je wilt dat wij begrijpen wat de relais doen, zul je ze betere namen moeten geven (zoals ik al eerder heb aangegeven). Je hebt nu een commentaar toegevoegd hetgeen een eerste stap is maar dat betekent dat we iedere keer dat we willen weten wat bv. relais2 is, we weer terug naar het begin van je programma moeten.

Je lijk je ook nog geen antwoord te hebben gegeven op de vraag waarom je vetragingen hebt van 5 seconden. Ik heb wel een vermoeden, maar wil het graag uit jouw mond vernemen.

Je lijkt de schakelaars te hebben aangesloten tussen pin en GND en de interne pull-up actief te hebben gemaakt voor de schakelaars. Het is verstandig om die informatie bij elkaar te houden zodat iemand die je programma leest het meteen begrijpt. Ik had hier een heel ander stukje tekst staan omdat ik dat niet meteen zag :wink:

Ik stel voor dat je

void setup()
{
  ...
  ...
 
  pinMode (LM1, INPUT);
  pinMode (LM2, INPUT);
  pinMode (LM3, INPUT);

  ...
  ...
  
  digitalWrite(LM1, HIGH);
  digitalWrite(LM2, HIGH);
  digitalWrite(LM3, HIGH);

  ...
  ...
}

verandert naar

void setup()
{
  ...
  ...
 
  // switches
  pinMode (LM1, INPUT);
  pinMode (LM2, INPUT);
  pinMode (LM3, INPUT);

  // activate internal pullup resistors
  digitalWrite(LM1, HIGH);
  digitalWrite(LM2, HIGH);
  digitalWrite(LM3, HIGH);

  ...
  ...
}

Er is ook een 'kortere weg' :wink:

void setup()
{
  ...
  ...
 
  // switches
  pinMode (LM1, INPUT_PULLUP);
  pinMode (LM2, INPUT_PULLUP);
  pinMode (LM3, INPUT_PULLUP);

  ...
  ...
  
}

Nu is de hamvraag of een gat resulteert in LOW of in HIGH?

Je moet er misschien ook rekening mee houden dat schakelaars contact dender hebben. Als ze van ingedrukt naar niet ingedrukt gaan (of omgekeerd) kan het snel uitlezen van de schakelaars resulteren in een aantal gedetecteerde overgangen van laag naar hoog.

LLLL HLHL HHHHHHHHH LH LLLLLLLLL
^    ^    ^         ^  ^
|    |    |         |  |
|    |    |         |  +--- stabiel
|    |    |         +------ dender
|    |    +---------------- stabiel
|    +--------------------- dender
+-------------------------- stabiel

Met de vertragingen die je op dit moment hebt ingebouwd en je huidige programma is er geen probleem.

Onderstaand programma laat je motor eeuwig draaien en laat je zien welke fles (of geen fles) er op dit moment 'actief' is. Het programma laat je ook zien hoe je de 'prijzen' kunt optellen. Het resultaat hangt af van het antwoord op de eerdere hamvraag; je kunt de LOWs veranderen naar HIGHs indien noodzakelijk.

int RELAY1 = A1;
int RELAY_MOTOR = A2;   // flessen laten ronddraaien
int RELAY3 = A3;
int RELAY_BOTTLE = A4;  // zorgen dat er drank uitkomt
int LM1 = 8;
int LM2 = 9;
int LM3 = 10;

int delaypositionue = 5000;
void setup()
{
  Serial.begin (9600);

  // relay connections
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY_MOTOR, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode( RELAY_BOTTLE, OUTPUT);

  // de-activate at start up
  digitalWrite(RELAY1, HIGH);
  digitalWrite(RELAY_MOTOR, HIGH);
  digitalWrite( RELAY3, HIGH);
  digitalWrite( RELAY_BOTTLE, HIGH);

  // switch connections
  pinMode (LM1, INPUT);
  pinMode (LM2, INPUT);
  pinMode (LM3, INPUT);

  // activate internal pullups on switches
  digitalWrite(LM1, HIGH);
  digitalWrite(LM2, HIGH);
  digitalWrite(LM3, HIGH);

  // start the motor
  digitalWrite ( RELAY_MOTOR, LOW);
  Serial.println("MOTOR ON");
}

void loop()
{
  int position = 0;

  // switch in gap
  if (digitalRead(LM1) == LOW)
  {
    position += 1;
  }
  if (digitalRead(LM2) == LOW)
  {
    position += 2;
  }
  if (digitalRead(LM3) == LOW)
  {
    position += 4;
  }

  Serial.print("Position = "); Serial.print(position);
  Serial.print(" @ "); Serial.println(millis());
}

Je kunt nu de variabele position testen en stoppen als de gewenste fles op de juiste plek staat.