// https://forum.arduino.cc/t/how-to-see-arduino-ide-serial-plotter-on-a-tft-1-8-display/1380585/
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "MCUFRIEND_kbv.h"
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320
#define COLUMN_0 0
#define ROW_0 0
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// RGB565 (RRRRR GGGGGG BBBBB) (31, 63, 31)
#define BLK 0x0000
#define WHT 0xFFFF
#define GRY 0x7BEF
#define RED 0xF800
#define ORG 0xFC80
#define YEL 0xFFE0
#define LYL 0xFFF0
#define LIM 0x7FEF
#define GRN 0x03E0
#define CYN 0x07FF
#define BLU 0x001F
#define PUR 0xC018
#define MAG 0xF81F
#define PNK 0xFDF9
int aOrg = 50, bOrg = 125, cOrg = 200, dOrg = 275; // centerline for each trace
int aVal, bVal, cVal, dVal; // analog pin readings
int aValx, bValx, cValx, dValx; // old analog readings
int xVal = 1, xValx, PEAK = 25; // movement and static values
void setup() {
Serial.begin(115200);
tft.begin();
tft.setRotation(0); // 0 vertical / 1 horizontal
tft.fillScreen(BLK);
tft.drawRect(COLUMN_0, ROW_0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, GRY);
drawMinMax();
}
void loop() {
readAnalogPins();
eraseColumn();
trace();
// displayValues();
}
// draw functions
// tft.drawPixel(uint16_t x, uint16_t y, uint16_t color);
// tft.drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);
// tft.drawFastVLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);
// tft.drawFastHLine(uint8_t x0, uint8_t y0, uint8_t length, uint16_t color);
// tft.drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint16_t bg, uint8_t size);
// tft.drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);
void drawMinMax() {
tft.drawFastHLine(COLUMN_0, aOrg + PEAK, SCREEN_WIDTH - 1, PNK);
tft.drawFastHLine(COLUMN_0, aOrg - PEAK, SCREEN_WIDTH - 1, PNK);
tft.drawFastHLine(COLUMN_0, bOrg + PEAK, SCREEN_WIDTH - 1, LYL);
tft.drawFastHLine(COLUMN_0, bOrg - PEAK, SCREEN_WIDTH - 1, LYL);
tft.drawFastHLine(COLUMN_0, cOrg + PEAK, SCREEN_WIDTH - 1, LIM);
tft.drawFastHLine(COLUMN_0, cOrg - PEAK, SCREEN_WIDTH - 1, LIM);
tft.drawFastHLine(COLUMN_0, dOrg + PEAK, SCREEN_WIDTH - 1, CYN);
tft.drawFastHLine(COLUMN_0, dOrg - PEAK, SCREEN_WIDTH - 1, CYN);
}
void eraseColumn() {
tft.drawLine(xVal, 1, xVal, SCREEN_HEIGHT - 3, BLK); // vertical black line to clear previous trace
tft.drawPixel(xValx, aOrg + PEAK, PNK);
tft.drawPixel(xValx, aOrg - PEAK, PNK);
tft.drawPixel(xValx, bOrg + PEAK, LYL);
tft.drawPixel(xValx, bOrg - PEAK, LYL);
tft.drawPixel(xValx, cOrg + PEAK, LIM);
tft.drawPixel(xValx, cOrg - PEAK, LIM);
tft.drawPixel(xValx, dOrg + PEAK, CYN);
tft.drawPixel(xValx, dOrg - PEAK, CYN);
}
void trace() {
tft.drawPixel(xVal, aOrg + aVal, RED);
tft.drawPixel(xVal, bOrg + bVal, YEL);
tft.drawPixel(xVal, cOrg + cVal, GRN);
tft.drawPixel(xVal, dOrg + dVal, BLU);
xVal++; // move to next pixel
if (xVal == SCREEN_WIDTH - 2) { // if at OLED right edge
xVal = 1; // reset xVal to left edge
}
xValx = xVal; // store old x value
delay(10); // 10ms is about 2 seconds per trace, 25MS about 4 seconds
}
void readAnalogPins() {
// read analog pin values
aVal = map(analogRead(A0), 0, 1023, -PEAK, PEAK);
bVal = map(analogRead(A1), 0, 1023, -PEAK, PEAK);
cVal = map(analogRead(A2), 0, 1023, -PEAK, PEAK);
dVal = map(analogRead(A3), 0, 1023, -PEAK, PEAK);
// store old values
aValx = aVal;
bValx = bVal;
cValx = cVal;
dValx = dVal;
}
void displayValues() {
spacepad(xVal);
spacepad(aVal);
spacepad(bVal);
spacepad(cVal);
spacepad(dVal);
Serial.println();
}
void spacepad(int val) {
Serial.print(" ");
if (val >= 0 && val < 100) Serial.print(" ");
if (val >= 0 && val < 10) Serial.print(" ");
if (val > -10 && val < 0) Serial.print(" ");
Serial.print(val);
}