Arduino提高篇14—摇杆按键操作OLED

摇杆按键操作OLED

摇杆在很多应用场合被用来替代轻触按键,不但操作上方便,而且一个摇杆可替代多个按键,这使得电路设计得到简化。本篇演示如何将摇杆扭转的四个方向作为四个按键来操作OLED显示。

1. 实验材料

  • Uno R3开发板
  • 配套USB数据线
  • 面包板及配套连接线
  • 双轴按键摇杆模块
  • OLED显示屏

2. 实验步骤

1. 根据原理图搭建电路图。

OLED屏的VCC、GND分别连接开发板的3.3V、GND,OLED屏的SDA和SCL分别连接开发板的A4和A5。双轴按键摇杆模块的VCC、GND分别连接开发板的5V、GND,模块的X轴输出、Y轴输出分别连接开发板的模拟引脚A0、A1。

实验原理图如下图所示:

实验原理图

实物连接图如下图所示:

实物连接图

2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

/*
   OLED_Key
   摇杆按键操作OLED
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET     4
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);

#define pinX  A0
#define pinY  A1

int valueX = 0;
int valueY = 0;
unsigned char keyValue = 0;
int value = 0;


void menu(unsigned char index)
{
  display.clearDisplay();//清屏
  display.setCursor(20, 2);//设置显示位置
  display.println("--KEY--");
  display.setCursor(2, 35);//设置显示位置

  if (index == 1)
  {
    display.print("R:  [");
    value = value - 1;
  } else if (index == 2)
  {
    display.print("L:  [");
    value = value + 1;
  } else if (index == 3)
  {
    display.print("D:  [");
    value = value - 10;
  }
  else if (index == 4)
  {
    display.print("U:  [");
    value = value + 10;
  }

  if (value >= 100)
  {
    value = 100;
  }
  if (value <= 0)
  {
    value = 0;
  }
  display.print(value);
  display.print("]");
  display.display(); // 开显示

}

//按键扫描函数
unsigned char keyScan(void)
{
  static unsigned char keyUp = 1;

  valueX = analogRead(pinX);
  valueY = analogRead(pinY);

  if (keyUp && ((valueX <= 10) || (valueX >= 1010) || (valueY <= 10) || (valueY >= 1010)))
  {
    delay(10);
    keyUp = 0;
    if (valueX <= 10)return 1;
    else if (valueX >= 1010)return 2;
    else if (valueY <= 10)return 3;
    else if (valueY >= 1010)return 4;
  } else if ((valueX > 10) && (valueX < 1010) && (valueY > 10) && (valueY < 1010))keyUp = 1;
  return 0;
}

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(WHITE);//开像素点发光
  display.clearDisplay();//清屏
  display.setTextSize(2); //设置字体大小
  display.setCursor(20, 2);//设置显示位置
  display.println("--KEY--");
  display.display(); // 开显示
}

void loop()
{
  keyValue = keyScan();

  if (keyValue != 0)
  {
    menu(keyValue);
  }
}

3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

程序下载

3. 实验现象

扭转摇杆对应显示四个L、R、U、D四个方向标示以及对应的加减数字显示。

实验现象

4. 程序分析

程序中最主要的部分是按键扫描函数,我们分别采集摇杆的X轴和Y轴模拟输入,选取模拟量AD值中的10和1010作为两个临界点,当扭动摇杆采集回的数据小于10或者大于1010,就认为这个轴向上进行了按键触发。

使用静态变量keyValue保存按键按下状态,只有当模拟量再次进入小于10或者大于1010时才会再次触发一次按键返回。

关注微信公众号:TonyCode
Arduino学习交流群:868283450

更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:
扫码加入微信公众号:TonyCode

以下是手势识别的Arduino代码,使用了OLED显示屏: ``` #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SparkFun_APDS9960.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); SparkFun_APDS9960 apds; void setup() { Serial.begin(9600); if (!apds.init()) { Serial.println("Failed to initialize APDS-9960 sensor."); } apds.enableGestureSensor(true); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); } void loop() { if (apds.isGestureAvailable()) { switch (apds.readGesture()) { case DIR_UP: display.clearDisplay(); display.setCursor(0, 0); display.println("UP"); display.display(); break; case DIR_DOWN: display.clearDisplay(); display.setCursor(0, 0); display.println("DOWN"); display.display(); break; case DIR_LEFT: display.clearDisplay(); display.setCursor(0, 0); display.println("LEFT"); display.display(); break; case DIR_RIGHT: display.clearDisplay(); display.setCursor(0, 0); display.println("RIGHT"); display.display(); break; case DIR_NEAR: display.clearDisplay(); display.setCursor(0, 0); display.println("NEAR"); display.display(); break; case DIR_FAR: display.clearDisplay(); display.setCursor(0, 0); display.println("FAR"); display.display(); break; default: break; } } } ``` 这个代码使用了SparkFun的APDS9960手势传感器来检测手势,并使用Adafruit的SSD1306 OLED显示屏来显示检测到的手势。在setup()函数中,初始化了传感器和显示屏。在loop()函数中,检测手势并根据手势在显示屏上显示相应的方向。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值