Het lukt niet 2 functies simultaan te draaien

Voor mijn beregening van mijn tuin gebruik ik water uit de regenwaterput 15.000 liter(pomp 6000 L/uur). De tuin is ingedeeld in 5 zones die elk een bepaalde tijd sproeien.Als de regenwaterput halfvol is wordt er commando gegeven om via een pomp grondwater bij te vullen (3000 L/uur). Tevens is er een droogloop beveiliging voor de waterpomp in opgenomen. Het beregenen werkt uitstekend. Maar de controle van de waterput werkt pas als de cyclus van de beregening is afgelopen.

waterput_level.ino (2.93 KB)

Heb je wel eens overwogen om wat commentaar in jouw sketch toe te voegen zodat een ander ook begrijpt wat jouw sketch eigenlijk doet? Of variabelen te benoemen die wat meer zelf beschrijvend zijn?
Nu is het vrij onleesbaar.

Mas3 heeft dit in zijn footer staan

Have a look at "blink without delay".

En dat is precies wat jij nodig hebt.

Met vriendelijke groet
Jantje

Hoi poelmans, welkom.

Jouw code doet inderdaad een beetje pijn aan de ogen.
Het commentaar waar Nico het over had, is een heel goed idee.
Niet alleen voor wanneer je iemand anders' hulp nodig hebt zoals nu, maar ook voor als bijvoorbeeld je straks als het begint te vriezen ineens bedenkt dat ook de temperatuur iets moet gaan doen, en je dus de code moet gaan aanpassen.
Over een paar maanden weet je niet meer hoe je precies tot deze code gekomen bent en mag je zelf dus gaan zitten uitpluizen hoe het ook weer werkt.
Dan is het een heel goed idee om maar eens wat commentaar toe te voegen.

Verder zie ik enorme delays, en dat doet mij altijd pijn.
De delays zoals je die hier toepast, zijn namelijk absoluut niet nodig.
Delay(18000) betekent "doe 288.000.000; tweehonderdachtentachtig miljoen keer niets".
Das enorm zonde van zeer kostbare tijd.
Een alternatief daarvoor vind je in de voorbeelden die bij de IDE zijn meegeleverd, daar ben je al op gewezen, en ik wijs daar bij elke post ook op.
Dus kijk daar eens naar.

Mijn excuses maar eerst wil ik mezelf even voorstellen.
Ik ben 56 jaar en ben met Arduino enkele maanden geleden beginnen experimenteren, zonder enige voorkennis van programmeren ben ik tot dit resultaat gekomen. Ik vind het zeer moeilijk maar als er resultaten zijn is voldoening des te groter.

Hier een aangepast sketch.

beregenig-waterput.ino (3.91 KB)

Ik heb de commentaren met belangstelling gelezen. Hieruit heb ik begrepen dat ik de functie "millis" moet gaan gebruiken. Volgens de de uitleg ( blink without delay ) kan dit niet anders dan de fout zijn.
Ik dank iedereen al voor de snelle reactie. Ik hou U op de hoogte

groeten

Rudy

Hoi poelmans.

Het is al heel wat dat je al met functies werkt wanneer je nog maar net met programmeren begonnen bent.
Uiteraard kan je daar nog wel wat stroomlijnen, maar dat zijn van die dingen die je gaandeweg wel zal leren.

Ik zie dat je commentaren hebt toegevoegd.
Das alvast een verbetering.
Zorg er wel voor dat als je de code gaat aanpassen, dat dan ook de commentaren nog blijven kloppen.
Anders heb je er nog niet veel aan.

Ik zou zeggen, ga eens met dat voorbeeld aan de slag en kijk eens of je begrijpt wat daar gebeurt.
Als dat niet het geval zou zijn, ben je van harte welkom om er hier op het forum vragen over te stellen.
Ik heb niet voor niets in mijn handtekening de opmerking gezet, dat is namelijk een van de meest voorkomende problemen die ook nog eens redelijk eenvoudig op te lossen is.
Ik zou je wel adviseren om je vragen daarover in een nieuwe thread te zetten met een duidelijke titel.
Want dan vangen we meerdere vliegen in 1 klap; jouw thread kan dan ook anderen helpen die tegen hetzelfde probleem aanlopen.

int qut=A0;//put leeg je mag wel langere namen hebben hoor
int hlf=A1;//put half vol
int thf=A2;// put 3 kwart vol
int ful=A3;// put vol
int motor=8;//pomp regenwaterput beter is pinregenpomp
int buz=7;// pomp grondwater      beter is pingrondpomp
int q; // onderste sensor? is input A0
int h;// etc
int t;
int f;
int v=100; //gain regenwaterput
int b=0;   //pomp grondwater beter is pompstart
int m=0;   //pomp regenput
int led=9;//level leeg
int led1=10;//level half vol
int led2=11;// level 3kwart vol
int led3=12;// level vol
const int buttonPin = A4;//beregening aan
const int buttonPin1 = A5;
const int ledPin =  13;
const int Pin2 =  2;//zone1
const int Pin3 =  3;//zone2
const int Pin4 =  4;//zone3
const int Pin5 =  5;//zone4
const int Pin6 =  6;//zone5

int buttonState = 0;      

int i = 0;
void setup()

{

pinMode(qut,INPUT);
pinMode(hlf,INPUT);
pinMode(qut,INPUT);
pinMode(ful,INPUT);
pinMode(motor,OUTPUT);
pinMode(buz,OUTPUT);
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(ledPin, OUTPUT);
  pinMode(Pin2,OUTPUT);
  pinMode(Pin3,OUTPUT);
  pinMode(Pin4,OUTPUT);
  pinMode(Pin5,OUTPUT);
  pinMode(Pin6,OUTPUT);
  pinMode(buttonPin, INPUT);//beregening aan
 
}

void loop()
{
 while (buttonState = digitalRead(buttonPin)) {waterlevel();
 }
 {
  if (buttonState == HIGH )
   for (int i=0;i<2; i++)
 {
    delay(125);
    digitalWrite(Pin2, HIGH);
    delay(18000); // hier staat je programma dus gewoon stil tot de tijd voorbij is.
// dit kun je voorkomen door millis te gebruiken.

    digitalWrite(Pin2, LOW);
    delay(3000);  // je pomp staat nog aan dus eerst 3 aan en dan pas 2 uit
    digitalWrite(Pin3,HIGH);
    delay(18000);
    digitalWrite(Pin3, LOW);
    delay(3000);
    digitalWrite(Pin4, HIGH);
    delay(12000);
    digitalWrite(Pin4, LOW);
    delay(3000);
    digitalWrite(Pin5,HIGH);
    delay(90000);
    digitalWrite(Pin5, LOW);
    delay(3000);
    digitalWrite(Pin6, HIGH);
    delay(90000);
    digitalWrite(Pin6, LOW);
    delay(3000);
   
  }

  else 
   digitalWrite(Pin2,LOW);
    digitalWrite(Pin3,LOW);
    digitalWrite(Pin4,LOW);
    digitalWrite(Pin5,LOW);
    digitalWrite(Pin6,LOW);
je pomp moet ook uit.

}
}
  void waterlevel()  
  { 
q=analogRead(qut); // dit is erg kryptisch
h=analogRead(hlf);
t=analogRead(thf);
f=analogRead(ful);
  

if(f>v && t>v && h>v && q>v )//put vol spring dan ook naar een functie put vol waar je de commandos geeft, dat maakt het overzichtelijker
{
digitalWrite (motor,LOW);
digitalWrite (buz,LOW);
digitalWrite (led,HIGH);
digitalWrite (led1,HIGH);
digitalWrite (led2,HIGH);
digitalWrite (led3,HIGH);
}
else
digitalWrite (led,LOW);
digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
digitalWrite (led3,LOW);
{
if(f<v && t>v && h>v && q>v)//put 3 kwart vol
{

digitalWrite (motor,LOW);
digitalWrite (buz,LOW);
digitalWrite (led,HIGH);
digitalWrite (led1,HIGH);
digitalWrite (led2,HIGH);
}
else
digitalWrite (led,LOW);
digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
{
if(f<v && t<v && h>v && q>v)//put half vol
{
digitalWrite (motor,LOW);
digitalWrite (buz,HIGH);
digitalWrite (led,HIGH);
digitalWrite (led1,HIGH);
}
else
digitalWrite (led,LOW);
digitalWrite (led1,LOW);
if(f<v && t<v && h<v && q>v)//put kwart vol
{
digitalWrite (motor,LOW);
digitalWrite (buz,HIGH);
digitalWrite (led,HIGH);
}
else
digitalWrite (led,LOW);
{
if(f<v && t<v && h<v && q<v)// put leeg
{
digitalWrite (motor,HIGH);
digitalWrite (buz,HIGH);
}
else;
}
}}}

zo kun je weer een hoop verbeteren aan je programma, en je bent goed bezig hoor, vooral het bedenksel is leuk, het is niet praktisch als je 18 seconden sproeit, maar ach om te testen is het wel handig.
zet die tijden ook in een variabele (long) dan hoef je maar op een plek te wijzigen.

@shooter

Het klopt allemaal. Ik had dit helemaal niet door waarom dit kon vastlopen. Nu weet ik dat het programma zich uitsluitend bezig houd met de delay's tot deze afgehandeld zijn. Ben nu de millis aan het instuderen maar dit is voor mij niet zo eenvoudig. Geef me nog even tijd en ik zal er wel komen.
Elke suggestie is zeker welkom voor een leek. En bedankt jongens voor de leuke reacties.

Groeten
Rudy

int qut=A0;//put leeg
int hlf=A1;//put half vol
int thf=A2;// put 3 kwart vol
int ful=A3;// put vol
int motor=8;//pomp regenwaterput
int buz=7;// pomp grondwater
int q;
int h;
int t;
int f;
int v=100; //gain regenwaterput
int b=0;   //pomp grondwater
int m=0;   //pomp regenput
int led=9;//level leeg
int led1=10;//level half vol
int led2=11;// level 3kwart vol
int led3=12;// level vol
const int buttonPin = A4;//beregening aan
const int buttonPin1 = A5;
const int ledPin =  13;
const int Pin2 =  2;//zone1
const int Pin3 =  3;//zone2
const int Pin4 =  4;//zone3
const int Pin5 =  5;//zone4
const int Pin6 =  6;//zone5

int buttonState = 0;      

int i = 0;
void setup()

{

pinMode(qut,INPUT);
pinMode(hlf,INPUT);
pinMode(qut,INPUT);
pinMode(ful,INPUT);
pinMode(motor,OUTPUT);
pinMode(buz,OUTPUT);
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(ledPin, OUTPUT);
  pinMode(Pin2,OUTPUT);
  pinMode(Pin3,OUTPUT);
  pinMode(Pin4,OUTPUT);
  pinMode(Pin5,OUTPUT);
  pinMode(Pin6,OUTPUT);
  pinMode(buttonPin, INPUT);//beregening aan
 
}

void loop()
{
 while (buttonState = digitalRead(buttonPin)) {waterlevel();
 }
 {
  if (buttonState == HIGH )
   for (int i=0;i<2; i++)
 {
    delay(125);
    digitalWrite(Pin2, HIGH);
    delay(18000);
    digitalWrite(Pin2, LOW);
    delay(3000);
    digitalWrite(Pin3,HIGH);
    delay(18000);
    digitalWrite(Pin3, LOW);
    delay(3000);
    digitalWrite(Pin4, HIGH);
    delay(12000);
    digitalWrite(Pin4, LOW);
    delay(3000);
    digitalWrite(Pin5,HIGH);
    delay(90000);
    digitalWrite(Pin5, LOW);
    delay(3000);
    digitalWrite(Pin6, HIGH);
    delay(90000);
    digitalWrite(Pin6, LOW);
    delay(3000);
   
  }

  else 
   digitalWrite(Pin2,LOW);
    digitalWrite(Pin3,LOW);
    digitalWrite(Pin4,LOW);
    digitalWrite(Pin5,LOW);
    digitalWrite(Pin6,LOW);
}
}
  void waterlevel()  
  { 
q=analogRead(qut);
h=analogRead(hlf);
t=analogRead(thf);
f=analogRead(ful);
  

if(f>v && t>v && h>v && q>v )//put vol
{
digitalWrite (motor,LOW);
digitalWrite (buz,LOW);
digitalWrite (led,HIGH);
digitalWrite (led1,HIGH);
digitalWrite (led2,HIGH);
digitalWrite (led3,HIGH);
}
else
digitalWrite (led,LOW);
digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
digitalWrite (led3,LOW);
{
if(f<v && t>v && h>v && q>v)//put 3 kwart vol
{

digitalWrite (motor,LOW);
digitalWrite (buz,LOW);
digitalWrite (led,HIGH);
digitalWrite (led1,HIGH);
digitalWrite (led2,HIGH);
}
else
digitalWrite (led,LOW);
digitalWrite (led1,LOW);
digitalWrite (led2,LOW);
{
if(f<v && t<v && h>v && q>v)//put half vol
{
digitalWrite (motor,LOW);
digitalWrite (buz,HIGH);
digitalWrite (led,HIGH);
digitalWrite (led1,HIGH);
}
else
digitalWrite (led,LOW);
digitalWrite (led1,LOW);
if(f<v && t<v && h<v && q>v)//put kwart vol
{
digitalWrite (motor,LOW);
digitalWrite (buz,HIGH);
digitalWrite (led,HIGH);
}
else
digitalWrite (led,LOW);
{
if(f<v && t<v && h<v && q<v)// put leeg
{
digitalWrite (motor,HIGH);
digitalWrite (buz,HIGH);
}
else;
}
}}}

Ik zie net dat het al een oude post is, maar er kan ook gewerkt worden met een display om je waterput te kunnen uitlezen. Dan is er alvast geen probleem meer.
Eventueel kan je mits een knopje(1minuut lang bijvoorbeeld of een aan-uit-knopje) andere zaken uitlezen over je display om te "zien" waar je ergens zit in je code.
Nadeel is dan wel dat je overal een "if" zou moeten toevoegen en een timer/boolean.
Ik heb alvast een post gemaakt: www.eshakendover.be

(website ligt effe uit maar komt straks hopelijk terug online)

Hoi smarivoet, ook welkom.

Je hoeft niet per se overal een if toe te voegen hoor.
Je kunt ook een display functie aanroepen en die afhankelijk van je drukknopje verschillende zaken laten zien.
Daarvoor kun je m door een switch...case laten vallen.
Toegegeven, dat lijkt op een if.. toestand maar ik vind het heel prettig en overzichtelijk werken.
En dat word dus vergroot als je dat in een eigen functie zet, maar je kunt het ook in een aparte sectie van de loop zetten.
Wanneer je het in een functie zet, houd er dan rekening me dat je alleen met globale variabelen kunt werken, en dus niet met variabelen die binnen een andere functie zijn gedeclareerd.