tijdschakelaar voor wc ventilator

Arduino specifieke Software
Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar voor wc ventilator

Berichtdoor wim2584 » 10 Feb 2017, 21:04

ja ik had de code in IDE gezet en gecompiled.... heeel veel problemen, ik zal eerst eea moeten uitzoeken en werkend krijgen voordat ik er nog meer problemen inzet?

#define lichtschakelaar 8
#define ventilator 3
#define plastimer 2
#define nalooptimer 6

dit is gelijk al fout?, ik weet even niet waarom.

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: tijdschakelaar voor wc ventilator

Berichtdoor shooter » 10 Feb 2017, 23:20

op basis van jouw eigen code dit ervan gemaakt in notepad ++
kijk maar eens of dit te begrijpen is.
je had nogal wat dubbele variabelen erin zitten.
cpp code
// wim lemson FSM machine voor wc ventilator 10-02-2017


// PIN definitions
#define lichtschakelaar 8
#define ventilator 3
#define plasled 2
#define naloopled 6
#define GREENBUTTON 12
#define BLUEBUTTON 8

// FSM states
#define plas 10// kan zo maar ook met enum
#define poep 20
#define naloop 30



// variables
int fsm_state=0;
int plasstate = 0;// en dit mag niet want je hebt hierboven al plas gezet
int naloop = 0;
int poep = 0;

unsigned long nalooptimer;
unsigned long plastimer;



void setup() {

pinMode(lichtschakelaar, INPUT_PULLUP);
pinMode(ventilator, OUTPUT);
pinMode(plasled, OUTPUT);
pinMode(naloopled, OUTPUT);

}

void loop() {

// FSM states
switch(fsm_state) {
case 0:
if (digitalRead(lichtschakelaar)== HIGH){
plastimer = millis(); // start plastimer
fsm_state=plas;}
break;
case plas:
digitalWrite(plasled,HIGH); // indicatie plastimer loopt

if (millis()-plastimer >= 10000){ // plas timer klaar
digitalWrite(ventilator,HIGH); // ventilator start
// plasled uit
//poepled aan
fsm_state =poep; // ga naar state poep
}
break;

case poep:
if (digitalRead(lichtschakelaar)== LOW){
nalooptimer=millis();
// naloopled aan
fsm_state = naloop; // change naar state naloop
}
break;

case naloop:
digitalWrite(nalooptimer, HIGH) // indicatie nalooptimer loopt
}
if (millis()-naloop >= 10000){ // naloop timer klaar?
digitalWrite(ventilator, LOW); // zet ventilator uit
// naloopled uit}
fsm_state=0;}
break;

}
paul deelen
shooter@home.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: tijdschakelaar voor wc ventilator

Berichtdoor shooter » 10 Feb 2017, 23:21

pja ik zit naast mijn vrouw dus kan het niet proberen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijdschakelaar voor wc ventilator

Berichtdoor Koepel » 11 Feb 2017, 00:41

Nu gaan de namen door elkaar (naloop en nalooptimer en ventilator pin).

@wim2584, kun je betere namen geven ?

Bijvoorbeeld alle pinnen met "Pin", alle states met '_state' of er een enum van maken, en de timer met timer of millis in de naam (dat heb je al). Bijvoorbeeld zo iets als dit:
Code: Alles selecteren
const int plasLedPin = 2;
const int naloopLedPin = 6;
const int greenButtonPin = 12;

#define idle_state 0
#define plas_state 10
#define poep_state 20
int fsm_state = idle_state;

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar voor wc ventilator

Berichtdoor wim2584 » 11 Feb 2017, 11:56

alvast Bedankt voor de hulp en ideeen,

ben er mee bezig, maar kan (mag?) niet de hele dag hier aan werken.

code is nu,zie hieronder, compileerd wel, maar werkt (nog) niet

[code2=]

// wim lemson FSM machine voor wc ventilator 10-02-2017 v 1.1
// zie ook: viewtopic.php?f=8&t=2371&start=20


// PIN definitions
#define lichtschakelaar 8
#define ventilator 3
#define plasled 2
#define naloopled 6


// FSM states
#define plas_state 10 // de verschillende status van de FSM
#define poep_state 20
#define naloop_state 30



// variables
int fsm_state = 0;
int plasstate = 0;
int naloop = 0;
int poep = 0;

unsigned long nalooptimer;
unsigned long plastimer;



void setup() {

pinMode(lichtschakelaar, INPUT_PULLUP);
pinMode(ventilator, OUTPUT);
pinMode(plasled, OUTPUT);
pinMode(naloopled, OUTPUT);

}

void loop() {

// FSM states
switch (fsm_state) {
case 0:
if (digitalRead(lichtschakelaar) == HIGH) {
plastimer = millis(); // start plastimer
fsm_state = plas_state;
}
break;
case plas_state:
digitalWrite(plasled, HIGH); // indicatie plastimer loopt

if (millis() - plastimer >= 10000) { // plas timer klaar
digitalWrite(ventilator, HIGH); // ventilator start
// plasled uit
//poepled aan
fsm_state = poep_state; // ga naar state poep
}
break;

case poep_state:
if (digitalRead(lichtschakelaar) == LOW) {
nalooptimer = millis();
// naloopled aan
fsm_state = naloop_state; // change naar state naloop
}
break;

case naloop_state:
digitalWrite(nalooptimer, HIGH); // indicatie nalooptimer loopt

if (millis() - naloop >= 10000) { // naloop timer klaar?
digitalWrite(ventilator, LOW); // zet ventilator uit
// naloopled uit}
fsm_state = 0;
}
break;

}
}[/code2]

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar voor wc ventilator

Berichtdoor wim2584 » 11 Feb 2017, 13:34

het wordt beter, maar zeker nog niet goed werkend.

het geheel wordt gestart door lichtschakelaar, maar stand lichtschakelaar doet er nadien niet meer toe?

waarom noem ik

#define poep_state 20 ?? hier eigenlijk de 20 of 30 erachter zetten?
#define naloop_state 30







cpp code
// FSM states
#define plas_state 10 // kan zo maar ook met enum
#define poep_state 20
#define naloop_state 30



// variables
int fsm_state = 0;


unsigned long nalooptimer;
unsigned long plastimer;



void setup() {

pinMode(lichtschakelaarpin, INPUT_PULLUP);
pinMode(lichtledpin, OUTPUT);
pinMode(ventilatorpin, OUTPUT);
pinMode(plasledpin, OUTPUT);
pinMode(naloopledpin, OUTPUT);

}

void loop() {

// FSM states
switch (fsm_state) {
case 0:

if (digitalRead(lichtschakelaarpin) == LOW) {
digitalWrite(lichtledpin, LOW);
}
else
{
(digitalRead(lichtschakelaarpin) == HIGH);
{

digitalWrite(lichtledpin, HIGH);
plastimer = millis(); // start plastimer
fsm_state = plas_state;
}
break;



case plas_state:

digitalWrite(plasledpin, HIGH); // indicatie plastimer loopt

if (millis() - plastimer >= 10000) // plas timer klaar
{
digitalWrite(ventilatorpin, HIGH); // ventilator start
digitalWrite(plasledpin, LOW); // plasled uit
fsm_state = poep_state; // ga naar state poep
}
break;


case poep_state:

if (digitalRead(lichtschakelaarpin) == LOW)
{
nalooptimer = millis();
fsm_state = naloop_state; // change naar state naloop
}
break;

case naloop_state:
digitalWrite(naloopledpin, HIGH); // indicatie nalooptimer loopt

if (millis() - nalooptimer >= 10000) // naloop timer klaar?
{
digitalWrite(ventilatorpin, LOW); // zet ventilator uit
fsm_state = 0;
}
break;

}
}
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijdschakelaar voor wc ventilator

Berichtdoor Koepel » 11 Feb 2017, 13:56

De waarden van de state voor een "state machine" maakt helemaal niets uit, ze hoeven niet eens oplopend te zijn, als ze maar verschillende waarden hebben. Dus 0,10,20,30 kan, of met een 'enum' wordt het 0,1,2,3, maar ook 102,3,50,7 werkt net zo goed.

In de sketch wordt naar de lamp gekeken om het geheel te starten. Verderop wordt naar de lamp gekeken om eventueel het nadraaien te starten. Er moet alleen nog iets bij om in de plas_state terug naar 'idle' te gaan. Voor de state machine is volgens mij die drie momenten naar de lamp kijken voldoende. Kun je state '0' een naam te geven, zoals 'idle_state' ?

Wanneer je ook een ledje wilt zetten, dan is het misschien nodig om er nog wat bij te zetten. Eventueel buiten de state machine om. Maar de ledjes zijn iets extra, ze bepalen niet het verloop van de code, dus de ledjes kunnen altijd later nog toegevoegd worden.

Je doet dit "digitalWrite(naloopledpin, HIGH);" in de naloop_state. Kun je die verplaatsen naar het moment dat de de naloop_state wordt voorbereid ?

Wanneer je in een state zit, en naar de volgende state wilt gaan, dan is dat het moment om alles goed te zetten voor de volgende state. Dus op het moment dat de beslissing wordt genomen om naar een volgende state te gaan, dan daar ook meteen alles goed zetten voor de volgende state. Het kan ook op andere manieren, maar dit is eenvoudig en duidelijk.

Je verzamelt nu de gegevens (zoals digitalRead()) in de state machine wanneer je ze nodig hebt. Het is ook mogelijk om alle gegevens te verzamelen voordat je de state machine in duikt.

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar voor wc ventilator

Berichtdoor wim2584 » 11 Feb 2017, 15:10

het is nu geworden , zie code

verder testen volgt later

code is dus , alvast bedankt voor tips en opmerkingen
cpp code
// wim lemson FSM machine voor wc ventilator 10-02-2017 v 1.3
// zie ook: viewtopic.php?f=8&t=2371&start=20


// PIN definitions
#define lichtschakelaarpin 10
#define ventilatorpin 3
#define plasledpin 2
#define naloopledpin 6
#define lichtledpin 7

// FSM states
#define idle_state 0
#define plas_state 10 // kan zo maar ook met enum
#define poep_state 20
#define naloop_state 30



// variables
int fsm_state = 0;


unsigned long nalooptimer;
unsigned long plastimer;



void setup() {

pinMode(lichtschakelaarpin, INPUT);
pinMode(lichtledpin, OUTPUT);
pinMode(ventilatorpin, OUTPUT);
pinMode(plasledpin, OUTPUT);
pinMode(naloopledpin, OUTPUT);

}

void loop() {

if (digitalRead(lichtschakelaarpin) == HIGH)
{
digitalWrite (lichtledpin, HIGH);
}
else
{
digitalWrite (lichtledpin, LOW);
}



// FSM states
switch (fsm_state) {

case idle_state:

if (digitalRead(lichtledpin) == HIGH);
{
plastimer = millis(); // start plastimer

fsm_state = plas_state;
}

break;



case plas_state:

digitalWrite(plasledpin, HIGH); // indicatie plastimer loopt

if (digitalRead(lichtledpin) == LOW)
{
fsm_state = idle_state;
}
else if (millis() - plastimer >= 20000) // plas timer klaar
{
digitalWrite(ventilatorpin, HIGH); // ventilator start

fsm_state = poep_state; // ga naar state poep
}

break;


case poep_state:

if (digitalRead(lichtschakelaarpin) == LOW)
{
digitalWrite(naloopledpin, HIGH); // indicatie nalooptimer loopt
nalooptimer = millis();

fsm_state = naloop_state; // change naar state naloop
}

break;


case naloop_state:

if (millis() - nalooptimer >= 10000) // naloop timer klaar?
{
digitalWrite(ventilatorpin, LOW); // zet ventilator uit
digitalWrite(naloopledpin, LOW);

fsm_state = idle_state;
}

break;

}
}

Berichten: 88
Geregistreerd: 16 Jul 2015, 21:02

Re: tijdschakelaar voor wc ventilator

Berichtdoor wim2584 » 11 Feb 2017, 15:33

nog aan toegevoegd , bij een tweede toiletbezoek in de naloop_state , terug naar de plas_state
verder nog een paar foutjes eruit gehaald.

zo werkt het, is het ook een redelijke code?

cpp code
// wim lemson FSM machine voor wc ventilator 10-02-2017 v 1.5
// zie ook: viewtopic.php?f=8&t=2371&start=20


// PIN definitions
#define lichtschakelaarpin 10
#define ventilatorpin 3
#define plasledpin 2
#define naloopledpin 6
#define lichtledpin 7

// FSM states
#define idle_state 0
#define plas_state 10
#define poep_state 20
#define naloop_state 30



// variables
int fsm_state = 0;


unsigned long nalooptimer;
unsigned long plastimer;



void setup() {

pinMode(lichtschakelaarpin, INPUT);
pinMode(lichtledpin, OUTPUT);
pinMode(ventilatorpin, OUTPUT);
pinMode(plasledpin, OUTPUT);
pinMode(naloopledpin, OUTPUT);

}

void loop() {

if (digitalRead(lichtschakelaarpin) == HIGH)
{
digitalWrite (lichtledpin, HIGH);
}
else
{
digitalWrite (lichtledpin, LOW);
}



// FSM states
switch (fsm_state) {

case idle_state:

if (digitalRead(lichtledpin) == HIGH)
{
plastimer = millis(); // start plastimer

fsm_state = plas_state;
}

break;



case plas_state:

digitalWrite(plasledpin, HIGH); // indicatie plastimer loopt

if (digitalRead(lichtledpin) == LOW)
{
fsm_state = idle_state;
}
else if (millis() - plastimer >= 20000) // plas timer klaar
{
digitalWrite(ventilatorpin, HIGH); // ventilator start

fsm_state = poep_state; // ga naar state poep
}

break;


case poep_state:

if (digitalRead(lichtledpin) == LOW)
{
digitalWrite(naloopledpin, HIGH); // indicatie nalooptimer loopt
nalooptimer = millis();

fsm_state = naloop_state; // change naar state naloop
}

break;


case naloop_state:

if (digitalRead(lichtledpin) == HIGH)
{
digitalWrite(naloopledpin, LOW); // zet naloop uit

fsm_state = plas_state; // opnieuw naar plas_state bij tweede bezoek in naloopttijd

}

else if (millis() - nalooptimer >= 10000) // naloop timer klaar?
{
digitalWrite(ventilatorpin, LOW); // zet ventilator uit
digitalWrite(naloopledpin, LOW);

fsm_state = idle_state;
}

break;

}
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijdschakelaar voor wc ventilator

Berichtdoor Koepel » 11 Feb 2017, 15:58

Het is redelijke code, in de betekenis dat je er verder mee kunt.

Kun je meer commentaar toevoegen ?

Deze: "digitalWrite(plasledpin, HIGH); // indicatie plastimer loopt" doe je in de plas_state. Maar volgens mij hoort die ook weer op het moment dat je overgaat naar de plas_state.

Bijvoorbeeld zo:
Code: Alles selecteren
   case idle_state:
 
      if (digitalRead(lichtledpin) == HIGH)
      {
        // De state is nu idle, en de lamp gaat aan.
        // Dat betekend dat wordt overgegaan naar de volgende state.
        // Zet hier alles klaar voor de volgende state.
 
        plastimer = millis();              // start plastimer

        digitalWrite(plasledpin, HIGH);    // indicatie plastimer loopt
 
        fsm_state = plas_state;          // zet de nieuwe state
      }
      break;


[EDIT] Hier een heel stuk weggehaald, omdat ik er aan begon te twijfelen ;) (ik had de timers liever niet binnen de "else if", maar omdat zowel de lamp als de timer de state wijzigen, is dat wel nodig) Sorry :oops:

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: KeithGam en 41 gasten