Go Down

Topic: [SOLVED]About using Wire.h (Read 1 time) previous topic - next topic

TommiP

Feb 21, 2015, 11:33 am Last Edit: Feb 22, 2015, 03:19 pm by TommiP Reason: Additional information
I'm going to need some jump start from the experts in I2C issue I have.

What I'm trying to do is to control 5" TFT display with RA8875 via I2C but I'm having some difficulties to start. I found the addresses of Touch panel and LCD (0x6 and 0x7) but I don't know yet which one is which.

Q1: Could I use "Wire.h" to control RS- and RW-bits to get to the result how it's in attachment pic "Data write" ? If it's not possible, how should I do it?

Q2: Have I understood corretcly that I could with sample code below, to set values for REG[01h]:

Code: [Select]

void setup()
{
   Wire.begin();
   Wire.beginTransmission(0x6);

   Wire.write(byte(0x41)); //REG [41h]
   Wire.write(byte(0x80)); //value 0x80, 1000 0000b

   Wire.endTransmission(); // stop transmitting
}


There was also in some examples command "Wire.send(ADDRESS, VALUE);" but I didn't get it to work.
Btw, I'm using Due in this project, because of 3.3 volts signal levels, demands by RA8875.

Edit: There was I2C code example by the seller on his ebay site but I was wondering is there "Wire.h" road to follow..

Best Regards
-TommiP

TommiP

Problem was solved by an example I found from some ebay site. I changed connection for some other reasons to SPI.

The code I used:

Code: [Select]

/*
  A really simple analog clock
 Tested and worked with:
 Teensy3,Teensy3.1,Arduino UNO,Arduino YUN,Arduino Leonardo,Stellaris
 Works with Arduino 1.0.6 IDE, Arduino 1.5.8 IDE, Energia 0013 IDE
  ---------------> http://www.buydisplay.com
*/


#include <SPI.h>
#include <RA8875.h>

//Arduino DUE,Arduino mega2560
#define RA8875_RESET 24
#define RA8875_INT 23
#define RA8875_CS 22



//#if defined(NEEDS_SET_MODULE)//Energia, this case is for stellaris/tiva
//RA8875 tft = RA8875(3);//select SPI module 3
/*
for module 3 (stellaris)
SCLK:  PD_0
MOSI:  PD_3
MISO:  PD_2
SS:    PD_1
*/
//#else

RA8875 tft = RA8875(RA8875_CS,RA8875_RESET);

//#endif


uint16_t ccenterx,ccentery;//center x,y of the clock
const uint16_t cradius = 110;//radius of the clock
const float scosConst = 0.0174532925;
float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;
float sdeg=0, mdeg=0, hdeg=0;
uint16_t osx,osy,omx,omy,ohx,ohy;
uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0;
uint32_t targetTime = 0;// for next 1 second timeout
uint8_t hh,mm,ss;  //containers for current time


void drawClockFace(){
  tft.fillCircle(ccenterx, ccentery, cradius, RA8875_BLUE);
  tft.fillCircle(ccenterx, ccentery, cradius-4, RA8875_BLACK);
  // Draw 12 lines
  for(int i = 0; i<360; i+= 30) {
    sx = cos((i-90)*scosConst);
    sy = sin((i-90)*scosConst);
    x0 = sx*(cradius-4)+ccenterx;
    yy0 = sy*(cradius-4)+ccentery;
    x1 = sx*(cradius-11)+ccenterx;
    yy1 = sy*(cradius-11)+ccentery;
    tft.drawLine(x0, yy0, x1, yy1, RA8875_BLUE);
  }
}

static uint8_t conv2d(const char* p) {
  uint8_t v = 0;
  if ('0' <= *p && *p <= '9') v = *p - '0';
  return 10 * v + *++p - '0';
}

void setup(void) {
 tft.begin(RA8875_480x272);

  tft.setTextColor(RA8875_WHITE, RA8875_BLACK);
  ccenterx = tft.width()/2;
  ccentery = tft.height()/2;
  osx = ccenterx;
  osy = ccentery;
  omx = ccenterx;
  omy = ccentery;
  ohx = ccenterx;
  ohy = ccentery;
  drawClockFace();// Draw clock face
  //get current time from compiler
  hh = conv2d(__TIME__);
  mm = conv2d(__TIME__+3);
  ss = conv2d(__TIME__+6);
  targetTime = millis() + 1000;
}

void drawClockHands(uint8_t h,uint8_t m,uint8_t s){
  // Pre-compute hand degrees, x & y coords for a fast screen update
  sdeg = s * 6;                  // 0-59 -> 0-354
  mdeg = m * 6 + sdeg * 0.01666667;  // 0-59 -> 0-360 - includes seconds
  hdeg = h * 30 + mdeg * 0.0833333;  // 0-11 -> 0-360 - includes minutes and seconds
  hx = cos((hdeg-90)*scosConst);   
  hy = sin((hdeg-90)*scosConst);
  mx = cos((mdeg-90)*scosConst);   
  my = sin((mdeg-90)*scosConst);
  sx = cos((sdeg-90)*scosConst);   
  sy = sin((sdeg-90)*scosConst);

  // Erase just old hand positions
  tft.drawLine(ohx, ohy, ccenterx+1, ccentery+1, RA8875_BLACK); 
  tft.drawLine(omx, omy, ccenterx+1, ccentery+1, RA8875_BLACK); 
  tft.drawLine(osx, osy, ccenterx+1, ccentery+1, RA8875_BLACK);
  // Draw new hand positions 
  tft.drawLine(hx*(cradius-28)+ccenterx+1, hy*(cradius-28)+ccentery+1, ccenterx+1, ccentery+1, RA8875_WHITE);
  tft.drawLine(mx*(cradius-17)+ccenterx+1, my*(cradius-17)+ccentery+1, ccenterx+1, ccentery+1, RA8875_WHITE);
  tft.drawLine(sx*(cradius-14)+ccenterx+1, sy*(cradius-14)+ccentery+1, ccenterx+1, ccentery+1, RA8875_RED);
  tft.fillCircle(ccenterx+1, ccentery+1, 3, RA8875_RED);

  // Update old x&y coords
  osx = sx*(cradius-14)+ccenterx+1;
  osy = sy*(cradius-14)+ccentery+1;
  omx = mx*(cradius-17)+ccenterx+1;
  omy = my*(cradius-17)+ccentery+1;
  ohx = hx*(cradius-28)+ccenterx+1;
  ohy = hy*(cradius-28)+ccentery+1;
}



void drawPrintTime(uint16_t x,uint16_t y, uint8_t h,uint8_t m,uint8_t s){
  tft.changeMode(TEXT);
  tft.setCursor (0, 0);
  tft.print ("www.buydisplay.com");
  tft.setCursor (x, y);
  tft.print(__DATE__);
  tft.setCursor (x, y-13);
  if (hh > 12) {
    if (hh < 22) tft.print('0');     
    tft.print (hh-12);
  }
  else {
    if (hh < 10) tft.print('0');
    tft.print (hh);
  }
  tft.print (':');
  if (mm < 10) tft.print('0');
  tft.print (mm);
  tft.print (':');
  if (ss < 10) tft.print('0');
  tft.print (ss);
  if (hh > 12) {
    tft.print(" pm");
  }
  else {
    tft.print (" am");
  }
  tft.changeMode(GRAPHIC);
}

void loop() {
  if (targetTime < millis()) {
    targetTime = millis()+1000;
    ss++;
    if (ss == 60) {
      ss = 0;
      mm++;
      if(mm > 59) {
        mm = 0;
        hh++;
        if (hh > 23) hh = 0;
      }
    }
    drawClockHands(hh,mm,ss);
    drawPrintTime(34,151,hh,mm,ss);
  }
}


Desided to share information 'cos someone else might have a same problem..

-TommiP

Go Up