Tijd factor in plaats van delay

Goedendag, ik heb een probleem met een code waar ik niet aan uit kom.
Het volgende. Ik heb een programma gemaakt met behulp van codeys, voor het aansturen van een machine. Simpel uitgelegd betreft het een loop waarin eerst 3 relais worden aangestuurd, daarna 1 relais en als laatste nog 1 relais wat gaat knipperend gaat schakelen.
Er is 1 trigger op pin 2 die gedurende de loop gecontroleerd word. Zodra deze low wordt zal pin 7 knipperend gaan schakelen. Dit heb ik tot dusverre werkend gekregen.

Nu het probleem. Ik krijg het niet voor elkaar om de tijdsduur van de setpins low 4,5,6 en setpins low 4 hoger te krijgen dan ca. 30 seconden.
Ieder getal hoger dan ca. 30.000 resulteert er in dat de uitgangen oneindig laag blijven. (Staan nu ingesteld op 5 seconden)

Ik heb op het forum al een soortgelijk probleem voorbij zien komen waarbij men de tijdseenheid verhoogd door bijvoorbeeld de volgende code te gebruiken:
1000 * 10 * 60 of 1000 * 10 * 60ul
Het toevoegen van een delay werkt niet omdat tijdens de delay er geen controle plaatsvind op pin 2.
Kan iemand mij de goede richting op helpen?

// Definieer de pinnen
const int pin4 = 4;
const int pin5 = 5;
const int pin6 = 6;
const int pin7 = 7;
const int input2 = 2;
bool pin7Knipperen = false; // Variabele om bij te houden of pin 7 moet knipperen ivm te hoog peil

void setup() {
  // Zet de pinnen als OUTPUT
  pinMode(pin4, OUTPUT);
  pinMode(pin5, OUTPUT);
  pinMode(pin6, OUTPUT);
  pinMode(pin7, OUTPUT);
  
  // Zet input2 als INPUT
  pinMode(input2, INPUT);

  // Zet alle pinnen hoog
  digitalWrite(pin4, HIGH);
  digitalWrite(pin5, HIGH);
  digitalWrite(pin6, HIGH);
  digitalWrite(pin7, LOW);

  // Zet pin 4, 5, 6 en 7 om de beurt laag voor 1 seconde
  setPinsSequentialLow();
}

// Functie om pinnen om de beurt laag te zetten voor 1 seconde
void setPinsSequentialLow() {
  for (int pin = pin4; pin <= pin7; pin++) {
    digitalWrite(pin, LOW);  // Zet de pin laag
    delay(1500);             // Wacht 1 seconde
    digitalWrite(pin, HIGH); // Zet de pin weer hoog
  }
}

// Functie om pinnen laag te zetten met controle op input 2
void setPinsLow(int pin1, int pin2, int pin3, int duration) {
  unsigned long startTime = millis();
  digitalWrite(pin1, LOW);
  digitalWrite(pin2, LOW);
  digitalWrite(pin3, LOW);
  
  while (millis() - startTime < duration) {
    // Controleer de status van input 2
    if (digitalRead(input2) == LOW) {
      pin7Knipperen = true; // Zet pin7Knipperen op true als input2 laag is
      break;
    }
    delay(50); // Kleine vertraging voor stabiliteit
    
  }
}

void loop() {


  // Zet pin 4, 5, en 6 laag voor 5 seconden met controle op input2
  setPinsLow(pin4, pin5, pin6, 5000); // Wacht 5 seconden of input2 laag is
  delay(5000);
  // Zet pin 4, 5, en 6 weer hoog
  digitalWrite(pin4, HIGH);
  digitalWrite(pin5, HIGH);
  digitalWrite(pin6, HIGH);
  
  // Zet pin 4 laag voor seconden met controle op input2
  setPinsLow(pin4, pin4, pin4, 5000); // Zet pin 4 laag voor 5 seconden of input2 laag is
  digitalWrite(pin4, HIGH); // Zet pin 4 weer hoog

  // Duur van het knipperen (10 minuten)
  unsigned long startTime = millis();
  
  while (millis() - startTime < 86400000) { // 24 uur in milliseconden
    // Controleer de status van input 2
    if (digitalRead(input2) == LOW) {
      pin7Knipperen = true; // Zorg dat onder deze voorwaarde pin 7 blijft knipperen
    }
    
    if (pin7Knipperen) {
      // Laat pin als alarm 7 knipperen
      digitalWrite(pin7, HIGH);
      delay(50);
         digitalWrite(pin7, LOW);
      delay(50);
    } else {
      // Laat alleen pin 7 knipperen als teken dat programma klaar is
      digitalWrite(pin7, HIGH);
      delay(1500);
      digitalWrite(pin7, LOW);
      delay(1500);
    }
  }
}

Probeer eens met UL erachter...
Met unsigned longs moet het goed gaan tot perioden van 40 dagen. Bij nog grotere periodes moet je de rollover bijhouden. Wat jij wilt moet dus prima kunnen...

En waar wordt deze gedeclareerd?

Helaas heeft dit geen resultaat. Ik heb te weinig kennis om te verklaren wat je vraagt over de declaratie van de DURATION.

duration is een int en krijgt de waarde 5000 in de aanroep van de funktie setpinslow(.....,....,...,5000)

ik snap alleen niet waarom je 3x pin4 als parameter mee geeft. Dit is waarschijnlijk een foutje?.

het is gelukt, met behulp van codey. zie toelichting:

  1. Loop in setPinsLow: De setPinsLow functie bevat nu een oneindige loop (while (true)) die blijft draaien totdat ofwel input2 laag is of de gespecificeerde duur is verstreken. In ieder geval hartelijk dank voor het meedenken!
  2. `// Definieer de pinnen
    const int pin4 = 4;
    const int pin5 = 5;
    const int pin6 = 6;
    const int pin7 = 7;
    const int input2 = 2;
    bool pin7Knipperen = false; // Variabele om bij te houden of pin 7 moet knipperen ivm te hoog peil

void setup() {
// Zet de pinnen als OUTPUT
pinMode(pin4, OUTPUT);
pinMode(pin5, OUTPUT);
pinMode(pin6, OUTPUT);
pinMode(pin7, OUTPUT);

// Zet input2 als INPUT
pinMode(input2, INPUT);

// Zet alle pinnen hoog
digitalWrite(pin4, HIGH);
digitalWrite(pin5, HIGH);
digitalWrite(pin6, HIGH);
digitalWrite(pin7, LOW);

// Zet pin 4, 5, 6 en 7 om de beurt laag voor 1 seconde
setPinsSequentialLow();
}

// Functie om pinnen om de beurt laag te zetten voor 1 seconde
void setPinsSequentialLow() {
for (int pin = pin4; pin <= pin7; pin++) {
digitalWrite(pin, LOW); // Zet de pin laag
delay(2250); // Wacht 1,5 seconde
digitalWrite(pin, HIGH); // Zet de pin weer hoog
}
}

// Functie om pinnen laag te zetten met controle op input 2
void setPinsLow(int pin1, int pin2, int pin3, unsigned long duration) {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);

unsigned long startTime = millis();
while (true) {
// Controleer de status van input 2
if (digitalRead(input2) == LOW) {
pin7Knipperen = true; // Zet pin7Knipperen op true als input2 laag is
break; // Stop de loop als pin 2 laag is
}

// Controleer of de duur verstreken is
if (millis() - startTime >= duration) {
  break; // Stop de loop als de duur is verstreken
}

delay(50); // Kleine vertraging voor stabiliteit

}

// Zet de pinnen weer hoog
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
digitalWrite(pin3, HIGH);
}

void loop() {
// Zet pin 4, 5, en 6 laag voor 30 seconden met controle op input2
setPinsLow(pin4, pin5, pin6, 240000); // Wacht 30 seconden of input2 laag is

// Zet pin 4 laag voor 30 seconden met controle op input2
setPinsLow(pin4, pin4, pin4, 180000); // Zet pin 4 laag voor 30 seconden of input2 laag is

// Duur van het knipperen (10 minuten)
unsigned long startTime = millis();

while (millis() - startTime < 86400000) { // 24 uur in milliseconden
// Controleer de status van input 2
if (digitalRead(input2) == LOW) {
pin7Knipperen = true; // Zorg dat onder deze voorwaarde pin 7 blijft knipperen
}

if (pin7Knipperen) {
  // Laat pin als alarm 7 knipperen
  digitalWrite(pin7, HIGH);
  delay(50);
  digitalWrite(pin7, LOW);
  delay(50);
} else {
  // Laat alleen pin 7 knipperen als teken dat programma klaar is
  digitalWrite(pin7, HIGH);
  delay(1500);
  digitalWrite(pin7, LOW);
  delay(1500);
}

}
}`

Dit moet dus ook een unsigned long zijn...
Ints gaan tot 32xxx ergens... (2^15-1)

Kijk, dat is waar mijn oer-stapjes programmeren komen bovendrijven.
Het getal is dan 32768 (-1 = 32767); dat was een belangrijke waarde voor de commodore 64; mijn eerste computer.
Riep je daar dat byte aan, dan kreeg je een reset van het systeem.
sys 32768 was dan het commando, en vanaf die locatie werd dus de reset uitgevoerd.
Heeft verder niets met de thread te maken, maar ik kon deze post even niet laten, stukje nostalgie.

1 Like

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