projets de S3 s4 2021
Dependencies: mbed TFT_fonts SPI_TFT_ILI9341
Diff: main.cpp
- Revision:
- 6:13d0de9e679c
- Parent:
- 5:80791250acb2
- Child:
- 8:eb61367f53ce
--- a/main.cpp Thu Jan 10 04:31:29 2019 +0000 +++ b/main.cpp Sat Jan 12 03:48:27 2019 +0000 @@ -1,8 +1,21 @@ +/* KL25Z mbed library for ILI9341 touch devices + * SPI Interface + + * Uses Peter Drescher ILI9341 Library + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + #include "mbed.h" #include "SPI_TFT_ILI9341.h" #include "Arial12x12.h" -#include "BMP565.h" -#include "stdio.h" #include "touch.h" @@ -19,17 +32,23 @@ #define PIN_CS_SD PTA4 -SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_BL_TFT, PIN_DC_TFT, "TFT"); +SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_BL_TFT, PIN_DC_TFT, "TFT"); //PIN_BL_TFT does not have to be connected TouchScreen tft(PIN_XP, PIN_YP, PIN_XM, PIN_YM); //init TouchScreen port pins // Paint application - Demonstate both TFT and Touch Screen -int ColorPaletteHigh = 15; -int color = White; //Paint brush color +int ColorPaletteHigh = 15; //Height of color palette +int color = White; //Paint brush initial color unsigned int colors[16] = {Red, Green, Blue, Cyan, Yellow, Purple, Pink, Black, Orange, Brown, BlueGreen, White, LightPink, DarkGrey, DarkGreen, Mustard}; -int RXPLATE = 350; +int RXPLATE = 350; //Set this to the resistance measured across XP and XM int Q = 1024; //10 bit TSC Resolution +float TS_MINX = 5500; //Set this to screen x min +float TS_MAXX = 58100; //Set this to screen x max +float TS_MINY = 4700; //Set this to screen y min +float TS_MAXY = 57600; //Set this to screen y max +int PRESSURE = 200; //Set this to max pressure (z) that will register as a touch event +int v[3] ={0,0,0}; //array to roll touches for comparison and validation, initialized at zero briefly. struct point { @@ -53,10 +72,10 @@ Point getPoint(){ float z; - int y2 = tft.readTouch(PTB3,PTB1,PTB2,PTB0); //a(analog),i(analog),n(digital),m(digital) - int x2 = tft.readTouch(PTB2,PTB0,PTB3,PTB1); - int z2 = tft.readTouch(PTB0,PTB3,PTB2,PTB1); - int z1 = tft.readTouch(PTB3,PTB0,PTB2,PTB1); + int y2 = tft.readTouch(PTB3,PTB1,PTB2,PTB0); //a(analog),i(analog),n(digital),m(digital) + int x2 = tft.readTouch(PTB2,PTB0,PTB3,PTB1); //Resources to help set these up + int z2 = tft.readTouch(PTB0,PTB3,PTB2,PTB1); //http://electronics.stackexchange.com/questions/113223/4-wire-resisitive-touch-screen-not-working + int z1 = tft.readTouch(PTB3,PTB0,PTB2,PTB1); //http://www.ti.com/lit/an/sbaa155a/sbaa155a.pdf if (z1!=0){ z = (float)z2/(float)z1; @@ -67,52 +86,46 @@ int y = y2; return point(x,y,z); } + int main(){ TFT.claim(stdout); // send stdout to the TFT display TFT.set_orientation(0); - //TFT.Bitmap(28,90,265,65,p1); - //wait(1); - //TFT.cls(); - TFT.set_font((unsigned char*) Arial12x12); - TFT.foreground(Cyan); // set chars to Cyan - TFT.background(Purple); // set background to Purple - TFT.locate(80,90); - //printf("Initializing z...\r\n"); + TFT.set_font((unsigned char*) Arial12x12); //set font to arial 12x12 + TFT.foreground(Cyan); // set text chars to Cyan + TFT.background(Purple); // set text background to Purple + for(int i = 0; i<16; i++){ - TFT.fillrect(i*15, 0, 15*(i+1), ColorPaletteHigh, colors[i]); + TFT.fillrect(i*15, 0, 15*(i+1), ColorPaletteHigh, colors[i]); //Fill color palete with 16 colors defined in SPI_TFT_ILI9341.h } - float TS_MINX = 5500; - float TS_MAXX = 58100; - float TS_MINY = 4700; - float TS_MAXY = 57600; - int PRESSURE = 200; while(1){ // a point object holds x y and z coordinates. - //TFT.BusEnable(false); Point p = getPoint(); - //TFT.BusEnable(true); //map the ADC value read to into pixel co-ordinates - p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240); - p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320); - p.z = p.x * RXPLATE / Q * (p.z -1); - // we have some minimum pressure we consider 'valid' - // pressure of 0 means no pressing! + p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240); //Use map functionm to size p.x to screen size + p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320); //Use map functionm to size p.y to screen size + p.z = 20+p.x * RXPLATE / Q * (p.z -1); //Calc p.z based on above reference links + + v[2]=v[1]; //Rotate p.z touch values in array + v[1]=v[0]; + v[0]=p.z; + /*TFT.locate(60,90); - printf("x = %d \r\n", p.x); + printf("x = %d \r\n", p.x); //Uncomment these to see point data on screen and to obtain calibration values TFT.locate(60,110); printf("y = %d \r\n", p.y); TFT.locate(60,130); - printf("z = %d \r\n", p.z); - //TFT.locate(60,170);*/ - //printf("Initializing z...%d \r\n",zx); - if (p.z > 40 && p.z < PRESSURE) { + printf("z = %d \r\n", p.z);*/ + + // we have some minimum pressure we consider 'valid' + // pressure of 0 means no pressing! + if (p.z > 40 && p.z < PRESSURE & p.z == (v[1]+v[2])/2) { //Validate that p.z senses a touch event // Detect paint brush color change if(int(p.y) < ColorPaletteHigh+2){ - color = colors[int(p.x)/15]; + color = colors[int(p.x)/15]; //Touch event occured in color palette, change color. }else{ - TFT.fillcircle(int(p.x),int(p.y),2,color); + TFT.fillcircle(int(p.x),int(p.y),2,color); //Touch event caused paint event with 2 pixel brush } } }