arLCD - 320x240 color LCD with touch screen

Status
Not open for further replies.
I'm working with the code now.

Last time, I replaced timeOutCount with timeOutMilliseconds, which is in units of actual milliseconds using Arduino millis() function.

timeOutCount is assigned values 665000, 65000, 2000000, and 128000. I believe these will actually implement about 3.8 sec, 0.37 sec, 11.6 sec, and 0.74 sec timeouts, when running on the 16 MHz '328 chip. Are those the timeouts you intended?
 
I'll be waiting like a dog by the mail box Monday. I can't wait to try this. Thanks to all of you for working on it.
 
I think I found some sort of bug. The arLCD list a more appropriate place for this most likely but figured I would post here as well since I'm using the Teensy3 and the latest posted modded library. I have not tried this screen configuration with the imbedded Arduino driving the device yet to try to duplicate the error.

I have 1/2 of my lower screen filled with buttons. I want to setup four touch zones above the buttons to activate upon press of changing "soft button" text. Above that is the main displayed information. To facilitate an easier visualization of where the touch zones would go I created duplicate sized buttons and placed them first. I then un-commented them and enabled the touch zones with duplicate sizing and placement. While doing so I noticed that not all the temporary viual buttons would indicate. I tried resizing and moving around a bit but no matter how hard I tried only two would show up. They were widget numbers 18-21 and the last in the list in setup. I noticed that upon bootup the device seems to draw the widgets in order of their numerical value. I placed the four temporary buttons at the beginning of setup and found they drew fine. However, my last two buttons went missing instead. It's as if 19 buttons can be drawn max and the rest are pushed out of some list. I tested this with the touch zones and they behave the same. Although they can't be seen their lack of response indicates they follow the same pattern or rule or whatever. I have attached some pictures to try to illustrate what I'm describing. The touch zones would be where the four large buttons above the keypad are behind the changing "soft menu" text that comes in via serial from the device and changes in response to being touched.

How it is inteded to lookin final configuration when using only touch zones (T/R and BAND work but the SQ and DSP do not) they are missing like the second image and are non functional.
20131210_211551.jpg

four "visual test" buttons placed at the end of the widget list in setup cause the SQ and DSP positions to disappear
20131210_211644.jpg

four "visual test" buttons placed at the beginning of the widget list in setup cause TUNE UP and TUNE DOWN buttons to disappear
20131210_211706.jpg
 
Instead of putting a button to show where the touchzone is, turn on shadow and the touchzone area show up.
Shadow ON color linetype linethickness
You can turn it back off after you know it works.
I would have to see your code to understand what's not working or what is causing the problem.
I have a Teensy if that causes the problem.
Its hard to say what it is without seeing it in action.
 
Last edited:
Thanks for the tip on the shadow technique I will try that.

Also, do you know of any ideas on speeding up the drawing of larger than size 1 or 0 fonts? Since the device spits out that text all in one string I'm trying to figure out a way to only print what changes. That was part of why I went to the trouble of printing each character individually, the hope of coming up with a way to do that, instead of just one row at a time.



Code:
//Radio serial interface uses ODD parity
//Appears widgets must be listed in order as they appear on the screen from top to bottom
//characters printed individually for detailed placement control, soft menu text must be separated into groups


#include <ezLCDLib.h>
#define LED_PIN 13
ezLCD3 lcd;
int option = 1; // 1=draw, 2=disabled, 3=toggle pressed, 4=toggle not pressed,
// 5=toggle pressed disabled, 6=toggle not pressed disabled.
int touch=0;
char rxdata[30];
uint8_t opCode;
uint8_t subopCode;
uint8_t packetBegin;
uint8_t packetLength;
uint8_t appendedLength;

uint8_t specialReports[9] = {
  0x24,0x04,0x18,0x29,0x00,0x01,0x2E,0x98,0x03};  // enable serial data reporting
uint8_t acknowledge[6] = {  // ack requred to get next packet from radio
  0x24,0x01,0x10,0xF3,0x28,0x03}; 
uint8_t tuneUp[10] = {
  0x24,0x05,0x18,0x36,0xFE,0x7B,0xEF,0x01,0xE0,0x03,  };
uint8_t tuneDown[10] = {     
  0x24,0x05,0x18,0x36,0xDF,0x7B,0xEF,0x01,0xC1,0x03}  ; // down button command 
uint8_t buttonRelease[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xEF,0x01,0xE1,0x03}  ; // button release command
uint8_t button1[10] = { 
  0x24,0x05,0x18,0x36,0xFF,0x79,0xEF,0x01,0xDF,0x03}  ; // keypad button 1
uint8_t button2[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x3B,0xEF,0x01,0xA1,0x03}  ; // keypad button 2
uint8_t button3[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xE7,0x01,0xD9,0x03}  ; // keypad button 3  
uint8_t button4[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x5B,0xEF,0x01,0xC1,0x03}  ; // keypad button 4  
uint8_t button5[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xEB,0x01,0xDD,0x03}  ; // keypad button 5
uint8_t button6[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0x6F,0x01,0x61,0x03}  ; // keypad button 6
uint8_t button7[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xAF,0x01,0xA1,0x03}  ; // keypad button 7  
uint8_t button8[10] = {
  0x24,0x05,0x18,0x36,0xF7,0x7B,0xEF,0x01,0xD9,0x03}  ; // keypad button 8
uint8_t button9[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7A,0xEF,0x01,0xE0,0x03}  ; // keypad button 9
uint8_t button0[10] = {
  0x24,0x05,0x18,0x36,0x7F,0x7B,0xEF,0x01,0x61,0x03}  ; // keypad button 0
uint8_t buttonAsterisk[10] = {
  0x24,0x05,0x18,0x36,0xFB,0x7B,0xEF,0x01,0xDD,0x03}  ; // keypad button *  
uint8_t buttonPound[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x6B,0xEF,0x01,0xD1,0x03}  ; // keypad button #
uint8_t buttonMENU[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xEF,0x00,0xE0,0x03}  ; // keypad button MENU
uint8_t buttonPesc[10] = {
  0x24,0x05,0x18,0x36,0xEF,0x7B,0xEF,0x01,0xD1,0x03}  ; // keypad button Pesc
byte buttonEnter[10] = {
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xED,0x01,0xDF,0x03}  ; // keypad button Enter   
byte moreKey[10] = {
  0x24,0x05,0x18,0x36,0xFD,0x7B,0xEF,0x01,0xDF,0x03}  ;  // more key
byte f1Key[10] = { 
  0x24,0x05,0x18,0x36,0xBF,0x7B,0xEF,0x01,0xA1,0x03}  ;  // soft key F1
byte f2Key[10] = { 
  0x24,0x05,0x18,0x36,0xFF,0x73,0xEF,0x01,0xD9,0x03}  ;  // soft key F2
byte fThreeKey[10] = {  
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xEE,0x01,0xE0,0x03}  ;  //soft key F3
byte fFourKey[10] = {  
  0x24,0x05,0x18,0x36,0xFF,0x7B,0xCF,0x01,0xc1,0x03}  ;  // soft key F4


void setup()
{
  Serial2.begin(9600, SERIAL_8O1);
   lcd.begin( EZM_BAUD_RATE );
  lcd.cls( BLACK, WHITE );
  lcd.fontw(1, "sans24");
  lcd.theme( 1, 1, 48, 0, 23, 3, 2, 1, 5, 1, 1); //small button theme ( 1, 1, 48, 0, 23, 3, 2, 1, 5, 1, 1 );
  lcd.theme( 2, 1, 48, 0, 23, 3, 1, 105, 5, 1, 1 ); //tune buttons theme
  lcd.fontw(1,"1");
  lcd.theme( 3, 1, 48, 0, 23, 3, 2, 1, 5, 1, 1 ); //ENT button theme


  //lcd.button( 18, 5, 110, 70, 30, 1, 0, 3, 1, 1 );     // just test buttons before I knew about shadowing
  // lcd.button( 19, 85, 110, 70, 30, 1, 0, 3, 1, 1 );
  //lcd.button( 20, 165, 110, 70, 30, 1, 0, 3, 1, 1);
  // lcd.button( 21, 245, 110, 70, 30, 1, 0, 3, 1, 1 );


lcd.slider( 22, 80, 0, 140, 25, 1, 255, 1, 0, 1); //Slider must be at top to appear
                                                  // Will be used for volume later on

  lcd.string( 1, "1" ); // stringId 1
  lcd.button( 1, 0, 150, 40, 30, 1, 0, 3, 1, 1 );
  lcd.string( 2, "2" ); // stringId 1
  lcd.button( 2, 40, 150, 40, 30, 1, 0, 3, 1, 2 );
  lcd.string( 3, "3" ); // stringId 1
  lcd.button( 3, 80, 150, 40, 30, 1, 0, 3, 1, 3 );
  lcd.string( 4, "4" ); // stringId 1
  lcd.button( 4, 0, 180, 40, 30, 1, 0, 3, 1, 4 );
  lcd.string( 5, "5" ); // stringId 1
  lcd.button( 5, 40, 180, 40, 30, 1, 0, 3, 1, 5 );
  lcd.string( 6, "6" ); // stringId 1
  lcd.button( 6, 80, 180, 40, 30, 1, 0, 3, 1, 6 );
  lcd.string( 7, "7" ); // stringId 1
  lcd.button( 7, 0, 210, 40, 30, 1, 0, 3, 1, 7 );
  lcd.string( 8, "8" ); // stringId 1
  lcd.button( 8, 40, 210, 40, 30, 1, 0, 3, 1, 8 );
  lcd.string( 9, "9" ); // stringId 1
  lcd.button( 9, 80, 210, 40, 30, 1, 0, 3, 1, 9 );
  lcd.string( 10, "*" ); // stringId 1
  lcd.button( 10, 120, 150, 40, 30, 1, 0, 3, 1, 10 );
  lcd.string( 11, "0" ); // stringId 1
  lcd.button( 11, 120, 180, 40, 30, 1, 0, 3, 1, 11 );
  lcd.string( 12, "#" ); // stringId 1
  lcd.button( 12, 120, 210, 40, 30, 1, 0, 3, 1, 12 );
  lcd.string( 13, "MENU" ); // stringId 1
  lcd.button( 13, 160, 150, 50, 30 , 1, 0, 3, 3, 13 );
  lcd.string( 14, "Esc" ); // stringId 1
  lcd.button( 14, 160, 180, 50, 30, 1, 0, 3, 3, 14 );
  lcd.string( 15, "ENT" ); // stringId 1
  lcd.button( 15, 160, 210, 50, 30, 1, 0, 3, 1, 15 );
  lcd.string( 16, "TUNE UP" ); // stringId 1
  lcd.button( 16, 210, 150, 110, 45, 1, 0, 3, 1, 16 );
  lcd.string( 17, "TUNE DOWN" ); // stringId 1
  lcd.button( 17, 210, 195, 110, 45, 1, 0, 3, 1, 17 );
  // the problematic touch zones...everything else seems to work normally
  lcd.touchZone( 18, 5, 110, 30, 40, 1);
  lcd.touchZone( 19, 85, 110, 30, 40, 1);
  lcd.touchZone( 20, 165, 110, 30, 40, 1);
  lcd.touchZone( 21, 245, 110, 30, 40, 1);

  Serial2.write(specialReports,9); // starts up the aux serial port
}

void loop()
{

  int touch = touch;
  touch = lcd.wstack(0);  

  if (( lcd.currentWidget == 1 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button1,10);
  }
  else if (( lcd.currentWidget == 1 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 2 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button2,10);
  }
  else if (( lcd.currentWidget == 2 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 3 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button3,10);
  }
  else if (( lcd.currentWidget == 3 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 4 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button4,10);
  }
  else if (( lcd.currentWidget == 4 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 5 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button5,10);
  }
  else if (( lcd.currentWidget == 5 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 6 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button6,10);
  }
  else if (( lcd.currentWidget == 6 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 7 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button7,10);
  }
  else if (( lcd.currentWidget == 7 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 8 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button8,10);
  }
  else if (( lcd.currentWidget == 8 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }
  if (( lcd.currentWidget == 9 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button9,10);
  }
  else if (( lcd.currentWidget == 9 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 10 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(buttonAsterisk,10);
  }
  else if (( lcd.currentWidget == 10 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 11 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(button0,10);
  }
  else if (( lcd.currentWidget == 11 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 12 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(buttonPound,10);
  }
  else if (( lcd.currentWidget == 12 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 13 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(buttonMENU,10);
  }
  else if (( lcd.currentWidget == 13 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonPesc,10);
  }

  if (( lcd.currentWidget == 14 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(buttonPesc,10);
  }
  else if (( lcd.currentWidget == 14 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 15 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(buttonEnter,10);
  }
  else if (( lcd.currentWidget == 15 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 16 )&& ( lcd.currentInfo == PRESSED )) { //tune up button command
    delay(2);
    Serial2.write(tuneUp,10);

  }
  else  if (( lcd.currentWidget == 16 )&& ( lcd.currentInfo == RELEASED )) { //button release command so radio doesn't free run
    delay(2);
    Serial2.write(buttonRelease,10);

  }

  if (( lcd.currentWidget == 17 )&& ( lcd.currentInfo == PRESSED )) { //tune up button command
    delay(2);
    Serial2.write(tuneDown,10);

  }
  else  if (( lcd.currentWidget == 17 )&& ( lcd.currentInfo == RELEASED )) { //button release command so radio doesn't free run
    delay(2);
    Serial2.write(buttonRelease,10);

  }

  if (( lcd.currentWidget == 18 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(f1Key,10);
  }
  else if (( lcd.currentWidget == 18 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 19 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(f2Key,10);
  }
  else if (( lcd.currentWidget == 19 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 20 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(fThreeKey,10);
  }
  else if (( lcd.currentWidget == 20 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (( lcd.currentWidget == 21 )&& ( lcd.currentInfo == PRESSED )){
    Serial2.write(fFourKey,10);
  }
  else if (( lcd.currentWidget == 21 )&& ( lcd.currentInfo == RELEASED )) { 
    Serial2.write(buttonRelease,10);
  }

  if (Serial2.available()) {
    int i=0;
    for (i=0;i<30;i++) {  // read the entire packet into rxdata
      delay(5);
      rxdata[i] = Serial2.read();
      //rxdata[i+1] = '\0';
    }
  }

  int L;  
  packetBegin = rxdata[0];
  packetLength = rxdata[1];
  appendedLength = rxdata[7];// for ack appended to incoming packet that skews offsets
  opCode = rxdata[3];
  subopCode = rxdata[4];
  L = packetLength;

  //if (rxdata[L+4] == 0x03 && rxdata[2] != 0x80) {    
  //if (rxdata[0] == 0x24){
  //delay(25);
  // Serial2.write(acknowledge,6);
  //}
  //else if (rxdata[2] == 0x80 && appendedLength+0x04 == 0x03){
  // Serial2.write(acknowledge,6);
  //}

  if (packetBegin == 0x24) {
    delay(22);
    Serial2.write(acknowledge,6);
  }

  if (rxdata[2] == 0x80){
    opCode = rxdata[9];
    subopCode = rxdata[10];
  }
  
  if (opCode == 0x2E && subopCode == 0x02 && rxdata[2] != 0x80){ // menu

    lcd.color(DARKSLATEGRAY);//background color
    lcd.xy(0,0);
    lcd.box(80,25,FILL);
    lcd.color(YELLOW);
    lcd.font(0);
    lcd.xy(0,0);
    lcd.print(rxdata[7]);
    lcd.print(rxdata[8]);
    lcd.print(rxdata[9]);
    lcd.print(rxdata[10]);
    lcd.print(rxdata[11]);
    lcd.xy(0,0);

  }     
  
    // for ack appended to incoming packet that skews offsets
  else if (opCode == 0x2E && subopCode == 0x02 && rxdata[2] == 0x80){
    lcd.color(DARKSLATEGRAY);//background color
    lcd.xy(0,0);
    lcd.box(80,25,FILL);
    lcd.color(LIME);
    lcd.font(0);
    lcd.xy(0,0);
    lcd.print(rxdata[13]);
    lcd.print(rxdata[14]);
    lcd.print(rxdata[15]);
    lcd.print(rxdata[16]);
    lcd.print(rxdata[17]);
    lcd.xy(0,0);
  }


  if (opCode == 0x2E && subopCode == 0x03 && rxdata[2] != 0x80)  { //frequency display

    lcd.color(BLACK);
    lcd.xy(0,50);
    lcd.box(319,55,FILL);
    lcd.color(YELLOW);
    lcd.font("VER37");
    lcd.xy(0,50);
  lcd.print(rxdata[7]);
 lcd.print(rxdata[8]);
    lcd.print(rxdata[9]);
   lcd.print(rxdata[10]);
  lcd.print(rxdata[11]);
   lcd.print(rxdata[12]);
    lcd.print(rxdata[13]);
    lcd.print(rxdata[14]);
   lcd.print(rxdata[15]);
   lcd.print(rxdata[16]);
   lcd.print(rxdata[17]);
    lcd.xy(0,50);

  }
    
// for ack appended to incoming packet that skews offsets
  if (opCode == 0x2E && subopCode == 0x03 && rxdata[2] == 0x80)  { // alt frequency display for skewed offsets due to pre-pended junk ack packet
                                                                 
    lcd.color(BLACK);
    lcd.xy(0,50);
    lcd.box(319,55,FILL);
    lcd.color(YELLOW);
    lcd.font("VER37");
    lcd.xy(0,50);
    lcd.print(rxdata[13]);
    lcd.print(rxdata[14]);
    lcd.print(rxdata[15]);
    lcd.print(rxdata[16]);
    lcd.print(rxdata[17]);
    lcd.print(rxdata[18]);
    lcd.print(rxdata[19]);
    lcd.print(rxdata[20]);
    lcd.print(rxdata[21]);
    lcd.print(rxdata[22]);
    lcd.print(rxdata[23]);
    lcd.xy(0,50);

  }

  if (opCode == 0x2E && subopCode == 0x04) {  // soft buttons where the touch zones will be
    lcd.color(BLACK);
    lcd.xy(0,115);
    lcd.box(319,20,FILL);
    lcd.color(LIME);
    lcd.font(0);
    lcd.xy(20,115);
    lcd.print(rxdata[7]);
    lcd.print(rxdata[8]);
    lcd.print(rxdata[9]);
    lcd.print(rxdata[10]);
    lcd.xy(100,115);
    lcd.print(rxdata[11]);
    lcd.print(rxdata[12]);
    lcd.print(rxdata[13]);
    lcd.print(rxdata[14]);
    lcd.xy(180,115);
    lcd.print(rxdata[15]);
    lcd.print(rxdata[16]);
    lcd.print(rxdata[17]);
    lcd.print(rxdata[18]);
    lcd.xy(260,115);
    lcd.print(rxdata[19]);
    lcd.print(rxdata[20]);
    lcd.print(rxdata[21]);
    //lcd.print(rxdata[22]);
    lcd.xy(0,110);

  }

  rxdata[L+4] = 0xFF; // these reset the opcodes and prevent reprinting when 
  rxdata[3] = 0xFF;   // the radio is idle and there is no incoming data
  rxdata[4] = 0xFF;
  rxdata[0] = 0xFF;
}

video doesn't show the soft button error but I can make another when I get more time
 
Last edited:
Transmissive LCDs.. with backlight... some I've used have an extra-bright CFL or LED backlight to make them more daylight readable.
 
Can I send you the code somehow?

If your full code is too large to post into a message with the [ code ] tags, you can attach it to your message, either as the original files or as a .zip file. Just click the "Go Advanced" button at the bottom of the message entry area. The advanced page has an "Additional Options" section where you can attach zip files.
 
I've been up too long, totally overlooked the advanced button. Original post edited above.
 
I loaded the code and I don't see any problems.
But since I do not have the radio, Is it going to show the frequency and text?
photo (9).jpg
 
I can't get four items to show up in that location at all.

No, without the radio it should not indicate anything but that should be of no consequence. Are you using the Teensy library? That's the only thing I can think that is possibly different. When I get some time this weekend I will try swapping in the original library file.
 
Last edited:
I definitely like the teensy loader system. It's nearly instant and rock solid in operation!
 
I can't get four items to show up in that location at all.

No, without the radio it should not indicate anything but that should be of no consequence. Are you using the Teensy library? That's the only thing I can think that is possibly different. When I get some time this weekend I will try swapping in the original library file.

I am using the Teensy library but with an arLCD.
 
Thanks! It arrived.
Just in time for the holidays... :D

But seriously, get to it whenever you like, I just wanted to put the hardware in your hands if anyone ever asked for support. What I like about this set of hardware solutions is how they appear to take over a lot of the processing so that the teensy can do whatever it needs to. Plus, there seems to be a much wider range of screen sizes and resolutions that can be driven, allowing folk to customize their projects as needed.

The only downside as I see it is that no one appears to have cracked the nut on how to mount these displays properly. All the solutions I am aware of are $$$ custom.
 
But seriously, get to it whenever you like, I just wanted to put the hardware in your hands if anyone ever asked for support.

Actually, I already hooked it up and it came in very handy for fixing this problem.

Adafruit has merged that fix to the library, so Teensy 3 is now fully supported. :)

Thanks!

What I like about this set of hardware solutions is how they appear to take over a lot of the processing so that the teensy can do whatever it needs to.

Yes.

RA8875, arLCD and Gameduino2 are the 3 libraries that currently support GPU accelerated graphics. I believe all 3 work on Teensy3. I'm going to test Gameduino2 in a couple days.

However, Earth's arLCD library and Adafruit's RA8875 appear to wait for the GPU to complete an operation before returning control to your Arduino sketch (Adafruit's library doesn't wait for the ones that are really fast, but it has delays for the slower commands). You still get the speed of a GPU, I suppose, but a fully synchronous protocol means your code can't be working on the next command or something else while the GPU works. I haven't studied the Gameduino2 code in detail yet, so I can't say how it works. I'll know soon...

I should also mention UTFT is very fast with Teensy 3.1, but it does require connecting 12 signals.


Plus, there seems to be a much wider range of screen sizes and resolutions that can be driven, allowing folk to customize their projects as needed.

Adafruit's RA8875 library supports exactly 2 sizes. Perhaps in theory the hardware might be able to support a wide range.

The only downside as I see it is that no one appears to have cracked the nut on how to mount these displays properly.

Indeed. I have the one you sent with a board dangling off the flexcable. I'll probably just mount it to the back side with some double-sticky tape.
 
Last edited:
Status
Not open for further replies.
Back
Top