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.


Arduino Forum > Using Arduino > Programming Questions > Flickering 4 x 7 segment display


arduino

Comments

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

How to format a Get Request

avrdude: verification error, first mismatch at byte 0x0000 0x0c != 0x62