Κώδικας:
/* 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 )***********/
καλές δοκιμές!