Использование touchscreen.getpoint приводит к мгновенному сбою программы

tft

этот код работает нормально, пока я не добавлю оператор if, окружающий метод draw screen (). при нажатии на экран программа мгновенно выходит из строя, делая экран белым. любая помощь будет признательна.

"
// 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));


}"

эта библиотека кажется в значительной степени плохо документированной, но это кажется невероятным, если это не с моей стороны.

, 👍1

Обсуждение

как вы можете знать, что программа потерпела крах?, @jsotola

Добро пожаловать в SE/Arduino! Пожалуйста, пройдите [экскурсию], чтобы узнать, как работает этот сайт. -- Проверьте, что возвращает ts.getpoint (). -- Как кажется, модуль "Сенсорный экран" - это какая-то локальная библиотека. Не могли бы вы предоставить ссылку, пожалуйста? [Редактировать] ваш вопрос, не добавляйте комментарий., @the busybee


2 ответа


1

Обновлено:

  • Предоставленная информация не разглашается.

Я бы подошел к проблеме так. Что делать, если что-то возвращается getPoint.

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

Чтобы

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

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

Это подскажет мне, возвращаю ли я ценность или это проблема в другом месте.

Надеюсь, это поможет.

,

привет, прежде всего, спасибо, что ответили. Сам по себе этот метод, похоже, не является проблемой, он будет работать нормально сам по себе. Проблема в том, что при вызове оператора if и метода getpoint с сенсорным экраном происходит сбой программы. Я могу печатать с помощью этого метода без проблем., @cptcrabcakes

Проигнорируйте мой первоначальный ответ. После некоторого дополнительного тестирования класс String теперь поддерживает ваше использование. Вместо этого я добавлю чаевые., @voidPointer

@cptcrabcakes Извините, я думаю, что мой первоначальный ответ не был актуальным. Я внес поправки., @voidPointer

Последовательный монитор передает данные о точках, что заставляет меня думать, что это не настоящий сбой, просто графическая библиотека выходит из себя., @cptcrabcakes

@cptcrabcakes Вы можете получить более качественную помощь, если сможете предоставить информацию, такую как платформа, которую вы используете, например Uno, Nano и т. Д., И подробную информацию об экране в вопросе., @voidPointer

Кто-то пометил ответ как бесполезный, несмотря на то, что он помог диагностировать, где была ошибка? ОК., @voidPointer


1

Понял это

TFT - экран, который я использую, заставляет совместно использовать контакты, используемые для аналогового и цифрового вместе. Запустив свой метод рисования с помощью pinMode (), я настроил контакты так, чтобы они обрабатывались как на сенсорном экране.

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));


}
,