89164浏览
楼主: 驴友花雕

[项目] 【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2021-6-29 12:51:49

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百六十五:2.4 英寸 TFT LCD 触摸屏模块 XPT2046 PCB ILI9341 240x320 像素 8 位 SPI 串口插接显示器
项目十五:一个字符串和 8 个按顺序改变颜色的实心圆圈

实验场景图 【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-6-29 15:11:43

2、选择了经典字体并使用了一个函数来淡化文本

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  项目十六:选择了经典字体并使用了一个函数来淡化文本



项目十六实验开源代码



  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  4.   项目十六:选择了经典字体并使用了一个函数来淡化文本
  5.   模块直插,引脚用法如下:
  6.   LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK
  7.   Arduino Uno A3 A2 A1 A0 A4 10 11 12 13
  8.   LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7
  9.   Arduino Uno 8 9 2 3 4 5 6 7
  10. */
  11. #include "Adafruit_GFX.h"   // Core graphics library
  12. #include "MCUFRIEND_kbv.h"   // Hardware-specific library
  13. MCUFRIEND_kbv tft;
  14. #include "Fonts/FreeSans9pt7b.h"
  15. #include "Fonts/FreeSans12pt7b.h"
  16. #include "Fonts/FreeSerif12pt7b.h"
  17. #include "FreeDefaultFonts.h"
  18. void showmsgXY(int x, int y, int sz, const GFXfont *f, const char *msg) {
  19.   int16_t x1, y1;
  20.   uint16_t wid, ht;
  21.   tft.setFont(f);
  22.   tft.setCursor(x, y);
  23.   tft.setTextSize(sz);
  24.   tft.println(msg);
  25. }
  26. uint8_t r = 255, g = 255, b = 255;
  27. uint16_t color;
  28. void setup() {
  29.   Serial.begin(9600);
  30.   uint16_t ID = tft.readID();
  31.   tft.begin(ID);
  32.   tft.invertDisplay(true);
  33.   tft.setRotation(1);
  34. }
  35. void loop(void) {
  36.   tft.invertDisplay(true);
  37.   tft.fillScreen(fwrite);
  38.   color = tft.color565(40, 240, 140);
  39.   tft.setTextColor(color);
  40.   showmsgXY(0, 0, 1, &FreeSerif12pt7b, "but they whose heart is firm"); delay(40);
  41.   tft.println(" ");
  42.   tft.println("and grow brave by reflection"); delay(40);
  43.   tft.println(" ");
  44.   tft.println("but they whose heart is firm"); delay(40);
  45.   tft.println(" ");
  46.   tft.println("and grow brave by reflection"); delay(40);
  47.   delay(300);
  48.   for (int j = 0; j < 20; j++) {
  49.     tft.setCursor(60, 210);
  50.     color = tft.color565(r -= 12, g -= 42, b -= 52);
  51.     tft.setTextColor(color);
  52.     tft.println(" ---- Da Vinci ----");
  53.     delay(200);
  54.   }
  55.   while (1);
  56. }
复制代码




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-6-29 15:43:58

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  项目十六:选择了经典字体并使用了一个函数来淡化文本


实验场景图 【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-6-29 17:05:58

3、将一个.jpg图片转换为.c文件并添加到代码中,写了一个字符串并使用淡入淡出代码显示。然后使用滚动代码将屏幕向左移动。下载 .h 文件并将其添加到 Arduino 草图的文件夹中。


【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  项目十七:
画线、实心圆和字符串显示功能

  实验开源代码:


  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  4.   项目十七:画线、实心圆和字符串显示功能
  5.   模块直插,引脚用法如下:
  6.   LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK
  7.   Arduino Uno A3 A2 A1 A0 A4 10 11 12 13
  8.   LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7
  9.   Arduino Uno 8 9 2 3 4 5 6 7
  10. */
  11. #include "Adafruit_GFX.h"
  12. #include "MCUFRIEND_kbv.h"
  13. MCUFRIEND_kbv tft;
  14. uint16_t ox = 0, oy = 0;
  15. int ave = 0, avec = 0, avet = 0;
  16. void aveg(void) {
  17.   int z = 0;
  18.   Serial.println(ave);
  19.   Serial.println(avec);
  20.   avet = ave / avec;
  21.   Serial.println(avet);
  22.   avet = avet * 32;
  23.   for (int i = 0; i < 24; i++) {
  24.     for (uint16_t a = 0; a < 3; a++) {
  25.       tft.drawLine(avet + a, z, avet + a, z + 10, 0xFB21);
  26.     } // thick
  27.     for (uint16_t a = 0; a < 2; a++) {
  28.       tft.drawLine(avet - a, z, avet - a, z + 10, 0xFB21);
  29.     }
  30.     delay(100);
  31.     z = z + 20;
  32.   }
  33. }
  34. void dchart_10x10(uint16_t nx, uint16_t ny) {
  35.   ave += nx;
  36.   avec++;
  37.   nx = nx * 32;
  38.   ny = ny * 48;
  39.   tft.drawCircle(nx, ny, 10, 0x0517);
  40.   tft.drawCircle(nx, ny, 9, 0x0517);
  41.   tft.fillCircle(nx, ny, 7, 0x0517);
  42.   delay (100);
  43.   ox = nx;
  44.   oy = ny;
  45. }
  46. void dotchart_10x10(uint16_t nx, uint16_t ny) {
  47.   ave += nx;
  48.   avec++;
  49.   nx = nx * 32;
  50.   ny = ny * 48;
  51.   int plus = 0;
  52.   float fplus = 0;
  53.   int sign = 0;
  54.   int y = 0, x = 0;
  55.   y = oy;
  56.   x = ox;
  57.   float xmines, ymines;
  58.   xmines = nx - ox;
  59.   ymines = ny - oy;
  60.   if (ox > nx) {
  61.     xmines = ox - nx;
  62.     sign = 1;
  63.   }
  64.   else
  65.     sign = 0;
  66.   for (int a = 0; a < (ny - oy); a++) {
  67.     fplus += xmines / ymines;
  68.     plus = fplus;
  69.     if (sign == 1)
  70.       tft.drawFastHLine(0, y, x - plus, 0xBFDF);
  71.     else
  72.       tft.drawFastHLine(0, y, x + plus, 0xBFDF);
  73.     y++;
  74.     delay(5);
  75.   }
  76.   
  77.   for (uint16_t a = 0; a < 2; a++) {
  78.     tft.drawLine(ox + a, oy, nx + a, ny, 0x01E8);
  79.   } // thick
  80.   for (uint16_t a = 0; a < 2; a++) {
  81.     tft.drawLine(ox, oy + a, nx, ny + a, 0x01E8);
  82.   }
  83.   ox = nx;
  84.   oy = ny;
  85. }
  86. void setup() {
  87.   tft.reset();
  88.   Serial.begin(9600);
  89.   uint16_t ID = tft.readID();
  90.   tft.begin(ID);
  91. }
  92. void loop() {
  93.   tft.invertDisplay(true);
  94.   tft.fillScreen(0xffff);
  95.   dotchart_10x10(3, 0);
  96.   dotchart_10x10(2, 1);
  97.   dotchart_10x10(4, 2);
  98.   dotchart_10x10(4, 3);
  99.   dotchart_10x10(5, 4);
  100.   dotchart_10x10(3, 5);
  101.   dotchart_10x10(6, 6);
  102.   dotchart_10x10(7, 7);
  103.   dotchart_10x10(9, 8);
  104.   dotchart_10x10(8, 9);
  105.   dotchart_10x10(10, 10);
  106.   dchart_10x10(3, 0);
  107.   dchart_10x10(2, 1);
  108.   dchart_10x10(4, 2);
  109.   dchart_10x10(4, 3);
  110.   dchart_10x10(5, 4);
  111.   dchart_10x10(3, 5);
  112.   dchart_10x10(6, 6);
  113.   dchart_10x10(7, 7);
  114.   dchart_10x10(9, 8);
  115.   dchart_10x10(8, 9);
  116.   dchart_10x10(10, 10);
  117.   tft.setRotation(1);
  118.   tft.setTextSize(2);
  119.   tft.setTextColor(0x01E8);
  120.   tft.setCursor(20, 20);
  121.   tft.print("Average");
  122.   int dl = 20;
  123.   for (int i = 0; i < 6; i++) {
  124.     for (uint16_t a = 0; a < 3; a++) {
  125.       tft.drawLine(dl, 40 + a, dl + 10, 40 + a, 0xFB21);
  126.     }
  127.     dl += 16;
  128.   }
  129.   tft.setRotation(0);
  130.   aveg();
  131.   while (1);
  132. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-6-29 17:10:43

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  项目十七:
画线、实心圆和字符串显示功能

  实验场景图  【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-5 08:13:55

偶然搜到的:
2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
参考电原理图

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-5 08:22:05

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 07:27:57

2.4英寸IPS电阻触摸屏 内置ILI9341控制芯片、XPT2046触摸面板控制芯片 兼容Arduino接口

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

IPS屏幕
是基于TFT的一种技术,其实质是TFT屏幕。IPS屏幕(In-Plane Switching,平面转换)技术是日立公司2001推出的液晶面板技术,俗称“Super TFT”。IPS面板的最大特点是:两极在同一个面。不像其它的液晶模式电极在上下两面、立体排列。该技术把液晶分子的排列方式进行了优化,采取水平排列方式。当遇到外界压力,分子结构向下稍微下陷,整体分子呈水平状。遇到外力时,硬屏液晶分子结构坚固性和稳定性优于软屏。不会画面失真,影响画面色彩,最大程度地保护画面的效果。还有一种S-IPS面板,属于IPS的改良型。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 07:38:19

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

触摸屏(Touch Panel)
又称为“触控屏”、“触控面板”,是一种可接收触头等输入讯号的感应式液晶显示装置,当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板,并借由液晶显示画面制造出生动的影音效果。

触摸屏技术产生于70年代,最先应用于美国的军事,此后,该项技术逐渐向民用移转,并且随着电子技术、网络技术的发展和互联网应用的普及,新一代触摸屏技术和产品相继出现,其坚固耐用、反应速度快、节省空间、易于交流等许多优点得到大众的认同。触摸屏作为一种最新的电脑输入设备,它是简单、方便、自然的一种人机交互方式。它赋予了多媒体以崭新的面貌,是极富吸引力的全新多媒体交互设备。主要应用于公共信息的查询、工业控制、军事指挥、电子游戏、多媒体教学等。

触摸屏的本质是传感器,它由触摸检测部件和触摸屏控制器组成。触摸检测部件安装在显示器屏幕前面,用于检测用户触摸位置,接受后送触摸屏控制器;触摸屏控制器的主要作用是从触摸点检测装置接收触摸信息,并将它转换成触点坐标送给CPU,同时能接收CPU发来的命令并加以执行。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 07:47:59

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

电阻式触摸屏
电阻屏最外层一般使用的是软屏,通过按压使内触点上下相连。内层装有物理材料氧化金属,即N型氧化物半导体——氧化铟锡(IndiumTinOxides,ITO),也叫氧化铟,透光率为80%,上下各一层,中间隔开。ITO是电阻触摸屏及电容触摸屏都用到的主要材料,它们的工作面就是ITO涂层,用指尖或任何物体按压外层,使表面膜内凹变形,让内两层ITO相碰导电从而定位到按压点的坐标来实现操控。根据屏的引出线数,又分有4线、5线及多线,门槛低,成本相对价廉,优点是不受灰尘、温度、湿度的影响。缺点也很明显,外层屏膜很容易刮花,不能使用尖锐的物体点触屏面。一般是不能多点触控,即只能支持单点,若同时按压两个或两个以上的触点,是不能被识别和找到精确坐标的。在电阻屏上要将一幅图片放大,就只能多次点击“+”,使图片逐步进阶式放大,这就是电阻屏的基本技术原理。

利用压力感应进行控制。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化。在X和Y两个方向上产生信号,然后传送到触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据模拟鼠标的方式运作。电阻式触摸屏不怕尘埃、水及污垢影响,能在恶劣环境下工作。但由于复合薄膜的外层采用塑胶材料,抗爆性较差,使用寿命受到一定影响。

电阻式触摸屏利用压力感应进行控制,它的表层是一层塑胶,底层是一层玻璃,能承受恶劣环境因素的干扰,但手感和透光性较差,适合佩带手套和不能用手直接触摸的场合。


【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 07:49:27

触摸屏硬件结构和工作原理
依据工作原理和传输介质的不同, 触摸屏主要分电阻式、电容式、红外线式以及表面声波式等多种类型。电阻式触摸屏是一块4层透明的复合薄膜屏,如图所示。下面是玻璃或有机玻璃构成的基层; 上面是一层外表面经过硬化处理从而光滑防刮的塑料层; 中间是两层金属导电层, 在导电层之间有许多细小的透明隔离点把两层隔开。两个金属导电层是触摸屏的工作面, 其两端各涂有一条银胶, 称为触摸屏工作面的一对电极。四线式触摸屏的X 工作面和Y 工作面分别加在两个导电层上, 共有4根引出线, 分别连到触摸屏的X 电极对和Y 电极对上。在触笔触摸屏幕时, 两导电层在接触点处接触。电阻式触摸屏作为输入设备与显示屏配合使用时, 其工作的实质就是通过测量X、Y两个方向电阻的分压, 确定触摸屏的触点坐标, 并将该坐标映射到显示屏坐标上, 从而实现人机交互。由于电阻式触摸屏工作面与外界完全隔离, 受环境影响小, 所以具有不怕灰尘和水汽、稳定性高、不漂移等优点, 特别适合工业现场使用。

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 10:38:22

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1
XPT2046芯片
是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 6V。XPT2046 片内集成有一个温度传感器。 在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。XPT2046 采用微小的封装形式:TSSOP-16,QFN-16 和 VFBGA-48。工作温度范围为-40℃~+85℃。与 ADS7846、TSC2046、AK4182A 完全兼容。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 10:59:45

本帖最后由 驴友花雕 于 2021-7-6 11:14 编辑

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图2

XPT2046基本原理描述
XPT2046 是一种典型的逐次逼近型模数转换器(SAR ADC),包含了采样/保持、模数转换、串口数据 输出等功能。同时芯片集成有一个 2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046 可以单电源供电,电源电压范围为 2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入 1V~VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。选择VBAT、Temp和AUX时应该配置为单端模式;作为触摸屏应用时,应该配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换精度。

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 11:01:00

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 11:08:17

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 11:27:04

本帖最后由 驴友花雕 于 2021-7-6 17:45 编辑

触摸屏的校准:
触摸液晶屏的4个角,采集X和Y坐标的12位值。这时候,就分别得到了X坐标和Y坐标的最小值和最大值,根据液晶屏的分辨率,再通过数学等比公式,就可以通过采集得到的12位ADC值得出现在触摸到屏幕的哪个点了。


【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

简单来说,电阻式触摸屏就是一种传感器,它利用压力感应进行控制,将矩形区域中触摸点(X,Y)的物理位置转换为代表 X坐标和 Y 坐标的电压 电阻式触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层导电层(透明的导电电阻),上面再盖一层经过硬化处理 光滑防擦的塑料层 它的内表面也涂有一层透明导电层层, 在他们之间有许多细小的(小于 1/1000 英寸) 的透明隔离点把两层导电层隔开绝缘 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,其中一面导电层接通 Y 轴方向的 5V 均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行 A/D 转换, 并将得到的电压值与 5V 相比即可得触摸点的 Y 轴坐标, 同理也能得出 X 轴的坐标, 然后再根据模拟鼠标的方式运作。 这就是所有电阻技术触摸屏共同的最基本原理由压力感应得到坐标值的并不能达到 100%的精度,它存在着误差。由于误差的存在, 在触摸屏上所绘制的图形和液晶屏上的图形,对应点的集合会有所偏差 在触摸屏上点击某一按钮或选择某项功能时, 内置的软件便无法对触摸屏上的点击做出正确响应,而触摸屏具有离散性,任意两个触摸点密度都不能完全一致, 所以几乎所有带阻性触摸屏的设备在出厂前均要经过一定的校准 校准是一种图形重建的过程,即将图形经过变换,换算出与液晶屏相一致的点集合, 现有的校准算法主要是用来改善上述中的固有误差。
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-6 12:19:23

本帖最后由 驴友花雕 于 2021-7-6 12:27 编辑

参考电原理图


【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-7 07:58:55


Arduino Uno 数字键盘
一个使用 2.4" TFT 触摸屏程序模拟数字键盘的小程序不充当 USB HID 设备,仅供参考仅在 Arduino UNO 上测试并使用 TFT 触摸屏驱动程序 0x9341

“小键盘”程序功能齐全并具有样式:
“numpad-layout”程序的布局没有样式但确实起作用(占用空间更小),要查看程序运行,请打开“串行监视器”并开始使用。

使用的屏幕:
2.4" TFT 触摸屏 240x320 (MCUFriend)
驱动程序 0x9341


  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验一百六十五:2.4寸TFT液晶触摸屏 彩屏模块 TFT-LCD 高清真彩显示屏
  4.   项目十八:测试并使用 TFT 触摸屏驱动程序 0x9341
  5.   模块直插,引脚用法如下:
  6.   LCD_CS LCD_CD LCD_WR LCD_RD LCD_RST SD_SS SD_DI SD_DO SD_SCK
  7.   Arduino Uno A3 A2 A1 A0 A4 10 11 12 13
  8.   LCD_D0 LCD_D1 LCD_D2 LCD_D3 LCD_D4 LCD_D5 LCD_D6 LCD_D7
  9.   Arduino Uno 8 9 2 3 4 5 6 7
  10. */
  11. #include <Adafruit_GFX.h>
  12. #include <TouchScreen.h>
  13. #include <Adafruit_TFTLCD.h>
  14. #define YP A2  // must be an analog pin, use "An" notation!
  15. #define XM A1  // must be an analog pin, use "An" notation!
  16. #define YM 6   // can be a digital pin
  17. #define XP 7   // can be a digital pin
  18. #define TS_MINX 150
  19. #define TS_MINY 120
  20. #define TS_MAXX 850
  21. #define TS_MAXY 891
  22. //SPI Communication
  23. #define LCD_CS A3
  24. #define LCD_CD A2
  25. #define LCD_WR A1
  26. #define LCD_RD A0
  27. // optional
  28. #define LCD_RESET A4
  29. //Color Definitons
  30. #define BLACK   0x0000
  31. #define WHITE   0xFFFF
  32. #define RED     0xF800
  33. #define GREEN   0x07E0
  34. #define CYAN    0x07FF
  35. #define MINPRESSURE 1
  36. #define MAXPRESSURE 1000
  37. // For better pressure precision, we need to know the resistance
  38. // between X+ and X- Use any multimeter to read it
  39. // For the one we're using, its 300 ohms across the X plate
  40. // Pins A2-A6
  41. TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364);
  42. //2.4 = 240 x 320
  43. //Height 319 to fit on screen
  44. //Size of key containers 70px
  45. #define BOXSIZE 70
  46. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
  47.   //Container variables for touch coordinates
  48.   int X, Y, Z;
  49.   
  50.   //Screen height without hidden pixel
  51.   double tHeight = tft.height()-1;
  52.   //Centering the mid square
  53.   double center = (tft.width()/2)-(BOXSIZE/2);
  54.   //Space between squares
  55.   double padding = 10;
  56.   //Position of squares to the left and right of center
  57.   double fromCenter = BOXSIZE + padding;
  58.   //Second row Y-Axis position
  59.   double secondRow = BOXSIZE + padding;
  60.   //Third row Y-Axis position
  61.   double thirdRow = secondRow + BOXSIZE + padding;
  62.   //Fourth row Y-Axis position
  63.   double fourthRow = thirdRow + BOXSIZE + padding;
  64.   //Y-Axis align for all squares
  65.   double verticalAlign = (tHeight-((BOXSIZE * 4)+(padding * 3)))/2;
  66.   //Left column starting x posision
  67.   double leftColPositionX = center - fromCenter;
  68.   //Mid column starting x posision
  69.   double midColPositionX = center;
  70.   //Right column starting x posision
  71.   double rightColPositionX = center + fromCenter;
  72. void setup() {  
  73.   Serial.begin(9600);
  74.   tft.reset();  
  75.   uint16_t identifier = tft.readID();
  76.   tft.begin(identifier);
  77.   //Background color
  78.   tft.fillScreen(BLACK);
  79.   createButtons();
  80.   Serial.println(F("按 TFT 屏幕上的任意按钮:"));
  81. }
  82. void loop() {
  83.   retrieveTouch();
  84.   int boxHeightRow1 = verticalAlign + BOXSIZE;
  85.   int boxHeightRow2 = secondRow + BOXSIZE;
  86.   int boxHeightRow3 = thirdRow + BOXSIZE;
  87.   int boxHeightRow4 = fourthRow + BOXSIZE;
  88.   if(Z > MINPRESSURE && Z < MAXPRESSURE){
  89.     //Check if element clicked is in left column
  90.     if(X > leftColPositionX && X < (leftColPositionX+BOXSIZE)){
  91.       //Check if element clicked is in row 1
  92.       if(Y > verticalAlign){
  93.         if(Y < boxHeightRow1){
  94.              Serial.println("1");
  95.              delay(150);
  96.         }
  97.         //Check if element clicked is in row 2
  98.         else if(Y < boxHeightRow2){
  99.              Serial.println("4");
  100.              delay(150);
  101.         }
  102.         //Check if element clicked is in row 3
  103.         else if(Y < boxHeightRow3){
  104.              Serial.println("7");
  105.              delay(150);
  106.         }
  107.         //Check if element clicked is in row 4
  108.         else if(Y < boxHeightRow4){
  109.              Serial.println("0");
  110.              delay(150);
  111.         }        
  112.       }
  113.        //Check if element clicked is in mid column
  114.     } else if (X > midColPositionX && X < (midColPositionX+BOXSIZE)){
  115.       //Check if element clicked is in row 1
  116.         if(Y > verticalAlign){
  117.           if(Y < boxHeightRow1){
  118.                Serial.println("2");
  119.                delay(150);
  120.           }
  121.           //Check if element clicked is in row 2
  122.           else if(Y < boxHeightRow2){
  123.                Serial.println("5");
  124.                delay(150);
  125.           }
  126.           //Check if element clicked is in row 3
  127.           else if(Y < boxHeightRow3){
  128.                Serial.println("8");
  129.                delay(150);
  130.           }
  131.           //Check if element clicked is in row 4
  132.           else if(Y < boxHeightRow4){
  133.                Serial.println("0");
  134.                delay(150);
  135.           }      
  136.         }
  137.       //Check if element clicked is in third column
  138.     } else if (X > rightColPositionX && X < (rightColPositionX+BOXSIZE)){
  139.         if(Y > verticalAlign){
  140.           //Check if element clicked is in row 1
  141.           if(Y < boxHeightRow1){
  142.                Serial.println("3");
  143.                delay(150);
  144.           }
  145.           //Check if element clicked is in row 2
  146.           else if(Y < boxHeightRow2){
  147.                Serial.println("6");
  148.                delay(150);
  149.           }
  150.           //Check if element clicked is in row 3
  151.           else if(Y < boxHeightRow3){
  152.                Serial.println("9");
  153.                delay(150);
  154.           }
  155.           //Check if element clicked is in row 3
  156.           else if(Y < boxHeightRow4){
  157.                Serial.println(".");
  158.                delay(150);
  159.           }        
  160.         }
  161.     }
  162.   }
  163. }
  164. void retrieveTouch()
  165. {
  166.     digitalWrite(13, HIGH);
  167.     TSPoint p = ts.getPoint();
  168.     digitalWrite(13, LOW);
  169.     //If sharing pins, you'll need to fix the directions of the touchscreen pins
  170.     pinMode(XM, OUTPUT);
  171.     pinMode(YP, OUTPUT);
  172.   
  173.     //Scale from 0->1023 to tft.width
  174.     X = map(p.x, TS_MAXX, TS_MINX, 0, tft.width());
  175.     Y = map(p.y, TS_MAXY, TS_MINY, 0, tft.height());
  176.     Z = p.z;
  177. }
  178. void createButtons(){
  179.   //(initial x,initial y,width,height,color)
  180.   double secondRowVertialAlign = secondRow + verticalAlign;
  181.   double thirdRowVertialAlign = thirdRow + verticalAlign;
  182.   double fourthRowVertialAlign = fourthRow + verticalAlign;
  183.   /***Draw squares with specified dimensions and position (No Fill)***/
  184.   //(initial x,initial y,width,height,color)
  185.   //First Row
  186.   tft.drawRect(leftColPositionX, verticalAlign, BOXSIZE, BOXSIZE, WHITE);
  187.   tft.drawRect(midColPositionX, verticalAlign, BOXSIZE, BOXSIZE, WHITE);
  188.   tft.drawRect(rightColPositionX, verticalAlign, BOXSIZE, BOXSIZE, WHITE);
  189.   //Second Row
  190.   tft.drawRect(leftColPositionX, secondRowVertialAlign, BOXSIZE, BOXSIZE, CYAN);
  191.   tft.drawRect(midColPositionX, secondRowVertialAlign, BOXSIZE, BOXSIZE, CYAN);
  192.   tft.drawRect(rightColPositionX, secondRowVertialAlign, BOXSIZE, BOXSIZE, CYAN);
  193.   //Third Row
  194.   tft.drawRect(leftColPositionX, thirdRowVertialAlign, BOXSIZE, BOXSIZE, GREEN);
  195.   tft.drawRect(midColPositionX, thirdRowVertialAlign, BOXSIZE, BOXSIZE, GREEN);
  196.   tft.drawRect(rightColPositionX, thirdRowVertialAlign, BOXSIZE, BOXSIZE, GREEN);
  197.   //Fourth Row
  198.   tft.drawRect(leftColPositionX, fourthRowVertialAlign, (BOXSIZE*2)+padding, BOXSIZE, RED);
  199.   tft.drawRect(rightColPositionX, fourthRowVertialAlign, BOXSIZE, BOXSIZE, RED);
  200. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-7 08:08:44

本帖最后由 驴友花雕 于 2021-7-7 08:10 编辑

实验记录:
1、白屏无显示
2、打开串口,程序正在运行,按下任意区域,可打印出数字
3、触摸屏可以使用,而液晶屏无法工作,不知问题出在哪里

【Arduino】168种传感器模块系列实验(165)---2.4寸TFT液晶触...图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-7 09:42:46

这个程序主要使用三个库-
  1. #include <Adafruit_GFX.h> // 核心图形库
  2. #include <Adafruit_TFTLCD.h> // 特定硬件的库
  3. #include <TouchScreen.h> // 触摸屏驱动库
复制代码



前面通过运行的程序,特定硬件库都是使用"MCUFRIEND_kbv.h" 已经可以适配2.4寸的屏幕了。

这里看来白屏问题出在硬件驱动库,Adafruit_TFTLCD.h 相关设置或是函数的使用


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2021-7-7 10:31:07

后来尝试修改:

  1. void setup() {
  2. Serial.begin(9600);
  3. tft.reset();
  4. uint16_t identifier = tft.readID();
  5. tft.begin(identifier);
复制代码




  1. void setup() {
  2. Serial.begin(9600);
  3. tft.reset();
  4. tft.begin(0x9341);
复制代码


直接点明是ILI9341芯片后,屏幕上终于有简单的显示了undefined

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail