1

this code runs fine until I add in the if statement surrounding the draw screen() method. upon clicking the screen, the program instantly crashes, turning the screen white. any help would be appreciated.

"
// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#include <stdint.h>
#include "TouchScreen.h"
#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin


// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Adafruit_TFTLCD tft;
int six;
int hundred;
int twenty;
int ten;
int four;
int eight;
int two;
int twelve;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
void setup()
{
  Serial.begin(9600);
  Serial.println(F("TFT LCD test"));
  tft.reset();
  uint16_t identifier = tft.readID();

  tft.begin(identifier);
  tft.fillScreen(BLACK);

  six = random(1, 6);
  eight = random(1, 8);
  twenty = random(1, 20);
  hundred = random(1, 100);
  four = random(1, 4);
  ten = random(1, 10);
  two = random(1, 2);
  twelve = random(1, 12);

  tft.setTextColor(WHITE);  tft.setTextSize(4);
  drawNumbers();

}

void loop() {

  six = random(1, 6);
  eight = random(1, 8);
  twenty = random(1, 20);
  hundred = random(1, 100);
  four = random(1, 4);
  ten = random(1, 10);
  two = random(1, 2);
  twelve = random(1, 12);
  if (ts.getPoint().z != 0) {
    drawNumbers();
  }



}

void drawNumbers() {
  tft.setCursor(0, 0);
  tft.fillScreen(BLACK);
  tft.println("D2: " + String(two));
  tft.println("D4: " + String(four));
  tft.println("D6: " + String(six));
  tft.println("D8: " + String(eight));
  tft.println("D10: " + String(ten));
  tft.println("D12: " + String(twelve));
  tft.println("D20: " + String(twenty));
  tft.println("D100: " + String(hundred));


}"

this library seems largely ill documented, but this seems egreigous if its not on my end.

2
  • 1
    how can you possibly know that the program crashed?
    – jsotola
    Jul 29 '21 at 6:26
  • Welcome to SE/Arduino! Please take the tour to learn how this site works. -- Check what ts.getpoint() returns. -- As it seems, the "Touchscreen" module is some local library. Would you mind to provide a link, please? Edit your question, don't add a comment. Jul 29 '21 at 9:01
1

Updated:

  • Provided info not revelant.

I would approach the problem like this. What if anything is returned by getPoint.

  if (ts.getPoint().z != 0) {
    drawNumbers();
  }

To

  auto pt = ts.getPoint().z;
  Serial.print("Point: ");
  Serial.println(pt);

  if (pt != 0) {
    drawNumbers();
  }

This would tell me if I am getting a value back or if it is a problem elsewhere.

Hope this helps.

6
  • hi, first of all, thanks for replying. That method itself doesn't seem to be the issue, it'll run fine on its own. The issue is when the if statement and the touchscreen getpoint method is invoked the program crashes. I am able to print using that method without issue. Jul 29 '21 at 10:58
  • Ignore my original answer. After some extra testing the String class now now supports your use. I shall instead add a tip. Jul 29 '21 at 11:01
  • @cptcrabcakes Sorry, I think my original answer was not upto date. I have amended. Jul 29 '21 at 11:17
  • The serial monitor is reporting point data back, which makes me think this isnt a true crash, just the graphics library freaking out. Jul 29 '21 at 11:42
  • 1
    Someone marked the answer down as not useful despite the fact it helped diagnose the error was elewhere? Ok. Jul 29 '21 at 12:13
1

Figured it out

the TFT screen im using forces the sharing of pins being used for analog and digital together. By starting my draw method with pinMode() i set the pins to be treated as the touchscreen's

void drawNumbers() {
    pinMode (XM, OUTPUT);
  pinMode (YP, OUTPUT);
  tft.setCursor(0, 0);
  tft.fillScreen(BLACK);
  tft.println("D2: " + String(two));
  tft.println("D4: " + String(four));
  tft.println("D6: " + String(six));
  tft.println("D8: " + String(eight));
  tft.println("D10: " + String(ten));
  tft.println("D12: " + String(twelve));
  tft.println("D20: " + String(twenty));
  tft.println("D100: " + String(hundred));


}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.