Increasing and Decreasing 7-segment Number with IR remote Post

I am very new to Arduino and need a bit of help. I am working on a project to increase and decrease numbers on a single 7 segment display with an IR remote. One button should turn the 7-segment on, one button should increase the displayed number and one button should decrease the displayed number. An LED strip should also light up with the same number of LEDs as the number displayed on the seven segment.

I realize this code probably is not the most direct way to achieve what I am trying to do, but I am wondering if there is a way to make this work and appreciate all help.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

#include <IRremote.h>
#define IR_RECEIVER_PIN 8
IRrecv irreceive(IR_RECEIVER_PIN);

decode_results results;

int i=0;

#define PIXEL_PIN1 5
#define PIXEL_COUNT 6
Adafruit_NeoPixel strip1(PIXEL_COUNT, PIXEL_PIN1, NEO_GRB + NEO_KHZ800);

#define BUTTON_1 0xFD08F7
#define BUTTON_2 0xFD8877
#define BUTTON_3 0xFD48B7

void setup()
{
    irreceive.enableIRIn();
    strip1.begin(); 
    strip1.show(); 
    pinMode(0, OUTPUT); // D0
    pinMode(1, OUTPUT); // D1
    pinMode(2, OUTPUT); // D2
    pinMode(3, OUTPUT); // D3
}

void loop()
{

  while (0<=i<=3){
    if(irreceive.decode(&results)) {
    Serial.println(results.value, HEX);
    irreceive.resume();
  }
  if(results.value == 0xFD08F7)//allow loop to begin by pressing button 1
  {
    s(i);
    if(results.value == 0xFD8877)//increase number by pressing button 2
    {
      i++;
    }
    if(results.value == 0XFD48B7)//decrease number by pressing button 3 
    {
      i--;
    }
  }
  } 
}

void s(int inputNum){ 
  if(inputNum=0)
  {
  //0 leds on, 7-segment number 0
  strip1.clear();
  strip1.show();
  digitalWrite(0, LOW); // 1
  digitalWrite(1, LOW);  // 2
  digitalWrite(2, LOW);  // 4
  digitalWrite(3, LOW); // 8
  delay(1000);
  }
  else if(inputNum=1)
  {
  //1 led on, 7-segment number 1
  strip1.clear();
  strip1.show();
  uint32_t red = strip1.Color(250, 0, 0, 0);
  strip1.fill(red, 0, 1);
  strip1.show();
  digitalWrite(0, HIGH); // 1
  digitalWrite(1, LOW);  // 2
  digitalWrite(2, LOW);  // 4
  digitalWrite(3, LOW); // 8
  delay(1000);
  }
  else if(inputNum=2)
  {
  //2 leds on, 7-segment number 2
  strip1.clear();
  strip1.show();
  uint32_t red = strip1.Color(250, 0, 0, 0);
  strip1.fill(red, 0, 2);
  strip1.show();
  digitalWrite(0, LOW); // 1
  digitalWrite(1, HIGH);  // 2
  digitalWrite(2, LOW);  // 4
  digitalWrite(3, LOW); // 8
  delay(1000);
  }
  else if(inputNum=3)
  {
  //3 leds on, 7-segment number 3
  strip1.clear();
  strip1.show();
  uint32_t red = strip1.Color(250, 0, 0, 0);
  strip1.fill(red, 0, 3);
  strip1.show();
  digitalWrite(0, HIGH); // 1
  digitalWrite(1, HIGH);  // 2
  digitalWrite(2, LOW);  // 4
  digitalWrite(3, LOW); // 8
  delay(1000);
  }
  else
  {
    off();
  } 
}

void off()
{
  uint32_t white = strip1.Color(0, 0, 0, 0);
  strip1.fill(white, 0, 8);
  strip1.show();
  digitalWrite(0, HIGH); // 1
  digitalWrite(1, HIGH);  // 2
  digitalWrite(2, HIGH);  // 4
  digitalWrite(3, HIGH); // 8
  delay(1000);
}

Please describe what you wanted it to do and what it actually does.

should be

while (0<= i && i<=3){

But... why are you be using a while() loop here?

The second if() cannot be true because if results.value is 0xFD08F7, it can't be 0xFD8877.

I think you need to review where every } is placed in your code. It would help you if your code was correctly indented. Click Tools->Auto Format

consider

#define BUTTON_1 0xFD08F7
#define BUTTON_2 0xFD8877
#define BUTTON_3 0xFD48B7

// -----------------------------------------------------------------------------
#undef MyHW
#ifdef MyHW
struct decode_results {
    unsigned long value;
};

struct IRrecv  {
    decode_results _res;

    IRrecv (int pin) { }
    void enableIRIn (void)  { }
    void resume     (void)  { }
    bool decode (decode_results *pVal)  {
        while (! Serial.available ())
            ;
        switch (Serial.read ()) {
        case '1':
            _res.value = BUTTON_1;
            break;
        case '2':
            _res.value = BUTTON_2;
            break;
        case '3':
            _res.value = BUTTON_3;
            break;
        default:            // \n
            return false;
            break;
        }

        *pVal = _res;
        return true;
    }
};

enum { NEO_GRB, NEO_KHZ800 };

struct Adafruit_NeoPixel {
    Adafruit_NeoPixel (int a, int b, int c) { }
    void begin (void) { }
    void clear (void) { }
    void show  (void) { }
    void fill  (int r, int b, int g)    { }
    uint32_t Color (int r, int b, int g, int h)    { return 0; }
};

// -------------------------------------
#else
# include <Adafruit_NeoPixel.h>
# ifdef __AVR__
#  include <avr/power.h> // Required for 16 MHz Adafruit Trinket
# endif
# include <IRremote.h>
#endif

// -----------------------------------------------------------------------------
#define IR_RECEIVER_PIN 8
IRrecv irreceive (IR_RECEIVER_PIN);
decode_results results;

#define PIXEL_PIN1 5
#define PIXEL_COUNT 6
Adafruit_NeoPixel strip1 (PIXEL_COUNT, PIXEL_PIN1, NEO_GRB + NEO_KHZ800);

int i;

// -----------------------------------------------------------------------------
void setup ()
{
    Serial.begin (9600);

    irreceive.enableIRIn ();
    strip1.begin ();
    strip1.show ();
    pinMode (0, OUTPUT); // D0
    pinMode (1, OUTPUT); // D1
    pinMode (2, OUTPUT); // D2
    pinMode (3, OUTPUT); // D3
}

// -----------------------------------------------------------------------------
void loop ()
{
    if (irreceive.decode(&results)) {
        Serial.println (results.value, HEX);
        irreceive.resume ();

        switch (results.value)  {
        case 0xFD08F7:  // button 1
            off ();
            break;

        case 0xFD8877:  // button 2
            disp (++i);
            break;

        case 0XFD48B7:  // button 3
            disp (--i);
            break;
        }
    }
}

// -----------------------------------------------------------------------------
void disp (
    int i )
{
    Serial.print ("disp: ");
    Serial.println (i);

    uint32_t red = strip1.Color (250, 0, 0, 0);
    strip1.clear ();
    strip1.fill (red, 0, 1);
    strip1.show ();

    digitalWrite (0, i & 1 ? HIGH : LOW);
    digitalWrite (1, i & 2 ? HIGH : LOW);
    digitalWrite (2, i & 4 ? HIGH : LOW);
    digitalWrite (3, i & 8 ? HIGH : LOW);
}

// -----------------------------------------------------------------------------
void off ()
{
    Serial.println ("off: ");

    uint32_t white = strip1.Color (0, 0, 0, 0);
    strip1.fill (white, 0, 8);
    strip1.show ();
    digitalWrite (0, HIGH); // 1
    digitalWrite (1, HIGH);  // 2
    digitalWrite (2, HIGH);  // 4
    digitalWrite (3, HIGH); // 8
}

A string of if/else like that is better done with a switch/case

  switch (results.value)
    case 0xFD08F7:
      //allow loop to begin by pressing button 1
      s(i);
      break;

    case 0xFD8877:
      //increase number by pressing button 2
      i++;
      break;

    case 0XFD48B7:
      //decrease number by pressing button 3 
      i--;
      break;
  }

Thanks for all the help. I was able to get it work.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.