# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  ST7735 & Arduino Nano

## Kernel Panic

Είμαι στην υλοποίηση μιας ιδιοκατασκευής που έχει για απεικόνιση μια οθόνη 1.8" SPI με ελεγκτή το *ST7735.
*Τα χρώματα που εμφανίζονται όμως, δεν έχουν και μεγάλη σχέση με αυτά που βλέπω στην οθόνη του Η/Υ και δεν λέει να ανεβάζω συνέχεια κώδικα στο nano μέχρι να βρω το σωστό χρώμα.
Μια ματιά που έριξα στον νετ, δεν βρήκα κάτι που να αλλάζει τα χρώματα στην οθόνη και πριν αρχίσω να γράφω, είπα να ρωτήσω εδώ.
Μήπως παίζει λοιπόν να έχει κάποιος έτοιμο κώδικα που να αλλάζει χρώματα στην ST7735?
tnx.

----------


## Fire Doger

Τα περισσότερα δεν είναι ίδια γιατί χάνεις πληροφορία από RGB888 πας σε RGB565, στον ST συγκεκριμένα μπορείς να πας μέχρι RGB666 γιατί δεν χωράει παραπάνω ο frame buffer του (και 1 bit στο κόκκινο και μπλε δεν κάνει διαφορά, πιο πολύ παίδεμα στο να βρεις μετατροπείς είναι)
Το ότι τα χρώματα που είναι ίδια φαίνονται χάλια είναι λόγο της οθόνης: αντίθεση, γωνία θέασης κλπ και δεν μπορείς να κάνεις κάτι.

Αν εννοείς την μετατροπή από RGB888 σε RGB565 δεν είναι κάτι δύσκολο, απλώς πετάς τα LSD και τα στουμπώνεις σε 16bit 7654376543276543  αν και νομίζω οι βιβλιοθήκες έχουν ήδη μια συνάρτηση για αυτήν την δουλειά.




> #define RGB2COLOR(r, g, b) ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)))



Υπάρχουν αρκετοί μετατροπείς στο διαδίκτυο και είχα κάνει και μια εφαρμογή σε C# αν σε βολεύει (github)

----------


## Kernel Panic

> Τα περισσότερα δεν είναι ίδια γιατί χάνεις πληροφορία από RGB888 πας σε RGB565, στον ST συγκεκριμένα μπορείς να πας μέχρι RGB666 γιατί δεν χωράει παραπάνω ο frame buffer του (και 1 bit στο κόκκινο και μπλε δεν κάνει διαφορά, ποιο πολύ παίδεμα στο να βρεις μετατροπείς είναι)
> Το ότι τα χρώματα που είναι ίδια φαίνονται χάλια είναι λόγο της οθόνης: αντίθεση, γωνία θέασης κλπ και δεν μπορείς να κάνεις κάτι.
> 
> Αν εννοείς την μετατροπή από RGB888 σε RGB565 δεν είναι κάτι δύσκολο, απλώς πετάς τα LSD και τα στουμπώνεις σε 16bit 7654376543276543  αν και νομίζω οι βιβλιοθήκες έχουν ήδη μια συνάρτηση για αυτήν την δουλειά.
> 
> 
> Υπάρχουν αρκετοί μετατροπείς στο διαδίκτυο και είχα κάνει και μια εφαρμογή σε C# αν σε βολεύει (github)



Σ' ευχαριστώ Στέφανε για τις πληροφορίες, ευτυχώς δεν χρειάζεται να κάνω κάποια μετατροπή γιατί η βιβλιοθήκη που χρησιμοποιώ (Ucglib) παίρνει κανονικά τιμές από RGB του τύπου,




```
  ucg.setColor(0, 25, 220, 25);   //  main color for the font
  ucg.setColor(1, 0, 0, 0);     // background for SOLID mode
```


αλλά η Κινεζιά οθονίτσα έχει τα θεματάκια της στην απεικόνιση.
Δεν φαίνεται να το γλυτώνω το γράψιμο...  
ο.κ. θα το ανεβάσω και εδώ να υπάρχει για κανέναν άλλον

----------


## Kernel Panic

εδώ είναι τα αποτελέσματα του κόπου! 
Check the Colors ST7735 TFT LCD screen
ST7735_Check_Colors_Kernel.jpg
και ένα σχεδιάκι 
ST7735_Check_Colors_Kernel_sch.png
και ο κώδικας 



```
/*   Check the Colors ST7735 TFT LCD screen
   Ucglib ->  https://github.com/olikraus/ucglib
   Arduino IDE 1.8.1
   Kernel Panic 2018
*/


/*===== Includes ==============================*/
#include <SPI.h>
#include "Ucglib.h"
//#include <EEPROM.h>


/*
  Hardware SPI Pins:
  Arduino Uno   sclk=13, data=11
*/
//Ucglib_ST7735_18x128x160_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8);
Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8);


/*===== Defines ==============================*/
#define EnableSerial  // >>> Please uncomment for Enable debug prints to serial monitor <<<
#define encA            2 // PinA rotary encoder
#define encB            3 // PinB rotary encoder
#define encButton       4 // Button pin rotary encoder
#define DebounceDelay  10 // Button debouncing globals
#define MaxSelect       6 // 
#define HorFonts       45 // Horizontal position >> ucg.setPrintPos(HorFonts, VerGREEN); <<
#define HorBack       134 // Horizontal position
#define HorBack1       91 // 
#define VerRED         87 // Vertical position 
#define VerGREEN      104 // Vertical position 
#define VerBLUE       121 // Vertical position 
#define Steps          10 // Steps change color


//-- Set the default colors --
byte Rfont = 245 ;
byte Gfont = 100 ;
byte Bfont =   0 ;
byte RBckgrnd = 100 ;
byte GBckgrnd =  90 ;
byte BBckgrnd =  70 ;


//-- States for Select and Change. --
byte    storerENC, Hor, Ver; // Unselected
boolean SelectCOLOR = true;
boolean ChangeColorFlag = false;


//-- rotary encoder --
byte  Rotating = 0;
byte  encoderPos = 0;  //
byte  oldEncPos = 1;   //
volatile unsigned int NewEncPos; //
boolean Set_A = false;
boolean Set_B = false;
//unsigned long previousMillis = 0;


enum _Colors {
  R_font,
  G_font,
  B_font,
  R_Bckgrnd,
  G_Bckgrnd,
  B_Bckgrnd
};


//===== setup ==> RUNS ONCE <===========================================
void setup() {
  //-- setup serial ---
#ifdef EnableSerial
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("*********************************");
  Serial.println("*  Check Colors ST7735 TFT LCD  *");
  Serial.println("*        Kernel Panic 2018      *");
  Serial.println("*********************************");
  Serial.println();
#endif // EnableSerial


  //-- Initialize TFT --
  ucg.begin(UCG_FONT_MODE_TRANSPARENT);
  ucg.clearScreen();
  ucg.setRotate90();
  ucg.setFontMode(UCG_FONT_MODE_SOLID);


  //-- setup pins --
  pinMode(encButton, INPUT_PULLUP);
  pinMode(encA, INPUT);
  pinMode(encB, INPUT);


  attachInterrupt(0, doEncoderA, RISING); // encoder pin on interrupt 0 (pin 2)
  attachInterrupt(1, doEncoderB, RISING); // encoder pin on interrupt 1 (pin 3)
  Hor = 2;
  MainScreen ();
  SelectCOLOR = true;
}//== close setup ===


//===== main loop ==> RUNS CONSTANTLY <=======================================
void loop()  {
  //-- encoder --
  if (oldEncPos != encoderPos) {
    noInterrupts();
    //--Select color --
    if (SelectCOLOR) {
      if (encoderPos > ((MaxSelect - 1) + 1)) encoderPos = (MaxSelect - 1);
      else if (encoderPos > (MaxSelect - 1)) encoderPos = 0;
#ifdef EnableSerial
      Serial.print("encoderPos: ");  Serial.println(encoderPos, DEC);
#endif // EnableSerial
      ColorsUnselected();
      ChooseColor(oldEncPos);
      ColorsSelected ();
      storerENC = encoderPos;
      ChooseColor(storerENC);
    } //-- close Select colors --


    //-- change colors --
    if (SelectCOLOR == false) {
      if (encoderPos > oldEncPos ) NewEncPos = Steps;
      else NewEncPos = -Steps;
      ColorsChange();
      ChooseColor(storerENC);
    }//-- close change colors ---
    oldEncPos = encoderPos;
    interrupts();
  }//-- close encoder --


  //-- enc Button --
  if (digitalRead(encButton) == LOW) {
    delay(DebounceDelay);
    SelectCOLOR = !SelectCOLOR;


    if (SelectCOLOR) {
      encoderPos = storerENC;
      oldEncPos = storerENC;
      ChangeColorFlag = false;
      ColorsSelected ();
      ChooseColor(storerENC);
    }//


    else {
      ColorsChange();
      ChooseColor(storerENC);
      ChangeColorFlag = true;
    }//


    while (digitalRead(encButton) == LOW) { // wait
      delay(DebounceDelay);
    }//-- close while --
  }//-- close enc Button --
}//== close main loop ==


//==== ChooseColor =========================================
void ChooseColor( byte color) {
  ucg.setFont(ucg_font_profont11_mf);
  switch (color) {
    // red fonts
    case R_font:
      if (ChangeColorFlag) {
        Rfont += NewEncPos;
      }
      ColorRedFont ();
      break;


    // green fonts
    case G_font:
      if (ChangeColorFlag) {
        Gfont += NewEncPos;
      }
      ColorGreenFont ();
      break;


    //blue font
    case B_font:
      if (ChangeColorFlag) {
        Bfont += NewEncPos;
      }
      ColorBlueFont ();
      break;


    // red background for SOLID mode
    case R_Bckgrnd:
      if (ChangeColorFlag) {
        RBckgrnd += NewEncPos;
      }
      ColorRedBack ();
      break;


    // green background for SOLID mode
    case G_Bckgrnd:
      if (ChangeColorFlag) {
        GBckgrnd += NewEncPos;
      }
      ColorGeenBack ();
      break;


    // blue background for SOLID mode
    case B_Bckgrnd:
      if (ChangeColorFlag) {
        BBckgrnd += NewEncPos;
      }
      ColorBlueBack ();
      break;
  }


}//== close ChooseColor ===




//===== ColorRedFont ===========================================
void ColorRedFont () {
  ucg.setPrintPos(HorFonts, VerRED); // Hor, Ver
  if (Rfont < 100) ucg.print("0");
  if (Rfont < 10) ucg.print("0");
  ucg.print(Rfont);
  if (ChangeColorFlag) {
    TestTextColors();
  }
}//== close ColorRedFont ===


//===== ColorRedBack ===========================================
void ColorRedBack () {
  ucg.setPrintPos(HorBack, VerRED); // Hor, Ver
  if (RBckgrnd < 100) ucg.print("0");
  if (RBckgrnd < 10) ucg.print("0");
  ucg.print(RBckgrnd);
  if (ChangeColorFlag) {
    TestTextColors();
  }
}//== close ColorRedBack ===


//===== ColorGreenFont ===========================================
void ColorGreenFont () {
  ucg.setPrintPos(HorFonts, VerGREEN); // Hor, Ver
  if (Gfont < 100) ucg.print("0");
  if (Gfont < 10) ucg.print("0");
  ucg.print(Gfont);
  if (ChangeColorFlag) {
    TestTextColors();
  }
}//== close ColorGreenFont ===


//===== ColorGeenBack ===========================================
void ColorGeenBack () {
  ucg.setPrintPos(HorBack, VerGREEN); // Hor, Ver
  if (GBckgrnd < 100) ucg.print("0");
  if (GBckgrnd < 10) ucg.print("0");
  ucg.print(GBckgrnd);
  if (ChangeColorFlag) {
    TestTextColors();
  }
}//== close ColorGeenBack ===


//===== ColorBlueFont ===========================================
void ColorBlueFont () {
  ucg.setPrintPos(HorFonts, VerBLUE); // Hor, Ver
  if (Bfont < 100) ucg.print("0");
  if (Bfont < 10) ucg.print("0");
  ucg.print(Bfont);
  if (ChangeColorFlag) {
    TestTextColors();
  }
}//== close ColorBlueFont ===


//===== ColorBlueBack ===========================================
void ColorBlueBack () {
  ucg.setPrintPos(HorBack, VerBLUE); // Hor, Ver
  if (BBckgrnd < 100) ucg.print("0");
  if (BBckgrnd < 10) ucg.print("0");
  ucg.print(BBckgrnd);
  if (ChangeColorFlag) {
    TestTextColors();
  }
}//== close ColorBlueBack ===


//===== MainScreen ===========================================
void MainScreen () {
  ucg.setFontMode(UCG_FONT_MODE_SOLID);
  TestTextColors();
  //Line
  ucg.setColor(250, 230, 80); // color Line
  ucg.drawHLine( 0, 74, 160); // Line from left, from top, length
  
  ucg.setFont(ucg_font_profont11_mf);
  Hor = 2;
  //--- Red ---
  ucg.setColor(0, 210, 25, 25);   //  main color for the font
  ucg.setColor(1, 0, 0, 0);     // background for SOLID mode
  ucg.setPrintPos(Hor, VerRED); // Hor, Ver
  ucg.print("R_Font:");
  ucg.setPrintPos(HorBack1, VerRED); // Hor, Ver
  ucg.print("R_Back:");
  ColorsUnselected();
  ColorRedFont ();
  ColorRedBack ();


  //--- Green ---
  ucg.setColor(0, 25, 220, 25); // font color
  ucg.setColor(1, 0, 0, 0);     // background for SOLID mode
  ucg.setPrintPos(Hor, VerGREEN); // Hor, Ver
  ucg.print("G_Font:");
  ucg.setPrintPos(HorBack1, VerGREEN); // Hor, Ver
  ucg.print("G_Back:");
  ColorsUnselected();
  ColorGreenFont ();
  ColorGeenBack ();


  //--- Blue ---
  ucg.setColor(0, 30, 90, 255); // font color
  ucg.setColor(1, 0, 0, 0);     // background for SOLID mode
  ucg.setPrintPos(Hor, VerBLUE); // Hor, Ver
  ucg.print("B_Font:");
  ucg.setPrintPos(HorBack1, VerBLUE); // Hor, Ver
  ucg.print("B_Back:");
  ColorsUnselected();
  ColorBlueFont ();
  ColorBlueBack ();
}//== close MainScreen ==


//===== TestTextColors ===========================================
void TestTextColors() {
  Hor = 30;
  Ver = 15;
  ucg.setFont(ucg_font_8x13B_mf); // select fonts
  ucg.setColor(0, Rfont, Gfont, Bfont);          // font color
  ucg.setColor(1, RBckgrnd, GBckgrnd, BBckgrnd); // background for SOLID mode
  ucg.setPrintPos(Hor, Ver); // Hor, Ver
  ucg.print("Kernel ");
  ucg.setColor(0, RBckgrnd, GBckgrnd, BBckgrnd); // invert colors
  ucg.setColor(1, Rfont, Gfont, Bfont);          // invert colors
  ucg.print(" Panic");
  Ver += 15;
  ucg.setColor(0, Rfont, Gfont, Bfont);          // font color
  ucg.setColor(1, RBckgrnd, GBckgrnd, BBckgrnd); // background for SOLID mode
  ucg.setPrintPos(Hor, Ver);
  ucg.print("1");
  Hor += 30;
  ucg.setPrintPos(Hor, Ver);
  ucg.print("10");


  Hor += 26;
  ucg.setColor(0, RBckgrnd, GBckgrnd, BBckgrnd); // invert colors
  ucg.setColor(1, Rfont, Gfont, Bfont);          // invert colors
  ucg.setPrintPos(Hor, Ver);
  ucg.print("20");
  Hor += 20;
  ucg.setPrintPos(Hor, Ver);
  ucg.print("100");
  // select fonts
  // ucg.setFont(ucg_font_8x13B_mf);
    ucg.setFont(ucg_font_profont11_mf); //
  // ucg.setFont(ucg_font_helvB08_hr);
  // ucg.setFont(ucg_font_helvB10_hr);
  //ucg.setFont(ucg_font_helvB12_hr);
  // ucg.setFont(ucg_font_ncenR10_tr);
  // ucg.setFont(ucg_font_amstrad_cpc_8r);
  // ucg.setFont(ucg_font_6x13O_tr);


  ucg.setColor(0, Rfont, Gfont, Bfont);          // font color
  ucg.setColor(1, RBckgrnd, GBckgrnd, BBckgrnd); // background for SOLID mode
  Hor = 30;
  Ver += 18;
  ucg.setPrintPos(Hor + 9, Ver); // Hor, Ver
  ucg.print("Color ");
  ucg.setColor(0, RBckgrnd, GBckgrnd, BBckgrnd); // invert colors
  ucg.setColor(1, Rfont, Gfont, Bfont);          // invert colors
  ucg.print(" Test");
  Ver += 20;
  ucg.setColor(0, Rfont, Gfont, Bfont);          // font color
  ucg.setColor(1, RBckgrnd, GBckgrnd, BBckgrnd); // background for SOLID mode
  ucg.setPrintPos(Hor, Ver);
  ucg.print("1");
  Hor += 30;
  ucg.setPrintPos(Hor, Ver);
  ucg.print("10");


  Hor += 26;
  ucg.setColor(0, RBckgrnd, GBckgrnd, BBckgrnd); // invert colors
  ucg.setColor(1, Rfont, Gfont, Bfont);          // invert colors
  ucg.setPrintPos(Hor, Ver);
  ucg.print("20");
  Hor += 20;
  ucg.setPrintPos(Hor, Ver);
  ucg.print("100");
  ucg.setPrintPos(Hor, Ver);
  ucg.print("10");


#ifdef EnableSerial
  Serial.println();
  Serial.print("Red   Font: ");         Serial.println(Rfont, DEC);
  Serial.print("Green Font: ");         Serial.println(Gfont, DEC);
  Serial.print("Blue  Font: ");         Serial.println(Bfont, DEC);
  Serial.print("Red   Background: ");   Serial.println(RBckgrnd, DEC);
  Serial.print("Green Background: ");   Serial.println(GBckgrnd, DEC);
  Serial.print("Blue  Background: ");   Serial.println(BBckgrnd, DEC);
  Serial.println();
#endif // EnableSerial
}//== close TestTextColors ===


//===== ColorsChange ===========================================
void ColorsChange () {
  ucg.setColor(0, 255, 255, 255); // font color
  ucg.setColor(1, 220, 100,  0);   // background color for SOLID mode
}

//===== ColorsSelected ===========================================
void ColorsSelected() {
  ucg.setColor(0, 255, 255, 255);    // color font
  ucg.setColor(1, 128, 128, 110);   // background color for SOLID mode
}//== close ColorsSelected ==

//===== ColorsUnselected ===========================================
void ColorsUnselected() {
  ucg.setColor(0, 180, 180, 170); // font color
  ucg.setColor(1,   0,   0,   0);   // background color for SOLID mode
}//== close ColorsUnselected ==

//=== doEncoderA [ Interrupt on A changing state ]================================
void doEncoderA() {
  cli(); //stop interrupts happening before we read pin values
  Rotating = PIND & 0xC; // read all eight pin values
  if (Rotating == B00001100 && Set_A) { //that we are expecting detent
    encoderPos --; //decrement the encoder's position count
    Set_A = false; //reset flags for the next turn
    Set_B = false; //reset flags for the next turn
  }
  else if (Rotating == B00000100) Set_B = true; //detent from free rotation
  sei(); //restart interrupts
}//== Close doEncoderA ===

//=== doEncoderB [Interrupt on B changing state] ================================
void doEncoderB() {
  cli(); //stop interrupts happening before we read pin values
  Rotating = PIND & 0xC; //read all eight pin values
  if (Rotating == B00001100 && Set_B) { //that we are expecting detent
    encoderPos ++; //increment the encoder's position count
    Set_A = false; //reset flags for the next turn
    Set_B = false; //reset flags for the next turn
  }
  else if (Rotating == B00001000) Set_A = true; //detent from free rotation
  sei(); //restart interrupts
}//== Close doEncoderB ===

/*********( THE END )***********/
```


καλές δοκιμές!

----------

