#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 2
#define TFT_CS 15
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
#define ENCODER_CLK 14
#define ENCODER_DT 12
#define ENCODER_SW 13
#define Inc 27 //Botão para incrementar o valor de ajuste
#define Dec 26 //Botão para decrementar o valor de ajuste
// Variáveis
int counter = 0;
int c=0, c_0=0, counterValue=0;
bool Incrementa=false,Decrementa=false;
//////// ENCODER ////////
void readEncoder(){
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
counter++; // Clockwise
}
if (dtValue == LOW) {
counter--; // Counterclockwise
}
}
int getCounter(){
int result;
noInterrupts();
result = counter;
interrupts();
return result;
}
void resetCounter(){
noInterrupts();
counter = 0;
interrupts();
}
void setup(){
Serial.begin(115200);
Serial.println();
tft.begin();
tft.setRotation(1); //Sentido do Display 0=Portrait / 1=Landscape
tft.fillScreen(ILI9341_BLACK);
pinMode(Inc, INPUT_PULLUP);//Configura o botão para entrada com Pullup interno
pinMode(Dec, INPUT_PULLUP);//Configura o botão para entrada com Pullup interno
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
tft.setTextColor(ILI9341_WHITE);//Seta a cor do Texto para branco
tft.setTextSize(3); //Seta o tamanho da letra para 3
tft.setCursor(10, 100); //Posiciona o cursor
tft.print("INICIANDO . . ."); // Mensagem inicial
delay(3000);
tft.fillScreen(ILI9341_BLACK); //Limpa o Display (Preto)
result();
tftPrintmask();
tftPrintmask2();
}
void loop(){
c = getCounter();
Serial.print("Counter:"); Serial.println(c);
/// RESET COUNTER
if (digitalRead(ENCODER_SW) == LOW) {
resetCounter();
}
/// ATUALIZA COUNTER
if (isnan(c)) { //Verifica se o valor obtido é ou não um número
Serial.print("ERRO NA LEITUTA DO ENCODER"); //Imprime a mensagem de erro de Leitura do sensor DHT
//tftPrintText(" ERRO ", ILI9341_RED, ILI9341_BLACK, 2, 65, 60, 14, 60); //Mostra a mensagem de erro de Leitura de Temperatura
c_0=0;
}else{
//Se o valor atual for diferente do anterior -> atualiza valor no Display TFT
if(c != c_0){
tft.fillRect(50, 50, 100, 30, ILI9341_BLACK);
tft.setTextSize(2); //Tamanho da fonte da letra
tft.setCursor(60, 60); //Posiciona o cursor
tft.setTextColor(ILI9341_WHITE); //Cor da fonte da letra
tft.print(c); //Escreve o cabeçalho
delay(100);
c_0 = c;
}
}
/// BOTÃO
Incrementa = digitalRead(Inc); //Verifica se o botão de incremento do "Setpoint" foi pressionado
Decrementa = digitalRead(Dec); //Verifica se o botão de decremento do "Setpoint" foi pressionado
//Se botão de incremento pressionado, INCREMENTA VALOR. OBSERVAÇÃO: BOTÃO PRESSIONADO = 0V -> FALSE
if(Incrementa == false){
counterValue = counterValue + 1;
tft.fillRect(50, 180, 100, 30, ILI9341_BLACK);
tft.setTextSize(2); //Tamanho da fonte da letra
tft.setCursor(60, 188); //Posiciona o cursor
tft.setTextColor(ILI9341_WHITE); //Cor da fonte da letra
tft.print(counterValue); //Escreve o cabeçalho
delay(100);
}
//Se botão de decremento pressionado, DECREMENTA VALOR. OBSERVAÇÃO: BOTÃO PRESSIONADO = 0V -> FALSE
if(Decrementa == false){
counterValue = counterValue - 1;
tft.fillRect(50, 180, 100, 30, ILI9341_BLACK);
tft.setTextSize(2); //Tamanho da fonte da letra
tft.setCursor(60, 188); //Posiciona o cursor
tft.setTextColor(ILI9341_WHITE); //Cor da fonte da letra
tft.print(counterValue); //Escreve o cabeçalho
delay(100);
}
/// RESULTADO
if(c>counterValue){
tft.fillCircle(260, 120, 35, ILI9341_GREEN);
}
else{
tft.fillCircle(260, 120, 35, ILI9341_RED);
}
}
//////// TFT ILI9341 ////////
void result(){
tft.setTextSize(1); //Tamanho da fonte da letra
tft.setCursor(230, 175); //Posiciona o cursor
tft.setTextColor(ILI9341_WHITE); //Cor da fonte da letra
tft.print("RESULTADO"); //Escreve o cabeçalho
}
void tftPrintmask(){
int x = 10;
tft.setTextWrap(false);
tft.drawRoundRect(0, 0, 200, 128,8, ILI9341_WHITE); //Desenha o retângulo maior
tft.drawRoundRect(5, 5, 190, 40,8, ILI9341_BLUE); //Desenha o retângulo menor
tft.setTextSize(2); //Tamanho da fonte da letra
tft.setCursor(10, 20); //Posiciona o cursor
tft.setTextColor(ILI9341_WHITE); //Cor da fonte da letra
tft.print("LEITURA ENCODER"); //Escreve o cabeçalho
tft.setCursor(5, 60); //Posiciona o cursor
tft.setTextColor(ILI9341_GREEN); //Cor da fonte da letra
tft.print("Val: ");
}
void tftPrintmask2(){
int x = 10;
tft.setTextWrap(false);
tft.drawRoundRect(0, 128, 200, 110,8, ILI9341_WHITE); //Desenha o retângulo maior
tft.drawRoundRect(5, 133, 190, 40,8, ILI9341_BLUE); //Desenha o retângulo menor
tft.setTextSize(2); //Tamanho da fonte da letra
tft.setCursor(10, 138); //Posiciona o cursor
tft.setTextColor(ILI9341_WHITE); //Cor da fonte da letra
tft.print("AJUSTE ENCODER"); //Escreve o cabeçalho
tft.setCursor(5, 188); //Posiciona o cursor
tft.setTextColor(ILI9341_GREEN); //Cor da fonte da letra
tft.print("Val: ");
}
//Função que escreve valores fracionários no display
void tftPrintValue(float value, uint16_t t_color, uint16_t b_color, uint16_t size, uint16_t col, uint16_t line, uint16_t height, uint16_t width) {
tft.setTextWrap(false);
tft.fillRect(col,line, width, height, b_color); //Desenha um retangulo no Display (limpa parte do display)
tft.setCursor(col, line); //Posiciona o cursor
tft.setTextColor(t_color); //Cor da fonte da letra
tft.setTextSize(size); //Tamanho da fonte da letra
tft.print(value); //Escreve um valor fracionário no display
}
//Função que escreve um texto no display
void tftPrintText(char *text, uint16_t t_color, uint16_t b_color, uint16_t size, uint16_t col, uint16_t line, uint16_t height, uint16_t width) {
tft.setTextWrap(false);
tft.fillRect(col,line, width, height, b_color); //Desenha um retangulo no Display (limpa parte do display)
tft.setCursor(col, line); //Posiciona o cursor
tft.setTextColor(t_color); //Cor da fonte da letra
tft.setTextSize(size); //Tamanho da fonte da letra
tft.print(text); //Escreve um texto no display
}