Control of PIR sensor using state


i'm using gprs shield receive sms texts , execute blocks of code accordingly. if message received 'on', i'd global variable pirstate == high. else, if message received off, i'd pirstate == low. digitalwrite(led1, high); part of if(pirstate == high) replaced code monitor pir sensor. can't seem global variable pirstate update properly.

i've had success getting update high when 'on' text received, won't update low when 'off' text received.

i've been looking @ code day or 2 , feel i'm glazing on simple. see glaring problems in logic below? in advance!

code: [select]

#include <softwareserial.h>
char inchar; // hold incoming character gsm shield
softwareserial sim900(7, 8);

int led1 = 5;
int inputpin = 6;   // choose input pin (for pir sensor)
int pinspeaker = 4; //set speaker on pwm pin (digital 9, 10, or 11)
int pirstate = low; // sensor 'off'/not being read

void setup()
{
  serial.begin(19200);
  // set digital pins control
  pinmode(led1, output);
  pinmode(inputpin, input);
  pinmode(pinspeaker, output);
 
  // set led low
  digitalwrite(led1, low);
 
  sim900.begin(19200);
  sim900.print("at+cmgf=1\r");  // set sms mode text
  delay(100);
  sim900.print("at+cnmi=2,2,0,0,0\r");
  // blurt out contents of new sms upon receipt gsm shield's serial out
  delay(100);
}

void loop()
{
  //if character comes in cellular module...
  if(sim900.available() >0)
  {
    inchar=sim900.read();
    if (inchar=='o')
    {
      delay(10);
      inchar=sim900.read();
      if (inchar=='n')
      {
        pirstate = high;        // update current state of pir
        sim900.println("at+cmgd=1,4"); // delete sms
        delay(10);
      } else if (inchar == 'f') 
      {
        delay(10);
        inchar=sim900.read();
        if (inchar=='f')
        {
          pirstate = low;
          delay(10);
          sim900.println("at+cmgd=1,4"); // delete sms
        }
      }
    }
  }// end of available
 
  // read state of pir sensor
  if (pirstate == high)
  {
    digitalwrite(led1, high); // turn led on
  } else if (pirstate == low)
  {
    digitalwrite(led1, low); // turn led off
    delay(500);
  } 
}// end of main loop

hi

you calling sim900.available() @ start of nested if statements.  looks rely on delays allow enough time each character arrive.  maybe there timing problem 3 character off message.

as quick test, rather proper fix, try increasing delay period between characters.  also, add in serial.print() after each sim900.read() show value of inchar @ each stage.

regards

ray



Arduino Forum > Using Arduino > Programming Questions > Control of PIR sensor using state


arduino

Comments

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support