Pages: [1]   Go Down
Author Topic: Run an if-else once  (Read 645 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello people. I have a project involving an RC car and a "seat belt". Basically the car cannot move unless the seat belt is fastened. I am using an Arduino UNO to control whether the car moves. It checks for a logic 1 or 0 at pin 9, and controls a relay at pin 8. The program works and the car does move only when the seat belt is fastened, but when the seat belt is unfastened the car immediately slows to a halt. I needed to add a delay when the seat belt is unfastened. So I added the delay() function and tried uploading. Here's the problem. I added a delay of 60 seconds. When the seat belt is unfastened, the Arduino delays for 60 seconds before writing a LOW to the relay. This is perfect, but when I refasten the seat belt after 60 seconds, the Arduino waits another 60 seconds before re-activating the relay. So I need help. Is it possible to just run the if-else once? Like what ever is in the "else" just once?

*ignore LCD commands.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int relayOut = 8;
int receiverIn = 9;
int x = 60;

void setup()
{
  pinMode(relayOut,OUTPUT);
  pinMode(receiverIn,INPUT);
  lcd.begin(16, 2);
  lcd.print("Welcome. Please fasten your seat belt.");


void delayCarStart()
{
  delay(3000);
  digitalWrite(relayOut, LOW);
}
 
void loop()
{
  if (digitalRead(receiverIn) == HIGH)
     {
     digitalWrite(relayOut, HIGH);
     lcd.print("You may proceed");
     }
  else
     {
     lcd.print("Please fasten your seat belt!");
     delayCarStart();
     }     
}

Logged

Poole, Dorset, UK
Offline Offline
Edison Member
*
Karma: 52
Posts: 2373
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

How are you de-bouncing the button. Look at the examples.

Mark
Logged

NE PA
Offline Offline
Full Member
***
Karma: 5
Posts: 156
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Is this the code you tested because there is nothing there that delays for 60 seconds. I agree wih Mark, it does sound like a debounce problem. Your button is "bouncing" which cycles from high to low a few times before settling. During that time the code catches a low state and goes to the else portion of your code.
« Last Edit: January 17, 2013, 07:31:09 am by Quick5pnt0 » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oops, posted the wrong copy...
Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int relayOut = 8;
int receiverIn = 9;
int x = 60;

void setup()
{
  pinMode(relayOut,OUTPUT);
  pinMode(receiverIn,INPUT);
  lcd.begin(16, 2);
  lcd.print("Welcome. Please fasten your seat belt.");
}  

  
void loop()
{
  if (digitalRead(receiverIn) == HIGH)
     {  
     digitalWrite(relayOut, HIGH);
     lcd.print("You may proceed");
     }
  else
     {
     lcd.print("Please fasten your seat belt!");
     delay(60000);
     digitalWrite(relayOut, LOW);
     }    
}

Moderator edit: CODE TAGS, CODE TAGS.
« Last Edit: January 17, 2013, 08:13:58 am by AWOL » Logged

NE PA
Offline Offline
Full Member
***
Karma: 5
Posts: 156
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Take a look at this:
http://arduino.cc/en/Tutorial/Debounce
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

still cant get it to work ergh... need this to work by saturday!!!!
Logged

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 309
Posts: 26495
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Have a look at the blink without delay tutorial to allow you to not use "delay()", and make your code more responsive.
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Queens, New York
Offline Offline
Faraday Member
**
Karma: 106
Posts: 3766
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

EDIT! Does not work properly

Try this
Code:
flagged = 0; //global variable at the top of code

void loop()
{
  if (digitalRead(receiverIn) == HIGH)
     {
       if(!flagged)
        {
          digitalWrite(relayOut, HIGH);
          lcd.print("You may proceed");
          flagged = 1;
        }
       else
        {
          lcd.print("Please fasten your seat belt!");
          delayCarStart();
        }
    }
  else flagged = 0;
}


Not compiled or tested but, have use simular example in other working programs.
« Last Edit: January 17, 2013, 03:26:04 pm by HazardsMind » Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

California
Offline Offline
Faraday Member
**
Karma: 92
Posts: 3438
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

What you're looking for is called signal edge detection. You don't care that the input is LOW, you're just looking for when it goes from HIGH to LOW. To do that, you need to keep track of the last reading. If the current reading is HIGH and the last reading is LOW, you have what's called a falling edge.
Logged

NE PA
Offline Offline
Full Member
***
Karma: 5
Posts: 156
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

still cant get it to work ergh... need this to work by saturday!!!!

Post your new code so somebody can see what is wrong.
Logged


Queens, New York
Offline Offline
Faraday Member
**
Karma: 106
Posts: 3766
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Here this example works.

Code:
const int sensor = 2;
int flag=0;
int flag1=0;
int last = 0;

void setup(){
  Serial.begin(9600);
  Serial.println("Start");
}
void loop(){
  //Serial.println(digitalRead(sensor));
  if(digitalRead(sensor) == HIGH)
  {
    if(!flag){
      Serial.println("X");
      flag = 1;
    }
  }
  else flag = 0;

  if(digitalRead(sensor) == LOW)
  {
    if(!flag1){
      Serial.println("Y");
      flag1 = 1;
    }
  }
  else flag1 = 0;
  //delay(1000);
}

Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Offline Offline
Jr. Member
**
Karma: 1
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Exactly as Arrch said, you need an edge trigger, google edge triggering arduino or edge triggering c++. It's a pretty easy thing to do.
Logged

Pages: [1]   Go Up
Jump to: