Hi Arduino-Community,
I'm working in a project with an ILI9341-Touchscreen (Adafruit 2.8" TFT LCD with resistive touchscreen (1770)). I followed the HowTo-Guide and everything worked perfectly so far.
The project is supposed to monitor some environmental data, show them on screen and save them to SD-Card( MicroSD card breakout board+ (254)). A RTC (Adafruit DS3231 Precision RTC Breakout (3013) keeps track of time. The touchscreen is also used for configuration purposes. When the screen is touched anywhere a menu opens and gives the user some options.
When I did a 24h test, I detected some strange behaviour. Every couple of hours the menu opens without any touch input. Because this happens so few I find it difficult to debug. I've searched the web for a couple of hours now and came up with nothing related to my problem.
Do you have an idea how I could investigate this bug or has this happend to you also?
Additional Information:
- An Arduino Mega 2560 is used
- I did a calibration by measunging the resistance between X+ and X- and put it in the code (345 Ohms).
- I tried to play with the MIN- and MAXPRESSURE values to no avail.
- As of now I did a workaround to close the menu after 5 min, but I would like to do it propper :-).
- I used this code in my loop function to detect if the screen was pressed:
if (ts.pressure() > minPressure) {
configurationMenu(); //opens configuration menu
}
My suggestions so far:
- some mixup between the SD-Card-Reader and the screen because both use the SPI-Interface
- accessing the touchscreen ts without using a TSPoint
- I've done something stupid
I'm very thankful for your input and suggestions.
Because my code has a couple of thousand lines, I cut it to the relevant parts. If you need more please ask.
//==============================================
//LIBRARIES
//==============================================
//ili9341 Touchscreen
#include <Adafruit_GFX.h> //look at this library for drawing and text commands
#include <Adafruit_ILI9341.h>
#include <TouchScreen.h>
//==============================================
//VARIABLES and CONSTANTS
//==============================================
/*TOUCH*/
//Pins for reading the touchscreen
#define YP A2 // must be an analog pin, use "An" notation!
#define XM A3 // must be an analog pin, use "An" notation!
#define YM 9 // can be any digital pin
#define XP 8 // can be any digital pin
//Calibration data to convert raw touch data to screen coordinates. If touchscreen readings are inaccurate these need to be changed. A good way to adjust these is to look at the breakouttouchpaint example.
#define TS_MINX 120
#define TS_MINY 80
#define TS_MAXX 900
#define TS_MAXY 904
//define min/max pressure of the touchscreen
#define MINPRESSURE 10
#define MAXPRESSURE 1000
/*SCREEN*/
//Pins for the screen
#define TFT_CS 46
#define TFT_DC 48
//Calibration for pressure detection on the touchscreen. If calibration is necessary replace number value with the resistance between X+ and X- on the touchscreen breakout (use a multimeter for measuring)
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 345);
unsigned int minPressure = 100; //minimal pressure to detect a screen press
//Create touchscreen object
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//==============================================
//SETUP
//==============================================
void setup() {
Serial.begin(9600);
//DISPLAY
tft.begin(); //Start screen
tft.fillScreen(ILI9341_BLACK); //make screen black to overwrite anything shown before
tft.setRotation(1); //set screen to landscape
}
//==============================================
//LOOP
//==============================================
void loop() {
if (ts.pressure() > minPressure) {
configurationMenu(); //opens configuration menu
}
}
//do other stuff