LCD Bargraf po I2C

daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

LCD Bargraf po I2C

Příspěvek od daton »

Dobrý den
mám problém s programováním bargrafu na aurduinu. Chci vytvořit bargraf na normálním dvouřádkovém LCD, které je k arduino připojeno přes sběrnici I2c. Pro zjednodušení jsem našel na oficiálních stránkách arduina i knihovnu která by to měla velmi zjednodušit http://playground.arduino.cc/Code/LcdBarGraph
LcdBarGraphX-v1.0.zip

Tato knihovna by měla umět jednak zjednodušit kod a spolupracovat s I2C jenže tomu tak není. Zkoušel jsem tuto knihovnu a samozřejmě mi to nahlásilo že je potřeba další knihvny na tom není nic divného jenže ted v tom začíná být slušný nepořádek. Knihovna LiquidCrystal se od té doby několikrát aktualizovala a ted lze nalézt i NewLiquidCrystal - ale s nimi to nechodí respektive příklady v ni použité nechodí. Ba co víc nechodí ani příklady použité v te NewLiquidCrystal, doinstaloval jsem ještě knihovnu LCD.h ale když to chtělo i základní knihovnu WProgram.h pochopil jsem že tudy asi cesta nevede. Prosím nemáte někdo zkušenosti s těmito knihovnami a typ na verze které fungují? Děkuji
micer
Příspěvky: 180
Registrován: 12 čer 2014, 19:14

Re: LCD Bargraf po I2C

Příspěvek od micer »

Nemám zkušenosti s těmi konkrétními knihovnami, nicméně problém by mohly posunout vpřed tyto tři starší články z Doupěte, kde je bargraf použit přímo bez speciálních knihoven také s displejem I2C:
1/ http://robodoupe.cz/2015/progress-bar-p ... d-displej/
2/ http://robodoupe.cz/2015/analogovy-joystick/
3/ http://robodoupe.cz/2015/meric-kapacity ... denzatoru/
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: LCD Bargraf po I2C

Příspěvek od daton »

Diky to je ono zkusím se od toho odpíchnout, bude toho víc na psaní ale chodit to bude díky.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: LCD Bargraf po I2C

Příspěvek od daton »

Tak se zkusil přepsat jen ten kod
http://robodoupe.cz/2015/progress-bar-p ... d-displej/

pro bargraf na displej 16x2 ale nedaří se mi zachovat tam koncovou část rámečku. Nejprve se rámeček vytvoří ok ale po dosažení maxima se při odečítání koncová čárka ztratí. Někde mám chybu a nevidím ji. Přepočítal jsem to na 48 čar z čehož 48 je to poslední rámečková. Zde je část kodu pro odpočítávání neutušíte kde můžu mít chybu?

Kód: Vybrat vše

  currentProgress--;
    lcd.setCursor(currentProgress / 3, 3); //presun na spravne souradnice
    smer = -1;
    if (currentProgress < 46) {
      switch (currentProgress % 3) {
        case 0: lcd.write(3); break;
        case 1: lcd.write((byte)0); break;
        case 2: lcd.write(1); break;
      }
    } else if (currentProgress == 46) {
      lcd.write(4);                       // predposledni znak
    }  else if (currentProgress == 47) {
      lcd.write(5);                       //posledni znak
    }
  }
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: LCD Bargraf po I2C

Příspěvek od daton »

Tak konec tabulky jsem ještě nevyřešil, kdyby někdo věděl tak prosím napište.

Ale rozebírám program p Černého pro měření kondenzátorů. Mám několik dotazů asi přímo k panu Černému nebo někomu kdo měřič stavěl.
První dotaz je na přepínání tlačítek., pracuje se zde s proměnou TL ale nikde ji nevidím definovanou nebo je to speciální struktura pro tlačítko? Dále se trochu ztrácím v těch smyčkách, smyčka setup je jasná ale potom následuje smyčka zobrazit ... to je již klasická programová ? Protože void Loop je až za touto smyčkou a následují další smyčky znamená to že po setup smyčce už jsou jen programové smyčky?
Díky za vysvětlení J
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: LCD Bargraf po I2C

Příspěvek od daton »

Tak definici TL už jsem našel ale ted mne ještě trápí jedna věc chtěl jsem te program na měření superkapacitorů předělat na LCD přes sběrnici. Což znamená že jsem zaměnil pinování paralelu za serii takto:

Kód: Vybrat vše

#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); //LiquidCrystal(rs, enable, d4, d5, d6, d7)
na tento začátek

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// nastavena adresa 0x3F a poradi pinu displeje na prevodniku: en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
Ale nechodí mi to, změnil jsem pin A5 na A6 (A5 je výstup na seriový port a bylo to také tlačítko nyní by mělo být tlačítko na A6) ale nejsem si jist jestli to neblokuje další piny například ty zapsané v závorce za 0x3F 2,1...... jestli nejsou na arduinu virtuálně obsazeny.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: LCD Bargraf po I2C

Příspěvek od daton »

Tak doufám že mi s tím někdo pomůže ted se snažím si vyzkoušet pouze tlačítka v kodu je to zde :

Kód: Vybrat vše

// Arduino Uno - metr superC
#include <LiquidCrystal.h>
int stav = 1;                   // stav vyberu z menu
int napeti;                     // pomocna pro mereni napeti
volatile int pryc = LOW;        // pro obslouzeni interruptu
unsigned long pocatek, doba;    // pomocne mereni casu
unsigned long form = 3600000;   // doba formovani v ms

LiquidCrystal lcd(9, 8, 7, 6, 5, 4); //LiquidCrystal(rs, enable, d4, d5, d6, d7)
// uzivatelske znaky pro grafiku
byte g0[8] = {B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111}; //0
byte g1[8] = {B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111}; //1
byte g2[8] = {B11111, B11000, B11000, B11000, B11000, B11000, B11000, B11111}; //2
byte g3[8] = {B11111, B11100, B11100, B11100, B11100, B11100, B11100, B11111}; //3
byte g4[8] = {B11111, B11110, B11110, B11110, B11110, B11110, B11110, B11111}; //4
byte g5[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}; //5
byte h0[8] = {B11111, B00001, B00001, B00001, B00001, B00001, B00001, B11111}; //6
byte h1[8] = {B11111, B10001, B10001, B10001, B10001, B10001, B10001, B11111};
byte h2[8] = {B11111, B11001, B11001, B11001, B11001, B11001, B11001, B11111};
byte h3[8] = {B11111, B11101, B11101, B11101, B11101, B11101, B11101, B11111};
byte h4[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}; //7

void setup() {
  pinMode(A1, OUTPUT);         // nabijeni
  digitalWrite(A1, LOW);       // nabijeni vypnout
  pinMode(A2, OUTPUT);         // vybijeni
  digitalWrite(A2, HIGH);      // vypnout vybijeni
  pinMode(A3, INPUT_PULLUP);   // TL enter
  pinMode(A5, INPUT_PULLUP);   // TL dalsi
  pinMode(2, INPUT_PULLUP);    // TL menu pres interrupt
  pinMode(10, OUTPUT);         // zvuk
  lcd.begin(16, 2);            // zavedeni grafiky do RAM displeje
  lcd.createChar(0, g0); lcd.createChar(1, g1); lcd.createChar(2, g2); lcd.createChar(3, g3);
  lcd.createChar(4, g4); lcd.createChar(5, g5); lcd.createChar(6, h0); lcd.createChar(7, h4);
  analogReference(EXTERNAL);   // reference 2,5 V z TL431
  lcd.clear();
  lcd.print("Meric superC");   // vypis hlavicky
  lcd.setCursor(0, 1);
  lcd.print("  verze 1.1");
  attachInterrupt(0, ven, LOW);// interrupt
  delay(2000);
}

// bargraf v druhém řádku displeje s rozsahem 0 - 80 resp. 1 - 79 (16x5 bodů)
void zobraz(int cislo) {
  constrain (cislo, 1, 80);
  lcd.setCursor(0, 1);
  if (cislo < 5) {
    lcd.write(cislo);
  } else {
    lcd.write(byte(5));
  }
  for (int j = 5; j <= 70; j = j + 5) {
    if (cislo >= j + 1 && cislo < j + 5) {
      lcd.write(cislo % 5);
    } else {
      if (cislo < j + 1) {
        lcd.write(byte(0));
      }
      if (cislo >= j + 5) {
        lcd.write(byte(5));
      }
    }
  }
  switch (cislo) {              // vymena znaku v pameti disleje
    case 76: lcd.createChar(7, h1); break;
    case 77: lcd.createChar(7, h2); break;
    case 78: lcd.createChar(7, h3); break;
    case 79: lcd.createChar(7, h4); break;
    case 80: lcd.createChar(7, h4); break;
    default: lcd.createChar(7, h0);
  }
  lcd.setCursor(15, 1);
  lcd.write(byte(7));
}

boolean ctiTL() {             // cteni tlacitek a posuny v menu
  int TL = 0;
  delay(300);
  do {
    if (digitalRead(A5) == LOW) TL += 1;  // dalsi
    if (digitalRead(A3) == LOW) TL += 2;  // enter
  } while (TL == 0);
  if (TL == 1) {
    stav ++;
    if (stav > 4) stav = 1;
    pip(10);
  }
  if (TL == 2) {
    return true;             // byl enter na zvoleny stav
  } else {
    return false;            // nekorektni kombinace ignoruj
  }
}

void loop() {                // hlavni menu funkci
  lcd.clear();
  lcd.print("Vyber funkce:");
  lcd.setCursor(0, 1);
  switch (stav) {
    case 1:                  // Zmerit kapacitu
      lcd.print("Zmerit kapacitu");
   //   if (ctiTL()) merkap();
      break;
    case 2:                  // Nabit
      lcd.print("Nabit na 2.5 V");
   //   if (ctiTL()) nabit();
      break;
    case 3:                  // Vybit
      lcd.print("Vybit na 0.20 V");
  //    if (ctiTL()) vybit();
      break;
    case 4:                  // Formovat
      lcd.print("Formovat (2,5 V)");
  //    if (ctiTL()) formovat();
      break;
  }
  if (pryc) {
    digitalWrite(A1, LOW);       // nabijeni vypnout
    digitalWrite(A2, HIGH);      // vypnout vybijeni
    for (int i = 1; i < 5; i++) {
      pip(50);
      delay(100);
    }

    pryc = LOW;
  }
}


potom jsou tam další smyčky ale to není tolik podstatné jde o to jak fungují tlačítka, zatím mi to moc nefunguje.
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: LCD Bargraf po I2C

Příspěvek od AlesH »

Ahoj. V Arduino programu je to tak, že funkce setup() proběhne jen jednou (po zapnutí napájení nebo po resetu) a pak už jen pořád dokola běží funkce loop(). Všechno ostatní mimo tyto dvě funkce jsou jen definice globálních proměnných a definice uživatelských funkcí (které se musí volat ze smyčky loop nebo z obsluhy přerušení). V poslední ukázce kódu vidím, že ve smyčce loop() jsou zakomentována všechna volání uživatelské funkce ctiTL(), takže tlačítka se vůbec nekontrolují a program na ně tedy nemůže nijak reagovat. Je to srozumitelné?
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: LCD Bargraf po I2C

Příspěvek od daton »

Jo to je ono proto ty tlačítka nereagují ale jen hypoteticky - snažím se tomu programu porozumět, co by se tam muselo dát, aby tlačítka reagovala a jen měnila menu na LCD nikoliv čekla na danou smyčku? Myslel jsem že stiskem tlačítka právě vyvolám jen změnu nápisu na displeji a předpokládal jsem že kdybych do toho case dal jen zpomalení jako například delay(500) na tom displeji by se mi ten nápis měl objevit.
Nevím zda je to srozumitelné ale zkouším se vlastně jen hrát s tlačítky a displejem zatím bez výkonných funkcí programu k tomu dojde později ale tady jsem právě chtěl rozběhnout jen přepínání menu a tlačítka a to se nedaří mohly by jste mi pomoci? Díky
kolbaba71
Příspěvky: 466
Registrován: 12 říj 2013, 17:35
Bydliště: Praha
Kontaktovat uživatele:

Re: LCD Bargraf po I2C

Příspěvek od kolbaba71 »

Zpomalení tímto způsobem (delay) vypadá na první pohled super, ale na druhý je to průšvih, jelikož na dobu, co mcu čeká, tak nereaguje na nic. Ani na tlačítka.
Odpovědět