Skocz do zawartości

ESP8266 - własne fonty na LCD ST7032i z interfejsem I2C.


99teki

Pomocna odpowiedź

- LCD ST7032i podłączony do nodeMCU (ESP8266) do portów GPIO 4,5, poniżej program znaleziony w internecie.

- do programu potrzebna biblioteka , adres podany w programie, druga biblioteka z makro załączona do tematu .

12345.thumb.jpg.56bf1ca18dd1569bbadd1b534148c527.jpg67890.thumb.jpg.b1255cdd7ed5ad2e006b08a0e7175ba3.jpgkonfiguracja.thumb.jpg.a61da7f2c4b7f7cfa842b75a9236a47f.jpg

 

- kod programu pod arduino

/*
* library name=ST7032_asukiaaa
* version=1.0.5
* author=tomozh <tomozh@gmail.com>, Asuki Kono <asukiaaa@gmail.com>
* maintainer=Asuki Kono <asukiaaa@gmail.com>
* sentence=This library controls ST7032 on LCD.
* paragraph=This library can control LCDs that using ST7032. Ex: SB1602B, SB0802G, AQM0802A-RN-GBW, AQM1602 and so on.
* category=Display
* url=https://github.com/asukiaaa/ST7032_asukiaaa
* architectures=*
* includes=ST7032_asukiaaa.h
*/

#include <Wire.h>
#include "ST7032_asukiaaa.h"
#include "bin.h"
		
	// Hardware required:
	// 1: I2C LCD connected on standard pins
	// 2: Linear Pot connected on analog pin 1
		
long sensorValue = 0;  					// variable to store the value coming from the sensor
int angle = 0;
unsigned long sumTimer;
unsigned long tempTimer;
long okresOdczytu = 2000;				// odczyt co 1 sekunde
		
ST7032_asukiaaa lcd; 
		
		//Large chars
char bn1[]={6,1,6, 1,6,32, 1,3,4, 3,3,4, 6,2,2,   6,3,1, 5,3,1, 1,1,4,   5,3,4, 5,3,4};
char bn2[]={6,2,6, 2,6,2,  5,2,2, 2,2,4, 32,6,32, 2,2,4, 5,2,4, 32,6,32, 5,3,4, 32,32,6};
		
	// ---------------------
void loadlargeChars()
{
  uint8_t cc1[8] = { // Custom Character 1
     B8(11111),
     B8(11111),
     B8(11111),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(00000)
     };
			
  uint8_t cc2[8] = { // Custom Character 2
     B8(00000),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(11111),
     B8(11111),
     B8(11111)
     };
			
  uint8_t cc3[8] = { // Custom Character 3
     B8(11111),
     B8(11111),
     B8(11111),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(11111),
     B8(11111)
     };
			
  uint8_t cc4[8] = { // Custom Character 4
     B8(11100),
     B8(11110),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11110),
     B8(11100)
     };
     
  uint8_t cc5[8] = { // Custom Character 5
     B8(00111),
     B8(01111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(01111),
     B8(00111)
     };     
			
  uint8_t cc6[8] = { // Custom Character 6
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111),
     B8(11111)
     };   
			
  uint8_t cc7[8] = { // Custom Character 7 Degree
     B8(01110),
     B8(10001),
     B8(10001),
     B8(10001),
     B8(01110),
     B8(00000),
     B8(00000),
     B8(00000)
     };  
			
    lcd.createChar(1, cc1);
    lcd.createChar(2, cc2);
    lcd.createChar(3, cc3);
    lcd.createChar(4, cc4);
    lcd.createChar(5, cc5);
    lcd.createChar(6, cc6);
    lcd.createChar(7, cc7);
}			
	// ------------------------------------------ setup --------------------------
void setup()
{
    Serial.begin(115200);
		Serial.println();
		lcd.begin(16, 2, LCD_5x8DOTS);
			//	lcd.setContrast(40);
    lcd.display();
    lcd.setCursor(0, 0);
			
    lcd.print("ST7032 LCD Test");
				
    loadlargeChars();
				
    delay(2000);
    lcd.clear();
			
		for (int y =0; y <13; y++)
		{
			display(y);
			delay(3000);
		}
		tempTimer = millis();
		
}
		
	// ------------------------------------------------ loop --------------------
void loop()
{
	sumTimer = millis();
	static int licz = 0;			
  sensorValue = analogRead(A0);    
								// adjust the value below to compensate e.g. a 300 degree pot would 
	sensorValue = 100;							
  angle = (sensorValue * 3600 / 1024); 
  angle = 200;
	if (sumTimer - tempTimer > okresOdczytu)
	{
		licz = random (0, 2000);
		display(licz);
		tempTimer = millis();
    Serial.println("1");
	}
    		
  delay(10);
}
		
// ---------------------
void display(int i) 					//Display the value in large characters
{
  lcd.clear();  
		
  PrintBigDeg(15);
  if (i == 0)
  {
    PrintBigDigit(8, 0);
    PrintBigDot(11);
    PrintBigDigit(12, 0);
  }
  int pos = 15;
  while(i > 0)
  {
    if (pos == 15) PrintBigDot(pos);
    pos -= 3;
    PrintBigDigit( pos, i % 10 );   // col, row
    i /= 10;
  }
}
		
	// ------------------------------------------
void PrintBigDigit(uint8_t offset, uint8_t digit)
{
		
 // Line 1 of the one digit number
 lcd.setCursor(offset, 0);    // col, row
 lcd.write(bn1[digit*3]);
 lcd.write(bn1[digit*3+1]);
 lcd.write(bn1[digit*3+2]);
		
 // Line 2 of the one-digit number
 lcd.setCursor(offset, 1);
 lcd.write(bn2[digit*3]);
 lcd.write(bn2[digit*3+1]);
 lcd.write(bn2[digit*3+2]);
}
		
	// -----------------------------
void PrintBigDot(uint8_t offset)
{
  lcd.setCursor(offset, 1);	// col, row
  lcd.print('.');
}
			
	// -----------------------------
void PrintBigDeg(int8_t offset)
{
  lcd.setCursor(offset, 0);
  lcd.write(7);
}

// ---------------------------------- end ------------------

 

bin.zip

Edytowano przez 99teki
  • Lubię! 1
Link do komentarza
Share on other sites

@99teki ciekawie wyglądają te duże cyfry 🙂 ewentualnie można by dopełnić brzuszek w 6 i 9 bo są troche nieczytelne ale koncepcja super! Mam w planach zbudować timer i może skorzystam.

Możesz napisać coś o sposobie zapisu znaków:

  uint8_t cc1[8] = { // Custom Character 1
     B8(11111),
     B8(11111),
     B8(11111),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(00000),
     B8(00000)
     };

i w szczególności to, bo domyślam się jaka jest idea, ale nie widzę jak to działa:

		//Large chars
char bn1[]={6,1,6, 1,6,32, 1,3,4, 3,3,4, 6,2,2,   6,3,1, 5,3,1, 1,1,4,   5,3,4, 5,3,4};
char bn2[]={6,2,6, 2,6,2,  5,2,2, 2,2,4, 32,6,32, 2,2,4, 5,2,4, 32,6,32, 5,3,4, 32,32,6};

 

Link do komentarza
Share on other sites

(edytowany)

- znaków do RAM w tym COG można wpisać tylko 7, a jak jest symbol stopnia C to jest tylko 6 miejsc.

tablica cc1 to "beleczka" u góry, cc2 to "beleczka" u dołu., cc3 "beleczka" gruba u góry, cienka u dołu, itd.

cc7 to znak stopnia C.

teraz z bn1, bn2 wstawiasz znaki do 1 i 2 linii., 

bn1 6, 1, 6 czyli brzuszek z lewej, beleczka u góry i brzuszek na prawej stronie.

bn2 6, 2, 6 te same brzuszki ale beleczka u dołu.

czyli masz cyfrę 0.

dla cyfry 6 można to poprawić w cc1 ale wtedy inne znaki są odkształcone, wszędzie tam gdzie w bn1, bn2 masz  wpis "1".

cyfra 9 poprawa w bn2 dla pozycji 9 zamiast 32, 32, 6 ma być 32, 2, 6 czyli dodana 2 - beleczka z dołu.

 

Edytowano przez 99teki
Link do komentarza
Share on other sites

Powiem tak: Bawiłem się w to przy moim pierwszym omomierzu. Ograniczenie 7 znaków można obejść, mi się udało zrobić znaczek omegi i literki k i M (wyświetlane zamiennie, oczywiście cyfry swoją drogą).

Niestety - czytelność glifów jest praktycznie żadna, to taki bajer bez praktycznego zastosowania.

No, ale jako bajer może być... chociaż do jakichś praktycznych celów lepiej użyć jakiegoś małego TFT czy nawet OLEDa, a nawet ledowego 7seg.

To tak z punktu widzenia przyślepawego dziadka 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.