Go Down

Topic: lampje moet branden na werking pomp (Read 454 times) previous topic - next topic

Patriciaverdurmen

Hallo,

Ik ben een absolute beginner en probeer zoveel mogelijk zelf uit te zoeken maar nu kom ik er niet uit.

In de kelder staat bij ons een condensatieketel die nogal wat water verliest. Wanneer de emmer vol is dan duwt het water een sensor naar boven zodat die contact maakt en de pomp het water uit de emmer naar een andere emmer pompt die wij dan kunnen legen.

Dit alles lukt met de arduino.

Nu zou ik graag hebben dat wanneer er water werd gepompt dat er bij ons boven een ledlampje gaat branden. En wanneer er reeds 2 keer werd gepompt dat het lichtje gaat knipperen.

In bijlage en hieronder de code die ik wilde gebruiken en de bijhorende foutmeldingen  :smiley-confuse:

Kan iemand mij helpen? Alvast bedankt.


// constanten:
const int magneetPin = 2;     // nummer van de magneet watersensor
const int ledPin =  13;      // nummer van de ledpin
const int pompPin =  12;      // nummer van de relais die de pomp aanstuurt


// variabelen
int magneetState = 0;         // variabele voor de magneetstatus
int gepompt = 0;               // variabele voor als er wordt gepompt
int AantalKeerGepompt = 0;     // variabele voor het aantal keer dat er gepompt is geweest



void setup1() {
   pinMode(pompPin, OUTPUT);  //pomp is de output
   pinMode(magneetPin, INPUT);  //magneet watersensor is input

}

void setup2() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);  // lampje is de output

}

void loop1() {
  // read the state of the pushmagneet value:
  magneetState = digitalRead(magneetPin);
 

  if (magneetState == LOW) {
    // pomp is uit:
        digitalWrite(pompPin, LOW);
      } 
 
  else {
    digitalWrite(pompPin, HIGH); // zet pomp aan
    delay(120000);    // pomp werkt 2 minuten
    gepompt = 1;       // verander variabele gepompt naar 1
  }
}

void loop2() {     //2de loop die moet gebeuren

  AantalKeerGepompt = AantalKeerGepompt + gepompt;     //totaal aantal keer dat er gepompt werd
 
  if (AantalKeerGepompt == 1) {
    digitalWrite(ledPin, HIGH);         // als er één maal gepompt is geweest moet het ledje blijven branden
  }
  else if (AantalKeerGepompt == 2) {     // als er 2 maal gepompt is geweest moet het ledje knipperen
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    delay(1000);
  }
    else {
      digitalWrite(ledPin, LOW);       // als er geen enkele keer is gepompt dan moet er geen ledje branden
    }
  }

foutmelding:


C:\Users\User\AppData\Local\Temp\ccZvmAVu.ltrans0.ltrans.o: In function `main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:43: undefined reference to `setup'

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

collect2.exe: error: ld returned 1 exit status

exit status 1
Fout bij het compileren voor board Arduino/Genuino Uno




sterretje

#1
Nov 11, 2018, 12:24 pm Last Edit: Nov 11, 2018, 12:50 pm by sterretje
De fourmelding geeft aan dat je geen setup() en geen loop() functies hebt. Deze zijn vereist.

Je kunt een setup() functie schrijven die setup1() en setup2() aanroept of je kunt de inhoud van setup1() en setup2() combineren in setup().

Op vergekijkbare wijze kun je een loop() functie schrijven om de foutmelding kwijt te raken.

Code: [Select]
void setup()
{
  pinMode(pompPin, OUTPUT);  //pomp is de output
  pinMode(magneetPin, INPUT);  //magneet watersensor is input

  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);  // lampje is de output
}

void loop()
{
  loop1();
  loop2();
}


Het geheel zal waarschijnlijk niet werken zoals je verwacht ten gevolge van de delays die je gebruikt. Bv gedurende de delay(120000) kan je lampje niet knipperen.

Je zult een andere gedachtengang moeten volgen. Als je de pomp start, kijk je op de klok. Daarna kijk je zo af en toe op de klok om te kijken of de twee minuten voorbij zijn.

Terwijl de twee minuten nog niet voorbij zijn kun je andere dingen doen zoals het knipperen van het lampje. Dat doe je ook weer door op de klok te kijken, te kijken of een seconde voorbij is en de status van het lampje te veranderen.

If you understand an example, use it.
If you don't understand an example, don't use it.

Electronics engineer by trade, software engineer by profession. Trying to get back into electronics after 15 years absence.

sterretje

#2
Nov 11, 2018, 01:53 pm Last Edit: Nov 11, 2018, 02:01 pm by sterretje
Hier is een functie die de pomp bestuurt en die niet blokkeert.

Code: [Select]
/*
  besturen van de pomp
*/
void pomp()
{
  // variabele die aangeeft of de pomp aan is of niet
  static bool pompIsAan = false;
  // variabele om de tijd bij te houden wanneer de pomp aan is gegaan
  static unsigned long startTijd;

  // read the state of the pushmagneet value:
  magneetState = digitalRead(magneetPin);

  if (magneetState == HIGH)
  {
    // als de pomp nog niet aan is
    if (pompIsAan == false)
    {
      // geef aan dat de pomp aan is
      pompIsAan = true;
      // zet the start tijd dat de pomp werd ingeschakeld
      startTijd = millis();
      // zet het de pomp aan
      digitalWrite(pompPin, HIGH);
      // verhoog het aantal keer dat er gepompt is
      AantalKeerGepompt++;
    }
  }

  // als de pomp aan is
  if (pompIsAan == true)
  {
    // als pomp duur overschreden
    if (millis() - startTijd >= pompDuur)
    {
      // geef aan dat de pomp niet meer aan is
      pompIsAan = false;
      // zet het de pomp uit
      digitalWrite(pompPin, LOW);
    }
  }
}

Ik vermoed dat ik er voldoende verklarende tekst in heb gezet.

Hetzelfde kun je doen voor de functie voor het lampje
Code: [Select]
/*
  besturen van het lampje gebasserd op de globale variable AantalKeerGepompt
*/
void lampje()
{
  // variabele die aangeeft of het lampje knippert of niet
  static bool knipperen = false;
  // variabele om de start tijd bij te houden voor het knipperen
  static unsigned long startTijd;

  if (AantalKeerGepompt >= 2)
  {
    if (knipperen == false)
    {
      // geef aan dat we knipperen
      knipperen = true;
      // zet the start tijd voor de eerste knipper
      startTijd = millis();
      // zet het lampje aan
      digitalWrite(ledPin, HIGH);
    }
  }
  else
  {
    knipperen = false;
  }

  if (AantalKeerGepompt == 0)
  {
    // niet gepompt
    digitalWrite(ledPin, LOW);
  }
  else if (AantalKeerGepompt == 1)
  {
    // 1x gepompt
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    //2x of meer

    // als knipper interval overschreden
    if (millis() - startTijd >= knipperInterval)
    {
      // set een nieuwe start tijd voor het knipperen
      startTijd = millis();
      // schakel het lampje om (aan naar uit en vice versa)
      digitalWrite(ledPin, !digitalRead(ledPin));
    }
  }
}

Het omschakelen van het lampje op de getoonde manier werkt op Arduinos met een AVR processor (e.g. Mega en Uno).

En de rest van de code
Code: [Select]
// constanten:
const int magneetPin = 2;                   // nummer van de magneet watersensor
const int ledPin =  13;                     // nummer van de ledpin
const int pompPin =  12;                    // nummer van de relais die de pomp aanstuurt

const unsigned long pompDuur = 120000;      // 2 minuten
const unsigned long knipperInterval = 1000; // 1 seconde aan, 1 seconde uit

// variabelen
int magneetState = 0;         // variabele voor de magneetstatus
int gepompt = 0;               // variabele voor als er wordt gepompt
int AantalKeerGepompt = 0;     // variabele voor het aantal keer dat er gepompt is geweest

void setup() {
  pinMode(pompPin, OUTPUT);  //pomp is de output
  pinMode(magneetPin, INPUT);  //magneet watersensor is input

  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);  // lampje is de output
}

void loop()
{
  pomp();
  lampje();
}

// lampje() en pomp() hier


Wat ontbreekt is het beperken van AantalKeerGepompt (to bv 2). Er is ook geen mogelijkheid om AantalKeerGepompt terug te zetten naar nul.

Niet getest, maar het compileert.
If you understand an example, use it.
If you don't understand an example, don't use it.

Electronics engineer by trade, software engineer by profession. Trying to get back into electronics after 15 years absence.

Patriciaverdurmen

Dag Sterretje,

Heel erg bedankt voor de info. Hier kan ik al zeker mee verder. Ik probeer het deze week eens uit.

Het was inderdaad ook nog de bedoeling om ergens een drukknop te plaatsen die het "AantalKeerGepompt" terug op nul zet wanneer we de emmer water hebben geleegd.

Maar ik vond de huidige problemen al voldoende:-).
Ik kan nu alleszins verder gaan proberen en dat drukknopje zou me toch wel zelf moeten lukken (hoop ik) ;-).

Groetjes en bedankt!

sterretje

Probeer te begrijpen hoe de functies werken. Als je iets niet begrijpt, vraag om uitleg.
If you understand an example, use it.
If you don't understand an example, don't use it.

Electronics engineer by trade, software engineer by profession. Trying to get back into electronics after 15 years absence.

Go Up