Go Down

Topic: Hulp bij schoolopdracht - Timer in douche (Read 1 time) previous topic - next topic

shooter

@nico: die If dingen komen van Rob , is ook een goede manier van beginnen, hij houd het simpel, en dat lijkt mij hier ook de beste.
@Kim er missen wat haken {} na de if
zoek een cheatsheet, waar alle instructies op staan, en ja dat water is goed.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

nicoverduin

Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

kimmieg

@shooter: Dankje voor je bericht. Dat water zorgt ervoor dat mn beeps per minuut het niet meer doen. Enig idee hoe dat kan?

En ook het alarm en het rode lampje gaan niet aan na 10 minuten in het water (of uberhaupt na 10 minuten).

Code: [Select]


//
//    FILE: watersensor.ino
//  AUTHOR: Kimmie
// VERSION: 0.0.3
// PURPOSE: Douchegedrag veranderen
//
// HISTORY:

const int read = A0;
int water;
const int greenLEDPin = D3;
const int redLEDPin = D4;
const int piezoPin = D1;
unsigned long currentTime = 0;
unsigned long lastTimeIDidBeep = 0;
uint32_t WaterDetectionTime  = 0;

void setup() {

  Serial.begin(9600); //Begin serial communication
  pinMode(greenLEDPin, OUTPUT);
  pinMode(redLEDPin, OUTPUT);
  pinMode(piezoPin, OUTPUT);
}

void loop() {

  currentTime = millis();
  water = analogRead(read);
  WaterDetectionTime  = millis();

  if (water <= 700)
  {
    digitalWrite(greenLEDPin, HIGH);
    digitalWrite(redLEDPin, LOW);
    digitalWrite(piezoPin, LOW);
  }

  else if (currentTime - lastTimeIDidBeep >= 6000) //na elke minuut een beep
  {
    lastTimeIDidBeep = currentTime;
    beep();
  }

  else if (water > 700)
  {
    WaterDetectionTime  = millis();
  }

  else if (millis() - WaterDetectionTime  >=  60000 && WaterDetectionTime  !=  0)

  {
    digitalWrite(greenLEDPin, LOW);
    digitalWrite(redLEDPin, HIGH);
    alarm();

  }


}

void alarm() {
  tone(piezoPin, 698);
  delay(600);
  noTone(piezoPin);
  delay(400);
}

void beep() {
  tone(piezoPin, 100);
  delay(100);
  noTone(piezoPin);
  delay(1000);

}



MAS3

#18
Jan 31, 2018, 12:46 am Last Edit: Jan 31, 2018, 12:47 am by MAS3
De teller start onder bepaalde voorwaarden.
Schijnbaar worden die voorwaarden niet bereikt.
Wanneer de eerste voorwaarde wel word bereikt, dan zullen de andere voorwaarden niet meer behandeld worden.
Dat kun je wel of niet zo laten gebeuren door wel of niet het woordje 'else' te gebruiken.
Dus 'else' betekent dat wat er daarna gebeuren moet, alleen moet worden uitgevoerd als het voorgaande niet waar was.
En dus ook dat wat daarna staat, niet zal worden uitgevoerd als het voorgaande wel waar was.
Ik hoop dat dat duidelijk genoeg is.



Ik zie dat het woord 'read' een kleurtje krijgt in de IDE.
Dat betekent volgens mij dat dat een woord is dat al gedefinieerd is.
Daarom is dat volgens mij niet het beste woord om te kiezen hiervoor.
Ik stel voor om daarvoor in de plaats het woord 'sensor' te gebruiken.
Zodat je geen vreemde en ongewenste dingen veroorzaakt.
Die kleurtjes die spontaan (of toch niet..) in je code verschijnen, zijn hints van de IDE die je moeten helpen tijdens het programmeren.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

kimmieg

#19
Jan 31, 2018, 10:17 am Last Edit: Jan 31, 2018, 10:32 am by kimmieg
Bedankt! Dit is nu mijn code:

Code: [Select]



//
//    FILE: watersensor.ino
//  AUTHOR: Kimmie
// VERSION: 0.0.3
// PURPOSE: Douchegedrag veranderen
//
// HISTORY:

const int sensor = A0;
int water;
const int greenLEDPin = D3;
const int redLEDPin = D4;
const int piezoPin = D1;
unsigned long currentTime = 0;
unsigned long lastTimeIDidBeep = 0;
uint32_t WaterDetectionTime  = 0;

void setup() {

  Serial.begin(9600); //Begin serial communication
  pinMode(greenLEDPin, OUTPUT);
  pinMode(redLEDPin, OUTPUT);
  pinMode(piezoPin, OUTPUT);
}

void loop() {

  currentTime = millis();
  water = analogRead(sensor);
  WaterDetectionTime  = millis();

  if (water <= 700) // geen water
  {
    digitalWrite(greenLEDPin, HIGH);
    digitalWrite(redLEDPin, LOW);
    digitalWrite(piezoPin, LOW);
  }

  if (water >= 700 && currentTime - lastTimeIDidBeep >= 60000) //water staat aan + na elke minuut een beep
  {
    lastTimeIDidBeep = currentTime;
    beep();
  }

  if (water >= 700) //is er water gedetecteerd? Onthoud de begintijd
  {
    WaterDetectionTime = millis();
  }

  if (water >= 700 && millis() - WaterDetectionTime >= 600000 && WaterDetectionTime  !=  0) //zijn er 10 minuten verstreken? Zet rode led aan + alarm
  {
    digitalWrite(greenLEDPin, LOW);
    digitalWrite(redLEDPin, HIGH);
    alarm();
  }
}

void alarm() {
  tone(piezoPin, 698);
  delay(600);
  noTone(piezoPin);
  delay(400);
}

void beep() {
  tone(piezoPin, 100);
  delay(100);
  noTone(piezoPin);
  delay(1000);

}




Toch gaat het alarm niet aan na 10 minuten. Wat doe ik precies fout? En hoe zet ik de waterdetectietimer weer op 0 zodra de watersensor niet meer in contact is met water.

if (water <= 700) // doe ik dit zo?
{
    WaterDetectionTime = 0;
}

Of kan ik 'WaterDetectionTime = 0;' in de eerste if statement zetten?

Ik heb het gevoel dat deze if statement niet klopt;

if (water >= 700 && millis() - WaterDetectionTime >= 60000 && WaterDetectionTime  !=  0)

Wie kan mij vertellen wat er precies fout gaat? :D

kimmieg

#20
Jan 31, 2018, 03:22 pm Last Edit: Jan 31, 2018, 03:27 pm by kimmieg
Ik heb even wat meer aanpassingen gedaan:

Code: [Select]



//
//    FILE: watersensor.ino
//  AUTHOR: Kimmie
// VERSION: 0.0.7
// PURPOSE: Douchegedrag veranderen
//
// HISTORY:

const int sensor = A0;
int water;
const int greenLEDPin = D3;
const int redLEDPin = D4;
const int piezoPin = D1;
unsigned long currentTime = 0;
unsigned long lastTimeIDidBeep = 0;
uint32_t WaterDetectionTime  = 0;

void setup() {

  Serial.begin(9600); //Begin serial communication
  pinMode(greenLEDPin, OUTPUT);
  pinMode(redLEDPin, OUTPUT);
  pinMode(piezoPin, OUTPUT);
}

void loop() {

  currentTime = millis();
  water = analogRead(sensor);

  if (water > 700)
  {
    WaterDetectionTime = millis(); //onthoud de begintijd

    if (currentTime - lastTimeIDidBeep >= 6000) //na elke minuut een beep
    {
      lastTimeIDidBeep = currentTime;
      beep();
    }

    if (WaterDetectionTime >= 60000 && WaterDetectionTime  !=  0) //zijn er 10 minuten verstreken én waterdetectie staat niet op 0 nadat er water is gedetecteerd? Zet rode led aan + alarm

    {
      digitalWrite(greenLEDPin, LOW);
      digitalWrite(redLEDPin, HIGH);
      alarm();
    }

  }

  else
 {
    digitalWrite(greenLEDPin, HIGH);
    digitalWrite(redLEDPin, LOW);
    digitalWrite(piezoPin, LOW);
    WaterDetectionTime = 0;                  //klopt dit?
  }

}

void alarm()
{

 
  tone(piezoPin, 698);
  delay(600);
  noTone(piezoPin);
  delay(400);
 
}

void beep() {
  tone(piezoPin, 100);
  delay(100);
  noTone(piezoPin);
  delay(1000);

}



De timer start nog steeds meteen nadat de code is geupload en ik snap niet waarom dit is. Ook blijven de minuutbeeps doorgaan nadat het alarm aangaat, hoe stop ik dit?

Ik geef nu aan dat wanneer er water is gedetecteerd ik de WaterDetectionTime wil starten. Als er 600000 (10 minuten) milliseconden voorbij zijn gaat het rode lampje branden en het alarm gaat aan.

Als er geen water gedetecteerd wordt staat het groene lampje aan en wordt de detectiontimer op 0 gezet (toch?).

Volgens mij ben ik veel te moeilijk aan het denken en zie ik door de bomen het bos even niet meer. Ik hoop dat iemand mij verduidelijking kan geven.

nicoverduin

Dat doe je inderdaad. Vandaar mijn voorstel eerder....
Trek het probleem uit elkaar.....
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

MAS3

Nico heeft groot gelijk; je ziet nu misschien 1 of meerdere grote problemen.
Maar die grotere problemen zijn met zekerheid af te breken tot kleinere problemen.
En als je dat vaak genoeg doet, zijn het ineens geen problemen meer.

Overigens is het antwoord op je vraag in je sketch: Neen.
Bekijk eens wat die regel, wanneer die uitgevoerd word, tot gevolg zal hebben.

Ga vooral verder met dit project, en laat 'm ook zien als je het af hebt.
Dan zal ik je mijn mening vertellen over dat eindresultaat.
En ik denk dat ik nu al weet wat die mening zal zijn ;).
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up