• [ESP32 IDF+Vscode]OLED多级菜单显示(摇杆控制)


    ADC介绍

    ESP32集成了两个 12SAR(逐次逼近寄存器)adc ,共支持18个测量通道。

    1、两个 ADC 通道简介:

    ADC1:

    • 支持 8 个通道,包括:GPIO32 - GPIO39(并非按顺序)

    ADC2:

    • 支持 10 个通道,包括:GPIO0, GPIO2, GPIO4, GPIO12 - GPIO15, GOIO25 - GPIO27(并非按顺序)

    ESP32 内置霍尔传感器,采用 ADC1 的通道0和3(GPIO36 和 GPIO39)。如果想要使用ESP32内置的霍尔传感器,请不要对这两个GPIO做任何配置! 

    接线方式

    Ps2---        ----ESP32

    VRY                ADC_CHANNEL_6(GPIO 34)

    VRX                ADC_CHANNEL_7(GPIO 35)

    SW                  GPIO_NUM_12

    效果

     

     

     代码

    1. void Get_keyNum(void)
    2. {
    3. uint8_t KeyNum = 0;
    4. BaseType_t err;
    5. //int val_x = adc1_get_raw(PS2_X_CHANNEL);
    6. if (adc1_get_raw(PS2_X_CHANNEL) ==4095) {
    7. Delay_ms(20);
    8. while (adc1_get_raw(PS2_X_CHANNEL)==4095);
    9. Delay_ms(20);
    10. KeyNum = 1;
    11. } else if (adc1_get_raw(PS2_X_CHANNEL)==0) {
    12. Delay_ms(20);
    13. while (adc1_get_raw(PS2_X_CHANNEL)==0);
    14. Delay_ms(20);
    15. KeyNum = 2;
    16. }
    17. // 检测SW按键是否按下
    18. if (btn_intr_flag == 1) {
    19. KeyNum = 3;
    20. btn_intr_flag = 0;
    21. }
    22. if((key_queue!=NULL)&&(KeyNum))
    23. {
    24. err=xQueueSend(key_queue,&KeyNum,10);
    25. if(err!= pdPASS)
    26. {
    27. printf("Send Failed\r\n");
    28. }
    29. }
    30. //printf("KeyNum:%d\n", KeyNum);
    31. }

    OLED

    1. #include <stdio.h>
    2. #include "menu.h"
    3. #include "dht11.h"
    4. #include "OLED.h"
    5. #include "bmp.h"
    6. #define Number 25
    7. //定义时间,日期,星期变量
    8. uint16_t hour = 17;
    9. uint16_t minute = 51;
    10. uint16_t second = 0;
    11. uint16_t day = 27;
    12. uint16_t month = 8;
    13. uint16_t year = 23;
    14. uint8_t week = 7;
    15. //索引数组相关
    16. void (*current_operation_index)(); //执行当前操作函数
    17. uint8_t func_index = 0;
    18. /*定义了索引数组,索引数组要配合主程序按键值进行选择*/
    19. Menu_table table[26]=
    20. {
    21. //序号,下一项,确定,返回
    22. {0, 1, 4, 0,(*show1)},//一级界面 图片
    23. {1, 2, 11, 1,(*show2)},//一级界面 时间
    24. {2, 3, 12, 2,(*show3)},//一级界面 led
    25. {3, 0, 13, 3,(*show4)},//一级界面 游戏
    26. //图片的下层界面
    27. {4, 5, 4, 0, (*show5)}, //二级界面 猫
    28. {5, 6, 5, 0, (*show10)}, //二级界面
    29. {6, 7, 6, 0, (*show6)}, //二级界面
    30. {7, 8, 7, 0, (*show7)}, //二级界面
    31. {8, 9, 8, 0, (*show8)}, //二级界面
    32. {9, 10, 9, 0,( *show9)}, //二级界面
    33. {10, 4 ,10, 0, (*show12)}, //二级界面
    34. //时间的下层界面
    35. {11, 11, 11, 1, (*show13)}, //二级界面 时间
    36. //LED的下层界面
    37. {12, 12, 2, 2,(*show14)}, //二级界面 //控制led
    38. //游戏的下层界面
    39. {13, 13, 13, 3, (*show11)}, //二级界面
    40. };
    41. //按键
    42. void Menu_key_set(uint8_t KeyNum)
    43. {
    44. OLED_Clear();
    45. if(KeyNum == 1)
    46. {
    47. func_index=table[func_index].next;//按键next按下后的索引号
    48. OLED_Clear();
    49. }
    50. if(KeyNum == 3)
    51. {
    52. func_index=table[func_index].enter;
    53. OLED_Clear();
    54. }
    55. if(KeyNum == 2)
    56. {
    57. func_index=table[func_index].back;//按键next按下后的索引号
    58. OLED_Clear();
    59. }
    60. current_operation_index=table[func_index].current_operation;//执行当前索引号所对应的功能函数。
    61. (*current_operation_index)();//执行当前操作函数
    62. }
    63. //显示菜单函数
    64. void show0(void)//眼睛
    65. {
    66. OLED_DrawBMPFast(yanjing);
    67. }
    68. void show1(void)//图片
    69. {
    70. OLED_DrawBMPFast(tupian);
    71. }
    72. void show2(void)//时间
    73. {
    74. OLED_ShowCHinese(50,3,0);
    75. OLED_ShowCHinese(66,3,1);
    76. }
    77. void show3(void)//LED
    78. {
    79. OLED_DrawBMPFast(led);
    80. }
    81. void show4(void)//游戏图标
    82. {
    83. OLED_DrawBMPFast(youxiji);
    84. }
    85. //显示图片
    86. void show5(void)
    87. {
    88. OLED_DrawBMPFast(cat);
    89. }
    90. void show6(void)
    91. {
    92. OLED_DrawBMPFast(baozi);
    93. }
    94. void show7(void)
    95. {
    96. OLED_DrawBMPFast(baoziyi);
    97. }
    98. void show8(void)
    99. {
    100. OLED_DrawBMPFast(daishu);
    101. }
    102. void show9(void)
    103. {
    104. OLED_DrawBMPFast(mapi);
    105. }
    106. void show10(void)
    107. {
    108. OLED_DrawBMPFast(dog);
    109. }
    110. //显示太空人
    111. void show11(void)
    112. {
    113. OLED_DrawBMPFast(gImage_1);
    114. Delay_ms(Number);
    115. OLED_DrawBMPFast(gImage_2);
    116. Delay_ms(Number);
    117. OLED_DrawBMPFast(gImage_3);
    118. Delay_ms(Number);
    119. OLED_DrawBMPFast(gImage_4);
    120. Delay_ms(Number);
    121. OLED_DrawBMPFast(gImage_5);
    122. Delay_ms(Number);
    123. OLED_DrawBMPFast(gImage_6);
    124. Delay_ms(Number);
    125. OLED_DrawBMPFast(gImage_7);
    126. Delay_ms(Number);
    127. OLED_DrawBMPFast(gImage_8);
    128. Delay_ms(Number);
    129. OLED_DrawBMPFast(gImage_9);
    130. Delay_ms(Number);
    131. OLED_DrawBMPFast(gImage_10);
    132. Delay_ms(Number);
    133. OLED_DrawBMPFast(gImage_11);
    134. Delay_ms(Number);
    135. OLED_DrawBMPFast(gImage_12);
    136. Delay_ms(Number);
    137. OLED_DrawBMPFast(gImage_13);
    138. Delay_ms(Number);
    139. OLED_DrawBMPFast(gImage_14);
    140. Delay_ms(Number);
    141. OLED_DrawBMPFast(gImage_15);
    142. Delay_ms(Number);
    143. OLED_DrawBMPFast(gImage_16);
    144. Delay_ms(Number);
    145. OLED_DrawBMPFast(gImage_17);
    146. Delay_ms(Number);
    147. OLED_DrawBMPFast(gImage_18);
    148. Delay_ms(Number);
    149. OLED_DrawBMPFast(gImage_19);
    150. Delay_ms(Number);
    151. OLED_DrawBMPFast(gImage_20);
    152. Delay_ms(Number);
    153. }
    154. void show12(void)
    155. {
    156. OLED_ShowCHinese(50,3,9);
    157. OLED_ShowCHinese(66,3,10);
    158. }
    159. //显示时间
    160. void show13(void)
    161. {
    162. OLED_ShowCHinese(0,3,2);
    163. OLED_ShowCHinese(16,3,3);
    164. OLED_ShowChar(32,3,':',16);
    165. OLED_ShowNum(40,3,20,2,16);
    166. OLED_ShowNum(56,3,year/10,1,16);
    167. OLED_ShowNum(64,3,year%10,1,16);
    168. OLED_ShowChar(72,3,'-',16);
    169. OLED_ShowNum(80,3,month/10,1,16);
    170. OLED_ShowNum(88,3,month%10,1,16);
    171. OLED_ShowChar(98,3,'-',16);
    172. OLED_ShowNum(104,3,day/10,1,16);
    173. OLED_ShowNum(112,3,day%10,1,16);
    174. //显示时间
    175. OLED_ShowCHinese(0,1,0);
    176. OLED_ShowCHinese(16,1,1);
    177. OLED_ShowChar(32,1,':',16);
    178. OLED_ShowNum(40,1,hour/10,1,16);
    179. OLED_ShowNum(48,1,hour%10,1,16);
    180. OLED_ShowChar(56,1,':',16);
    181. OLED_ShowNum(64,1,minute/10,1,16);
    182. OLED_ShowNum(72,1,minute%10,1,16);
    183. OLED_ShowChar(80,1,':',16);
    184. OLED_ShowNum(88,1,second/10,1,16);
    185. OLED_ShowNum(96,1,second%10,1,16);
    186. //显示星期
    187. OLED_ShowCHinese(0,5,4);
    188. OLED_ShowCHinese(16,5,5);
    189. OLED_ShowChar(32,5,':',16);
    190. OLED_ShowNum(70,5,week,1,16);
    191. }
    192. //控制led
    193. void show14(void)
    194. {
    195. OLED_DrawBMPFast(dengbao);
    196. }
    197. //void show15(void)
    198. //{
    199. //}
    200. //void show16(void)
    201. //{
    202. //}
    203. //控制时间,日期与星期增加
    204. void Date_Time(void)
    205. {
    206. //显示日期
    207. //判断日期
    208. if(hour>=24)
    209. {
    210. day++;
    211. week++;
    212. if(week >= 7)week = 1;
    213. if(day==30)
    214. {
    215. month++;
    216. day = 0;
    217. if(month==12)
    218. {
    219. year++;
    220. month = 0;
    221. if(year > 2050 || year < 2000) year = 0;
    222. }
    223. }
    224. }
    225. }

     完整代码:

    ESP32 IDF Vscode: ESP32开发 - Gitee.com

  • 相关阅读:
    Nexus私库搭建 Linux(快捷步骤)
    Linux系统启动和内核管理及系统救援
    应急响应 >> Windows系统应急
    记录一次SQL函数和优化的问题
    springboot基于java的个性化推荐的电商购物商城平台设计与实现
    小柏实战学习Liunx(图文教程二十一)
    MFC文件操作
    HTML CSS JS 网页设计作业「我的家乡吉林」
    springboot+爱心捐赠小程序 毕业设计-附源码211711
    ResNet网络学习笔记。
  • 原文地址:https://blog.csdn.net/m0_55986434/article/details/133265732