# XPT2046 Module | Since | Origin / Contributor | Maintainer | Source | | :----- | :-------------------- | :---------- | :------ | | 2017-03-09| [Starofall](https://github.com/nodemcu/nodemcu-firmware/pull/1242)/[Frank Exoo](https://github.com/FrankX0) | [Frank Exoo](https://github.com/FrankX0) | [xpt2046.c](../../app/modules/xpt2046.c)| XPT2046 is a touch controller used by several cheap displays - often in combination with the ILI9341 display controller. The module is built based on the libraries of [spapadim](https://github.com/spapadim/XPT2046/) and [PaulStoffregen](https://github.com/PaulStoffregen/XPT2046_Touchscreen). ## xpt2046.init() Initiates the XPT2046 module to read touch values from the display. It is required to call [`spi.setup()`](spi.md#spisetup) before calling `xpt2046.init` (see example). As the ucg lib also requires [`spi.setup()`](spi.md#spisetup) to be called before it is important to only call it once in total and to activate `spi.FULLDUPLEX`. The `clock_div` used in [`spi.setup()`](spi.md#spisetup) should be 16 or higher, as lower values might produces inaccurate results. #### Syntax `xpt2046.init(cs_pin, irq_pin, height, width)` #### Parameters - `cs_pin` GPIO pin for cs - `irq_pin` GPIO pin for irq - `height` display height in pixel - `width` display width in pixel #### Returns `nil` #### Example ```lua -- Setup spi with `clock_div` of 16 and spi.FULLDUPLEX spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 16,spi.FULLDUPLEX) -- SETTING UP DISPLAY (using ucg module) local disp = ucg.ili9341_18x240x320_hw_spi(8, 4, 0) disp:begin(0) -- SETTING UP TOUCH xpt2046.init(2,1,320,240) xpt2046.setCalibration(198, 1776, 1762, 273) ``` ## xpt2046.setCalibration() Sets the calibration of the display. Calibration values can be obtained by using [`xpt2046.getRaw()`](#xpt2046getraw) and read the values in the edges. #### Syntax `xpt2046.setCalibration(x1, y1, x2, y2)` #### Parameters - `x1` raw x value at top left - `y1` raw y value at top left - `x2` raw x value at bottom right - `y2` raw y value at bottom right #### Returns `nil` ## xpt2046.isTouched() Checks if the touch panel is touched. #### Syntax `xpt2046.isTouched()` #### Returns `true` if the display is touched, else `false` #### Example ```lua if(xpt2046.isTouched()) then local x, y = xpt2046.getPosition() print(x .. "-" .. y) end ``` ## xpt2046.getPosition() Returns the position the display is touched using the calibration values and given width and height. Can be used in an interrupt pin callback to return the coordinates when the touch screen is touched. #### Syntax `xpt2046.getPosition()` #### Returns returns both the x and the y position. #### Example ```lua -- Setup spi with `clock_div` of 16 and spi.FULLDUPLEX spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 16,spi.FULLDUPLEX) -- SETTING UP TOUCH cs_pin = 2 -- GPIO4 irq_pin = 3 -- GPIO0 height = 240 width = 320 xpt2046.init(cs_pin, irq_pin, width, height) xpt2046.setCalibration(198, 1776, 1762, 273) gpio.mode(irq_pin,gpio.INT,gpio.PULLUP) gpio.trig(irq_pin, "down", function() print(xpt2046.getPosition()) end) ``` ## xpt2046.getPositionAvg() To create better measurements this function reads the position three times and averages the two positions with the least distance. #### Syntax `xpt2046.getPositionAvg()` #### Returns returns both the x and the y position. #### Example ```lua local x, y = xpt2046.getPositionAvg() print(x .. "-" .. y) ``` ## xpt2046.getRaw() Reads the raw value from the display. Useful for debugging and custom conversions. #### Syntax `xpt2046.getRaw()` #### Returns returns both the x and the y position as a raw value. #### Example ```lua local rawX, rawY = xpt2046.getRaw() print(rawX .. "-" .. rawY) ```