Best approach to mitigate possible EM interference corrupting LCD?


seeing garbage characters printed on lcd @ seemingly random times - although seem if garbage appears after sketch/circuit has been running while. i'm not sure if it's memory leak in code, or whether it's em interference e.g. ac lighting switches etc. in vicinity.

i'd advice best electronic modifications made circuit mitigate against em interference corrupting lcd. i've read range of similar forum posts various capacitor values (100uf? 47uf?) have been quoted worth putting across vss , vdd @ lcd, smooth supply noise. 

if has ideas keen hear them.

i appreciate since i've got lashed on breadboards, might seeing more em interference otherwise case if had soldered down veroboard etc. (due jumper wires acting inductors?).
if think that's main problem means so  :)

here details of set-up:

i'm using arduino nano v3.0,  driving hd44780 lcd display using 74hd595 shift register, per link:
http://www.instructables.com/id/hookup-a-16-pin-hd44780-lcd-to-an-arduino-in-6-sec/#step1

i drew out schematic in fritzing (see attached). note i've chosen use arduino pins 5, 6 & 7 datapin, latchpin , clockpin instead of 7, 8 & 9.

i've added simple ldr-based voltage divider consisting of 60k resistor , 5516 ldr  follows:

5v ]-----[[60k]]-----|-----((5516 ldr))----[gnd
                                         |
                                         |---->to arduino pin 2 (interrupt 0)

...the idea being voltage drop across 5516 ldr (it's 'looking' straight @ blinking led in darkness) fire isr declared in sketch.

the ldr voltage divider connected across same 5v & gnd lcd/shift register circuit.

the 5v & gnd taken corresponding arduino 5v / gnd pins.

code: [select]

#include <liquidcrystal595.h>    // include library

const float meter_blinks_per_kwh = 800.0;
const float millis_per_hour = 3600000.0;
float bill_units_per_hour = 0;

liquidcrystal595 lcd(5,6,7);     // datapin, latchpin, clockpin
int backlightpin = 4;

const long bounce_window_ms=450;
unsigned long prev_interrupt_ms = 0;
unsigned long interrupt_ms = 0;
unsigned long millis_since_last_blink = 0;
volatile unsigned long last_blink_ms = 0;
volatile int blinks = 0;
int interruptpin = 2;

unsigned long curr_millis = 0;
unsigned long prev_millis = 0;

void onblink()
{
  interrupt_ms = millis();
  millis_since_last_blink = (unsigned long)(interrupt_ms - prev_interrupt_ms);
  if(millis_since_last_blink >= bounce_window_ms)
  {
    last_blink_ms = millis_since_last_blink;
    blinks++;
    prev_interrupt_ms = interrupt_ms;
  }
}

void setup() {

  pinmode(interruptpin,input);
  attachinterrupt(0, onblink, falling);

  pinmode(backlightpin,output);
  lcd.begin(16,2);             // 16 characters, 2 rows
  lcd.clear();
 
  digitalwrite(backlightpin, high); //turn on backlight

  lcd.setcursor(0,0);
  lcd.print("blink monitor");
  lcd.setcursor(0,1);
  lcd.print("initializing...");
  delay(5000);
  lcd.clear();
  lcd.setcursor(0,0);
  lcd.print("ms     kw");
}

void loop() {

  curr_millis = millis();

  if((unsigned long)curr_millis - prev_millis > 1000)
  {
    calculatekwh();
    prev_millis = curr_millis;
  }
}

void calculatekwh()
{
  if(blinks > 0)
  {
    bill_units_per_hour = millis_per_hour / ((float)last_blink_ms * meter_blinks_per_kwh); // 3600000 / [x * 800]
    lcd.setcursor(0,1);
    lcd.print(last_blink_ms);  lcd.print("   ");//add whitespace on previous long timing
    lcd.setcursor(8,1);
    lcd.print(bill_units_per_hour,2); // 2 decimal places
  }
}



thanks in advance help.
happy supply further info may need.


sorry, reason schematic didn't attach in first post.
see attached below.


Arduino Forum > Using Arduino > Displays > Best approach to mitigate possible EM interference corrupting LCD?


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support