Tigga
Tigga

Reputation: 13

How to allow my C++ code to update variables?

I'm new to coding and C++.

The code below is meant to monitor a magswitch and a status led on another controller. The code needs to run once the magswitch pin goes high (this works).

The additional code for pulseIn, is what I hope to use to monitor different flash rates of the led when I get the code working. For now I'm just looking for the state variable to update with the if and else if statements.

When I toggle the statusPin, the code picks up the changing state, but I cannot get it to update the "state" and "statuspinstate" variables.

The statuspinstate variable shows as 1, even though it is initialized as 0.

I inserted all the serial prints to try and see where things are going wrong.

This is the serial print when "statusPin" is LOW:

statuspinstate: 0
rate1: 2147483647
period: 0.00
rate2: 0
ontime: 0
offtime: 0
state: 0
statepinstatus: 1

This is the serial print when "statusPin" is HIGH

statuspinstate: 1
rate1: 2147483647
period: 0.00
rate2: 0
ontime: 0
offtime: 0
state: 0
statepinstatus: 1

Code:

    const int statusPin = 19; //Reads status led
    const int magSwitch = 22; //Magswitch to detect movement
    
    int ontime,offtime,rate1,rate2;
    float freq,period;
    volatile unsigned int state =0;
    volatile unsigned int statuspinstate = 0;
       
void setup()
{
pinMode(statusPin, INPUT);     //input from controller
pinMode(magSwitch, INPUT);
Serial.begin(115200);

}

void loop()
{
   while (digitalRead(magSwitch) == LOW) {

}


{   

   statuspinstate = digitalRead(statusPin);
   ontime = pulseIn(statusPin,HIGH);
   offtime = pulseIn(statusPin,LOW);
   period = ontime+offtime;
   rate1 = (ontime/period);       //future use
   rate2 = (offtime);             //future use
   Serial.println(String("statuspinstate ") + (digitalRead(statusPin)));   //all serial print is debug info
   Serial.println(String("rate1: ") + (rate1));
   Serial.println(String("period: ") + (period));
   Serial.println(String("rate2: ") + (rate2));
   Serial.println(String("ontime: ") + (ontime));
   Serial.println(String("offtime: ") + (offtime));
   delay(500);
}

   if ((ontime) != 0)
    state = period;

   else if (statuspinstate = 1)
    state = 9999;

   else if (statuspinstate = 0);
    state = 0;
    
   Serial.println(String("state: ") + (state));
   Serial.println(String("statepinstatus: ") + (statuspinstate));

    statuspinstate = 0;                                         //return statuspinstate to zero
   
}

Upvotes: 0

Views: 259

Answers (1)

molbdnilo
molbdnilo

Reputation: 66371

Look at your conditional, with proper indentation (do get a text editor that can indent your code for you):

if ((ontime) != 0)
    state = period;
else if (statuspinstate = 1)
    state = 9999;
else if (statuspinstate = 0);
state = 0;

We know that ontime is zero, so the second condition is tried next.
Now, statuspinstate = 1 is an assignment, not a comparison, and its value is "truth-y" so you take that branch.
Next, the stray semicolon in if (statuspinstate = 0); (which is also an assignment condition, but not evaluated) makes state = 0 unconditional.

So every time ontime is zero, you end up executing statuspinstate = 1 and state = 0.

What you probably want is

if (ontime != 0)
    state = period;
else if (statuspinstate == 1)
    state = 9999;
else if (statuspinstate == 0)
    state = 0;

Upvotes: 4

Related Questions