• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Migotanie LCD 20x4 I2C
#11
Musze podłączyć i wgrać , a co do odświeżania to on robi za każdym wyświetleniem na lcd.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#12
(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.
 
Odpowiedź
#13
Kod:
#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;
}
spróbuj to i usuń delay
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#14
(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.
Kod:
#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;
}
 
Odpowiedź
#15
wgrałeś poprawiony program prze zemnie i w nim usunąłeś delay.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#16
(23-10-2016, 00:02)adix napisał(a):
Kod:
#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;
}
spróbuj to i usuń delay

Ekran jest zamrożony nie zmieniają się jakiekolwiek wartości. Pomiar następuje - bo widzę to na serial monitorze.
Winna leży po stronie usuniętej pętli if OPIS1 (zaraz na początku void loop
 
Odpowiedź
#17
LiquidCrystal_I2C lcd(0x27,20,4);
adresacja zmieni na swoja moja jest taka
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#18
bo ona jest zbędna ale jak tak problem robi to ja przywróć
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#19
(23-10-2016, 00:14)adix napisał(a): LiquidCrystal_I2C lcd(0x27,20,4);
adresacja zmieni na swoja moja jest taka

Tak tak już do tego doszedłem.
Niestety na pasku postępu pozostają kreski z poprzednich odczytów Huh
 
Odpowiedź
#20
musisz czyscic pop przes lcd.print" ";
wzalnosci ile znakow ma czysci
ok ja ide pomoge ci jutro
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości