tijdschakelaar voor wc ventilator
36 berichten
• Pagina 3 van 4 • 1, 2, 3, 4
Re: tijdschakelaar voor wc ventilator
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.
#define lichtschakelaar 8
#define ventilator 3
#define plastimer 2
#define nalooptimer 6
dit is gelijk al fout?, ik weet even niet waarom.
Advertisement
Re: tijdschakelaar voor wc ventilator
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
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
shooter@home.nl
Re: tijdschakelaar voor wc ventilator
pja ik zit naast mijn vrouw dus kan het niet proberen.
paul deelen
shooter@home.nl
shooter@home.nl
Re: tijdschakelaar voor wc ventilator
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:
@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;
Re: tijdschakelaar voor wc ventilator
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]
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]
Re: tijdschakelaar voor wc ventilator
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
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;
}
}
}
Re: tijdschakelaar voor wc ventilator
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.
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.
Re: tijdschakelaar voor wc ventilator
het is nu geworden , zie code
verder testen volgt later
code is dus , alvast bedankt voor tips en opmerkingen
cpp 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;
}
}
Re: tijdschakelaar voor wc ventilator
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
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;
}
}
Re: tijdschakelaar voor wc ventilator
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:
[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
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
36 berichten
• Pagina 3 van 4 • 1, 2, 3, 4
Wie is er online?
Gebruikers in dit forum: KeithGam en 41 gasten