Flickering 4 x 7 segment display
what i'm trying take temperature reading ds18b20 , output 4 x 7 segment display (common cathode). have working mostly. problem i'm don't know how fix strobing , ghosting (not sure if that's called when previous number faintly showing underneath new number). i'm new @ , appreciated.
code: [select]
#include <onewire.h>
int ds18s20_pin = 12; //ds18s20 signal pin on digital 2
//temperature chip i/o
onewire ds(ds18s20_pin); // on digital pin 2
int ones;
int tens;
int hundreds;
boolean negative;
int d1=14, d2=15, d3=16, d4=17;
int a=18, b=13, c=11, d=6, e=1, f=19, g=5, prd=7, x=0, v;
void setup(){
serial.begin(9600);
pinmode(d1, output);
pinmode(d2, output);
pinmode(d3, output);
pinmode(d4, output);
pinmode(a, output);
pinmode(b, output);
pinmode(c, output);
pinmode(d, output);
pinmode(e, output);
pinmode(f, output);
pinmode(g, output);
pinmode(prd, output);
}
void loop(){
float temperature = gettemp();
serial.println(temperature);
v = gettemp();
if(v<0) {
negative=true;
v=v*-1;
}
ones=v%10;
v=v/10;
tens=v%10;
v=v/10;
hundreds=v;
digit(1);
number(0);
delay(2);
digit(5);
number(11);
digit(2);
number(hundreds);
delay(2);
digit(5);
number(11);
digit(3);
number(tens);
delay(2);
digit(5);
number(11);
digit(4);
number(ones);
delay(2);
digit(5);
number(11);
}
void digit(int num){
switch(num){
case 1:
digitalwrite(d1, low);
digitalwrite(d2, high);
digitalwrite(d3, high);
digitalwrite(d4, high);
break;
case 2:
digitalwrite(d1, high);
digitalwrite(d2, low);
digitalwrite(d3, high);
digitalwrite(d4, high);
break;
case 3:
digitalwrite(d1, high);
digitalwrite(d2, high);
digitalwrite(d3, low);
digitalwrite(d4, high);
break;
case 4:
digitalwrite(d1, high);
digitalwrite(d2, high);
digitalwrite(d3, high);
digitalwrite(d4, low);
break;
case 5:
digitalwrite(d1, high);
digitalwrite(d2, high);
digitalwrite(d3, high);
digitalwrite(d4, high);
break;
default:
digitalwrite(d1, high);
digitalwrite(d2, high);
digitalwrite(d3, high);
digitalwrite(d4, high);
break;
}
}
void number(int num){
switch(num){
case 0:
digitalwrite(a, high);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, high);
digitalwrite(g, low);
digitalwrite(prd, low);
break;
case 1:
digitalwrite(a, low);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
digitalwrite(prd, low);
break;
case 2:
digitalwrite(a, high);
digitalwrite(b, high);
digitalwrite(c, low);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, low);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 3:
digitalwrite(a, high);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, high);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 4:
digitalwrite(a, low);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, high);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 5:
digitalwrite(a, high);
digitalwrite(b, low);
digitalwrite(c, high);
digitalwrite(d, high);
digitalwrite(e, low);
digitalwrite(f, high);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 6:
digitalwrite(a, high);
digitalwrite(b, low);
digitalwrite(c, high);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, high);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 7:
digitalwrite(a, high);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
digitalwrite(prd, low);
break;
case 8:
digitalwrite(a, high);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, high);
digitalwrite(e, high);
digitalwrite(f, high);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 9:
digitalwrite(a, high);
digitalwrite(b, high);
digitalwrite(c, high);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, high);
digitalwrite(g, high);
digitalwrite(prd, low);
break;
case 10:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
digitalwrite(prd, high);
break;
case 11:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
digitalwrite(prd, low);
break;
default:
digitalwrite(a, low);
digitalwrite(b, low);
digitalwrite(c, low);
digitalwrite(d, low);
digitalwrite(e, low);
digitalwrite(f, low);
digitalwrite(g, low);
digitalwrite(prd, low);
break;
}
}
float gettemp(){
//returns temperature 1 ds18s20 in degrees c or f
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( onewire::crc8( addr, 7) != addr[7]) {
serial.println("crc not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
serial.print("device not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, parasite power on @ end
byte present = ds.reset();
ds.select(addr);
ds.write(0xbe); // read scratchpad
(int = 0; < 9; i++) { // need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte msb = data[1];
byte lsb = data[0];
float tempread = ((msb << 8) | lsb); //using two's compliment
float temperaturesum = tempread / 16; //return degrees c
float tempa = temperaturesum * 1.8; //these 2 lines convert degrees f
float tempb = tempa + 32;
return tempb;
// return temperaturesum;
}
i'm not surprised..
all delays, idea routine fast enough* display 3 digits (1 @ time) individually, our eyes perceive number whole, freeze frame tv image, if reduce speed or frame rate, you'll you're describing...
remove delays, best bet switch milli , every few seconds new temperature (say every 3 - 5 seconds) value , display value until refresh, inside loop check see if 5 seconds have passed, if so, new value , display value.
alternatively, use 74hc595 control segments using 3 pins, or specialized ic you, temperature , pass values ic , takes care of keeping values on display...
to start with, remove delays when using digitalwrite , you'll see huge improvement doing that.
all delays, idea routine fast enough* display 3 digits (1 @ time) individually, our eyes perceive number whole, freeze frame tv image, if reduce speed or frame rate, you'll you're describing...
remove delays, best bet switch milli , every few seconds new temperature (say every 3 - 5 seconds) value , display value until refresh, inside loop check see if 5 seconds have passed, if so, new value , display value.
alternatively, use 74hc595 control segments using 3 pins, or specialized ic you, temperature , pass values ic , takes care of keeping values on display...
to start with, remove delays when using digitalwrite , you'll see huge improvement doing that.
Arduino Forum > Using Arduino > Programming Questions > Flickering 4 x 7 segment display
arduino
Comments
Post a Comment