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.

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

code: [select]

  else if ((millis >= (ts + 5000)) && (cd == 0))

are missing call millis() function ?


Arduino Forum > Using Arduino > Programming Questions > Help with a sub function


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts