All though the above fix works, it causes the interval to take pictures to be off with ~16ms each time. Over time this will accumulate into several seconds, which is kinda annoying. I can live with it tho, but if someone could come up with some other fix I would be grateful.
As I said above, the problem is with the delay(5); if it's set to 0 the display won't work properly (no multiplexing?) but the interval works perfectly. Have tried to figure out a way to use millis(); to reset the display but failed horribly. Any suggestions here?
semi pseudo:
currentTime = millis();
if(currentTime - someTime equals delay)
reset segment X
someTime = currentTime
else
nothing
entire code for displaying time, the delay() is at the bottom
#include "WProgram.h"
#include "SevenSeg.h"
// a,b,c,d,e,f,g
int digits[11][7] = { { 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,0,0,1,1 }, // = 9
{ 0,0,0,0,0,0,0 } // = blank
};
unsigned long _currentTime;
unsigned long _seg1Time = 0;
unsigned long _seg2Time = 0;
unsigned long _elapsed = 0;
unsigned long _start = 0;
SevenSeg::SevenSeg(int seg1, int seg2, int seg3, int seg4, int a, int b, int c, int d, int e, int f, int g, int dp) {
pinMode(seg1, OUTPUT);
pinMode(seg2, OUTPUT);
pinMode(seg3, OUTPUT);
pinMode(seg4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(dp, OUTPUT);
_seg1 = seg1;
_seg2 = seg2;
_seg3 = seg3;
_seg4 = seg4;
_a = a;
_b = b;
_c = c;
_d = d;
_e = e;
_f = f;
_g = g;
_dp = dp;
digitalWrite(_seg1, HIGH);
digitalWrite(_seg2, HIGH);
digitalWrite(_seg3, HIGH);
digitalWrite(_seg4, HIGH);
}
void SevenSeg::setTime(long time) {
_time = time;
if(_time <= 5999000) { //max 99 minutes 59 seconds
_clockValue = _time/1000;
_seconds = _clockValue%60;
_minutes = _clockValue/60;
//_hours = _minutes/60;
//_minutes = _minutes-(_hours*60);
setNumber(_seg1, (int)(_minutes/10), false);
setNumber(_seg2, (int)(_minutes)-(_minutes/10)*(10), true);
setNumber(_seg3, (int)(_seconds/10), false);
setNumber(_seg4, (int)(_seconds)-(_seconds/10)*(10), false);
} else _time=0;
}
void SevenSeg::setNumber(int segment, int number, boolean dot) {
_pin = _a;
_segment = segment;
if (dot) {
digitalWrite(_dp, HIGH);
} else digitalWrite(_dp, LOW);
digitalWrite(_segment, LOW);
for (int i=0;i<7;i++) {
digitalWrite(_pin, digits[number][i]);
_pin++;
}
clearSegment(_segment);
}
void SevenSeg::clearSegment(int segment) {
delay(4);
digitalWrite(segment, HIGH);
}
Or is there any hardware out there i could use to drive the 7-segment for example, that won't have any interrupt calls to it?