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

### 使用游戏摇杆控制 OLED 显示屏实现加减法操作 为了实现在OLED显示屏上通过游戏摇杆来执行加减法的操作,可以基于已有的硬件配置并编写相应的微控制器程序。下面提供了一个具体的实例。 #### 所需材料 - Arduino Uno R3 开发板及其配套 USB 数据线 - 面包板以及配套连接线 - 双轴按键摇杆模块 - 支持 I2C 通信协议的 OLED 显示屏[^1] #### 程序设计思路 该程序主要分为两部分:一是读取来自摇杆的数据;二是更新 OLED 屏幕上的数值显示。每当检测到摇杆被按下或者倾斜时,就会触发一次计算过程——增加或减少当前显示的数字,并刷新屏幕内容。 下面是具体实现此功能的一段 Python风格伪代码转换成适用于Arduino环境下的 C++ 语法版本: ```cpp #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int joystickPinX = A0; // Joystick X-axis analog input pin const int joystickPinY = A1; // Joystick Y-axis analog input pin const int buttonPin = 2; // Button on the joystick digital input pin int value = 50; // Initial displayed number bool isPressedLastTime = false; void setup() { pinMode(joystickPinX, INPUT); pinMode(joystickPinY, INPUT); pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { while(true){} // Don't proceed, loop forever } } void loop(){ static unsigned long lastDebounceTime = 0; const unsigned long debounceDelay = 50; bool isPressedNow = !digitalRead(buttonPin); unsigned long currentTime = millis(); if ((currentTime - lastDebounceTime) >= debounceDelay){ if(isPressedNow && !isPressedLastTime){ changeValue(); updateDisplay(); }else{ readJoystickPosition(); } isPressedLastTime = isPressedNow; lastDebounceTime = currentTime; } } void changeValue(){ if(digitalRead(A1)<500 || digitalRead(A0)>1000)value++; else if(digitalRead(A1)>1000 || digitalRead(A0)<500)value--; } void readJoystickPosition(){ int joyX = analogRead(joystickPinX); int joyY = analogRead(joystickPinY); Serial.print("X="); Serial.println(joyX); Serial.print("Y="); Serial.println(joyY); } void updateDisplay(){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); char buffer[7]; sprintf(buffer,"%d",value); display.print(buffer); display.display(); } ``` 上述代码实现了基本的功能需求,在这里需要注意的是对于按钮的状态变化进行了去抖动处理以防止误触引发错误计数。同时考虑到实际应用中的情况,可能还需要进一步优化逻辑判断条件使得用户体验更加流畅自然[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值