Help with a sub function
i'm missing in buzzer routine @ end of code.
so far working i'd hoped first fsm. i'm trying set door alarm when door closes. idea tone sound 5 times, when countdown reaches 0 code goes came from.
what doing turning on buzzer going run machine. how never gets part cycles buzz routine returns code.
thanks help.
so far working i'd hoped first fsm. i'm trying set door alarm when door closes. idea tone sound 5 times, when countdown reaches 0 code goes came from.
what doing turning on buzzer going run machine. how never gets part cycles buzz routine returns code.
thanks help.
code: [select]
// use names states it's easier to
// understand code doing
// possible states
const int s_dooropen = 0;
const int s_wait4dark = 1;
const int s_doorclosed = 2;
const int s_wait4day = 3;
const int s_override = 4;
// pin numbers
const int door12vc = 11; // accuates door open 12v constant:
const int door12vs = 12; // accuates door open 12v switched:
const int solarsw = a0; // solar switch - daylight sensor:
const int smpwr = 9; //feedpower sm pot
const int smfeedback = a1; //read smpot output
const int buzz = 3; // audible feedback:
const int dsman = 8; // manual door switch:
unsigned int solarlvl = 0u; // variable store daylight value
static unsigned long ts; // store current time delays
int sm = 0; //sunlightmultiplier potentiometer
int doormaxtrvltime = 5000; //5 sec door open_close:
int state = s_doorclosed; //stores current state
int cd = 5; //build count down buzzer time
void setup()
{
serial.begin(9600); // set baud rate communicate
pinmode(door12vc, output);
pinmode(door12vs, output);
pinmode(solarsw, input);
pinmode(smpwr, output);
pinmode(smfeedback, input);
pinmode(buzz, output);
pinmode(dsman, input);
// makes sure door closed when starting
int tone;
tone = buzzerroutine();
digitalwrite( door12vc, low);
digitalwrite( door12vs, low);
delay(doormaxtrvltime);// time extend door closer
digitalwrite( door12vc, high);
digitalwrite( door12vs, high); //turn off closer relays
// keyword "static" makes sure variable
// isn't destroyed after each loop
static int state = s_doorclosed ;
}
void loop()
{
digitalread(dsman);
if (dsman == low) (state = s_override);
solarlvl = analogread(solarsw); // stores value of sunlight:
digitalwrite(smpwr, high); //power solar multiplier
analogread(smfeedback);
digitalwrite(smpwr, low); //depower multiplier
solarlvl = (solarlvl * smfeedback);
serial.print("solar level multiplier = ");
serial.println(solarlvl);
delay(500);
switch (state)
{
case s_doorclosed:
// doorclosed
int tone;
tone = buzzerroutine();
digitalwrite( door12vc, low);
digitalwrite( door12vs, low);
delay(doormaxtrvltime);// time extend door closer
digitalwrite( door12vc, high);
digitalwrite( door12vs, high); //turn off closer relays
state = s_wait4day;
break;
case s_wait4day:
// wait solarlevel go above setpoint
if (solarlvl > 200) {
state = s_dooropen;
}
break;
case s_dooropen:
// dooropen
digitalwrite( door12vc, low);
digitalwrite( door12vs, high);
delay(doormaxtrvltime);// time retract door closer
digitalwrite( door12vc, high);
digitalwrite( door12vs, high); //turn off closer relays
state = s_wait4dark; // move next state
break;
case s_wait4dark:
// wait solar level drop below set point.
if (solarlvl < 100)
{
state = s_doorclosed;
}
break;
case s_override:
// cycle door based on push button switch.
//what override if door closed
digitalread(dsman);
if ((dsman == low) && (state == s_doorclosed || state == s_wait4day));
{ // dooropen
digitalwrite( door12vc, low);
digitalwrite( door12vs, high);
delay(doormaxtrvltime);// time retract door closer
digitalwrite( door12vc, high);
digitalwrite( door12vs, high); //turn off closer relays;
digitalread(dsman); //check cancel of override
if (dsman == low) {
(state = s_wait4dark);
}
else {
(state = s_override);
}
}
//what override if door open
if ((dsman == low) && (state == s_dooropen || state == s_wait4dark));
{ // doorclose
int tone;
tone = buzzerroutine();
digitalwrite( door12vc, low);
digitalwrite( door12vs, low);
delay(doormaxtrvltime);// time retract door closer
digitalwrite( door12vc, high);
digitalwrite( door12vs, high); //turn off closer relays
digitalread(dsman);// check cancel of override
if (dsman == low) {
(state = s_wait4day);
}
else {
(state = s_override);
}
}
}
}
// subroutine buzzer
int buzzerroutine()
{
ts = millis(); // record current time
digitalwrite(buzz, high); // sound buzzer
if ((millis >= (ts + 5000)) && (cd >= 1)) //sets time alarm on
{
digitalwrite(buzz, low); // silence buzzer
--cd;// decrease counter
delay(1000); //pause between tones
}
else if ((millis >= (ts + 5000)) && (cd == 0))
{
digitalwrite(buzz, low); // silence buzzer
cd = 5; //reset counter
return;
}
}
//} end of loop
Arduino Forum > Using Arduino > Programming Questions > Help with a sub function
arduino
Comments
Post a Comment