sturing voor badkamer

algemene C code
Berichten: 9
Geregistreerd: 15 Mei 2014, 19:20

sturing voor badkamer

Berichtdoor kennyquintens » 30 Mrt 2015, 20:10

ik heb een centraal systeem gemaakt voor mijn badkamer doormiddelvan de arduino duemilianova.
Nu heb ik een probleem bij de timers van de ventilator, namelijk dat hij ofwel maar een paar seconden draait ofwel continue naarmate ik de intervallen verander, ik had op internet volgende waardes gevonden: 5minuten = 300000 en 15minuten = 900000 maar dan draait hij continue ofwel een vrij lange tijd die ik nog niet gewacht heb.

Ik heb dit gedaan dmv de millis methode maar weet niet zeker of die klopt.

Hierbij de code:

[code2=]/* Sturing Badkamer */


/*-----( Declare Constants and Pin Numbers )-----*/

#define keyboard_AnalogInput0 0
#define keyboard_AnalogInput1 1
#define keyboard_AnalogInput2 2

#define btnDouche 1
#define btnLavabo 2
#define btnVenti15 3
#define btnSauna 4
#define btnLicht 5
#define btnWC 6
#define btnAllesuit 7
#define btnVenti5 8
#define btnNONE0 10
#define btnNONE1 11
#define btnNONE2 12

/*-----( Declare Variables )-----*/

unsigned long currentMillis = 0;
unsigned long previousButtonMillis = 0;
unsigned long previousVentiMillis = 0;
unsigned long previousDimmerMillis = 0;

const int buttonInterval = 250;
const int ventiInterval1 = 150000; // Interval van 5minuten (300000)
const int ventiInterval2 = 450000; // Interval van 15minuten (900000)
const int dimmerInterval = 150;

const int Licht = 7;
byte LichtStatus = HIGH;
const int LichtPower = 9;
byte LichtPowerStatus = HIGH;
const int Lavabo = 2;
byte LavaboStatus = HIGH;
const int Douche = 4;
byte DoucheStatus = HIGH;
const int WC = 5;
byte WCStatus = HIGH;
const int Venti = 3;
byte VentiStatus = HIGH;
byte VentiStatus1 = HIGH;
byte VentiStatus2 = HIGH;
const int Bezet = 6;
byte BezetStatus = HIGH;
const int Sauna = 8;
byte SaunaStatus = HIGH;
int Allesuit;
byte AllesuitStatus = LOW;


int adc_key_in0 = 0;
int buttonPressed0;
int adc_key_in1 = 0;
int buttonPressed1;
int adc_key_in2 = 0;
int buttonPressed2;

void setup() /****** SETUP ******/
{
Serial.begin(9600);
Serial.println("Laden van Sturing Badkamer");

pinMode(Licht, OUTPUT);
digitalWrite(Licht, HIGH);
pinMode(LichtPower, OUTPUT);
digitalWrite(LichtPower, HIGH);
pinMode(Lavabo, OUTPUT);
digitalWrite(Lavabo, HIGH);
pinMode(Douche, OUTPUT);
digitalWrite(Douche, HIGH);
pinMode(WC, OUTPUT);
digitalWrite(WC, HIGH);
pinMode(Venti, OUTPUT);
digitalWrite(Venti, OUTPUT);
pinMode(Bezet, OUTPUT);
digitalWrite(Bezet, OUTPUT);
pinMode(Sauna, OUTPUT);
digitalWrite(Sauna, HIGH);

Serial.println("Uitgangen ingeladen");

}//--(end setup )---


void loop() /****** LOOP ******/
{
currentMillis = millis();

readButton();
/* Serial.println(adc_key_in0);
Serial.println(adc_key_in1);
Serial.println(adc_key_in2);
*/


if (buttonPressed0 != btnNONE0 || buttonPressed1 != btnNONE1 || buttonPressed2 != btnNONE2)
{
Serial.print("OK - That looks like you pressed ");
Serial.println(buttonPressed0, DEC);
Serial.print("OK - That looks like you pressed ");
Serial.println(buttonPressed1, DEC);
Serial.print("OK - That looks like you pressed ");
Serial.println(buttonPressed2, DEC);


if (buttonPressed0 == 1 || buttonPressed2 == 1) {
Serial.println("pressed btnDouche");
DoucheStatus = LOW;
BezetStatus = LOW;
LichtAan();
Venti2();
}


if (buttonPressed0 == 2) {
Serial.println("pressed btnLavabo");
LavaboStatus = LOW;
}


if (buttonPressed0 == 3) {
Serial.println("pressed btnVenti15");
Venti2();
}


if (buttonPressed0 == 4 || buttonPressed1 == 4) {
Serial.println("pressed btnSauna");
SaunaStatus = LOW;
BezetStatus = LOW;
LavaboStatus = HIGH;
WCStatus = HIGH;
DoucheStatus = HIGH;
setStatussen();
delay(250);
Sfeer();
}


if (buttonPressed0 == 5 || buttonPressed1 == 5) {
Serial.println("pressed btnLicht");
LichtAan();
}


if (buttonPressed1 == 6) {
Serial.println("pressed btnWC");
LavaboStatus = LOW;
WCStatus = LOW;
BezetStatus = LOW;
Venti1();
}


if (buttonPressed1 == 7) {
Serial.println("pressed btnAllesuit");
LavaboStatus = HIGH;
DoucheStatus = HIGH;
WCStatus = HIGH;
SaunaStatus = HIGH;
BezetStatus = HIGH;
LichtUit();
}


if (buttonPressed2 == 8) {
Serial.println("pressed btnVenti5");

}
}

if (VentiStatus1 == LOW) {
if (currentMillis - previousVentiMillis >= ventiInterval1) {
VentiStatus = HIGH;
VentiStatus1 = HIGH;
Serial.println("Venti off");

}
}

if (VentiStatus2 == LOW) {
if (currentMillis - previousVentiMillis >= ventiInterval2) {
VentiStatus = HIGH;
VentiStatus2 = HIGH;
Serial.println("Venti off");

}
}

setStatussen();

}//--(end main loop )---





void readButton() { // Debounche

if (millis() - previousButtonMillis >= buttonInterval) {

previousButtonMillis += buttonInterval;

buttonPressed0 = read_keyboard0();
buttonPressed1 = read_keyboard1();
buttonPressed2 = read_keyboard2();


}
}




int read_keyboard0() { // Read analog input 0 Viervoudige drukknop

adc_key_in0 = analogRead(keyboard_AnalogInput0);

if (adc_key_in0 > 1000) return btnNONE0;
if (adc_key_in0 < 100) return btnDouche;
if (adc_key_in0 < 200) return btnLavabo;
if (adc_key_in0 < 400) return btnVenti15;
if (adc_key_in0 < 1000) return btnSauna;
return btnNONE0;
}




int read_keyboard1() { // Read analog input 1 Zesvoudige drukknop (deel 1)

adc_key_in1 = analogRead(keyboard_AnalogInput1);

if (adc_key_in1 > 1000) return btnNONE1;
if (adc_key_in1 < 100) return btnLicht;
if (adc_key_in1 < 200) return btnWC;
if (adc_key_in1 < 400) return btnSauna;
if (adc_key_in1 < 1000) return btnAllesuit;
return btnNONE1;
}




int read_keyboard2() { // Read analog input 2 Zesvoudige drukknop (deel 2)

adc_key_in2 = analogRead(keyboard_AnalogInput2);

if (adc_key_in2 > 1000) return btnNONE2;
if (adc_key_in2 < 500) return btnVenti5;
if (adc_key_in2 < 1000) return btnDouche;
return btnNONE2;
}




void Venti1() { // Laat de ventilator aangaan en start de 1ste timer

if (VentiStatus1 == HIGH) {
Serial.println("Venti on");
VentiStatus = LOW;
VentiStatus1 = LOW;
previousVentiMillis = currentMillis;

}

}



void Venti2() { // Laat de ventilator aangaan en start de 2de timer

if (VentiStatus2 == HIGH) {
Serial.println("Venti on");
VentiStatus = LOW;
VentiStatus2 = LOW;
previousVentiMillis = currentMillis;

}

}




void LichtUit() { // Zorgt ervoor dat het licht uitgaat

LichtPowerStatus = HIGH;
digitalWrite(LichtPower, LichtPowerStatus);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);

}




void Sfeer() { // Zorgt ervoor dat het licht op 25% brandt

LichtPowerStatus = LOW;
digitalWrite(LichtPower, LichtPowerStatus);

delay(200);

LichtStatus = LOW;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = LOW;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = LOW;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = LOW;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);

}




void LichtAan() { // Zorgt ervoor dat het licht op 100% brandt

LichtPowerStatus = LOW;
digitalWrite(LichtPower, LichtPowerStatus);

delay(100);


LichtStatus = LOW;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = LOW;
digitalWrite(Licht, LichtStatus);
delay(100);

LichtStatus = HIGH;
digitalWrite(Licht, LichtStatus);

}



void setStatussen() { // Toekennen van de statussen naar de uitgangen

digitalWrite(Douche, DoucheStatus);
digitalWrite(WC, WCStatus);
digitalWrite(Lavabo, LavaboStatus);
digitalWrite(Venti, VentiStatus);
digitalWrite(Bezet, BezetStatus);
digitalWrite(Sauna, SaunaStatus);

}
//*********( THE END )***********


[/code2]

Alvast bedankt.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: sturing voor badkamer

Berichtdoor nicoverduin » 30 Mrt 2015, 20:31

Om te beginnen mag je dit veranderen:
cpp code
const int buttonInterval = 250;
const int ventiInterval1 = 150000; // Interval van 5minuten (300000)
const int ventiInterval2 = 450000; // Interval van 15minuten (900000)
const int dimmerInterval = 150;


Een int kan niet groter zijn dan 65535.
Ik zou die grote getallen veranderen in
cpp code
const long ventiInterval1 = 150000; // Interval van 5minuten (300000)
const long ventiInterval2 = 450000; // Interval van 15minuten (900000)

Mogelijk helpt dat.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: sturing voor badkamer

Berichtdoor shooter » 30 Mrt 2015, 22:26

nico is weer snel, nog wel een aanvulling maak ze niet const maar gewoon unsigned long net zoals millis is.
want als e niet const zijn kun je ze ergens in je programma veranderen.

zo leren we elke dag bij.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 15 Mei 2014, 19:20

Re: sturing voor badkamer

Berichtdoor kennyquintens » 02 Apr 2015, 04:53

Oke, dit werkt, allen bedankt hiervoor.
Maar nu even nog over de "debounche" die ik heb proberen in te programmeren, die werkt volgens mij ook niet. Namelijk wanneer ik druk verschijnt er een keer of 3 het knopje waarop gedrukt wordt. Wanneer ik de buttoninterval tijd verander dan moet ik het knopje langer ingedrukt houden om te laten activeren. Dus hij werkt eigenlijk omgekeerd volgens mij.
Iemand hier nog een oplossing voor?

Mvg,
Kenny.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: sturing voor badkamer

Berichtdoor nicoverduin » 02 Apr 2015, 06:38

Het is mij niet helemaal duidelijk wat je wilt bereiken met de functie readButton().

De meest eenvoudige debounce doe je als volgt:
cpp code
button = digitalRead(Button);
if (button == LOW) { // aannemende dat dat LAAG "AAN" is
delay(DEBOUNCE_TIJD);
button = digitalRead(Button);
}


in jouw geval ga je wachten of de debounce tijd is verstreken en dan ga je lezen. Eigenlijk een beetje zinloos. Pas als de schakelaar "AAN" is kun je even wachten en dan nog een keer lezen om te kijken of de knop nog steeds aan is. Er zijn alternatieve methoden, maar die zijn meer complex. Probeer eerst dit maar.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten