Close

Zápis hodnot na Oled display PSI 128×64

Úvodní stránka Fórum Vaše projekty Arduino Zápis hodnot na Oled display PSI 128×64

  • Toto téma obsahuje celkem 8 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 7 roky a 7 měsíci.
Aktuálně je na stránce zobrazeno 9 příspěvků - 1. až 9. (celkem z 9)
  • Autor
    Příspěvky
  • #11382
    lil_bow_wuw
    Účastník

    Zdraví.
    Mám na Vás prosbu. Doslat jsem se k programování Arduina teprve nedávno a jsem v tom naprosto amatér.
    Měl bych dotaz jak zobrazit hodnoty co posílám na serial monitor, tak aby se zobrazovali i na Oled displai.
    Mám Arduino Nano,
    Displai 0.96″ SPI Serial 128X64 OLED (http://www.ebay.com/itm/152314477112?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT)
    a dva button schwits.
    Zkoušel jsem displej rozchodit a není v tom problém, zkušební hodiny a podobné kraviny fungovaly) ale dál si sám nevím rady.
    Zde je kód:

    const int buttonA = 2; //PIN NA INDIKACI CÍVKY A
    const int buttonB = 3; //PIN NA INDIKACI CÍVKY B
    const int civkaA = 4; //PIN NA CÍVKU A
    const int civkaB = 5; //PIN NA CÍVKU B
    int StateA = 0; //STAV INDIKACE CÍVKY A
    int StateB = 0; //STAV INDIKACE CÍVKY B
    int ax = 1; //POČET SEPNUTÍ CÍVKY A
    int ay = 1; //POČET NESEPNUTÍ CÍVKY A
    int bx = 1; //POČET SEPNUTÍ CÍVKY B
    int by = 1; //POČET NESEPNUTÍ CÍVKY B
    int t1 = 1200; //ČAS SEPNUTI 1,2 vteřiny
    int t2 = 800; //ČAS ROZEPNUTI 0,8 vteřiny
    int t3 = 10000; //ČAS ROZBĚHU PROGRAMU 10 vteřin
    int i1 = 0; //POČET CYKLŮ NA KONCI 0
    int i2 = 30000; //POČET CYKLŮ NA KONCI 30.000

    void setup() {
    Serial.begin(9600); //ZAHÁJENÍ KOMUNIKACE NA SERIOVÉ LINCE
    Serial.println(„PROGAM EVM“);
    Serial.println(„30.000 CYKLU“);
    Serial.println(„CEKAM 10 VTERIN A ZACNU CYKLOVAT“);
    delay(t3);
    pinMode(buttonA, INPUT_PULLUP); //indikace cívky A
    pinMode(buttonB, INPUT_PULLUP); //indikace cívky B
    pinMode(civkaA, OUTPUT); //sepnuté cívky A
    pinMode(civkaB, OUTPUT); //sepnuté cívky B

    for(int i1=1; i1 <= i2; i1++){
    Serial.print(„CYKLUS „);
    Serial.println(i1);
    //cívka A
    digitalWrite(civkaA, HIGH);
    StateA = digitalRead(buttonA);
    if (StateA == HIGH){ Serial.print(„A – ON „);}
    else { Serial.print(„A – OFF „);}
    if (StateA == HIGH){ Serial.println(ax++);}
    else { Serial.println(ay++);}
    delay(t1);
    digitalWrite(civkaA, LOW);
    delay(t2);
    //cívka B
    digitalWrite(civkaB, HIGH);
    StateB = digitalRead(buttonB);
    if (StateB == HIGH){ Serial.print(„B – ON „);}
    else { Serial.print(„B – OFF „);}
    if (StateB == HIGH){ Serial.println(bx++);}
    else { Serial.println(by++);}
    delay(t1);
    digitalWrite(civkaB, LOW);
    delay(t2);
    }
    Serial.println(„“);
    Serial.print(„POCET CYKLU „);
    Serial.println(i2);
    Serial.print(„A – ON „);
    Serial.println(ax-1);
    Serial.print(„A – OFF „);
    Serial.println(ay-1);
    Serial.print(„B – ON „);
    Serial.println(bx-1);
    Serial.print(„B – OFF „);
    Serial.println(by-1);
    }
    void loop () {
    }

    #11408
    posjirka
    Účastník

    v čem je problém? nevíš jak spustit LCD nebo jak tam dostat požadované data?
    Musíš si to představit jak by to mohlo fungovat a podle toho navrhnou tprogram.
    Vem si excel, zažlu´t si sloupce/řádky podle toho kolk jich máš v LCD (já standardně 2×16) a vlož si tam náhled max. počtu znaků aby is předsatvil jak by to mohlo vypadat.
    Podle toho si pak navrhneš program

    #11466
    lil_bow_wuw
    Účastník

    Zdar, já mám oled display ne LCD. Spustit ho umím ale nevím jak tam vypsat data „duplicitně “ jak v seriovem monitoru.

    #11467
    posjirka
    Účastník

    z pohledu přístupu není rozdíl mezi LCD a OLED, je to jen v technologii zobrazení, ale komunikační protokoly jsou podobné/stejné.
    zkus si ještě jednou přečíst co jsem ti psal v předchozím příspěvku.
    Musíš si představit jak by to na tom OLED display mohlo vypadat a podle toho napsat program. je vhodné si program rozdělit na základní funkční celky:
    – nastavení ( setup() )
    – měření
    – vyhodnocení
    – regulace
    – zobrazení

    všechny 4 poslední body musí být ve smčce loop() aby se průběžně aktualizovali
    Když to dodržíš, tak budeš mít výstup pro zobrazení na 1 místě a nemusíš to vyzobávat z celého programu. Pak není problém zobrazovat ty údaje na serial monitoru a zároveň na LCD.

    Co má ten tvůj program vlastně dělat?

    #11468
    lil_bow_wuw
    Účastník

    zdravím.
    1/ Je to program na zkoušení elektromagnetických cívek kdy se musí každí cívka zkontrolovat 30.000 cykly. Každý cyklus musí mít 1200 milisekund sepnutí a 800 milisekund rozepnuti a v rozepnutí se musí kotva cívky vrátit zpět.
    2/ Měl jsem tentýž program zobrazován přes ethernet shield a koukal jsem na to přes webové rozhraní. To ale nebylo ideální protože se muselo tahat moc kabelu k zařízení. Nakonec jsem chtěl udělat krabičku s displejem kde budou zobrazeny všechny hodnoty stejně jak v seriovém monitoru. Jsem v tomto úplně začáteční a nemám ani páru o programování (jsem čistokrevný strojař bez elektro vzdělání :-))
    3/ Musí to být v loopu celý ten program?? Když je to totiž v setupu tak se celý program udělá 30.000 a „zastaví se“. Když je to v loopu tak dojede na hodnotu 30.000 a opakuje se což nechci.
    4/ Zkoušel jsi ten program nahrát do arduina? On takhle úplně v pohodě běží a díky pinu 2 a 3 indikuje sepnutí cívky, respektive mechanické přitáhnutí kotvy cívky.
    5/ mělo by to na tom displeji vypadat stejně jak na tom seriovem monitoru. Vždy po jenom cyklu cívky A a B obnova displeje a znova dokola 30.000 krát a na konci celé to vyhodnocení a už neobnovovat displej a zastavit se.

    Asi to píšu jak nějaký tupec co??? 😀

    #11470
    posjirka
    Účastník

    tupec nejsi. Každý něják začínal. spíš ti dávám kladné body za odavhu a snahu pustit se do něčeho neznámého.
    Podle toho co píšeš, tak ten program nebude fungovat. rozhodně se kotva cívky nepřitáhne na 1us (1 krok/příkaz). a tak ti asi nebude správně indikovat přitáhnutí kotvy.
    Připadá mi to jako testování bipolárních/paměťových relé 🙂
    Reakční čas relé je v řádech ms. takže asi nebude správně vyhodnocovat stav kontaktu.
    právě proto se používá smyčkování loop() aby měl ten mechanický svět čas dojet a my ho mohli odchytat.
    Neboj i smyčka loop() se dá zastavit 🙂
    pauzu mezi sepnutím/rozepnutím chápu. co očekáváš?
    a/ že bude kontakt zakmitávat (spínat/rozpínat)
    b/ že se nesepne

    #11471
    posjirka
    Účastník

    jestli chceš jen přidat display navrhnul jsem toto rozložení :
    http://www.imgup.cz/image/LXAC
    je to to co chceš ?

    #11474
    lil_bow_wuw
    Účastník

    Zjednodušený program bez displeje mi už funguje cca 3 měsíce. Jen vždy musel být puštěný počítač aby byly vidět hodnoty na seriovém monitoru. Až se dostanu na montáž pokusím se udělat foto.
    Displej by mohl vypadat tak jak si navrhl.
    Očekávám že ventil nesepne nebo že se kotva přilepí na jednu či druhou stranu.

    #11481
    posjirka
    Účastník

    jelikož nemám OLED display tak jednu po paměti a tutoriálu.
    Kdyby něco nešlo, napiš/popiš problém a opravíme. V každém případě si musíš upravit piny kam máš připojený OLED:

    // 16.5.2017 - by JP - iprava pro OLED display
    
    // připojení knihovny U8glib - http://navody.arduino-shop.cz/docs/texty/0/18/u8glib_oled.zip
    #include "U8glib.h"
    
    // nastavení propojovacích pinů
    #define D0 13
    #define D1 11
    #define DC 9
    #define CS 8
    #define RES 10
    
    // inicializace OLED displeje z knihovny U8glib 
    U8GLIB_SSD1306_128X64 mujOled(D0, D1, CS, DC, RES);
    
    const int buttonA = 2; //PIN NA INDIKACI CÍVKY A
    const int buttonB = 3; //PIN NA INDIKACI CÍVKY B
    const int civkaA = 4; //PIN NA CÍVKU A
    const int civkaB = 5; //PIN NA CÍVKU B
    int StateA = 0; //STAV INDIKACE CÍVKY A
    int StateB = 0; //STAV INDIKACE CÍVKY B
    int ax = 1; //POČET SEPNUTÍ CÍVKY A
    int ay = 1; //POČET NESEPNUTÍ CÍVKY A
    int bx = 1; //POČET SEPNUTÍ CÍVKY B
    int by = 1; //POČET NESEPNUTÍ CÍVKY B
    int t1 = 1200; //ČAS SEPNUTI 1,2 vteřiny
    int t2 = 800; //ČAS ROZEPNUTI 0,8 vteřiny
    int t3 = 10000; //ČAS ROZBĚHU PROGRAMU 10 vteřin
    int i1 = 0; //POČET CYKLŮ NA KONCI 0
    int i2 = 30000; //POČET CYKLŮ NA KONCI 30.000
    
    void setup() {
      Serial.begin(9600); //ZAHÁJENÍ KOMUNIKACE NA SERIOVÉ LINCE
      Serial.println("PROGAM EVM");
      Serial.println("30.000 CYKLU");
      Serial.println("CEKAM 10 VTERIN A ZACNU CYKLOVAT");
      intro(); // UVODNI OBRAZOVKA
      delay(t3);
      pinMode(buttonA, INPUT_PULLUP); //indikace cívky A
      pinMode(buttonB, INPUT_PULLUP); //indikace cívky B
      pinMode(civkaA, OUTPUT); //sepnuté cívky A
      pinMode(civkaB, OUTPUT); //sepnuté cívky B
    
      for(int i1=1; i1 <= i2; i1++){
        Serial.print("CYKLUS ");
        Serial.println(i1);
        //cívka A
        digitalWrite(civkaA, HIGH);
        StateA = digitalRead(buttonA);
        if (StateA == HIGH){ 
          Serial.print("A – ON ");
        } else { 
          Serial.print("A – OFF ");
        }
        if (StateA == HIGH){ 
          Serial.println(ax++);
        } else { 
          Serial.println(ay++);
        }
        menu();  // zobrazeni menu
        delay(t1);
        digitalWrite(civkaA, LOW);
        delay(t2);
        //cívka B
        digitalWrite(civkaB, HIGH);
        StateB = digitalRead(buttonB);
        if (StateB == HIGH){
          Serial.print("B – ON ");
        } else { 
          Serial.print("B – OFF ");
        }
        if (StateB == HIGH){
          Serial.println(bx++);
        } else { 
          Serial.println(by++);
        }
        menu();  // zobrazeni menu
        delay(t1);
        digitalWrite(civkaB, LOW);
        delay(t2);
        }
        Serial.println("");
        Serial.print("POCET CYKLU ");
        Serial.println(i2);
        Serial.print("A – ON ");
        Serial.println(ax-1);
        Serial.print("A – OFF ");
        Serial.println(ay-1);
        Serial.print("B – ON ");
        Serial.println(bx-1);
        Serial.print("B – OFF ");
        Serial.println(by-1);
        menu();  // zobrazeni menu
    }
    void loop () {
    }
    
    void intro() {
      // uvodni obrazovka
      mujOled.setFont(u8g_font_unifont);
      mujOled.setPrintPos(0, 10);
      // výpis textu na zadanou souřadnici
      mujOled.print("PROGRAM EVM");
      mujOled.setPrintPos(0, 25);
      mujOled.print("30.000 CYKLU");
      mujOled.setPrintPos(0, 40);
      mujOled.print("CEKAM 10 VTERIN");
      mujOled.setPrintPos(0, 55);
      mujOled.print("A ZACNU CYKLOVAT");
    }
    
    void menu(){
      // zobrazeni menu
      mujOled.setFont(u8g_font_unifont);
      mujOled.setPrintPos(0, 10);
      // výpis textu na zadanou souřadnici
      mujOled.print("CYKLUS ");
      mujOled.print(i1);
      mujOled.setPrintPos(16, 25);
      mujOled.print("ON");
      mujOled.setPrintPos(72, 25);
      mujOled.print("OFF");
      mujOled.setPrintPos(0, 40);
      mujOled.print("A");
      mujOled.setPrintPos(16, 40);
      mujOled.print(ax);
      mujOled.setPrintPos(72, 40);
      mujOled.print(ay);
      mujOled.setPrintPos(0, 55);
      mujOled.print("B"); 
      mujOled.setPrintPos(16, 55);
      mujOled.print(bx);
      mujOled.setPrintPos(72, 55);
      mujOled.print(by); 
    }
Aktuálně je na stránce zobrazeno 9 příspěvků - 1. až 9. (celkem z 9)
  • Pro reakci na toto téma se musíte přihlásit.