Adding TFT graph functions

This commit is contained in:
-help 2024-01-28 02:57:19 +02:00
parent 7d6fe95ff9
commit 03c59dc85e
5 changed files with 198 additions and 30 deletions

View File

@ -1,11 +1,157 @@
#include "tft.h" #include "tft.h"
extern Adafruit_ST7789 tft; // LCD display pins
#define TFT_CS 7
#define TFT_RST 12
#define TFT_DC 14
#define MOSI 4 // MOSI
#define SCK 6 // SCK
// Create an instance of the Adafruit ST7789 class using the custom SPI pins
TFT::TFT() Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, MOSI, SCK, TFT_RST);
TFT_Display::TFT_Display()
{ {
} }
TFT::~TFT() TFT_Display::~TFT_Display()
{ {
} }
void TFT_Display::start()
{
tft.init(240, 320); // Init ST7789 320x240
tft.setRotation(1); // Set screen orientation
}
void TFT_Display::init(ReflowProfile *profile)
{
clear();
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
TFT_XY xy = getCenteredTextXY(profile->name);
tft.setCursor(xy.x, xy.y);
tft.println(profile->name);
drawGraph();
}
void TFT_Display::clear()
{
tft.fillScreen(ST77XX_BLACK);
}
TFT_XY TFT_Display::getCenteredTextXY(char *text)
{
TFT_XY xy;
uint8_t textLength = strlen(text);
int16_t x, y;
uint16_t w, h;
w = tft.width();
h = tft.height();
tft.getTextBounds(text, 0, 0, &x, &y, &w, &h);
xy.x = (w - textLength) / 2;
xy.y = (h - 1) / 2;
return xy;
}
TFT_XY TFT_Display::getRightAlignedTextXY(char *text, uint16_t x, uint16_t y)
{
TFT_XY xy;
uint8_t textLength = strlen(text);
int16_t x1, y1;
uint16_t w, h;
w = tft.width();
h = tft.height();
tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
xy.x = x - textLength - 1;
xy.y = y;
return xy;
}
TFT_XY TFT_Display::getLeftAlignedTopTextXY(char *text, uint16_t x, uint16_t y)
{
TFT_XY xy;
uint8_t textLength = strlen(text);
int16_t x1, y1;
uint16_t w, h;
w = tft.width();
h = tft.height();
tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
xy.x = x;
xy.y = y - h - 1;
return xy;
}
void TFT_Display::getMaxTempFromProfile(ReflowProfile *profile)
{
for (uint8_t i = 0; i < 5; i++)
{
if (profile->steps[i].targetTempAtEnd > maxTemp)
{
maxTemp = profile->steps[i].targetTempAtEnd;
}
}
if (maxTemp < 200)
{
maxTemp = 200;
}
else if (maxTemp > 200 && maxTemp < 255)
{
if (maxTemp + 20 > 255)
{
maxTemp = 255;
}
else
{
maxTemp += 20;
}
}
else
{
maxTemp = 255;
}
}
TFT_XY TFT_Display::getXYWithinGraphBounds(uint8_t temp, uint8_t time)
{
TFT_XY xy;
xy.x = graphXY.x + (graphWidth * (time / totalTIme));
xy.y = graphXY.y - (graphHeight * ((temp - minTemp) / (maxTemp - minTemp)));
return xy;
}
void TFT_Display::drawGraph()
{
tft.drawPixel(graphXY.x, graphXY.y, ST77XX_WHITE);
tft.drawFastHLine(graphXY.x, graphXY.y, graphWidth, ST77XX_WHITE);
tft.drawFastVLine(graphXY.x, graphXY.y - graphHeight, graphHeight, ST77XX_WHITE);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(1);
TFT_XY position = getLeftAlignedTopTextXY("20", graphXY.x, graphXY.y);
tft.setCursor(position.x, position.y);
tft.println("20");
}

View File

@ -1,21 +1,44 @@
#ifndef TFT_H #ifndef TFT_Display_h
#define TFT_H #define TFT_Display_h
#include <Arduino.h> #include <Arduino.h>
#include <Adafruit_ST7789.h> // Include the ST7789 library #include <Adafruit_ST7789.h> // Include the ST7789 library
#include <reflow.h>
class TFT { struct TFT_XY
{
int x;
int y;
};
class TFT_Display
{
public: public:
TFT(); TFT_Display();
~TFT(); ~TFT_Display();
void start();
// Add your class methods here // Add your class methods here
void init(ReflowProfile *profile);
void clear(); void clear();
private: private:
// Add your private members here // Add your private members here
TFT_XY getCenteredTextXY(char *text);
TFT_XY getRightAlignedTextXY(char *text, uint16_t x, uint16_t y);
TFT_XY getLeftAlignedTopTextXY(char *text, uint16_t x, uint16_t y);
void getMaxTempFromProfile(ReflowProfile *profile);
uint8_t graphHeight = 180;
uint16_t graphWidth = 256;
TFT_XY graphXY = {32, 220};
uint16_t maxTemp = 0;
uint16_t totalTIme ;
uint8_t minTemp = 20;
TFT_XY getXYWithinGraphBounds(uint8_t temp, uint8_t time);
void drawGraph();
}; };
#endif // TFT_H #endif // TFT_H

View File

@ -59,7 +59,7 @@ ReflowProfile reflowProfiles[] = {
ReflowStep(ReflowProcessState::PREHEAT, 120, 35, EASE_OUT), ReflowStep(ReflowProcessState::PREHEAT, 120, 35, EASE_OUT),
ReflowStep(ReflowProcessState::SOAK, 90, 155), ReflowStep(ReflowProcessState::SOAK, 90, 155),
ReflowStep(ReflowProcessState::REFLOW, 45, 185, EASE_OUT), ReflowStep(ReflowProcessState::REFLOW, 45, 185, EASE_OUT),
ReflowStep(ReflowProcessState::COOL, 45, 155, EASE_IN), ReflowStep(ReflowProcessState::COOL, 45, 155, EASE_OUT),
ReflowStep(ReflowProcessState::DONE, 0, 0)}, ReflowStep(ReflowProcessState::DONE, 0, 0)},
"138c Sn42Bi58\0"), "138c Sn42Bi58\0"),

View File

@ -1,6 +1,5 @@
#include <Arduino.h> #include <Arduino.h>
#include "ArduPID.h" #include "ArduPID.h"
#include <Adafruit_ST7789.h> // Include the ST7789 library
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <voltageReference/AnalogRef.h> #include <voltageReference/AnalogRef.h>
#include <Wire.h> #include <Wire.h>
@ -9,6 +8,7 @@
#include "leds/leds.h" #include "leds/leds.h"
#include "reflow.h" #include "reflow.h"
#include "displays/oled.h" #include "displays/oled.h"
#include "displays/tft.h"
#include "PID/PidController.h" #include "PID/PidController.h"
#include "globals.h" #include "globals.h"
#include "EEPROMDataManager.h" #include "EEPROMDataManager.h"
@ -16,17 +16,6 @@
// LCD display pins
#define TFT_CS 7
#define TFT_RST 12
#define TFT_DC 14
#define MOSI 4 // MOSI
#define SCK 6 // SCK
// Create an instance of the Adafruit ST7789 class using the custom SPI pins
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, MOSI, SCK, TFT_RST);
#define MOSTFET_PIN 17 #define MOSTFET_PIN 17
double currentTemp = 0; double currentTemp = 0;
@ -38,12 +27,10 @@ LEDS leds = LEDS();
// Declare the PID // Declare the PID
ArduPID PID; ArduPID PID;
OledDisplay oled = OledDisplay(); OledDisplay oled = OledDisplay();
TFT_Display tftDisplay ;
TemperatureController temperatureController ;
TemperatureController temperatureController;
void setup() void setup()
{ {
@ -65,6 +52,8 @@ void setup()
reflowProcessState.set(USER_INPUT); reflowProcessState.set(USER_INPUT);
temperatureController.checkPluggedInThermistors(); temperatureController.checkPluggedInThermistors();
tftDisplay.start();
} }
void loop() void loop()
{ {
@ -91,11 +80,20 @@ void loop()
} }
ReflowProcessState newState = reflowProcessState.get(); ReflowProcessState newState = reflowProcessState.get();
if (newState != state) { if (newState != state)
{
Serial.println("State changed from " + String(STATE_STR(state)) + " to " + String(STATE_STR(newState))); Serial.println("State changed from " + String(STATE_STR(state)) + " to " + String(STATE_STR(newState)));
// State changed from state to newState (user input or wifi input needs to be above here) // State changed from state to newState (user input or wifi input needs to be above here)
if (newState == PREHEAT) { if (newState == PREHEAT)
{
// Initalize the TFT
tftDisplay.init(&chosenReflowProfile);
//Start the reflow profile after tft to make sure the timer is accurate
chosenReflowProfile.start(); chosenReflowProfile.start();
// Start the PID
pidController.start(); pidController.start();
} }
} }
@ -122,7 +120,6 @@ void loop()
reflowProcessState.set(USER_INPUT); reflowProcessState.set(USER_INPUT);
} }
// if (step.state == ReflowProcessState::DONE) { // if (step.state == ReflowProcessState::DONE) {
// profile.start(); // profile.start();
// return; // return;

View File

@ -155,6 +155,8 @@ public:
return curStep.calcTempAtPercentage(startTemp, percentage); return curStep.calcTempAtPercentage(startTemp, percentage);
} }
uint8_t getCurrentStepRelativeTime() { uint8_t getCurrentStepRelativeTime() {
uint32_t elapsedTime = timer.elapsed(); uint32_t elapsedTime = timer.elapsed();
uint16_t startTime = startTimes[STEPINDEX(curReflowStep())]; uint16_t startTime = startTimes[STEPINDEX(curReflowStep())];