Problem with LCD and hardware debounce
hi everyone. have genuino uno , i'm creating 4-way mixing valve controller house heating system pellet burner.
uno powered via ac-dc 9v, 1a adapter. breadboard powered via 5v , gnd pin. lcd soldered i2c driver , connected sda , scl pin on uno , vcc, gnd breadboard. on breadboard have 4 push buttons(two via resistors on analog input , 2 hardware debounce trigger interrupts), 2x ds18b20, 74hc14, 1x led.
when try push buttons hardware debounce counts randomly(either pressed or not), when upload program test debounce works perfect every push.
another problem lcd. after time showing weird characters. after pushed reset button on uno shows weird characters immediately. when upload program initialize lcd , print text in (either loop or setup) works fine long time.
is possible there lack of current or loose contacts on breadboard?
uno powered via ac-dc 9v, 1a adapter. breadboard powered via 5v , gnd pin. lcd soldered i2c driver , connected sda , scl pin on uno , vcc, gnd breadboard. on breadboard have 4 push buttons(two via resistors on analog input , 2 hardware debounce trigger interrupts), 2x ds18b20, 74hc14, 1x led.
when try push buttons hardware debounce counts randomly(either pressed or not), when upload program test debounce works perfect every push.
another problem lcd. after time showing weird characters. after pushed reset button on uno shows weird characters immediately. when upload program initialize lcd , print text in (either loop or setup) works fine long time.
is possible there lack of current or loose contacts on breadboard?
code: [select]
#include <liquidcrystal_i2c.h>
#include <onewire.h>
#include <dallastemperature.h>
#include <wire.h>
#define one_wire_bus 5
void page1();
void page2();
int readkeypad();
void maindisplay();
void menu();
void onoff();
int = 0; //promenjiva za povratak u maindisplay za cekanje podesavanja parametara, while(i)
int m = 0;
int o = 0;
int analoginput = a0;
int keyvalue;
float tk = 0;
float tg = 0;
float tz = 20;
float tznew = tz;
float tu = 28;
float tunew = tu;
liquidcrystal_i2c lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, positive);
onewire onewire(one_wire_bus);
dallastemperature sensors(&onewire);
void setup() {
pinmode(a0, input_pullup);
pinmode(2, input);
pinmode(3, input);
pinmode(7, output);
digitalwrite(7, low);
attachinterrupt(digitalpintointerrupt(2), menu, rising);
attachinterrupt(digitalpintointerrupt(3), onoff, rising);
sensors.begin();
sensors.setresolution(10);
lcd.begin(16,2);
lcd.setcursor(2, 0);
lcd.print("mixing valve");
lcd.setcursor(3, 1);
lcd.print("controller");
delay(2000);
lcd.clear();
lcd.setcursor(1, 0);
lcd.print("software v-1.0");
lcd.setcursor(3, 1);
lcd.print("by namilax");
delay(2000);
maindisplay();
}
void menu() {
m++;
}
void onoff() {
o++;
}
//podesi tz
void page1() {
= 1;
lcd.clear();
lcd.setcursor(3, 0);
lcd.print("podesi tz");
while (i == 1) {
lcd.setcursor(6, 1);
lcd.print(tznew, 1);
lcd.nocursor();
if (m == 2) {
tz = tznew;
page2();
}
readkeypad();
if (keyvalue == 1) {
tznew--;
delay(200);
}
else if (keyvalue == 2) {
tznew++;
delay(200);
}
}
}
//podesi tu
void page2() {
lcd.clear();
lcd.setcursor(3, 0);
lcd.print("podesi tu");
while (i == 1) {
lcd.setcursor(6, 1);
lcd.print(tunew, 1);
lcd.nocursor();
if (m >= 3) {
tu = tunew;
= 0;
m = 0;
maindisplay();
}
readkeypad();
if (keyvalue == 1) {
tunew--;
delay(200);
}
else if (keyvalue == 2) {
tunew++;
delay(200);
}
else readkeypad();
}
}
int readkeypad() {
int keypadvalue;
keypadvalue = analogread(analoginput);
if (keypadvalue > 400) {
keyvalue = 0;
}
else if (keypadvalue < 80) {
keyvalue = 1;
}
else if (keypadvalue < 250 && keypadvalue > 210) {
keyvalue = 2;
}
return keyvalue;
}
void maindisplay() {
lcd.clear();
lcd.setcursor(0, 0);
lcd.print("tk=");
lcd.setcursor(9, 0);
lcd.print("tg=");
lcd.setcursor(0, 1);
lcd.print("tu=");
lcd.setcursor(3, 1);
lcd.print(tu, 1);
lcd.setcursor(9, 1);
lcd.print("tz=");
lcd.setcursor(12, 1);
lcd.print(tz, 1);
}
void loop() {
if (m == 1) {
page1();
}
else if (tk >= tu && o == 1)
digitalwrite(7, high);
else if (o >= 2) {
o = 0;
digitalwrite(7, low);
}
sensors.requesttemperatures();
tg = sensors.gettempcbyindex(0);
tk = sensors.gettempcbyindex(1);
lcd.setcursor(3, 0);
lcd.print(tk, 1);
lcd.setcursor(12, 0);
lcd.print(tg, 1);
}
hi,
if absolutely sure hardware debouncing working well, try declare global, variables used inside isrs (m , o) volatile, prevent compiler optimizations.
i had never tried use lcd i2c, notice display present garbage text when lcd vdd voltage low...
if absolutely sure hardware debouncing working well, try declare global, variables used inside isrs (m , o) volatile, prevent compiler optimizations.
i had never tried use lcd i2c, notice display present garbage text when lcd vdd voltage low...
Arduino Forum > Using Arduino > General Electronics > Problem with LCD and hardware debounce
arduino
Comments
Post a Comment