7 Segment Library for Arduino 1.0

Hi all,
Thanks for the help. I have edited the code, but in my example program, it gives me a ton of error messages. Here is the current .h file.

#ifndef Soda_h
#define Soda_h

#include "Arduino.h"

class Soda
{
public:
    uint8_t pins(int a, int b, int c, int d, int e, int f, int g, int dp);
    void write(int number);
    
private:
    int _a, _b, _c, _d, _e, _f, _g, _dp, _number;
    const byte numeral[10];
    const int segmentPins[8];
    
#endif

And here is the latest .cpp file.

#include "Arduino.h"
#include "Soda.h"

uint8_t Soda::pins(int a, int b, int c, int d, int e, int f, int g, int dp) {
    
    a=_a;
    b=_b;
    c=_c;
    d=_d;
    e=_e;
    f=_f;
    g=_g;
    dp=_dp;
    
    segmentPins[0] = _dp;
    segmentPins[1] = _g;
    segmentPins[2] = _f;
    segmentPins[3] = _e;
    segmentPins[4] = _d;
    segmentPins[5] = _c;
    segmentPins[6] = _b;
    segmentPins[7] = _a;
    
    for(int i=0; i < 8; i++) {
        
        pinMode(segmentPins[i], OUTPUT);
    }
    
    
}

void Soda::write(int number) {
    boolean isBitSet;
    
    numeral[0] = B11111100;  // 0
    numeral[1] = B01100000;  // 1
    numeral[2] = B11011010;  // 2
    numeral[3] = B11110010;  // 3
    numeral[4] = B01100110;  // 4
    numeral[5] = B10110110;  // 5
    numeral[6] = B10111110;  // 6
    numeral[7] = B11100000;  // 7
    numeral[8] = B11111110;  // 8
    numeral[9] = B11100110;  // 9
    
    for(int segment=1; segment < 8; segment++) {
        if(number < 0 || number > 9) {
            isBitSet = 0;
        }else{
            isBitSet = bitRead(numeral[number], segment);
        }
        isBitSet = ! isBitSet;
        digitalWrite(segmentPins[segment], isBitSet);
    }
}

And here is the example code in the Arduino IDE.

// Soda Demo

#include "Soda.h"

void setup() {
  Soda.pins(2, 3, 4, 5, 6, 7, 8, 9);
}

void loop() {
  for(int i=0; i<10; i++) {
    Soda.write(i);
    delay(1000);
  }
}

I get the following error messages after I compile.

SodaDemo:4: error: 'void Soda::setup()' cannot be overloaded
SodaDemo:2: error: with 'void Soda::setup()'
SodaDemo:8: error: 'void Soda::loop()' cannot be overloaded
SodaDemo:3: error: with 'void Soda::loop()'
SodaDemo:13: error: expected `}' at end of input
SodaDemo.cpp: In member function 'void Soda::setup()':
SodaDemo:5: error: expected unqualified-id before '.' token
SodaDemo.cpp: In member function 'void Soda::loop()':
SodaDemo:10: error: expected unqualified-id before '.' token
SodaDemo.cpp: At global scope:
SodaDemo:13: error: expected unqualified-id at end of input

Any help?

Soda.h

Needs '};' before '#endif'

Soda.cpp

Your assignments

a=_a;
...

need to be reversed

_a=a;

Soda Demo

Soda.pins(2, 3, 4, 5, 6, 7, 8, 9);

In this case 'pins(...)' is NOT a class method.

You probably meant something along the line of (at global scope)

Soda soda;

and change all occurences of 'Soda.' with 'soda.'

Example

soda.pins(2, 3, 4, 5, 6, 7, 8, 9);

etc ...

EDIT: There may be other issues as I didn't spend much time looking at, or bother trying, to compile the code you provided

Thanks for the replies. I still have the following error message though.

SodaDemo:2: error: new types may not be defined in a return type
SodaDemo.cpp:6: note: (perhaps a semicolon is missing after the definition of 'Soda')
SodaDemo:2: error: two or more data types in declaration of 'setup'
SodaDemo:4: error: structure 'soda' with uninitialized const members

Could anyone help?

You need to make an instance of the Soda object before you can use it:

Soda digit;

void setup() {
  digit.pins(...);
}

void loop() {
  digit.write(...);
}

If you get more errors, please post the latest revision again, so we don't have to guess at what changes you made.

Sorry for the confusion. Here are the latest files. I am still getting an error message though.

Soda Demo:

// Soda Demo

#include "Soda.h"

Soda soda;

void setup() {
  soda.pins(2, 3, 4, 5, 6, 7, 8, 9);
}

void loop() {
  for(int i=0; i<10; i++) {
    soda.write(i);
    delay(1000);
  }
}

Soda.h

#ifndef Soda_h
#define Soda_h

#include "Arduino.h"

class Soda
{
public:
    uint8_t pins(int a, int b, int c, int d, int e, int f, int g, int dp);
    void write(int number);
    
private:
    int _a, _b, _c, _d, _e, _f, _g, _dp, _number;
    const byte numeral[10];
    const int segmentPins[8];
}

#endif

Soda.cpp

#include "Soda.h"

uint8_t Soda::pins(int a, int b, int c, int d, int e, int f, int g, int dp) {

    _a=a;
    _b=b;
    _c=c;
    _d=d;
    _e=e;
    _f=f;
    _g=g;
    _dp=dp;
    
    segmentPins[0] = _dp;
    segmentPins[1] = _g;
    segmentPins[2] = _f;
    segmentPins[3] = _e;
    segmentPins[4] = _d;
    segmentPins[5] = _c;
    segmentPins[6] = _b;
    segmentPins[7] = _a;
    
    for(int i=0; i < 8; i++) {
        
        pinMode(segmentPins[i], OUTPUT);
    }
    
    
}

void Soda::write(int number) {
    boolean isBitSet;
    
    numeral[0] = B11111100;  // 0
    numeral[1] = B01100000;  // 1
    numeral[2] = B11011010;  // 2
    numeral[3] = B11110010;  // 3
    numeral[4] = B01100110;  // 4
    numeral[5] = B10110110;  // 5
    numeral[6] = B10111110;  // 6
    numeral[7] = B11100000;  // 7
    numeral[8] = B11111110;  // 8
    numeral[9] = B11100110;  // 9
    
    for(int segment=1; segment < 8; segment++) {
        if(number < 0 || number > 9) {
            isBitSet = 0;
        }else{
            isBitSet = bitRead(numeral[number], segment);
        }
        isBitSet = ! isBitSet;
        digitalWrite(segmentPins[segment], isBitSet);
    }
}

And here is the same error message that comes up with soda demo.

SodaDemo:2: error: new types may not be defined in a return type
SodaDemo.cpp:6: note: (perhaps a semicolon is missing after the definition of 'Soda')
SodaDemo:2: error: two or more data types in declaration of 'setup'
SodaDemo:4: error: structure 'soda' with uninitialized const members

Any Help?

Thanks,
Qtechknow

You still need a semi-colon following that last '}' in Soda.h

Thanks for the answers. The library is successfully working. The only thing is, I would like to drive two digits now. Here are the most recent files.

The .h file

#ifndef Soda_h
#define Soda_h

#include "Arduino.h"

class Soda
{
public:
    uint8_t pins(int a, int b, int c, int d, int e, int f, int g, int dp, boolean common);
    void write(int number);
    
private:
    int _a, _b, _c, _d, _e, _f, _g, _dp, _number;
    byte numeral[10];
    int segmentPins[8];
    boolean _common;
};

#endif

The current .cpp file.

#include "Arduino.h"
#include "Soda.h"

uint8_t Soda::pins(int a, int b, int c, int d, int e, int f, int g, int dp, boolean common) {

    _a=a;
    _b=b;
    _c=c;
    _d=d;
    _e=e;
    _f=f;
    _g=g;
    _dp=dp;
    _common=common;
    
    segmentPins[0] = _dp;
    segmentPins[1] = _g;
    segmentPins[2] = _f;
    segmentPins[3] = _e;
    segmentPins[4] = _d;
    segmentPins[5] = _c;
    segmentPins[6] = _b;
    segmentPins[7] = _a;
    
    for(int i=0; i < 8; i++) {
        
        pinMode(segmentPins[i], OUTPUT);
    }
    
    
}

void Soda::write(int number) {
    boolean isBitSet;
    
    numeral[0] = B11111100;  // 0
    numeral[1] = B01100000;  // 1
    numeral[2] = B11011010;  // 2
    numeral[3] = B11110010;  // 3
    numeral[4] = B01100110;  // 4
    numeral[5] = B10110110;  // 5
    numeral[6] = B10111110;  // 6
    numeral[7] = B11100000;  // 7
    numeral[8] = B11111110;  // 8
    numeral[9] = B11100110;  // 9

    if (_common == HIGH) {

    for(int segment=1; segment < 8; segment++) {
        if(number < 0 || number > 9) {
            isBitSet = 0;
        }else{
            isBitSet = bitRead(numeral[number], segment);
        }
        isBitSet = ! isBitSet;
        digitalWrite(segmentPins[segment], isBitSet);
      }
    }
        if (_common == LOW) {
            for(int segment=1; segment < 8; segment++) {
                if(number < 0 || number > 9) {
                    isBitSet = 0;
                }else{
                    isBitSet = bitRead(numeral[number], segment);
                }
                digitalWrite(segmentPins[segment], isBitSet);
            }
        }
}

And the program I'm trying to run.

/* Soda Demo

Uses the soda library from Qtechknow.  Counts to 9 and then goes back to 0 on 
a seven segment display.  

created 14 Apr 12
Made by Quin (Qtechknow)
*/

#include "Soda.h"

Soda Soda;   // initialize the first display
Soda Soda2;  // initialize the second display

void setup() {
// Segments A, B, C, D, E, F, G, DP pin numbers
  Soda.pins(2, 3, 4, 5, 6, 7, 8, 9, HIGH);  // set high for common anode, and 
  Soda2.pins(10, 11, 12, 13, A0, A1, A2, A3, HIGH);  // low for common cathode display
}

void loop() {

  for(int i=0; i< 10; i++) {
    Soda.write(i);        // count to 9
    Soda2.write(i);
    delay(1000);          // delay for 1 second
  }
}

These are the error messages.

SodaDemo:12: error: 'Soda' does not name a type
SodaDemo.cpp: In function 'void setup()':
SodaDemo:17: error: 'Soda2' was not declared in this scope
SodaDemo.cpp: In function 'void loop()':
SodaDemo:24: error: 'Soda2' was not declared in this scope

Any Help?

Thanks,
Qtechknow

Your handling of common node vs. common cathode seems to repeat the same code, when all that is needed is a simple inversion.

Do you know how to use 2 7-segment displays?

Instantiate a second object?

Qtechknow:
Do you know how to use 2 7-segment displays?

Yes, why do you ask?

So you're 11 huh?

i belive you can't make a funcion with the same name over other funcion of arduino like setup(); change the funcion name

Now, the library is working, and I would like to add another function to this. The new library will be named Pineapple, and will use a shift register to drive the 7 segment led. I have made the new .h file, and the .cpp file, and example code to work. This library uses the shifter library from bildr, also. So I need the shifter library to work in the Pineapple library. I do not know how to initiate the shifter library in my .cpp file or .h file. This is the current .h, .cpp, and example code for my library.

.cpp file

#include "Arduino.h"
#include "Pineapple.h"
#include "Shifter.h"

uint8_t Pineapple::pins(int a, int b, int c, int d, int e, int f, int g, int dp, boolean common) {
    
    _a=a;
    _b=b;
    _c=c;
    _d=d;
    _e=e;
    _f=f;
    _g=g;
    _dp=dp;
    _common=common;
    
    segmentPins[0] = _dp;
    segmentPins[1] = _g;
    segmentPins[2] = _f;
    segmentPins[3] = _e;
    segmentPins[4] = _d;
    segmentPins[5] = _c;
    segmentPins[6] = _b;
    segmentPins[7] = _a;
    
    for(int i=0; i < 8; i++) {
        
        pinMode(segmentPins[i], OUTPUT);
    }
    
    
}

void Pineapple::write(int number) {
    boolean isBitSet;
    
    numeral[0] = B11111100;  // 0
    numeral[1] = B01100000;  // 1
    numeral[2] = B11011010;  // 2
    numeral[3] = B11110010;  // 3
    numeral[4] = B01100110;  // 4
    numeral[5] = B10110110;  // 5
    numeral[6] = B10111110;  // 6
    numeral[7] = B11100000;  // 7
    numeral[8] = B11111110;  // 8
    numeral[9] = B11100110;  // 9
    
    if (_common == HIGH) {
        
        for(int segment=1; segment < 8; segment++) {
            if(number < 0 || number > 9) {
                isBitSet = 0;
            }else{
                isBitSet = bitRead(numeral[number], segment);
            }
            isBitSet = ! isBitSet;
            shifter.setPin(segmentPins[segment], isBitSet);
            shifter.write();
        }
    }else{
        for(int segment=1; segment < 8; segment++) {
            if(number < 0 || number > 9) {
                isBitSet = 0;
            }else{
                isBitSet = bitRead(numeral[number], segment);
            }
            shifter.setPin(segmentPins[segment], isBitSet);
            shifter.write();
        }
    }
    if (_number == '.' && _common == HIGH) {
        shifter.setPin(_dp, LOW);
        shifter.write();
    }
    if (_number == '.' && _common == LOW) {
        shifter.setPin(_dp, HIGH);
        shifter.write();
    }
    if (_common == HIGH) {
        shifter.setPin(_dp, HIGH);
        shifter.write();
    }
    if (_common == LOW) {
        shifter.setPin(_dp, LOW);
        shifter.write();
    }
}

The current .h file.

#ifndef Pineapple_h
#define Pineapple_h

#include "Arduino.h"

class Pineapple
{
public:
    uint8_t pins(int a, int b, int c, int d, int e, int f, int g, int dp, boolean common);
    void write(int number);
    
private:
    int _a, _b, _c, _d, _e, _f, _g, _dp, _number;
    byte numeral[10];
    int segmentPins[8];
    boolean _common;
};

#endif

The example code.

#include "Shifter.h"
#include "Pineapple.h"

#define serial 4 //SER_IN
#define registerClock 3 //L_CLOCK
#define serialClock 2 //CLOCK

#define number 1

Shifter shifter(serial, registerClock, serialClock, number);
Pineapple pineapple;

void setup() {
  pineapple.pins(0, 1, 2, 3, 4, 5, 6, 7, HIGH);
}

void loop() {
  pineapple.write(1);
}

The error message I get says the shifter wasn't declared in this scope, and I know that that means I have to initiate the shifter library in the pineapple library. Any help?

Remove the leading 'shifter.' wherever used in your .cpp file

Thanks lloyddean for your reply. Yes, I'm 11, but I don't post that here because I want people to take me seriously. For the code, I got a TON of error messages. It said when I take out all of the shifter.'s, that all of the names with out shifter. are "not declared in this scope". Here is my current .cpp file.

#include "Arduino.h"
#include "Pineapple.h"
#include "Shifter.h"

uint8_t Pineapple::pins(int a, int b, int c, int d, int e, int f, int g, int dp, boolean common) {
    
    _a=a;
    _b=b;
    _c=c;
    _d=d;
    _e=e;
    _f=f;
    _g=g;
    _dp=dp;
    _common=common;
    
    segmentPins[0] = _dp;
    segmentPins[1] = _g;
    segmentPins[2] = _f;
    segmentPins[3] = _e;
    segmentPins[4] = _d;
    segmentPins[5] = _c;
    segmentPins[6] = _b;
    segmentPins[7] = _a;
    
    for(int i=0; i < 8; i++) {
        
        pinMode(segmentPins[i], OUTPUT);
    }
    
    
}

void Pineapple::write(int number) {
    boolean isBitSet;
    
    numeral[0] = B11111100;  // 0
    numeral[1] = B01100000;  // 1
    numeral[2] = B11011010;  // 2
    numeral[3] = B11110010;  // 3
    numeral[4] = B01100110;  // 4
    numeral[5] = B10110110;  // 5
    numeral[6] = B10111110;  // 6
    numeral[7] = B11100000;  // 7
    numeral[8] = B11111110;  // 8
    numeral[9] = B11100110;  // 9
    
    if (_common == HIGH) {
        
        for(int segment=1; segment < 8; segment++) {
            if(number < 0 || number > 9) {
                isBitSet = 0;
            }else{
                isBitSet = bitRead(numeral[number], segment);
            }
            isBitSet = ! isBitSet;
            setPin(segmentPins[segment], isBitSet);
            write();
        }
    }else{
        for(int segment=1; segment < 8; segment++) {
            if(number < 0 || number > 9) {
                isBitSet = 0;
            }else{
                isBitSet = bitRead(numeral[number], segment);
            }
            setPin(segmentPins[segment], isBitSet);
            write();
        }
    }
    if (_number == '.' && _common == HIGH) {
        setPin(_dp, LOW);
        write();
    }
    if (_number == '.' && _common == LOW) {
        setPin(_dp, HIGH);
        write();
    }
    if (_common == HIGH) {
        setPin(_dp, HIGH);
        write();
    }
    if (_common == LOW) {
        setPin(_dp, LOW);
        write();
    }
}

Where is 'setPin'?

setPin is in about the middle

More specific then. Where is 'setPin' defined. I see no implementation for it

How would you define setPin and write() if they are already part of the shifter library?