Εμφάνιση αποτελεσμάτων : 1 έως 4 από 4

Θέμα: ST7735 & Arduino Nano

  1. #1
    Μέλος Το avatar του χρήστη Kernel Panic
    Όνομα
    Kernel Panic
    Εγγραφή
    Aug 2016
    Περιοχή
    Αθήνα
    Μηνύματα
    430

    Προεπιλογή ST7735 & Arduino Nano

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

    0 Not allowed! Not allowed!

  2. #2
    Μέλος Το avatar του χρήστη Fire Doger
    Όνομα
    Στέφανος
    Εγγραφή
    Jan 2015
    Περιοχή
    .
    Μηνύματα
    1.519

    Προεπιλογή

    Τα περισσότερα δεν είναι ίδια γιατί χάνεις πληροφορία από 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)

    2 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη Fire Doger : 03-02-18 στις 14:48

  3. #3
    Μέλος Το avatar του χρήστη Kernel Panic
    Όνομα
    Kernel Panic
    Εγγραφή
    Aug 2016
    Περιοχή
    Αθήνα
    Μηνύματα
    430

    Cool

    Παράθεση Αρχικό μήνυμα από Fire Doger Εμφάνιση μηνυμάτων
    Τα περισσότερα δεν είναι ίδια γιατί χάνεις πληροφορία από 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
    αλλά η Κινεζιά οθονίτσα έχει τα θεματάκια της στην απεικόνιση.
    Δεν φαίνεται να το γλυτώνω το γράψιμο...
    ο.κ. θα το ανεβάσω και εδώ να υπάρχει για κανέναν άλλον

    0 Not allowed! Not allowed!

  4. #4
    Μέλος Το avatar του χρήστη Kernel Panic
    Όνομα
    Kernel Panic
    Εγγραφή
    Aug 2016
    Περιοχή
    Αθήνα
    Μηνύματα
    430

    Red Face Check the Colors ST7735 TFT LCD screen

    εδώ είναι τα αποτελέσματα του κόπου!
    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 )***********/
    καλές δοκιμές!

    2 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. Arduino Nano
    By leuteris107 in forum Μικροελεγκτές
    Απαντήσεις: 5
    Τελευταίο Μήνυμα: 24-12-16, 10:04
  2. Σταθμος Κόλλησης με Arduino Nano.
    By thomasdriver in forum Παρουσίαση Ολοκληρωμένων Κατασκευών
    Απαντήσεις: 10
    Τελευταίο Μήνυμα: 27-09-16, 18:45
  3. ARDUINO NANO
    By electricalgian in forum Ηλεκτρονικά
    Απαντήσεις: 17
    Τελευταίο Μήνυμα: 17-05-16, 19:13
  4. arduino nano
    By FMTRIKALA in forum Μικροελεγκτές
    Απαντήσεις: 1
    Τελευταίο Μήνυμα: 26-11-15, 09:29
  5. Ραδιόφωνο FM με Arduino nano
    By CLOCKMAN in forum Παρουσίαση Ολοκληρωμένων Κατασκευών
    Απαντήσεις: 27
    Τελευταίο Μήνυμα: 16-02-15, 17:38

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας