Sentuhan XPT2046 tidak berfungsi - uji tanpa menyentuh

Display SPI murah ukuran 3,2” dan 2,8” sering dilengkapi lapisan sentuh resistif, yang dibaca oleh chip XPT2046. Saat sentuhan tidak berfungsi, saran yang biasa adalah kalibrasi, ganti library, atau tekan lebih keras. Di penampil foto ESP32 saya, layar kalibrasi menampilkan panahnya dan tidak terjadi apa-apa, sekeras apa pun saya menekan.
Masalahnya, hasil bacaan sentuh sulit dinilai. Angka yang salah bisa karena kabel, kalibrasi, atau tekanan yang terlalu ringan. Ada cara menguji chip tanpa perlu menyentuh layar sama sekali.
Triknya - baca termometernya
Selain input sentuh, XPT2046 bisa mengukur suhunya sendiri. Perintah 0x87 memulai pengukuran itu dan langsung mengembalikan hasilnya. Nilainya hampir tidak berubah, jadi ini sinyal uji yang sempurna.
- Nilai yang stabil berarti chip mendengar perintahmu dan jawabannya sampai ke ESP32.
- Nilai acak, 0 atau 8191, berarti chip tidak menjawab.
Di modul saya, chip yang berfungsi terbaca sekitar 830 di suhu ruang. Punyamu bisa sedikit berbeda. Yang penting nilainya tetap stabil.
Sketch uji
Hanya memakai library SPI. Pin-pinnya milik saya, dengan chip sentuh di bus yang sama dengan display. Ganti dengan pin kamu.
#include <SPI.h>
const int PIN_SCK = 18, PIN_MISO = 19, PIN_MOSI = 23;
const int PIN_TOUCH_CS = 33;
const int PIN_LCD_CS = 5; // keep the display quiet on the shared bus
uint16_t readTemperature() {
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(PIN_TOUCH_CS, LOW);
SPI.transfer(0x87); // start bit, temperature input, reference on
uint16_t raw = SPI.transfer16(0x0000) >> 3; // 12-bit result
digitalWrite(PIN_TOUCH_CS, HIGH);
SPI.endTransaction();
return raw;
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LCD_CS, OUTPUT); digitalWrite(PIN_LCD_CS, HIGH);
pinMode(PIN_TOUCH_CS, OUTPUT); digitalWrite(PIN_TOUCH_CS, HIGH);
SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI);
}
void loop() {
Serial.println(readTemperature());
delay(500);
}
Hasilnya 12 bit, jadi bacaan yang asli paling besar 4095. Nilai 8191 berarti semua bit kembali sebagai 1. Tidak ada yang menggerakkan jalurnya, jadi jalur itu mengambang di high.
Arti angkanya
| Output serial | Artinya |
|---|---|
| Nilai stabil (sekitar 830 di modul saya) | Chip berfungsi. Masalahnya di kalibrasi, pin IRQ, atau library |
| Selalu 0 | MISO tertahan low, sering oleh chip lain di bus |
| Selalu 8191 | Tidak ada yang menjawab. Cek T_CS, T_CLK dan T_DO |
| Melompat-lompat | Kontak longgar |
Dalam kasus saya, chip tidak menjawab, dan penyebabnya dua kabel yang tertukar. Untuk memastikan, tukar MOSI dan MISO di kode lalu jalankan tesnya lagi.
SPI.begin(PIN_SCK, PIN_MOSI, PIN_MISO); // MISO and MOSI swapped, for the test only
Kalau chip sekarang menjawab dengan nilai stabil, T_DIN dan T_DO tertukar di kabel. Di bus bersama, pin 23 ESP32 (MOSI) harus ke SDI layar dan T_DIN, dan pin 19 (MISO) ke SDO layar dan T_DO. Di breadboard, memindahkan kabel ke lubang lain di baris yang sama tidak mengubah apa pun, karena satu baris itu tersambung semua.
Kalau chip menjawab tapi sentuhan masih gagal
- Pin IRQ (T_IRQ) menjadi low saat layar ditekan. Banyak library melewati pembacaan selama pin ini high, jadi pin IRQ yang salah terlihat persis seperti sentuhan yang mati. Cek di pengaturan library-mu.
- Di beberapa modul, pin SDO layar tidak melepas MISO dan merusak bacaan sentuh. Cabut SDO layar. Banyak library display tidak pernah perlu membaca dari layar.
- Lalu lakukan kalibrasi. Nilai mentah baru menjadi koordinat layar setelah kalibrasi.
Tautan
- Datasheet ADS7846, Texas Instruments (bahasa Inggris). XPT2046 adalah tiruan chip ini, dengan perintah yang sama.
- LovyanGFX, library display dan sentuh yang saya pakai (bahasa Inggris)