查看: 1843|回复: 5

M5Core2简易手写板

[复制链接]

该用户从未签到

发表于 2020-9-8 18:00 | 显示全部楼层 |阅读模式
本帖最后由 vany5921 于 2020-9-8 18:09 编辑

      为了理解新功能的触摸屏的使用方法,试着制作了简单的绘画应用。作为参考,M5Core2的library的Example有能确认touch的基本程序。      EhOOHpcUwAAzCOt.jpeg

      M5Core2/src/touch.h
  1. //获取XY坐标
复制代码
  1.   //判断是否触摸
复制代码
绘画应用程序
在触摸的地方画个圆就可以画画了。另外,M5 Core2没有物理按钮,可以通过触摸坐标进行判定。作为功能按键
左键(相当于BtnA):颜色变更
中间键(相当于BtnB):调整圆的大小
右键(相当于Btnk):清除画面


在loop()中处理的按钮判断和圆绘制的代码
  1. void loop() {
  2. TouchPoint_t pos= M5.Touch.getPressPoint();

  3. static bool isPressed = false;

  4. if(!M5.Touch.ispressed()) isPressed = false;

  5. if(pos.y > 1 && pos.x > 1){
  6.    M5.Lcd.fillCircle(pos.x, pos.y, radiusMap[radius], colorMap[color]);
  7. }

  8. if(!isPressed){
  9.    if(pos.y > 240){
  10.      if(pos.x < 120){//btnA
  11.        isPressed = true;
  12.        toggleColor();
  13.      }
  14.      else if(pos.x > 240){ //btnC
  15.        isPressed = true;
  16.        resetScreen();
  17.      }
  18.      else if(pos.x >= 180 && pos.x <= 210){ //btnB
  19.        isPressed = true;
  20.        toggleRadius();
  21.      }
  22.    }
  23. }
  24. delay(10);
  25. }
复制代码
稍微花了点心思的是,使用bool isPresed(),如果手指没有脱离屏幕就不会判定为按下按钮。如果没有这个的话,即使一直按按钮判定范围,按钮也会持续按下去。通过toggle Color(),resetScreen(),togleRadius()进行颜色变更,画面清零,圆尺寸变更。此外,屏幕左上角绘制的圆的颜色和大小样本将以ShowCircleIcon()绘制。
  1. enum {
  2. small = 0,
  3. midium,
  4. large,
  5. radius_threshold,
  6. };

  7. enum {
  8. black = 0,
  9. white,
  10. red,
  11. green,
  12. blue,
  13. yellow,
  14. purple,
  15. pink,
  16. color_threshold,
  17. };

  18. std::map<int, uint32_t> colorMap{
  19.    {black, BLACK},
  20.    {white, WHITE},
  21.    {red, RED},
  22.    {green, GREEN},
  23.    {blue, BLUE},
  24.    {yellow, YELLOW},
  25.    {purple, PURPLE},
  26.    {pink, PINK},
  27. };

  28. std::map<int, uint32_t> radiusMap{
  29.    {small, 10},
  30.    {midium, 15},
  31.    {large, 25},
  32. };

  33. uint32_t color = black;
  34. uint32_t radius = midium;

  35. void toggleColor()
  36. {
  37. color++;
  38. if(color >= color_threshold) color = 0;
  39. showCircleIcon();
  40. }

  41. void toggleRadius()
  42. {
  43. radius++;
  44. if(radius >= radius_threshold) radius = 0;
  45. showCircleIcon();
  46. }

  47. void showCircleIcon()
  48. {
  49. const int L = radiusMap[large];
  50. const int x = L + 2;
  51. const int y = L + 2;
  52. M5.Lcd.fillCircle(x, y, L + 2, WHITE); //reset
  53. if(color == white) M5.Lcd.drawCircle(x, y, radiusMap[radius], BLACK);
  54. else M5.Lcd.fillCircle(x, y, radiusMap[radius], colorMap[color]);
  55. }

  56. void touchsetup()
  57. {
  58. showCircleIcon();
  59. }

  60. void setup() {
  61. M5.begin(true, true, true, true);
  62. Serial.begin(115200);
  63. M5.Lcd.fillScreen(WHITE);
  64. touchsetup();
  65. }

  66. void resetScreen()
  67. {
  68. M5.Lcd.fillScreen(WHITE);
  69. showCircleIcon();
  70. }
复制代码
完整代码如下:
  1. #include <M5Core2.h>
  2. #include <Fonts/EVA_20px.h>
  3. #include <stdio.h>
  4. #include <map>
  5. enum {
  6. small = 0,
  7. midium,
  8. large,
  9. radius_threshold,
  10. };

  11. enum {
  12. black = 0,
  13. white,
  14. red,
  15. green,
  16. blue,
  17. yellow,
  18. purple,
  19. pink,
  20. color_threshold,
  21. };

  22. std::map<int, uint32_t> colorMap{
  23.    {black, BLACK},
  24.    {white, WHITE},
  25.    {red, RED},
  26.    {green, GREEN},
  27.    {blue, BLUE},
  28.    {yellow, YELLOW},
  29.    {purple, PURPLE},
  30.    {pink, PINK},
  31. };

  32. std::map<int, uint32_t> radiusMap{
  33.    {small, 10},
  34.    {midium, 15},
  35.    {large, 25},
  36. };

  37. uint32_t color = black;
  38. uint32_t radius = midium;

  39. void toggleColor()
  40. {
  41. color++;
  42. if(color >= color_threshold) color = 0;
  43. showCircleIcon();
  44. }

  45. void resetScreen()
  46. {
  47. M5.Lcd.fillScreen(WHITE);
  48. showCircleIcon();
  49. }

  50. void toggleRadius()
  51. {
  52. radius++;
  53. if(radius >= radius_threshold) radius = 0;
  54. showCircleIcon();
  55. }

  56. void showCircleIcon()
  57. {
  58. const int L = radiusMap[large];
  59. const int x = L + 2;
  60. const int y = L + 2;
  61. M5.Lcd.fillCircle(x, y, L + 2, WHITE); //reset
  62. if(color == white) M5.Lcd.drawCircle(x, y, radiusMap[radius], BLACK);
  63. else M5.Lcd.fillCircle(x, y, radiusMap[radius], colorMap[color]);
  64. }

  65. void touchsetup()
  66. {
  67. showCircleIcon();
  68. }

  69. void setup() {
  70. M5.begin(true, true, true, true);
  71. Serial.begin(115200);
  72. M5.Lcd.fillScreen(WHITE);
  73. touchsetup();
  74. }

  75. void loop() {
  76. TouchPoint_t pos= M5.Touch.getPressPoint();

  77. static bool isPressed = false;

  78. if(!M5.Touch.ispressed()) isPressed = false;

  79. if(pos.y > 1 && pos.x > 1){
  80.    M5.Lcd.fillCircle(pos.x, pos.y, radiusMap[radius], colorMap[color]);
  81. }

  82. if(!isPressed){
  83.    if(pos.y > 240){
  84.      if(pos.x < 120){//btnA
  85.        isPressed = true;
  86.        toggleColor();
  87.      }
  88.      else if(pos.x > 240){ //btnC
  89.        isPressed = true;
  90.        resetScreen();
  91.      }
  92.      else if(pos.x >= 180 && pos.x <= 210){ //btnB
  93.        isPressed = true;
  94.        toggleRadius();
  95.      }
  96.    }
  97. }
  98. delay(10);
  99. }
复制代码





该用户从未签到

发表于 2020-9-8 19:23 | 显示全部楼层
比较好奇的是,M5Stack 究竟是做内销的,还是主攻出口

该用户从未签到

发表于 2020-9-9 08:25 | 显示全部楼层
明显是出口为主呀

该用户从未签到

 楼主| 发表于 2020-9-10 15:34 | 显示全部楼层
t3486784401 发表于 2020-9-8 19:23
比较好奇的是,M5Stack 究竟是做内销的,还是主攻出口

挣老外的钱,国内刷存在感

该用户从未签到

发表于 2020-9-10 17:40 | 显示全部楼层
vany5921 发表于 2020-9-10 15:34
挣老外的钱,国内刷存在感

国内卖便宜点会好很多,入手个 Proto 单元都要十几块大洋

该用户从未签到

 楼主| 发表于 2020-9-11 11:18 | 显示全部楼层
t3486784401 发表于 2020-9-10 17:40
国内卖便宜点会好很多,入手个 Proto 单元都要十几块大洋

存在差价了就会有贸易商倒卖赚差价
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

arduino程序设计基础 blinker物联网解决方案

热门推荐

【教程】pico+hx711电子秤
【教程】pico+hx711电子秤
pico+hx711电子秤 【前言】 我做过多款电子秤,这次移植到pico上
ESP8266+Onenet平台远程数据传输和控制
ESP8266+Onenet平台远程数
这是我的第一个diy,主要功能实现了onenet云平台温湿度数据的传输和远程控制LED灯平台
【Arduino】108种传感器模块系列实验(48)---三轴ADXL345模块
【Arduino】108种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
震惊!OLED菜单竟只用10行代码就可以完成到完美!!!
震惊!OLED菜单竟只用10行
震惊!OLED菜单竟只用10行代码就可
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表