Arduino Polska Forum

Pełna wersja: Migotanie LCD 20x4 I2C
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Musze podłączyć i wgrać , a co do odświeżania to on robi za każdym wyświetleniem na lcd.
(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(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
(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;
}
wgrałeś poprawiony program prze zemnie i w nim usunąłeś delay.
(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
LiquidCrystal_I2C lcd(0x27,20,4);
adresacja zmieni na swoja moja jest taka
bo ona jest zbędna ale jak tak problem robi to ja przywróć
(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
musisz czyscic pop przes lcd.print" ";
wzalnosci ile znakow ma czysci
ok ja ide pomoge ci jutro
Stron: 1 2