Wyświetlacz TFT HY43B/HY50B FT800
Tworzenie bardziej skomplikowanych interfejsów graficznych na wciąż popularnych 8-bitowcach do niedawna było bardzo kłopotliwe. Ograniczenia stanowiły głównie dwa elementy - powolne taktowanie MCU oraz ograniczona pamięć. Specjalnie piszę w formie "było", bowiem zastosowany kontroler FT800 w opisywanym dziś wyświetlaczu HY43B/HY50 pozwala osiągnąć to, co zdawało się wręcz niemożliwe i karkołomne.
Czym jest układ FT800
FT800 określany jest mianem EVE (Embedded Video Engine), czyli wbudowanym silnikiem wideo, zaprojektowanym do obsługi wyświetlaczy TFT WQVGA (480x272) oraz QVGA (320x240). Oprócz obsługi wyświetlaczy, kontroluje również rezystancyjne ekrany dotykowe, posiada wbudowany syntezator dźwiękowy oraz wyjście audio. Układ z powodzeniem odtwarza 8-bitowe monofoniczne pliki PCM, 4-bitowe ADPCM oraz pliki w formacie μ-Law z częstotliwością próbkowania od 8kH do 48kHz. Komunikacja z FT800 może odbywać się za pomocą magistrali SPI z prędkością do 30MHz lub I2c z prędkością do 3.4Mhz.
W odróżnieniu od tradycyjnych kontrolerów, nie przesyłamy pojedynczych pikseli, a posługujemy się zestawem wbudowanych instrukcji, które są interpretowane i wykonywane po stronie FT800, co z kolei eliminuje konieczność stosowania zewnętrznych i dość kosztowych buforów ramek. Dzięki temu uzyskujemy coś na wzór akceleracji sprzętowej wykonywanych operacji. Brzmi ciekawie? Jestem pewny, że pokochacie ten wyświetlacz równie jak ja!
Rzućmy na chwilę okiem na diagram z którego poznamy ogólną jego budowę funkcjonalną. Wyróżnić możemy interfejs komunikacji z MCU, blok rejestrów, pamięci RAM o rozmiarze 256kB, pamięci ROM w której znajdują się między innymi podstawowe czcionki, widgety, ikony itp. oraz trzy silniki - graficzny, dźwiękowy i dotyku.
Zanim jednak zaczniemy rozmawiać z FT800, niezbędne jest poznanie mapy pamięci oraz zasady działania, która nieco różni się od standardowych kontrolerów TFT.
Bardzo ważnym dla nas obszarem pamięci będzie RAM_G o rozmiarze 256kB - to w niej będziemy mogli przechowywać wszelkie dane, takie jak dodatkowe czcionki, ikonki, obrazy PNG/JPG lub zapamiętywać listę instrukcji, o której za chwilę.
Kolejnym istotnym dla nas obszarem jest ROM_FONT, w którym znajdują się fabrycznie zapisane czcionki o różnych rozmiarach.
Jednak najważniejszy dla nas może okazać się obszar RAM_DL. To w nim będziemy zapisywali polecenia, które układ będzie wykonywał. Każde polecenie zajmuje rozmiar 4 bajtów, więc nie trudno wyliczyć, że jednorazowo możemy zlecić układowi 2000 zadań. Z jednej strony mogłoby wydawać, że jest to mało - jednak szybko zobaczycie, że jest to ilość wystarczająca do większości zastosowań.
Kolejnym regionem jest 380 bajtowy obszar różnych rejestrów, z których możemy odczytywać wiele przydatnych informacji. Np.: ilość wyświetlonych klatek obrazu lub stan ekranu dotykowego.
Z punktu programowania mniej istotny będzie ostatni 4kB obszar RAM_CMD, pełniący formę buforu poleceń układu.
Wyświetlacze FT800CB-HY43B i FT800CB-HY50
Na rynku zagranicznym jest kilka wyświetlaczy z kontrolerem FT800, jednak są to gotowe zestawy szkoleniowe z dodatkowym układem MCU, które ciężko byłoby połączyć np. z Arduino. W ofercie sklepu elty.pl są dostępne gotowe panele TFT o rozmiarach 4.3" i 5" z ekranem dotykowym, które w banalny sposób połączymy z naszym mikrokontrolerem. W komplecie dostajemy wyświetlacz w czarnej ramce oraz taśmę FPC. Bardzo dobrze rozwiązano tu mocowanie ramki, którą w razie konieczności możemy odkręcić i użyć jako nakładkę do umieszczenia samego ekranu w otworze obudowy urządzenia.
Z tyłu znajdziemy niezbędne dla nas złącza. Do wyboru mamy gniazdo FPC oraz dodatkowe miejsce na przylutowanie goldpinów, tak aby wpiąć wyświetlacz w ewentualne gniazdo. Pomyślano również o przejściówce FPC na standardowe goldpiny o rastrze 2.54mm. W tym celu wystarczy wyłamać adapter z lewej strony i przylutować goldpiny.
Podłączenie odbywa standardowo wykorzystując SPI. Bez obaw możemy go podłączyć pod mikrokontrolery z logiką 5V, ponieważ wyświetlacz posiada wbudowane już bufory 74LCX125 z tolerancją 5V. A więc:
- Adapter ↔ Arduino UNO
- 5V ↔ 5V
- GND ↔ GND
- SCK ↔ D13
- MISO ↔ D12
- MOSI ↔ D11
- INT ↔ D10
- CS ↔ D9
- PD ↔ D4
Pin Audio służy do przesyłania sygnału dźwiękowego (Audio PWM out, push-pull output, 16mA sink/source current).
Biblioteka Arduino
Na stronie internetowej EVE Projects znajdziemy wszelką i niezbędną dokumentację oraz dema. To co nas jednak interesuje, to biblioteka dla Arduino: FTDI_V1.2.0_09072014(FT800).zip, którą wystarczy rozpakować do katalogu libraries/
----------------------
Uwaga. Jeśli korzystasz z Arduino IDE 1.6.0 lub nowszej, powyższe biblioteki nie będą w stanie się poprawnie skompilować, dlatego przygotowałem specjalne wersje dla Arduino IDE > 1.6.0:
FTDI_V1.4.0_FT800: pobierz biblioteki dla Arduino 1.6.x
----------------------
Znajdziemy w niej przykłady dla różnych platform szkoleniowych: ADAM_4DLCD_FT843, Breakout_4DLCD_FT843, VM800B35, VM800P35 oraz VM800P43_50. W przypadku Arduino nteresować nas będą jedynie przykłady dla modelu VM800P43_50, który obsługuje poprawnie wyświetlacze FT800CB-HY43B i FT800CB-HY50. Bez problemu wykorzystamy również dodatkowy czytnik kart SD, który jest wymagany do uruchomienia większości przykładów.
Zasada działania
Zrozumienie zasdy działania kontrolera FT800 jest tutaj kluczowe. W standardowych kontrolerach wysyłaliśmy dane bezpośrednio do pamięci. Oznaczało to, że aby narysować linię o długości 200 pikseli, musieliśmy wysłać sporą ilość danych - współrzędne X i Y oraz kolor. Niejednokrotnie jest to co najmniej 4 bajty na współrzędne i 3 bajty na kolor. Tak więc dla linii 200 pikseli jest to ponad 600 bajtów. Do tego jeszcze dochodzą bajty sterujące. W przypadku bardziej złożonych danych do wyświetlenia ilość wzrasta lawinowo, co czyni wyświetlanie bardzo powolnym. W przypadku FT800 wystarczy wysłać tylko kilka 4 bajtowych poleceń.
Drugą istotną różnicą jest sposób wyświetlania. Jeśli przypomnimy sobie obsługę wyświetlaczy TFT, które już opisywałem, aby wyświetlić kolejną ramkę animacji musieliśmy wyczyścić cały ekran. A w przypadku zmiany wyświetlanej wartości tekstowej, konieczne było wyczyszczenie tego, co było wyświetlone pod spodem. To również powodowało, że wyświetlanie szybkozmiennych elementów było bardzo kłopotliwe.
Tutaj sprawa wygląda zupełnie inaczej. Najpierw musimy zdefiniować wszystkie elementy do wyświetlenia, a następnie wysłać do FT800. Wysłanie kolejnej listy powoduje automatyczne wyczyszczenie obrazu i wyświetlenie nowego. Z jednej strony wydaje się, że jest to problem, bo po co ponownie wyświetlać stałe elementy? Z drugiej jednak strony, nie musimy się o nic martwić. W razie konieczności możemy zapisać stałe polecenia do pamięci RAM, a potem je doklejać - ale to już pokażę następnym razem, ponieważ wpisów o FT800 będzie znacznie więcej, głównie z powodu mało czytelnych przykładów dołączonych do biblioteki.
Dziś zajmiemy się tylko inicjalizacją wyświetlacza i wyświetlania tekstu oraz liczb, a także korzystania z predefiniowanych zmiennych rozmiaru ekranu, czy sposoby centrowania tekstu.
W kolejnych odcinkach omówimy pozostałe funkcje wyświetlacza - osbługę ekranu dotykowego, kalibrację, obsługę widgetów, wyświetlanie obrazów, odtwarzanie dźwięku itd.
Przykład 1 - Inicjalizacja i wyświetlanie tekstu
- #include "SPI.h"
- #include "Wire.h"
- #include "FT_VM800P43_50.h"
- FT800IMPL_SPI FTImpl(FT_CS_PIN,FT_PDN_PIN,FT_INT_PIN);
- boolean DisplayInit()
- {
- uint32_t chipid = 0;
- Serial.println("Inicjalizacja ekranu");
- // Inicjalizujemy ekran
- FTImpl.Init(FT_DISPLAY_RESOLUTION);
- delay(20);
- // Pobieramy ID ukladu i sprawdzamy czy to FT800
- chipid = FTImpl.Read32(FT_ROM_CHIPID);
- if (chipid != FT800_CHIPID)
- {
- Serial.print("Nie obslugiwany uklad: 0x");
- Serial.println(chipid, HEX);
- return false;
- }
- Serial.print("Obslugiwany uklad: 0x");
- Serial.println(chipid, HEX);
- // Wlaczamy ekran
- FTImpl.DisplayOn();
- return true;
- }
- void scena(unsigned long int czas)
- {
- FTImpl.DLStart(); // Otwieramy liste wyswietlania
- FTImpl.ColorRGB(0xFF,0xFF,0xFF); // Ustawiamy kolor bialy (R,G,B)
- // Wyswietlamy tekst w naroznikach
- // Parametry: x, y, rozmiar 16-31, centrowanie, tekst
- FTImpl.Cmd_Text(10, 10, 20, FT_OPT_CENTERY, "LEWO-GORA");
- FTImpl.Cmd_Text(FT_DISPLAYWIDTH-10, 10, 20, FT_OPT_RIGHTX | FT_OPT_CENTERY, "PRAWO-GORA");
- FTImpl.Cmd_Text(10, FT_DISPLAYHEIGHT-10, 20, FT_OPT_CENTERY, "LEWO-DOL");
- FTImpl.Cmd_Text(FT_DISPLAYWIDTH-10, FT_DISPLAYHEIGHT-10, 20, FT_OPT_RIGHTX | FT_OPT_CENTERY, "PRAWO-DOL");
- // Wyswietlamy napis na srodku
- FTImpl.ColorRGB(0xFF,0xFF,0x00); // Ustawiamy kolor zolty (R,G,B)
- FTImpl.Cmd_Text(FT_DISPLAYWIDTH/2, FT_DISPLAYHEIGHT/2-15, 29, FT_OPT_CENTER, "www.jarzebski.pl");
- // Wyswietlamy liczbe z parametru funkcji
- FTImpl.ColorRGB(0x00,0xFF,0x00); // Ustawiamy kolor zielony (R,G,B)
- FTImpl.Cmd_Number(FT_DISPLAYWIDTH/2, FT_DISPLAYHEIGHT/2+15, 29, FT_OPT_CENTER, czas);
- // Latajace hashe
- int offset1 = czas % FT_DISPLAYWIDTH;
- int offset2 = FT_DISPLAYWIDTH - offset1;
- FTImpl.ColorRGB(0x00,0xFF,0xFF); // Ustawiamy kolor turkusowy (R,G,B)
- FTImpl.Cmd_Text(offset1, FT_DISPLAYHEIGHT/2-50, 31, FT_OPT_CENTER, "#");
- FTImpl.Cmd_Text(offset2, FT_DISPLAYHEIGHT/2+50, 31, FT_OPT_CENTER, "#");
- FTImpl.DLEnd(); // Zamykamy liste wyswietlania
- FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczenie
- }
- void setup()
- {
- Serial.begin(9600);
- while(!DisplayInit()){}
- }
- void loop()
- {
- scena(millis());
- }
Jak widzimy, w pętli loop() wysyłamy kompletną scenę, do której przekazujemy parametr w postaci czasu millis(). Scena wykorzystuje przekazaną wartość i ją wyświetla.
Materiał filmowy
Przydante dokumenty
https://www.jarzebski.pl/datasheets/FT800_AN240_From_the_GroundUp.pdf
https://www.jarzebski.pl/datasheets/FT800_AN246_Sample_Arduino_App.pdf
https://www.jarzebski.pl/datasheets/FT800_AN318_Arduino_Library.pdf
https://www.jarzebski.pl/datasheets/FT800_datasheet.pdf
https://www.jarzebski.pl/datasheets/FT800_programmers_guide.pdf
Reklama
Komentarze
RE-WE-LA-CJA! Już zamawiam ekranik :) Z niecierpliwością czekam na kolejne części. Pozdrawiam...
To fakt, ekran jest kapitalny :)
Własnie doszedł zamówiony ekran. Jestem pod wrażeniem możliwości i prędkości renderowania :) To całkiem nowy wymiar projektów Arduino!
Czy kolega "rafalski76" mógłby się odezwac do mnie na maila. Mam parę pytań ;) Mój mail ---> sergiusz.fan@interia.pl
Gdzie można kupić to cudo? Bo oprócz jednej oferty na Allegro nie znalazłem nigdzie tego wyświetlacza :-(
Ja swój kupiłem na elty.pl
Troszkę szkoda, że nie ma biblioteki i przykładów dla IDE 1.5.x lub 1.6.0.
Ale to da się obejść. Ekran jest ok. Już instaluję w maszynie...
Mam mały problem, może pomożecie.
Podzieliłem sobie plik ino na więcej, a mianowicie:
1) W pliku głównym mam:
#define __PROG_TYPES_COMPAT__
#include
#include
#include
#include "TouchLcd.h"
FT800IMPL_SPI tlcd(FT_CS_PIN,FT_PDN_PIN,FT_INT_PIN);
TouchLcd myTouchLcd;
void setup(){}
void loop(){}
2) W pliku TouchLcd.h:
#ifndef TouchLcd_h
#define TouchLcd_h
#include "Arduino.h"
class FT_VM800P43_50;
extern FT800IMPL_SPI tlcd;
class TouchLcd
{
};
#endif;
3) W pliku Touchlcd.cpp:
#include
#include
#include
#include "TouchLcd.h"
Reszta kodu wykasowana. Otrzymuję błędy:
TouchLcd.cpp.o*:In function `FT_RTC::DecToBcd(unsigned char)\'
FT_SD.h*:FT_SD()\'
FTDI_Touch.cpp.o*:FTDIlibrariesFT_SDFT_SD.h:159: first defined here
TouchLcd.cpp.o*:In function `FT_RTC::DecToBcd(unsigned char)\'
i tak do wielu funkcji.
Coś pokopałem z extern, ale zupełnie nie wiem co...
Ciekawe, wygląda na to, że najpierw musisz dodać nagłówek w którym jest funkcja DecToBcd ?
Tych błędów jest cała masa, a ewidentnie jest to powtórne definiowanie, więc to chyba nie to...
Pierwsze 3 includy to:
#include "SPI.h"
#include "Wire.h"
#include "FT_VM800P43_50.h"
Wszystko ładnie,pięknie tylko w necie same dema,a co z odczytem jakiś wartości z czujników itp.Moze jakiś przykładzik?
Czy już widział może ktoś z Was wersję z kontrolerem FT801 i dotykiem pojemnościowym? Czy jeszcze czymś więcej różnią się te kontrolery niż tylko dotykiem? (FT800 - rezystancyjny, FT801 - pojemnościowy z mulkti...)
http://www.ftdichip.com/Support/Documents/AppNotes/AN_333_FT800_and_FT801_Touch_Capabilities.pdf
Tutaj mają z pojemnościowym: http://unisystem.pl/
@Korneliusz...
No w sumie tak...
Ja znalazłem również te produkowane przez FTDI:
http://www.ftdichip.com/Products/Modules/VM801B.html
lub te same dostępne także w Polsce:
http://www.soselectronic.pl/?str=371&artnum=179811&name=ftdi-vm801b50a-bk
no ale żeby za sam pojemnościowy dotyk płacić 600 PLN?? to przecież więcej niż za kompletny 7" wyświetlacz z dotykiem w tablecie Larka :D (cały tablet Lark albo Manta to coś około 200 pln!!! ) raczej sam kontroler ekranu i dotyku może dałoby się do tych tabletowych dopasować ??
witam,
próbuję skompilować projekty do tego ekranu i nie moge dołaczyć
#include "FT_VM800P43_50.h"
otrzymuję tak czy inaczej komunikat
Font.ino:30:28: error: FT_VM800P43_50.h: No such file or directory
pozdrawiam
A zainstalowałeś bibliotekę???
Jeśli tak, podeślij kod.
Bardzo fajny blog. Czekam na więcej lekcji. Szkoda ze w sieci jest malo materiału na ich temat. Przydałby się przykład jak wyświetlać np dane z czujników. Godzinę albo coś. Sam w sobie lcd\'k jest fantastycznie super szybki.
Czy komuś udało się podpiąć to urządzonko do DUE?
Jaki konwerter poziomów użyliście?
Ja jakoś nie mogę :(. Jeszcze będę sprawdzał.
Maty, co potrzebujesz - napiszę Ci przykład.
Uruchamiam ten wyświetlacz (na Leonardo Eth), ale mam jakieś problemy z zawieszaniem się (albo obraz zastyga, albo pojawiają się krzaki, albo biały/czarny ekran).
Wygląda na to, że dołączenie oscyloskopu do linii SCK i MOSI pomaga (przez dłuższy czas się nie zawiesza), choć nie rozwiązuje problemu całkowicie.
Próbowałem też zmniejszyć częstotliwość zegara SPI, ale to też nie pomogło.
Macie może jakieś sugestie??
I jeszcze zauważyłem, że aby móc uruchomić przykłady pobrane ze strony FTDI muszę z nich usuwać te linijki:
FTImpl.SetDisplayEnablePin(FT_DISPENABLE_PIN);
FTImpl.SetAudioEnablePin(FT_AUDIOENABLE_PIN);
MOSI z kolei ma 3.3V (Arduino 5V), ale to chyba nie powinno mieć znaczenia.
Wyświetlacz jest bardzo czuły na stabilność napięcia zasilającego, sprawdź linie zasilania czy nie dużych spadków
Rzeczywiście, trzeba było poprawić łączenie. Zastosowałem krótką taśmę i całe złącza 5x2 i 3x2.
Ja dołożyłem szeregowo do MISO R27.
Czy komuś udało się może przerobić bibliotekę pod IDE 1.6.5 albo może wiecie gdzie mogę pobrać taką ... nie ukrywam, że napaliłem się strasznie kupiłem wyświetlacz ale nie doczytałem drobnym druczkiem o kompatybilności z IDE no i tera mam problem bo inne biblioteki w moim projekcie mają z owu problem ze starszym IDE ... może macie jakiś pomysł.
Możesz przekleić komunikat błędu?
Tutaj szczegóły: https://github.com/arduino/Arduino/issues/2789
Szkoda tylko, że FTDI nie zamierza zmodyfikować bibliotek.
Aby na szybko uruchomic demo z przykladów FT800 na Arduino 1.6.x można dodać na poczatku kodu definicje:
#define prog_uchar const unsigned char
#define prog_char const char
Rozwiązuje większość problemów bez grzebania w kodzie.
W chyba wersji 1.5.7 zmieniła się definicja prog_uchar, a raczej zniknęła
previous: prog_uchar text[] PROGMEN = { "Hello World" };
now: const unsigned char text[] PROGMEM = { "Hello World" };
Własnie po godzinie stresu udało mi się uruchomić mój wyświetlacz na Uno ;]
Mam pytanko jak wyswietlic double na tym wyswietlaczu?
Czy kolega mógłby podesłać kod do obsługi klawiatury dla FT800 taki odchudzony dla UNO ?
Witam.
Mam taki mały problem z transformacją typu float na const char lub string.
Chodzi głównie o to aby wyświetlana była temperatura i inne warości zmiennoprzecinkowe na FT800.
Drugim problemem jest procedura kalibracji ekranu.
skąd i gdzie zapisać dane kalibracji, bo przy zwykłym resecie...(no nie za ciekawie to wygląda.
Z Góry dziękuję Szczególnie Panu, Korneliuszu.
Może ten kod da się przerobić pod arduino
#include
#include
#include
char *iascii(int);
char* fascii(float i) /* Function to convert a floating point number into a stream of ASCII characters */
{
char *s;int j,k;
float a,b,c;
j=i;
s=(char*)malloc(10*sizeof(char));
s=iascii(j);
printf("%s.",s);
i=i-j;
for(a=0,c=0.1,k=1;(b=(i-a))!=0;a+=c)
{
if(b<0)
{
b=i+a;
k++; a=c/10; c=a;
}
if(a==1)
{ a=c/10;c=a;}
}
for(;k>0;k--)
{
i=10*i;
}
j=i;
s=iascii(j);
return s;
}
char* iascii(int i) /* Function to convert an integer into a stream of ASCII charcters */
{
char *s;
int j,k;
s=(char*)malloc(10*sizeof(char));
for(j=0;i!=0;j++)
{
*s++=(i%10)+48;
i=i/10;
}*s=\'\';
for(k=j;k>0;k--,s--);
j--;
for(i=0;(j-i)>0;j--,i++)
{
char c; /* Loop to reverse the string s */
c=s[i];
s[i]=s[j];
s[j]=c;
}
return s;
}
int main()
{
char *s;
float i;
puts("Enter any positive floating point number");
scanf("%f",&i);
s=fascii(i);
printf("%s",s);
}
// 11111111111111
// Zapis kalibracji do EEPROM
//****************************************************************************************
void kalibracja() // kalibracja dotyku ekranu
{
FTImpl.DLStart(); // Otwieramy liste wyswietlania
FTImpl.ClearColorRGB(0x00, 0x00, 0x00); // Kolor czyszczenia czarny
FTImpl.Clear(1, 1, 1); // Czyścimy ekran
FTImpl.ColorRGB(0xFF, 0xFF, 0xFF); // Ustawiamy kolor bialy (R,G,B)
FTImpl.Cmd_Text((FT_DISPLAYWIDTH / 2), (FT_DISPLAYHEIGHT / 2), 30, FT_OPT_CENTER, flashtext(0));//Dotknij punkty
FTImpl.Cmd_FGColor(0xFFFF00); // Kolor pierwszego planu
FTImpl.Cmd_BGColor(0x444400); // Kolor drugiego planu
FTImpl.Cmd_Calibrate(0); // Kalibracja
FTImpl.DLEnd(); // Zamykamy liste wyswietlania
FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczeni
// Pobranie zawartosci 12 rejestrow i wyswietlenie w konsoli
Serial.println(F("uint8_t touchCallibration[24] = {"));
for (uint8_t i = 0; i < 24; i++)
{
EEPROM.write(EEPROM_CALIBRATION_DATA_START + i, FTImpl.Read(REG_TOUCH_TRANSFORM_A + i));
if ((i % 4 == 0) && (i > 0)) Serial.println();
Serial.print(F("0x"));
Serial.print(FTImpl.Read(REG_TOUCH_TRANSFORM_A + i), HEX);
if (i < 23) Serial.print(F(", "));
}
EEPROM.write(0, 0xAF);
Serial.println();
Serial.println(F("};"));
nrmenu = 0;
}
//****************************************************************************************
// w setup po inicjalizacji
if ((EEPROM.read(0) != 0xAF) || b == 3 ) //czy w EEPROM procesora o adresie 0 zawiera wartość 0xaf lub wciśnięty przycisk podczas uruchamiania
{
kalibracja(); //jeśli nie, wiec kalibrujemy ekran i zapisujemy wyniki w EEPROM procesora
}
else
{
for (int i = 0; i < 24; i++) // jeśli jest ... kopiujemy dane do rejestów "dotyku"
{
FTImpl.Write(REG_TOUCH_TRANSFORM_A + i, EEPROM.read(EEPROM_CALIBRATION_DATA_START + i));
}
}
//****************************************************************************************
//****************************************************************************************
//****************************************************************************************
//22222222222222222222**************************************************
char *TempChar(float ft) //zamienia temperature F L O A T na C H A R [x]
{
String temp = String(ft);// zmiana float na string odczytu temperatury z czujnika "i" do temp1
temp.toCharArray(bufor, 8); // zmiana string na *char z temp do bufora( 6 znaków)
int8_t Length = strlen(bufor);
temp.toCharArray(bufor, Length);
return bufor; // zwracamy bufor do funkcji
}
przykład wykozystania
FTImpl.Cmd_Text(180, 80, 22, 0, strcat(TempChar(TempFloat[1]), " \'C"));
FTImpl.Cmd_Text(180, 110, 22, 0, TempChar(TempFloat[2]));
//****************************************************************************************
//****************************************************************************************
//****************************************************************************************
///333333333333333333333333333333
// Stringi zapisane we FLASH nie zabieraja nam RAM-u
// Konfigurowanie string_table jest procesem dwuetapowym. Najpierw zdefiniować ciągi STR_xx.
const char STR_0 [] PROGMEM = "Dotknij punkty"; // od 0-19 nazwy przycisków
const char STR_1 [] PROGMEM = "WITAM";
const char STR_2 [] PROGMEM = " Piotr";
const char STR_3 [] PROGMEM = "Wymien czujnik";
const char STR_4 [] PROGMEM = " \'C";
// Następnie ustawiamy tabele na odwoływanie się do ciągów.
const char* const string_table[] PROGMEM = {
STR_0, STR_1, STR_2, STR_3, STR_4}// i tak ile chcemy, aby tylko flashu starczylo
char bufor[60]; // Upewnij się, że jest wystarczająco duży dla największego ciągu STR_xx powyżej
//****************************************************************************************
char *flashtext(int i) //////////////// Funkcja zwraca stringi z pamięci flash
{
return strcpy_P ( bufor, (char *) pgm_read_word (& (string_table [i]))); // Niezbędne odlewy i wyłuskania, po prostu skopiować.
}
//****************************************************************************************
FTImpl.Cmd_Text(200, 130, 30, FT_OPT_CENTER, flashtext(0));//Dotknij punkty
mam nadzieję, że komuś się przyda:):)
a nie lepiej użyć PSTR
FTImpl.Cmd_Text(200, 130, 30, FT_OPT_CENTER, (PSTR("text")));
Nie wiem, czy lepiej?
Dla jednej linii tekstu pewnie tak.
Witam
Dzisiaj przyszło Mega2560 i nie mam już sił, nic nie działa. Jak podłączyć FT800 Mega2560
Bardzo proszę o pomoc w tym temacie.
Widzę, że temat umarł.
Znalazłem fajny programik do obsługi wyświetlacza
na stronie producenta,zgodny z ARDUINO,
FTDI EVE Screen Editor.
Większość w/w problemów rozwiązałem,
nie mniej jednak proszę o pomoc przy podłączeniu do MEGA 2560,
nie chce kombinować na pałę aby czegoś nie uszkodzić.
na razie piszę na UNO ale nie da się ukryć, że pamięć po mału się kończy.
PS
Przydało by się chociaż omówienie wgrania polskiej czcionki,
na pewno już ktoś to robił, widziałem w necie sporo takich wyświetlaczy a na nich polska czcionka.
Pozdro dla wszystkich
I to będzie temat na kolejny odcinek :)
Super nie mogę się doczekać. Wyświetlacz jest na prawdę super,
a tak na prawdę to Twoja stronka Korneliuszu.
ps.
Zauważyłem, że przydało by się obrócić wyświetlanie o 180 stopni,
po odwróceniu widać lepiej pod większym kątem nachylenia.
Wie ktoś jak by to trzeba było zrobić?
Witam. I jak sprawa polskich znaków w FT800? Próbowałem coś zrobić na własną ręke niestety poległem.
Kupiłem taki wyświetlacz Riveldi: RVT28AEFNWR00. Niestety nie jestem w stanie zmusić go do działania z Arduino. Podpinam go poprzez shielda. Z konfiguracją FT_VM801P43_50.h ekran pozostaje niepodświetlony. Zmiana FT_CS_PIN z 9 na 10 powoduje, że się podświetla. Kombinowałem ale nie jestem w stanie nic na nim wyświetlić ;( Może ktoś pomoże?
Dzięki,
Rafal
Cześć - jakie Arduino posiadasz i którą wersję IDE? :)
Nie wiem czemu mi się wkleiło wcześniej FT_VM801P43_50.h. Oczywiście powinno być FT_VM800P43_50.h - i z takiej konfiguracji korzystam. Arduino to UNO. Jako IDE używam eclipse\'a od baeyens\'a.
Dostaję jakiś dziwny chipId:
FTImpl.Read32(FT_ROM_CHIPID);
O ile dobrze teraz pamiętam było to A4A4A4. Ktoś miał kiedyś podobny problem i miał walniętą taśmę. Ja mam dwie i na obu to samo.
R.
Dzień dobry,
uprzejmie proszę o informację (dla laika), na czym polegają zmiany w bibliotece dla Arduino IDE > 1.6.
inny sposób dostępu do pamięci - tak w skrócie :)
Witam,
Jak sprawdzić długość wyświetlanego tekstu, tak aby wyświetlić bezpośrednio np. za wartością, jednostkę, np:
FTImpl.Cmd_Number(10,10,20, FT_OPT_CENTERY, wilgotnosc);
FTImpl.Cmd_Text(50, 10, 20, FT_OPT_CENTERY, " %");
Musisz połączyć w jeden string
Cześć!
Mam pytanie do użytkowników tego wyświetlacza. Znacie może "komende" do zmiany wartości podświetlenia/jasności? Mój wyświetlacz świeci cały czas na 100%, tak, że patrząc prostopadle do niego nic nie widać :(. Tylko pod kątem coś widać.
Jesli pracujesz na Arduino to;
FTImpl.Write(REG_PWM_DUTY,podswietlenie); // Gdzie podświetlenie max 128, 0= wygaszenie wyswietlacza.
Wyświetlacz ma minus, wrażliwy na zakłócenia. Przy stosowaniu arduino + przekaźnik + FT800 ciężko wygłuszyć zakłócenia.
Czy są jakieś wymagania, do jakich pinów Arduino (PWM, INT) mają być podłączone piny INT, CS, PD FT800? Czy mogą to być dowolne?
Wszystko zależy od definicji w nagłówku .h. Zwyczajowo CS może być dowolny pin cyfrowy, po zmianie właśnie w pliku nagłówka. INT zależy, jeśli stricte ma obsługa przerwać, musisz wybrać pin obsługujący przerwania.
Nie mogę sobie poradzić z podłączeniem FT800 do ATmega1284p. Zmieniałem piny wg różnych konfiguracji, ale problem wciąż występuje. Pisałem z prośbą o pomoc na elektrodzie, ale bez odzewu. Może tutaj znajdzie się podpowiedź?
http://www.elektroda.pl/rtvforum/topic3191877.html
Hej,
ktoś wie jak wyświetlić napisy (FTImpl.Cmd_Text) obrócone o 90 stopni?
Witam,
Wie ktoś może dlaczego jak nie podłączę pinu INT to cały ekran zmienia się płynnie na biały? Jakby jasność na 100% wtedy się przestawiała.
Witam,
Proszę wybaczyć mój polski, używam tłumacza.
Kupiłem ten LCD: http://elty.pl/pl/p/Wyswietlacz-LCD-5-800x480-z-panelem-dotykowym-sterowanianie-SPI%2C-kontoler-FT810-/1783
Czy ktoś ma doświadczenie zadowolić FT810 lub bibliotekę funkcjonalną dla FT810? Używam Arduino 1.6.10.
Pobrałem https://elty.pl/upload/download/FT_App_Gradient.rar~~dobj kodu, który nie działa i zakończyć ten błąd:
Arduino: 1.6.10 (Windows 10), Board: "Arduino/Genuino Uno"
WARNING: Category \'\' in library UIPEthernet is not valid. Setting to \'Uncategorized\'
In file included from sketchFT_Platform.h:198:0,
from sketchFT_CoPro_Cmds.cpp:31:
FT_DataTypes.h:53: error: \'prog_uchar\' does not name a type
typedef prog_uchar ft_prog_uchar8_t;
^
FT_DataTypes.h:54: error: \'prog_char\' does not name a type
typedef prog_char ft_prog_char8_t;
^
FT_DataTypes.h:55: error: \'prog_uint16_t\' does not name a type
typedef prog_uint16_t ft_prog_uint16_t;
^
In file included from sketchFT_Platform.h:199:0,
from sketchFT_CoPro_Cmds.cpp:31:
FT_Gpu_Hal.h:275: error: \'ft_prog_uchar8_t\' does not name a type
ft_void_t Ft_Gpu_Hal_WrMemFromFlash(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr,const ft_prog_uchar8_t *buffer, ft_uint32_t length);
^
FT_Gpu_Hal.h:276: error: \'ft_prog_uchar8_t\' has not been declared
ft_void_t Ft_Gpu_Hal_WrCmdBufFromFlash(Ft_Gpu_Hal_Context_t *host,FT_PROGMEM ft_prog_uchar8_t *buffer,ft_uint32_t count);
^
exit status 1
\'prog_uchar\' does not name a type
Hi i will check this today
Dziękuję bardzo,
Chciałbym tu użyć przykładu, zgodnie z którym może działać bardzo dobrze z wyświetlaczem FT800. Możliwe jest modyfikowanie tego przykładem i ubiegać się o FT810? Niestety myliłem się.
Dzięki za wszelkie rady.
Try this modified library for FT81X on Due, MEGA, UNO, Teensy 3.2 based on Gameduino 2 library:
http://www.mediafire.com/file/26ouvrp2tkhhln8/GD2+para+FT80X_GD3+para+FT81X.rar
Enjoy it!
For arduino Due:
FT81X Arduino Due
MOSI 11
MISO 12
SCK 13
GND GND
VCC 5V on HotMCU-FT81X TFT´s, 3.3V on Riverdi-FT81X
CS 10
Witam,
Ten artykuł ujawnił istnienie FT800 - wspaniałej platformy graficznej - Dzięki!
Mam już Ft800 (dokładnie Ft800CB FOR HY 43B/50B) i uruchamiam na nim wszystkie przykłady dla Arduino za wyjątkiem tych, które wykorzystują czytnik kart SD.
Np. aplikacja Image Viewer, podłączenie jak poniżej:
FT_SD_CSPIN: 8
FT_CS_PIN: 9
FT_PDN_PIN: 4
FT_INT_PIN: 3
tak podłączyłem do Arduino Uno.
Po uruchomieniu nic się nie wyświetla.
Jeśli podłącze FT_INT_PIN: do portu #10 otrzymuję komunikat ""STORAGE DEVICE NOT FOUND".
Czytnik kart działa z innym programem z wykorzystaniem biblioteki SD.h w tym samym fizycznym podłączeniu z FT800 - więc jest sprawny (czyta zawartość karty).
Proszę o pomoc albo jakąś sugestie.
Pozdrawiam
Czy te przykłady nie wymagają od procesora większej pamięci???
Kiedyś uruchamiałem , ale na mega 2560.
na uno raczej nie pociągnie.
ps.
no i musisz na kartę wcześniej wgrać pliki potrzebne dla programu.
Witam.
Ma ktoś jakieś sensowne rozwiązanie wyświetlania wartości ujemnych i zmiennoprzecinkowych?
char *TempChar(float ft) //zamienia temperature F L O A T na C H A R [x]
{
String temp = String(ft);// zmiana float na string odczytu temperatury z czujnika "i" do temp1
temp.toCharArray(bufor, 8); // zmiana string na *char z temp do bufora( 6 znaków)
int8_t Length = strlen(bufor);
temp.toCharArray(bufor, Length);
return bufor; // zwracamy bufor do funkcji
}
//****************************************************************************************
char *IntToChar(int ft) //zamienia temperature I N T E G E R na C H A R [x]
{
String temp = String(ft);// zmiana float na string odczytu temperatury z czujnika "i" do temp1
temp.toCharArray(bufor, 8); // zmiana string na *char z temp do bufora( 6 znaków)
int8_t Length = strlen(bufor);
temp.toCharArray(bufor, Length + 1);
return bufor; // zwracamy bufor do funkcji
}
//****************************************************************************************
float IntToFloat(int x) // zamienia temp integer na float 0,10 - 2 miejsca po przecinku
{
return ((float)x / 10);
}
//****************************************************************************************
//**************************************************************************************************************************************//
void CzytajTemp(int b) // czyta i zamienia temperature F L O A T na INTEGER * 10 //32,7 = 327
{
TempFloat[b] = sensors.readTemperature(FA(sensorsAddress[b]));
TempInt[b] = int(10 * TempFloat[b]);
sensors.request();
// Serial.print(" int- ");Serial.print(TempInt[b]);
// Serial.print(" char-");Serial.print(TempChar(b));
// Serial.print(" float-");Serial.println(TempFloat[b]);
}
// tak wywołujesz
FTImpl.ColorRGB((tag3 == 0) ? 0x00ff7f : 0xff7f00);//111111 // lewo góra
FTImpl.Cmd_Text(143, 100, 30, FT_OPT_RIGHTX, flashtext( 166 + dane[nrdanx])); //typ
FTImpl.ColorRGB((tag3 == 1) ? 0x00ff7f : 0xff7f00);//2222222 // prawo góra
FTImpl.Cmd_Text(285, 100, 30, FT_OPT_RIGHTX, strcat(TempChar((float)dane[nrdanx + 1] / 10 ), " s")); //sek
FTImpl.ColorRGB((tag3 == 2) ? 0x00ff7f : 0xff7f00);//3333333 // lewo dół
FTImpl.Cmd_Text(143, 165, 30, FT_OPT_RIGHTX, strcat(IntToChar(dane[nrdanx + 2]), " %")); //%
FTImpl.ColorRGB((tag3 == 3) ? 0x00ff7f : 0xff7f00);//4444444 // prawo dół
FTImpl.Cmd_Text(285, 165, 30, FT_OPT_RIGHTX, strcat(IntToChar(dane[nrdanx + 3]), " %")); //%
u mnie wszystko śmiga
możesz sobie dostosować
Witam Korneliuszu.
Obiecałeś kiedyś tam pokazać jak czcionkę wgrać itp.
Może przyszedł już na to czas.
Widzę że coraz więcej ludzi posiada te wyświetlacze, a Google odsyła najczęściej do Ciebie Korneliuszu
Pozdrawiam
Piotr
Świetny artykuł, odkrył przede mną naprawdę sporo ciekawych możliwości, bo wszystkie dotychczasowe ekraniki arduinowe są ekstremalnie powolne.
Mam jednak pytanie, bo czytałem, że jest z tym problem, a chodzi mianowicie o używanie jednocześnie drugiego urządzenia spi (karty sd). Zamówiłem sobie na ebay model z procesorem ft800, taki, jak w tym artykule.
Podobno linia CS jest trzymana prez sterownik ft800 w stanie low, przez co nie można odczytywać danych np. z karty uSD, bo dane te trafiałyby też do sterownika, a nie tylko do arduino. Rozwiązaniem ma być komenda:
void EndTransferCmd() //End transfer in continuous mode.
Sam jeszcze tego nie mogę przetestować, ale w takim razie czy wystarczy po komendach:
FTImpl.DLEnd(); // Zamykamy liste wyswietlania
FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczenie
dopisać komendę EndTransfer, czy może jest ona wbudowana już w polecenie Finish?
Pozdrawiam serdecznie!
Mam jeszcze jedno pytanie, tym razem jednak znacznie prostsze, odnośnie zasilania.
Układ posiada bufory tolerujące 5V, ale ja chciałbym przerobić biblioteki i sterować nim za pomocą procesora atxmega, który ma wyjścia 3.3V
W takim razie czy po prostu do pinów 5V i GND podpiąć 3.3V? Bo jeżeli podpiąłbym 5V, to chyba uszkodziłbym procesor, bo mimo, że on wysyłałby sygnały 0-3.3V, to układ odpowiadałby napięciem 0-5V. Nie za bardzo wiem, gdzie mógłbym znaleźć jakieś informacje na ten temat dla tego konkretnego układu, który ma tylko takie wyprowadzenia.
Z góry dziękuję za odpowiedź i pozdrawiam!
Super artykuł.
Pytanko:
Żaden projekt udostępniony na stronie kontrolera nie chce mi się skompilować, bo:
"fatal error: ..WireWire.h: No such file or directory"
Jak to naprawić?
Z góry dzięki za odpowiedź!
Czy ktos potrafil by mnie oswiecic ja wyswietlic zegard z rtc 1307 na tym cudenku
Mam zmienną temperatURE
Float aaa która podaje np.78,3 st.
Jak ją wyświetlić? W jaki sposób wyświetlice liczby po przecinku. (Nie jestem programistą i dopiero się uczę)
Wczoraj troszkę nie jasno napisałem dlatego podaję mój kod z którym nie mogę sobie poradzić.
// Include the libraries we need
#include
#include
#include
#include
#include
#include
FT800IMPL_SPI FTImpl(FT_CS_PIN,FT_PDN_PIN,FT_INT_PIN);
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
float aaa = sensors.getTempCByIndex(0);
/*
* The setup function. We only start the sensors here
*/
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
FTImpl.Init(FT_DISPLAY_RESOLUTION);
FTImpl.SetDisplayEnablePin(FT_DISPENABLE_PIN);
FTImpl.SetAudioEnablePin(FT_AUDIOENABLE_PIN);
FTImpl.DisplayOn();
FTImpl.AudioOn();
FTImpl.DLStart();
FTImpl.Finish();
FTImpl.DLStart();
FTImpl.DLEnd();
FTImpl.Finish();
// Start up the library
sensors.begin();
}
void loop(void)
{
FTImpl.DLStart();
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
// After we got the temperatures, we can print them here.
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
float temp = (sensors.getTempCByIndex(0));
FTImpl.Cmd_Number(10,10,31, FT_OPT_SIGNED, temp);
//FTImpl.Cmd_Text(172, 59, 28, 0, (sensors.getTempCByIndex(0));
FTImpl.DLEnd();
FTImpl.Finish();
}
Bardzo proszę o poprawienie przykładu tak aby wyświetlał temperaturę z miejscami po przecinku.Zależy mi na jak najszybszym poprawieniu.
Witam
Mam problem próbuje wgrać program ( przykład 1) do orange mega2560.
podpoiłem wyświetlacz cs-9, pd-4, int-3, mosi-51, miso-50, sck-52 zasilanie z płytki 5v i gnd. Po wgraniu programu wyswietlacz jest ciemny. Jeżeli mam podpięty wyświetlacz i próbuje wgrać program to muszę wypiąć miso mosi sck. Używam programatora USBasp. Proszę o pomoc.
podepnij na sztywno kabelkami, nie taśmą. u mnie poszło.
podepnij na sztywno kabelkami, nie taśmą. u mnie poszło.
Członkowie ktoś jak wyświetlić zdjęcie lub rysunek.
Witam
Czy ktoś wie jak należy ustawić parametry obrazu dla rozdzielczości
800 X 600 (FT810).
Przejrzałem notę katalogową i programming Guide i nigdzie nie mogę tego
znaleźć.
Ktoś wie jak sterować wyświetlaczem ze sterownikiem Ft811.
Używam bibliotek gd3
Dawno nic nie robiłem ale zatrzymałem się na podłączeniu czytnika kart pamięci by zaciągał pliki graficzne i pliki z czciaka
Witam !!!
W jaki sposób można utworzyć większą czcionkowe niż 30?
Poszukuje przykładu graficznej reprezentacji wyniku np wskaźnik oraz możliwości rysowanie wykresów
Witam !!!
Poszukuje informacji, przykładu jak na FT800 narysować charakterystykę
Y=f(X) ?
Witam !!!
W jaki sposób w FT 800 zdefiniować klawiaturę do wprowadzanie danych: login, pass?