Hello,
I have a project with an
MQ7 sensor
ARDUINO UNO
TFT ELEGOO 2.8 DISPLAY
I would like to set a drawline as soon as the ppm result exceeds the red line on the display a warning is activated on the dysplay.
Could anyone help me?
the project code:
#include <Elegoo_GFX.h> // Libreria grafica di base
#include <Elegoo_TFTLCD.h> // Libreria specifica per l'hardware
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define LIGHT_GREY 0xBDF7
#define DARK_GREY 0x7BEF
#define ORANGE 0xFBE0
#define BROWN 0x79E0
#define PINK 0xF81F
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Global Variables
int valueBlock[4];
int posBlock[4];
int prevPosBlock[4];
// Editable Variables
bool proDebug = 0; // TODO - Debug? 0 = No, 1 = Si
bool displayValues = true; // EDIT - Visualizza il valore dei blocchi?
uint16_t graphColor = BLUE; // EDIT - Colore preferito del grafico
uint16_t blockColor = GREEN; // EDIT - Colore preferito blocchi
String graphName = "Misurazione C0"; // EDIT - Titolo
String graphBlock[] = {"PPM", "Pot2"}; // EDIT - Nome Blocchi
int graphRange = 256; // EDIT - Numero massimo possibile di blocchi, ad es. MQ7 R = Da 0 a 1024, ex 1024
int numberOfBlocks = 1; // EDIT - Numero blocchi sul display
// calcolo
const int numberOfMarks = (numberOfBlocks * 2); // calcola la quantità di linee che contrassegnano l'asse x
const int originX = 45; // l'origine del grafico sull'asse x
const int originY = 200; // the origin of the graph on the y axis
const int sizeX = 270; // la dimensione del grafico sull'asse x (lunghezza)
const int sizeY = 150; // la dimensione del grafico sull'asse y (altezza)
int boxSize = (sizeX / numberOfMarks); // calcola la dimensione tra i segni
int mark[] = {boxSize, (boxSize * 2), (boxSize * 3), (boxSize * 4), (boxSize * 5), (boxSize * 6), (boxSize * 7), (boxSize * 8)}; // calcola la posizione dei segni
const int minorSizeY = (originY + 10); // calcola l'origine y dei segni
const int minorSizeX = (originX - 10); // calcola l'origine x dei numeri
int numberSize = (sizeY / 6); // calcola la dimensione tra i numeri
int number[] = {numberSize, (numberSize * 2), (numberSize * 3), (numberSize * 4), (numberSize * 5), (numberSize * 6)}; // calcola la posizione dei numeri
int numberValue = (graphRange / 6); // calculates the value per number
int val[] = {graphRange, (numberValue * 5), (numberValue * 4), (numberValue * 3), (numberValue * 2), numberValue}; // calcola il valore di ogni numero
void drawHome()
{
tft.fillScreen(BLACK);
delay(500);
tft.setCursor(10, 45); // calcola il valore di ogni numero
tft.setTextColor(YELLOW); // imposta il colore del testo
tft.setTextSize(3); // imposta la dimensione del testo
tft.println("MQ SENSOR");
tft.setCursor(10, 80);
tft.setTextColor(CYAN);
tft.setTextSize(3);
tft.println("Misurazione C0");
delay(4000);
tft.fillScreen(WHITE);
delay(500);
}
void drawGraph()
{
// draw title
tft.setCursor(10, 10);
tft.setTextColor(BLUE);
tft.setTextSize(3);
tft.println(graphName);
// draw outline
tft.drawLine(originX, originY, (originX + sizeX), originY, graphColor);
tft.drawLine(originX, originY, originX, (originY - sizeY), graphColor);
// draw lables
for(int i = 0; i < numberOfMarks; i++)
{
tft.drawLine(mark[i], originY, mark[i], minorSizeY, graphColor);
}
// draw lable names
for(int i = 0; i < numberOfMarks; i += 2)
{
tft.setCursor((mark[i] + 6), (originY + 10));
tft.setTextColor(graphColor);
tft.setTextSize(2);
tft.println(graphBlock[i / 2]);
}
// draw numbers
for(int i = 0; i < 6; i++)
{
tft.drawLine(originX, (originY - number[i]), minorSizeX, (originY - number[i]), graphColor);
}
// draw number values
for(int i = 0; i < 6; i++)
{
tft.setCursor((minorSizeX - 30), (number[i] + numberSize));
tft.setTextColor(graphColor);
tft.setTextSize(1);
tft.println(val[i]);
}
}
void graph()
{
// get the values of the sensors
valueBlock[0] = analogRead(A5);
tft.drawLine (45, 110, 300, 110, RED);
if(proDebug)
{
Serial.println(valueBlock[0]);
Serial.println("");
}
// map the sensor values to the graph size
for(int i = 0; i < numberOfBlocks; i++)
{
posBlock[i] = map(valueBlock[i], 0, graphRange, originY, (originY - sizeY));
}
if(proDebug)
{
Serial.println(posBlock[0]);
Serial.println(posBlock[1]);
Serial.println("");
}
// draw the blocks - draw only if value differs
for(int i = 0; i < numberOfBlocks; i++)
{
if(posBlock[i] > (prevPosBlock[i] + 2) || posBlock[i] < (prevPosBlock[i] - 2))
{
prevPosBlock[i] = posBlock[i];
tft.fillRect((mark[i * 2] + 1), (originY - sizeY), (boxSize - 1), sizeY, WHITE);
delay(10);
tft.fillRect((mark[i * 2] + 1), posBlock[i], (boxSize - 1), (originY - posBlock[i]), blockColor);
}
}
// visualizzare i valori dei sensori se la modalità è selezionata
if(displayValues)
{
for(int i = 0; i < numberOfMarks; i += 2)
{
tft.setCursor((mark[i] - 45), (originY - 20));
tft.setTextColor(BLACK, WHITE);
tft.setTextSize(2);
tft.println(valueBlock[i / 2]);
}
}
}
void setup()
{
if(proDebug)
{
Serial.begin(9600);
while(!Serial) {};
}
tft.reset(); // reset the screen
delay(500);
uint16_t identifier = tft.readID();
identifier=0x9341;
tft.begin(identifier);
tft.setRotation(1);
drawHome(); // disegna l'intro - Opzionale
drawGraph(); // disegna il grafico
}
void loop()
{
graph(); // rappresenta graficamente i valori sul grafico
delay(200);
}