Sari la conținut
ELFORUM - Forumul electronistilor

Arduino + DOG display 128x64


djlove

Postări Recomandate

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
  • Răspunsuri 21
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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

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
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
  • 3 luni mai târziu...

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

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

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 de djlove
Link spre comentariu

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 de cimitavita
Link spre comentariu

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 de djlove
Link spre comentariu
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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări