22-10-2016, 23:32
Musze podłączyć i wgrać , a co do odświeżania to on robi za każdym wyświetleniem na lcd.
Jeśli pomogłem podziękuj punktem reputacji
Ocena wątku:
Migotanie LCD 20x4 I2C
|
(22-10-2016, 23:32)adix napisał(a): Musze podłączyć i wgrać , a co do odświeżania to on robi za każdym wyświetleniem na lcd.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define TRIG 10 // Trigger pin
#define ECHO 13 // Echo pin
#define PRZYCISK 7 /* 0 => pin 2 */
#define WIELKOSC_PASKA_POSTEPU (11 * 5)
#define POJEMNOSC_SZAMBA (L_DLUGOSC * W_SZEROKOSC)/10000
#define ODLEGLOSC_PLUS 0 /* cm (Odleglosc od gory plyty szamba do sonaru */
#define L_DLUGOSC 280.0 /* cm */
#define H_WYSOKOSC 165.0 /* cm */
#define W_SZEROKOSC 220.0 /* cm */
#define POZIOM_ALARMU_1 0 /* cm */
#define POZIOM_ALARMU_2 40 /* cm */
#define OPOZNIENIE_0 600 /* ms; 1000 * 60 * 1 = 1 min */
#define OPOZNIENIE_1 600 /* ms */
#define OPOZNIENIE_2 200 /* ms */
#define pomiar 10000
LiquidCrystal_I2C lcd(0x27,20,4);
float suma=0, prognoza;
int p=0, i;
unsigned long czas_miniony = 0;
byte *pasek(int n, byte newChar[]) {
byte code[5] = {
B10000,
B11000,
B11100,
B11110,
B11111};
for (i = 0; i < 8; i++)
newChar[i] = code[n - 1];
return newChar;
}
void setup() {
int i;
byte newChar[8];
lcd.begin(20,4); /* ustawienie ilości wierszów i kolumn LCD */
lcd.init();
lcd.backlight();
for (i = 1; i < 6; i++)
lcd.createChar(i, pasek(i, newChar));
{
newChar[0] =B00000;
newChar[1] =B00100;
newChar[2] =B01010;
newChar[3] =B01010;
newChar[4] =B11111;
newChar[5] =B00100;
newChar[6] =B00000;
}
Serial.begin(9600); /* uruchomienie serial monitora */
lcd.clear();
lcd.setCursor(2,1);
lcd.print("MIERNIK POZIOMU");
lcd.setCursor(7,2);
lcd.print("SZAMBA");
}
int OPIS = 1;
void loop(){
OPIS =2;
long hCieczyCm;
int litry, procent;
float szesc, sred;
String pusty_t="ZBIORNIK PUSTY";
String pelny_t="!!! ALARM !!!";
hCieczyCm = read_wysokosc();
if (hCieczyCm <=0){
lcd.clear();
lcd.setCursor(2,1);
lcd.print(pusty_t);
lcd.print(" 0");
lcd.print("L ");
p=0;
suma=0;
sred=0;
}
else if (hCieczyCm >=155){
lcd.clear();
lcd.setCursor(3,1);
lcd.print(pelny_t);
lcd.setCursor(3,2);
lcd.print("ZBIORNIK PELNY");
p=0;
suma=0;
sred=0;
// digitalWrite(LED_BUILTIN, HIGH); *Wlaczenie +5V*
//delay (500);
// lcd.noBacklight(); *Wylaczenie i wlaczenie podswietlenie LCD*
// delay (1000);
// lcd.backlight();
}
else {
lcd.setCursor(0,0);
lcd.print("Poziom E");
print_histogram(hCieczyCm);
lcd.setCursor(19,0);
lcd.print("F");
lcd.setCursor(0,1);
procent = (hCieczyCm / H_WYSOKOSC) *100;
lcd.print("Wyp. ");
lcd.setCursor(4,1);
lcd.print(procent);
lcd.print ("% - ");
litry = floor(POJEMNOSC_SZAMBA * hCieczyCm * 10);
// lcd.print(litry);
// lcd.print("L ");
szesc = litry * 0.0010;
lcd.print(szesc);
lcd.print ("m3");
lcd.setCursor(0,2);
lcd.print("Wys.cieczy ");
lcd.print(hCieczyCm);
lcd.print("cm");
lcd.setCursor(0,3);
lcd.print("Prog.napel. ");
lcd.print(prognoza);
lcd.print("dni");}
unsigned long czas_teraz = 0;
czas_teraz=millis();
if (hCieczyCm < 155 and hCieczyCm >0 and czas_teraz - czas_miniony >= pomiar) {
suma=suma+(H_WYSOKOSC - hCieczyCm); //sumuje poszczegolne wartosci pomiarow
p=p+1; // zwieksza zmianna p o 1
Serial.println("Nr pomiaru");
Serial.println(p);
Serial.println("Pomiar odleglosci");
Serial.println(hCieczyCm);
Serial.println("Wys zbior - pom");
Serial.println(H_WYSOKOSC - hCieczyCm);
Serial.println("Suma");
Serial.println(suma);
Serial.println("Srednia odleglosc");
sred=suma/p;
prognoza = hCieczyCm/sred;
Serial.println(sred);
Serial.println("Szacowana");
Serial.println(prognoza);
czas_miniony = czas_teraz;}
}
/* Compute & Display Histogram Capacity Bar */
void print_histogram(int hCieczyCm) {
int i, bloks;
float histogram;
// hCieczyCm : H_WYSOKOSC = histogram : WIELKOSC_PASKA_POSTEPU
histogram = (WIELKOSC_PASKA_POSTEPU * hCieczyCm) / H_WYSOKOSC;
histogram = histogram + 0.5;
bloks = (int)histogram / 5;
for (i = 0; i < bloks; i++)
lcd.write(5);
if ((int)(histogram) % 5 > 0)
lcd.write((int)(histogram) % 5);
}
long read_wysokosc() {
long hCieczyCm;
pinMode(TRIG, OUTPUT);
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
pinMode(ECHO, INPUT);
int odleglosc = pulseIn(ECHO, HIGH);
odleglosc=odleglosc / 29.387 / 2; /* konwesrsja czasu na odleglosc */
Serial.println(odleglosc);
delay(50);
hCieczyCm = H_WYSOKOSC - odleglosc + ODLEGLOSC_PLUS;
if (hCieczyCm < 0)
return 0;
if (hCieczyCm > H_WYSOKOSC)
return H_WYSOKOSC;
return hCieczyCm;
}
(22-10-2016, 23:43)pioga napisał(a):(22-10-2016, 23:32)adix napisał(a): Musze podłączyć i wgrać , a co do odświeżania to on robi za każdym wyświetleniem na lcd.
Chcę usunąć na końcu pomiaru odległości delay tak aby po podłączeniu przycisku nie trzeba czekać na zakonczenie delay aby zadziałał przycisk. Jednak po usunięciu tego delay pomiary są non-stop i wartości są cały czas aktualizowane na ekranie. Przy użyciu lcd.clear powoduje to migotanie uniemożliwiające odczyt wartości. Po usunięciu jedynie migotają i nieczytelne są odczyty i pasek postępu.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define TRIG 10 // Trigger pin
#define ECHO 13 // Echo pin
#define PRZYCISK 7 /* 0 => pin 2 */
#define WIELKOSC_PASKA_POSTEPU (11 * 5)
#define POJEMNOSC_SZAMBA (L_DLUGOSC * W_SZEROKOSC)/10000
#define ODLEGLOSC_PLUS 0 /* cm (Odleglosc od gory plyty szamba do sonaru */
#define L_DLUGOSC 280.0 /* cm */
#define H_WYSOKOSC 165.0 /* cm */
#define W_SZEROKOSC 220.0 /* cm */
#define POZIOM_ALARMU_1 0 /* cm */
#define POZIOM_ALARMU_2 40 /* cm */
#define OPOZNIENIE_0 600 /* ms; 1000 * 60 * 1 = 1 min */
#define OPOZNIENIE_1 600 /* ms */
#define OPOZNIENIE_2 200 /* ms */
#define pomiar 10000
LiquidCrystal_I2C lcd(0x3F,20,4);
float suma=0, prognoza;
int p=0, i;
unsigned long czas_miniony = 0;
byte *pasek(int n, byte newChar[]) {
byte code[5] = {
B10000,
B11000,
B11100,
B11110,
B11111};
for (i = 0; i < 8; i++)
newChar[i] = code[n - 1];
return newChar;
}
void setup() {
int i;
byte newChar[8];
lcd.begin(20,4); /* ustawienie ilości wierszów i kolumn LCD */
lcd.init();
lcd.backlight();
for (i = 1; i < 6; i++)
lcd.createChar(i, pasek(i, newChar));
{
newChar[0] =B00000;
newChar[1] =B00100;
newChar[2] =B01010;
newChar[3] =B01010;
newChar[4] =B11111;
newChar[5] =B00100;
newChar[6] =B00000;
}
Serial.begin(9600); /* uruchomienie serial monitora */
}
int OPIS = 1;
void loop(){
if (OPIS <=1){
lcd.clear();
lcd.setCursor(2,1);
lcd.print("MIERNIK POZIOMU");
lcd.setCursor(7,2);
lcd.print("SZAMBA");
delay(1000);}
OPIS =2;
long hCieczyCm;
int litry, procent;
float szesc, sred;
String pusty_t="ZBIORNIK PUSTY";
String pelny_t="!!! ALARM !!!";
hCieczyCm = read_wysokosc();
if (hCieczyCm <=0){
lcd.clear();
lcd.setCursor(2,1);
lcd.print(pusty_t);
lcd.print(" 0");
lcd.print("L ");
p=0;
suma=0;
sred=0;
}
else if (hCieczyCm >=155){
lcd.clear();
lcd.setCursor(3,1);
lcd.print(pelny_t);
lcd.setCursor(3,2);
lcd.print("ZBIORNIK PELNY");
p=0;
suma=0;
sred=0;
// digitalWrite(LED_BUILTIN, HIGH); *Wlaczenie +5V*
//delay (500);
// lcd.noBacklight(); *Wylaczenie i wlaczenie podswietlenie LCD*
// delay (1000);
// lcd.backlight();
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Poziom E");
print_histogram(hCieczyCm);
lcd.setCursor(19,0);
lcd.print("F");
lcd.setCursor(0,1);
procent = (hCieczyCm / H_WYSOKOSC) *100;
lcd.print("Wyp. ");
lcd.print(procent);
lcd.print ("% - ");
litry = floor(POJEMNOSC_SZAMBA * hCieczyCm * 10);
// lcd.print(litry);
// lcd.print("L ");
szesc = litry * 0.0010;
lcd.print(szesc);
lcd.print ("m3");
lcd.setCursor(0,2);
lcd.print("Wys.cieczy ");
lcd.print(hCieczyCm);
lcd.print("cm");
lcd.setCursor(0,3);
lcd.print("Prog.napel. ");
lcd.print(prognoza);
lcd.print("dni");}
unsigned long czas_teraz = 0;
czas_teraz=millis();
if (hCieczyCm < 155 and hCieczyCm >0 and czas_teraz - czas_miniony >= pomiar) {
suma=suma+(H_WYSOKOSC - hCieczyCm); //sumuje poszczegolne wartosci pomiarow
p=p+1; // zwieksza zmianna p o 1
Serial.println("Nr pomiaru");
Serial.println(p);
Serial.println("Pomiar odleglosci");
Serial.println(hCieczyCm);
Serial.println("Wys zbior - pom");
Serial.println(H_WYSOKOSC - hCieczyCm);
Serial.println("Suma");
Serial.println(suma);
Serial.println("Srednia odleglosc");
sred=suma/p;
prognoza = hCieczyCm/sred;
Serial.println(sred);
Serial.println("Szacowana");
Serial.println(prognoza);
czas_miniony = czas_teraz;}
}
/* Compute & Display Histogram Capacity Bar */
void print_histogram(int hCieczyCm) {
int i, bloks;
float histogram;
// hCieczyCm : H_WYSOKOSC = histogram : WIELKOSC_PASKA_POSTEPU
histogram = (WIELKOSC_PASKA_POSTEPU * hCieczyCm) / H_WYSOKOSC;
histogram = histogram + 0.5;
bloks = (int)histogram / 5;
for (i = 0; i < bloks; i++)
lcd.write(5);
if ((int)(histogram) % 5 > 0)
lcd.write((int)(histogram) % 5);
}
long read_wysokosc() {
long hCieczyCm;
pinMode(TRIG, OUTPUT);
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
pinMode(ECHO, INPUT);
int odleglosc = pulseIn(ECHO, HIGH);
odleglosc=odleglosc / 29.387 / 2; /* konwesrsja czasu na odleglosc */
Serial.println(odleglosc);
delay(2000);
hCieczyCm = H_WYSOKOSC - odleglosc + ODLEGLOSC_PLUS;
if (hCieczyCm < 0)
return 0;
if (hCieczyCm > H_WYSOKOSC)
return H_WYSOKOSC;
return hCieczyCm;
}
(23-10-2016, 00:02)adix napisał(a):spróbuj to i usuń delayKod:#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define TRIG 10 // Trigger pin
#define ECHO 13 // Echo pin
#define PRZYCISK 7 /* 0 => pin 2 */
#define WIELKOSC_PASKA_POSTEPU (11 * 5)
#define POJEMNOSC_SZAMBA (L_DLUGOSC * W_SZEROKOSC)/10000
#define ODLEGLOSC_PLUS 0 /* cm (Odleglosc od gory plyty szamba do sonaru */
#define L_DLUGOSC 280.0 /* cm */
#define H_WYSOKOSC 165.0 /* cm */
#define W_SZEROKOSC 220.0 /* cm */
#define POZIOM_ALARMU_1 0 /* cm */
#define POZIOM_ALARMU_2 40 /* cm */
#define OPOZNIENIE_0 600 /* ms; 1000 * 60 * 1 = 1 min */
#define OPOZNIENIE_1 600 /* ms */
#define OPOZNIENIE_2 200 /* ms */
#define pomiar 10000
LiquidCrystal_I2C lcd(0x27,20,4);
float suma=0, prognoza;
int p=0, i;
unsigned long czas_miniony = 0;
byte *pasek(int n, byte newChar[]) {
byte code[5] = {
B10000,
B11000,
B11100,
B11110,
B11111};
for (i = 0; i < 8; i++)
newChar[i] = code[n - 1];
return newChar;
}
void setup() {
int i;
byte newChar[8];
lcd.begin(20,4); /* ustawienie ilości wierszów i kolumn LCD */
lcd.init();
lcd.backlight();
for (i = 1; i < 6; i++)
lcd.createChar(i, pasek(i, newChar));
{
newChar[0] =B00000;
newChar[1] =B00100;
newChar[2] =B01010;
newChar[3] =B01010;
newChar[4] =B11111;
newChar[5] =B00100;
newChar[6] =B00000;
}
Serial.begin(9600); /* uruchomienie serial monitora */
lcd.clear();
lcd.setCursor(2,1);
lcd.print("MIERNIK POZIOMU");
lcd.setCursor(7,2);
lcd.print("SZAMBA");
}
int OPIS = 1;
void loop(){
OPIS =2;
long hCieczyCm;
int litry, procent;
float szesc, sred;
String pusty_t="ZBIORNIK PUSTY";
String pelny_t="!!! ALARM !!!";
hCieczyCm = read_wysokosc();
if (hCieczyCm <=0){
lcd.clear();
lcd.setCursor(2,1);
lcd.print(pusty_t);
lcd.print(" 0");
lcd.print("L ");
p=0;
suma=0;
sred=0;
}
else if (hCieczyCm >=155){
lcd.clear();
lcd.setCursor(3,1);
lcd.print(pelny_t);
lcd.setCursor(3,2);
lcd.print("ZBIORNIK PELNY");
p=0;
suma=0;
sred=0;
// digitalWrite(LED_BUILTIN, HIGH); *Wlaczenie +5V*
//delay (500);
// lcd.noBacklight(); *Wylaczenie i wlaczenie podswietlenie LCD*
// delay (1000);
// lcd.backlight();
}
else {
lcd.setCursor(0,0);
lcd.print("Poziom E");
print_histogram(hCieczyCm);
lcd.setCursor(19,0);
lcd.print("F");
lcd.setCursor(0,1);
procent = (hCieczyCm / H_WYSOKOSC) *100;
lcd.print("Wyp. ");
lcd.setCursor(4,1);
lcd.print(procent);
lcd.print ("% - ");
litry = floor(POJEMNOSC_SZAMBA * hCieczyCm * 10);
// lcd.print(litry);
// lcd.print("L ");
szesc = litry * 0.0010;
lcd.print(szesc);
lcd.print ("m3");
lcd.setCursor(0,2);
lcd.print("Wys.cieczy ");
lcd.print(hCieczyCm);
lcd.print("cm");
lcd.setCursor(0,3);
lcd.print("Prog.napel. ");
lcd.print(prognoza);
lcd.print("dni");}
unsigned long czas_teraz = 0;
czas_teraz=millis();
if (hCieczyCm < 155 and hCieczyCm >0 and czas_teraz - czas_miniony >= pomiar) {
suma=suma+(H_WYSOKOSC - hCieczyCm); //sumuje poszczegolne wartosci pomiarow
p=p+1; // zwieksza zmianna p o 1
Serial.println("Nr pomiaru");
Serial.println(p);
Serial.println("Pomiar odleglosci");
Serial.println(hCieczyCm);
Serial.println("Wys zbior - pom");
Serial.println(H_WYSOKOSC - hCieczyCm);
Serial.println("Suma");
Serial.println(suma);
Serial.println("Srednia odleglosc");
sred=suma/p;
prognoza = hCieczyCm/sred;
Serial.println(sred);
Serial.println("Szacowana");
Serial.println(prognoza);
czas_miniony = czas_teraz;}
}
/* Compute & Display Histogram Capacity Bar */
void print_histogram(int hCieczyCm) {
int i, bloks;
float histogram;
// hCieczyCm : H_WYSOKOSC = histogram : WIELKOSC_PASKA_POSTEPU
histogram = (WIELKOSC_PASKA_POSTEPU * hCieczyCm) / H_WYSOKOSC;
histogram = histogram + 0.5;
bloks = (int)histogram / 5;
for (i = 0; i < bloks; i++)
lcd.write(5);
if ((int)(histogram) % 5 > 0)
lcd.write((int)(histogram) % 5);
}
long read_wysokosc() {
long hCieczyCm;
pinMode(TRIG, OUTPUT);
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
pinMode(ECHO, INPUT);
int odleglosc = pulseIn(ECHO, HIGH);
odleglosc=odleglosc / 29.387 / 2; /* konwesrsja czasu na odleglosc */
Serial.println(odleglosc);
delay(50);
hCieczyCm = H_WYSOKOSC - odleglosc + ODLEGLOSC_PLUS;
if (hCieczyCm < 0)
return 0;
if (hCieczyCm > H_WYSOKOSC)
return H_WYSOKOSC;
return hCieczyCm;
}