Go Down

Topic: blink led with remote (Read 3119 times) previous topic - next topic

Henrywallace

I didn't highlight just that line.
I did that for a reason.
Oh are you talking about defining currentMillis? I defined that variable and the previousMillis variable before the setup() part of the code. Does it not work with it up there?

PaulS

Quote
PaulS im also having trouble understanding what youre saying. Are you saying all capitals is wrong and wont work, or it will work but not typical coding context?
It will work, but it will cause people that follow conventions, and expect others to follow them, too, to look at you funny.

Henrywallace

It will work, but it will cause people that follow conventions, and expect others to follow them, too, to look at you funny.
Okay that makes sense. So only use all capital names when its a constant? A constant is something that doesnt change like my BLINK_PIN or LED_PIN right?

AWOL

Oh are you talking about defining currentMillis? I defined that variable and the previousMillis variable before the setup() part of the code. Does it not work with it up there?
Think about it - the global variables get initialised once, before your code has even thought about considering allowing the possibility of running to cross its mind.

Henrywallace

Think about it - the global variables get initialised once, before your code has even thought about considering allowing the possibility of running to cross its mind.
So currentMillis cant get defined before setup because the code hasnt even begun to run yet and it hasnt started counting milliseconds? I never really thought about it like that. Can i define currentMillis and previousMillis in the Setup() function? Good catch, thank you.

AWOL

Quote
Can i define currentMillis and previousMillis in the Setup() function?
Certainly.
But then they won't be in scope in loop().

Henrywallace

Certainly.
But then they won't be in scope in loop().

Okay hold up, can i take back my last comment lol. Yes i just realized if i define it in setup() i wont be able to use in loop(). I also realized that it needs to be in loop so that currentMillis is constantly getting updated at the beginning of the loop.

larryd

Here is a sketch from a while back that may help you to visualize some things:
Code: [Select]
 

//**********************************************************************
 
#include "IRremote.h"
//LarryD

//Sketch to demonstrate using an IR hand remote to control Arduino outputs.
//The remote used here uses the NEC protocol.
//This remote sends the button code (example 0xFF629D) then a repeat code 0xFFFFFFFF
//The repeat code is re-sent as long as an IR remote button is pressed.
//The IR receiver used is the TSOP4838
 
/*  17 IR button remote layout   http://i.imgur.com/X1KIdqI.png
 
   ^
< OK  > 
   v
1  2  3
4  5  6
7  8  9
*  0  #
 
*/
 
 
const byte RECV_PIN = 7;   //IR receive pin
 
IRrecv irrecv(RECV_PIN);   //create instance of 'IRrecv'
decode_results results;    //create instance of 'decode_results'
 
unsigned long   TimerUp;   //UP arrow on the remote
boolean         TimerUpFlag = false;
 
unsigned long   TimerDown; //DOWN arrow on the remote
boolean         TimerDownFlag    = false;
 
unsigned long   TimerIntensity;
unsigned long   TimerIncDec;
boolean         intesityUpFlag   = false;
boolean         intesityDownFlag = false;
int             brightness;
 
unsigned long   dummy;
unsigned long * TimerPtr = &dummy; //pointer to the current timer
 
const byte upLED        = 13;  //turns on as long as the UP button is pressed
const byte downLED      = 12;  //turns on as long as the DOWN button is pressed
const byte leftLED      = 11;  //toggles on/off
const byte rightLED     = 10;  //toggles on/off
const byte intensityLED =  9;  //a LED which can have its intensity adjusted
 
 
//                           s e t u p ( )
//**********************************************************************
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); //start receive
 
  pinMode(upLED,   OUTPUT);
  pinMode(downLED, OUTPUT);
  pinMode(leftLED, OUTPUT);
  pinMode(rightLED, OUTPUT);
  pinMode(intensityLED, OUTPUT); //this is a PWM output pin
 
} //                    E N D  O F  s e t u p ( )
 
 
 
//                            l o o p ( )
//**********************************************************************
void loop()
{
  if (irrecv.decode(&results)) //is there IR remote button code
  {
    //Serial.println(results.value);
    processButton(); //process button press
    irrecv.resume(); //restart for next button press
  }
 
  //**********************                                //Turn off upLED
  //if timing is enabled, is it time to stop
  if (TimerUpFlag && millis() - TimerUp >= 250ul)
  {
    TimerUpFlag = false; //disable timing
    TimerPtr = &dummy;   //pointer to dummy timer
    digitalWrite(upLED, LOW);
  }
 
  //**********************                                //Turn off downLED
  //if timing is enabled, is it time to stop
  if (TimerDownFlag && millis() - TimerDown >= 250ul)
  {
    TimerDownFlag = false; //disable timing
    TimerPtr = &dummy;     //pointer to dummy timer
    digitalWrite(downLED, LOW);
  }
 
  //**********************                                //LED intensity
  //are we still within the adjustment time
  if (millis() - TimerIntensity <= 300ul)
  {
    //is it time to increase/decrease the intensity
    if (millis() - TimerIncDec >= 200ul)
    {
      TimerIncDec = millis();
 
      if (intesityUpFlag == true) //Increase
      {
        brightness += 5;
        if (brightness > 255)
        {
          brightness = 255;
        }
      }
      else if (intesityDownFlag == true) //Decrease
      {
        brightness -= 5;
        if (brightness < 0)
        {
          brightness = 0;
        }
      }
 
      analogWrite(intensityLED, brightness);
      //Serial.println(brightness); //debug
    }
  }
  //stop increasing/decreasing intensity
  else
  {
    intesityUpFlag = false;
    intesityDownFlag = false;
  }
 
  //************************************
  //Other non blocking code goes here
  //************************************
 
} //                   E N D  O F  l o o p ( )
 
 
 
//======================================================================
//                       F U N C T I O N S
//======================================================================
 
//                   p r o c e s s B u t t o n ( )
//**********************************************************************
//process IR remote button presses
void processButton()
{
  switch (results.value)
  {
    //**********************
    case 0xFF629D:                                           //UP Arrow
      {
        Serial.println("UP");
        TimerPtr = &TimerUp;  //point to this timer
        TimerUpFlag = true;   //enable timing
        digitalWrite(upLED, HIGH);
        TimerUp = millis();
      }
      break;
 
    //**********************
    case 0xFFA857:                                           //DOWN Arrow
      {
        Serial.println("DOWN");
        TimerPtr = &TimerDown;  //point to this timer
        TimerDownFlag = true;   //enable timing
        digitalWrite(downLED, HIGH);
        TimerDown = millis();
      }
      break;
 
    //**********************
    case 0xFF22DD:                                           //LEFT Arrow
      {
        Serial.println("LEFT");
        digitalWrite(leftLED, !digitalRead(leftLED));   //Toggle LED
      }
      break;
 
    //**********************
    case 0xFFC23D:                                           //RIGHT Arrow
      {
        Serial.println("RIGHT");
        digitalWrite(rightLED, !digitalRead(rightLED)); //Toggle LED
      }
      break;
 
    //**********************
    case 0xFF42BD:                                           // * button
      {
        Serial.println("*");
        TimerPtr = &TimerIntensity;  //point to this timer
        intesityUpFlag = true;       //enable intensity up adjustment
        intesityDownFlag = false;
        TimerIncDec = millis();
        TimerIntensity = millis();
      }
      break;
 
    //**********************
   case 0xFF52AD:                                           // # button
      {
        Serial.println("#");
        TimerPtr = &TimerIntensity;  //point to this timer
        intesityDownFlag = true;     //enable intensity down adjustment
        intesityUpFlag = false;
        TimerIncDec = millis();
        TimerIntensity = millis();
      }
      break;
 
    //**********************
    case 0xFF02FD:
      Serial.println("OK");
      break;
 
    //**********************
    case 0xFF6897:
      Serial.println("1");
      break;
 
    //**********************
    case 0xFF9867:
      Serial.println("2");
      break;
 
    //**********************
    case 0xFFB04F:
      Serial.println("3");
      break;
 
    //**********************
    case 0xFF30CF:
      Serial.println("4");
      break;
 
    //**********************
    case 0xFF18E7:
      Serial.println("5");
      break;
 
    //**********************
    case 0xFF7A85:
      Serial.println("6");
      break;
 
    //**********************
    case 0xFF10EF:
      Serial.println("7");
      break;
 
    //**********************
    case 0xFF38C7:
      Serial.println("8");
      break;
 
    //**********************
    case 0xFF5AA5:
      Serial.println("9");
      break;
 
    //**********************
    case 0xFF4AB5:
      Serial.println("0");
      break;
 
    //**********************
    case 0xFFFFFFFF: //Repeat code
      {
        Serial.println("REPEAT");
        *TimerPtr = millis();       //reset the current timer
      }
      break;
 
  } // END switch case
 
} //             E N D  o f  p r o c e s s B u t t o n ( )
 
//**********************************************************************
 
//======================================================================
//                        E N D  O F  C O D E
//======================================================================

No technical PMs.
If you are asked a question, please respond with an answer.
If you are asked for more information, please supply it.
If you need clarification, ask for help.

Henrywallace

larryd ill have to read through that later when im off work, but thank you im sure ill find it useful. Here is my latest and greatest code if anyone cares and has been following along.

Code: [Select]
#include <IRremote.h>
#include <IRremoteInt.h>
 
int RECV_PIN = 0;
int RELAY_PIN = 1;
int LED_PIN = 2;
int BLINK_PIN = 3;

bool signal_on = 0;
bool led_on = 0;

unsigned long previousMillis = 0;
 
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BLINK_PIN, OUTPUT);
  pinMode(RECV_PIN, INPUT);
  irrecv.enableIRIn();

  digitalWrite(RELAY_PIN, LOW);
  digitalWrite(LED_PIN, LOW);
  digitalWrite(BLINK_PIN, LOW);
}
 
void loop() {


unsigned long currentMillis = millis();

 if (currentMillis - previousMillis >= 250) {

previousMillis = currentMillis;
led_on = !led_on;
digitalWrite(BLINK_PIN, led_on);

}

  if (irrecv.decode(&results)) {
      signal_on = !signal_on);
      digitalWrite(RELAY_PIN, signal_on ? HIGH : LOW);
      digitalWrite(LED_PIN, signal_on ? HIGH : LOW);     
    irrecv.resume();
  }

}

PaulS

Quote
Here is my latest and greatest code if anyone cares and has been following along.
You didn't compile that, did you?

Henrywallace

You didn't compile that, did you?
No i cant do it at work because i dont have the IDE here. Ive been editing it in notepad and then email it to myself so i can have it when i get home. Is there another obvious thing wrong lol?

larryd

 signal_on = !signal_on);



.
No technical PMs.
If you are asked a question, please respond with an answer.
If you are asked for more information, please supply it.
If you need clarification, ask for help.

Henrywallace

signal_on = !signal_on);



.
Just to make sure we are on the same page. Take out the extra ) after !signal_on?

larryd

signal_on = !signal_on);

This should be:

signal_on = !signal_on;

No technical PMs.
If you are asked a question, please respond with an answer.
If you are asked for more information, please supply it.
If you need clarification, ask for help.

larryd

#29
Aug 17, 2017, 08:28 pm Last Edit: Aug 17, 2017, 09:00 pm by larryd
These are not good pins to use as they are connected to RX TX

int RECV_PIN  = 0;
int RELAY_PIN = 1;

Consider using these:

int RECV_PIN  = 2;
int RELAY_PIN = 3;
int LED_PIN   = 4;
int BLINK_PIN = 5;


Most remotes (NEC) I have used, send a repeat code (0xFFFFFFFF) after the switch code.

I your remote does this, you may want to filter the repeat code out.



digitalWrite(RELAY_PIN, signal_on ? HIGH : LOW);
digitalWrite(LED_PIN, signal_on ? HIGH : LOW);

Why not?

digitalWrite(RELAY_PIN, signal_on);
digitalWrite(LED_PIN, signal_on);


.
No technical PMs.
If you are asked a question, please respond with an answer.
If you are asked for more information, please supply it.
If you need clarification, ask for help.

Go Up