djlove Postat Mai 27, 2022 Partajează Postat Mai 27, 2022 Salutare Nu am mai lucrat pana acum cu display grafic si nu inteleg cum sa fac afisarea de numere dintr-o variabila. De exemplu sa afisez ceasul (ora, minute, secunde, furnizate de un RTC) Am exemplu de mai jos, care functioneaza, dar daca vreau sa afisez cu comanda " DOG.string(0,1,font_6x8," merge");" in loc de "merge" o variabila nu afiseaza. Cum se face afisarea pe un astfel de display? Sa ziceam ca am furnizata ora de "tm.Minute", ; comanda DOG.string(0,1,font_6x8, tm.Minute); nu afiseaza nimic pe display #include <Arduino.h> #include <SPI.h> #include <dog_7565R.h> #include <font_16x32nums.h> #include <font_6x8.h> #include <font_8x16.h> #include <font_8x8.h> #include <logo_BLH.h> //#include <Wire.h> //#include <TimeLib.h> #include <DS1307RTC.h> dog_7565R DOG; int led = 3; void init_backlight(boolean mono); void mono_backlight(byte brightness); void sample_screen(void); void setup() { Serial.begin(9600); while (!Serial) ; // wait for serial delay(200); Serial.println("DS1307RTC Read Test"); Serial.println("-------------------"); init_backlight(true); //use monochrome backlight in this sample code. Please change it to your configuration DOG.initialize(10,11,12,9,1,DOGM128); //SS = 10, 11,0= use Hardware SPI, 9 = A0, 4 = RESET, EA DOGM128-6 (=128x64 dots)11=mosi, } void sample_screen(void) { Serial.println("merge."); DOG.string(0,1,font_6x8," merge"); Serial.println("merge22."); } void print2digits(int number) { if (number >= 0 && number < 10) { Serial.write('0'); //DOG.string(0,1,font_16x32nums,"0"); } Serial.print(number); } void loop() { DOG.view(VIEW_TOP); DOG.clear(); DOG.contrast(13); DOG.rectangle(0,0,127,1,0x3); // sample_screen(); // delay(50); tmElements_t tm; if (RTC.read(tm)) { Serial.print("Ok, Time = "); print2digits(tm.Hour); Serial.write(':'); print2digits(tm.Minute); Serial.write(':'); print2digits(tm.Second); Serial.print(", Date (D/M/Y) = "); Serial.print(tm.Day); Serial.write('/'); Serial.print(tm.Month); Serial.write('/'); Serial.print(tmYearToCalendar(tm.Year)); Serial.println(); } else { if (RTC.chipPresent()) { Serial.println("The DS1307 is stopped. Please run the SetTime"); Serial.println("example to initialize the time and begin running."); Serial.println(); } else { Serial.println("DS1307 read error! Please check the circuitry."); Serial.println(); } // delay(9000); } //delay(1000); mono_backlight(255); //BL to half brightness delay(10000); } //The following functions controll the backlight with a PWM. Not needed for the display content void init_backlight(boolean mono) { if(mono) { pinMode(led, OUTPUT); mono_backlight(255); } } //Use this funtion for monochrome backlight void mono_backlight(byte brightness) { analogWrite(led, brightness); } Moderator: pe viitor foloseste simbolul "<>" din editor pentru a introduce cod in postare. Link spre comentariu
Vizitator Postat Mai 27, 2022 Partajează Postat Mai 27, 2022 DOG.string (asa cum rezulta si din nume) stie sa afiseze "stringuri", nu numere. Inainte de a afisa trebuie sa convertesti in string variabila pe care vrei sa o afisezi. O varianta este cam asa: char buf[32]; sprintf(buf,"%02d, tm.Minute); DOG.string(0,1,font_6x8,buf); Link spre comentariu
djlove Postat Mai 27, 2022 Autor Partajează Postat Mai 27, 2022 Acum 3 ore, Liviu.Mihaiu a spus: char buf[32]; sprintf(buf,"%02d, tm.Minute); DOG.string(0,1,font_6x8,buf); Multumesc frumos, o sa incerc asa si revin daca functioneaza Link spre comentariu
Vizitator Postat Mai 27, 2022 Partajează Postat Mai 27, 2022 Acum vad ca am omis niste ghilimele. Corect este: sprintf(buf, "%02d", tm.Minute); sau: sprintf(buf, "%02d:%02d:%02d", tm.Hour, tm.Minute, tm.Second); Link spre comentariu
djlove Postat Mai 28, 2022 Autor Partajează Postat Mai 28, 2022 Multumesc, functioneaza acum comanda Mai am de invatat acum lucruri, de exemplu cum as putea sa imi creez eu un alt font de o dimensiune anume.... Link spre comentariu
Vizitator Postat Mai 28, 2022 Partajează Postat Mai 28, 2022 La 27.05.2022 la 11:56, djlove a spus: #include <font_16x32nums.h> #include <font_6x8.h> #include <font_8x16.h> #include <font_8x8.h> Exista si alte fonturi in exemplul prezentat de tine. Ai incercat sa le folosesti ? Banuiesc ca se pot "#include" si altele gata facute. Te poti apuca sa-ti faci si propriile fonturi dar este cam mult de munca. Link spre comentariu
djlove Postat Mai 28, 2022 Autor Partajează Postat Mai 28, 2022 Da, pe acelea le am încercat pe toate... Mulțumesc frumos pentru ajutor, faptul ca pot afișa variabilele pe LCD-ul asta e un pas... Link spre comentariu
djlove Postat Septembrie 23, 2022 Autor Partajează Postat Septembrie 23, 2022 Ma poate ajuta cineva sa inteleg cum pot desena un dreptunghi pe ecran folosind functia DOG.rectangle. Reusesc sa desenez linii orizontale, dar nu un dreptunghi. De exemplu folosind comanda: "DOG.rectangle(0, 0, 61, 0, 1)" imi deseneaza o line sus pana la jumatatea ecranului descrierea functiei este urmatoarea: "void rectangle (byte start_column, byte start_page, byte end_column, byte end_page, byte pattern);" aici eu inteleg, prima cifra si a 3-a cifra definesc coloanele (in exemplul meu incepe de la 0 si se termina la 61), ok, asta functioneaza Dar cum definesc liniile unde incep si unde se termina, daca formulez "DOG.rectangle(0, 0, 61, 1, 1)" imi afiseaza pe ecran 2 linii orizontale una sub cealata, la distanta intre ele de 8-10px, fara linii verticale, daca pun "DOG.rectangle(0, 0, 61, 2, 1)" imi afiseaza pe ecran 3 linii orizontale una sub cealata, la distanta egale. Nu inteleg ce face acesta" byte pattern) si cum stiu ce sa pun acolo Multumesc anticipat Link spre comentariu
nico_2010 Postat Septembrie 23, 2022 Partajează Postat Septembrie 23, 2022 Din cate am vazut aici: /*---------------------------- Func: rectangle Desc: shows a pattern filled rectangle on the display Vars: start and end column (0..127/131) and page(0..3/7), bit pattern ------------------------------*/ void dog_7565R::rectangle(byte start_column, byte start_page, byte end_column, byte end_page, byte pattern) { byte x, y; if(type != DOGM132 && end_column > 128) //stay inside display area end_column = 128; else if(type == DOGM132 && end_column > 132) end_column = 132; if(type != DOGM132 && end_page > 7) end_page = 7; else if (type == DOGM132 && end_page > 3) end_page = 3; for(y=start_page; y<=end_page; y++) { position(start_column, y); digitalWrite(p_a0, HIGH); digitalWrite(p_cs, LOW); for(x=start_column; x<=end_column; x++) spi_out(pattern); digitalWrite(p_cs, HIGH); } } comanda :DOG.rectangle(0, 0, 61, 0, 1)" nu va desena un dreptunghi. Asta pentru ca: -byte start_column = 0; OK -byte start_page = 0; OK -byte end_column = 61; Aici s-ar finaliza o linie (intre 0 si 61) -byte end_page = 0; Nu e OK! Trebuie sa fie max 3 sau max 7, functie de tipul diplay-ului (128x64 sau 132x32). -byte pattern = 1; ? Poate fi OK, ai avea un pixel aprins pe o pagina, la dreapta, cred Link spre comentariu
djlove Postat Septembrie 23, 2022 Autor Partajează Postat Septembrie 23, 2022 (editat) Multumesc pentru raspuns Am testat si cu altceva acolo... "-byte start_column = 0; OK -Aici setez coloana de unde incepe linia, functioneaza ok -byte start_page = 0; OK - > Aici nu inteleg exact ce face, daca pun 1 linia nu mai e afisata pe display -byte end_column = 61; Aici s-ar finaliza o linie (intre 0 si 61) -> da, linia se termina la coloana 61, fucnctioneaza ok -byte end_page = 0; Nu e OK! Trebuie sa fie max 3 sau max 7, functie de tipul diplay-ului (128x64 sau 132x32). ->Aici functioneaza cam asa: daca pun 0 am o singura linie orizontala pe ecran, intre col 0 si 61, daca pun 1 am 2 linii orizontale intre alceleasi coloane, dar cu 8-10 pixeli distanta intre ele pe verticala" -byte pattern = 1; ? Poate fi OK, ai avea un pixel aprins pe o pagina, la dreapta, cred" -> cred ca aici imi scapa mie ceva si nu inteleg acest parametru. Daca pun 2 prima linie verticala coboara mai jos cu 1 pixel, pe linia 2, daca pun 3 am o linie mai groasa (primul rand +al 2lea rand de pixeli. daca pun 4, linia devine din nou subtire dar este afisata pe linia 3 daca pun 5 am prima linie afisata, una libera si linia 3 afisata, practic o line dubla si ceva mai aleator 24, primele 3 linii goale si liniile 3 si 4 pline Adaug si 2 foto cu cele 2 cazuri: https://postimg.cc/gallery/MW2ygS0 Intre timp am gasit si asta: "start column (0..101), start page (0..7), end column (0..101), end page (0..7), pattern-byte to fill area Description: Draws a filled rectangle on the screen. The filling is given through the pattern byte Example: Draw horizontal stripes on the screen DOG.rectangle(0,0,101,7,0x55);", daca incerc deseneaza multe linii orizontale pe ecran, dar nimic vertical sau in coordonate Am incercat sa schimb "0x55" cu altceva si se schimba design-ul dar nu am gasit o varianta sa fie dreptunghi si sa ii spun eu intre ce pixeli vreau dreptunghiul Editat Septembrie 23, 2022 de djlove Link spre comentariu
cimitavita Postat Septembrie 24, 2022 Partajează Postat Septembrie 24, 2022 (editat) Byte pattern e modul cum se apind biții. 0000_0001 (0x01) înseamnă chenar cu linia pe bitul 0. 0000_0101 (0x05) înseamnă chenar cu linie dublă pe bitul 0 și 2. Byte pattern nu poate fi mai mare de 255 când linia are o grosime de 8 pixeli. Acum nu știu dacă au reușit să facă ca byte pattern să meargă la fel și pe orizontală și pe verticală. Depinde de afișaj. Viteza cu care sunt desenate liniile e mica din cauză că necesită foarte multe calcule pe biți. Ar merge mai repede dacă ai face chenarul in bmp și pur și simplu l-ai copia pe ecran. Iar memoria grafică a display-ului e împărțită în pagini. De la 2 pagini pentru display-urile foarte simple până la 16 sau chiar 32 pagini pentru cele mai complexe. Pe ecran sunt afișate doar 2 pană la 8 pagini în funcție de marime, restul paginilor folosesc la diferite funcții cum ar fi scroll vertical sau orizontal sau pentru afișarea instantanee a unui text pe un uC foarte lent. Editat Septembrie 24, 2022 de cimitavita Link spre comentariu
djlove Postat Septembrie 26, 2022 Autor Partajează Postat Septembrie 26, 2022 Multumesc Am incercat si cu 0x01, care face line simpla si cu 0x05 linie dubla, dar ambele imi fac doar linii, nu chenar.... Pe verticala nu am reusit in nici un fel sa fac o line Link spre comentariu
nico_2010 Postat Septembrie 26, 2022 Partajează Postat Septembrie 26, 2022 Incearca cu 0x81 ca valoare a "pattern", si vezi ce iti apare pe ecran. Ar trebui sa iti apara o linie subtire sus si una subtire la baza ecranului, asta daca ma iau dupa foaia de catalog. Si daca este asa, atunci functia are o problema si ar trebui inlocuita. Link spre comentariu
djlove Postat Septembrie 26, 2022 Autor Partajează Postat Septembrie 26, 2022 (editat) DOG.rectangle(0, 0, 61, 0, 0x81); face 2 linii subtiri orizontale, prima incepand cu linia 0 si a 2-a pe linia 8, fara linii verticale. La baza ecranului nu apare nimic Cum as putea sa desenez exact ceea ce vreau si doar sa afisez pe ecran chenarele? Editat Septembrie 26, 2022 de djlove Link spre comentariu
nico_2010 Postat Septembrie 26, 2022 Partajează Postat Septembrie 26, 2022 DOG.rectangle(0, 0, 61, 0, 0x81) Parca vorbiram ca "byte end_page" nu trebuie sa fie 0 ci 7 sau 3, depinde de tipul de afisor! Ar trebui sa arata asa: DOG.rectangle(0, 0, 61, 0x07, 0x81) Mai incearca aodata. Si inca ceva: liniile trasate sunt pe toata lungimea afisorului? Acum 44 minute, djlove a spus: Cum as putea sa desenez exact ceea ce vreau si doar sa afisez pe ecran chenarele? Cu libraria asta nu o sa poti. L.E.: incearca cu libraria de aici: https://github.com/adafruit/ST7565-LCD/tree/master/ST7565 Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum