mirror of
https://github.com/arwidcool/Solder-Plate.git
synced 2024-11-24 15:00:15 +01:00
Adding TFT graph functions
This commit is contained in:
parent
7d6fe95ff9
commit
03c59dc85e
@ -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");
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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"),
|
||||||
|
|
||||||
|
35
src/main.cpp
35
src/main.cpp
@ -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;
|
||||||
|
@ -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())];
|
||||||
|
Loading…
Reference in New Issue
Block a user