#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define WHITE 0xFFFF
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
float xMin = 0, xMax = 10; // Minimum and maximum x-axis values
float yMin = 0, yMax = 100; // Minimum and maximum y-axis values
const int totalsample=11;
float pointX[totalsample] = {-61,2,3,44,50,60,74,88,90,105,181}; // X-coordinate of the point
float pointY[totalsample] = {10,10,20,23,23,23,23,23,23,23,200}; // Y-coordinate of the point
int graphWidth = 320; // Width of the display
int graphHeight = 240; // Height of the display
// Calculate scaling factors
float xScale = graphWidth / (xMax - xMin);
float yScale = graphHeight / (yMax - yMin);
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(0); // Adjust rotation if needed
tft.fillScreen(ILI9341_BLACK);
//int xAxisY = map(0, yMin, yMax, graphHeight, 0);
//Serial.println(xAxisY);
tft.fillRect(20,20,220,3,WHITE); //y axis
tft.fillRect(20,20,3,300,WHITE);//x axis
//tft.drawFastHLine(10, 10, 3,WHITE);
// Draw the point
draw(pointX,pointY);
// tft.fillCircle(pointYPixel, pointXPixel+19, 3, ILI9341_RED);
Serial.println(getMax(pointX));
}
void loop() {
// Your code here, if needed
}
void textX(int x,int x_pos){
tft.setRotation(0);
tft.setCursor(305,x_pos-5);
tft.print(x);
tft.setRotation(0);
}
void textY(int y,int y_pos){
tft.setRotation(3);
tft.setCursor(0,-3+map(y_pos,20,220,220,20));
tft.print(y);
tft.setRotation(0);
//tft.setCursor(0,map(y,20,220,220,20));
//serial.println()
}
void draw(float *x, float *y){
float maxY=getMax(y);
float labelTextX[totalsample];
for (int i =0;i<totalsample;i++){
labelTextX[i]=x[i];
}
adjustXScale(x);
float pointXPixel = 20;
if(x[0]!=0) pointXPixel=x[0]+25;
float pointYPixel = 20;
if(y[0]!=0) pointYPixel=y[0]+25;
tft.fillRect(20,pointXPixel-1,pointYPixel-20,3,ILI9341_RED); //y axis
tft.fillCircle(pointYPixel, pointXPixel, 3, ILI9341_RED);
drawLevel(labelTextX[0],y[0],x[0]+20,pointYPixel);
for (int i=1;i<totalsample;i++){
if(x[i]!=0&&x[i]!=x[i-1]) pointXPixel = x[i]+i*8+25; // Mirror x-coordinate
if(y[i]!=0&&y[i]!=y[i-1]) pointYPixel = y[i]+i*8+20;
tft.fillRect(20,pointXPixel-1,pointYPixel-20,3,ILI9341_RED); //y axis
tft.fillCircle(pointYPixel, pointXPixel, 3, ILI9341_RED);
drawLevel(labelTextX[i],y[i],20+8*i+x[i],pointYPixel);
}
}
void drawLevel(int x,int y,int x_pos,int y_pos){
// Draw labels
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);
textX(x,x_pos);
textY(y,y_pos);
}
float getMax(float maxN[]){
float maxValue = maxN[0];
for (int i = 1; i < totalsample; i++) {
if (maxN[i] > maxValue) {
maxValue = maxN[i];
}
}
return maxValue;
}
float getMin(float minN[]){
float minValue = minN[0];
for (int i = 1; i < totalsample; i++) {
if (minN[i] < minValue) {
minValue = minN[i];
}
}
return minValue;
}
float adjustXScale(float *x){
float maxX=getMax(x);
float minX=getMin(x);
if(maxX>200&&minX<0)
for (int i=0;i<totalsample;i++){
x[i]=map(x[i],minX,maxX,0,200);
}
else if(maxX>200&&minX>=0)
for (int i=0;i<totalsample;i++){
x[i]=map(x[i],0,maxX,0,200);
}
else if(maxX<200&&minX<0)
for (int i=0;i<totalsample;i++){
x[i]=map(x[i],minX,200,0,200);
}
}
float adjustYScale(float *y){
float maxY=getMax(y);
float minY=getMin(y);
if(maxY>200&&minY<0)
for (int i=0;i<totalsample;i++){
x[i]=map(x[i],minX,maxX,0,200);
}
else if(maxY>200&&minY>=0)
for (int i=0;i<totalsample;i++){
x[i]=map(x[i],0,maxX,0,200);
}
else if(maxY<200&&minY<0)
for (int i=0;i<totalsample;i++){
x[i]=map(x[i],minX,200,0,200);
}
}