Arduino提高篇(十四)摇杆按键操作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时才会再次触发一次按键返回。


Arduino学习交流群:672088578

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

Arduino控制OLED显示显示温湿度数据通常需要以下几个步骤: 1. **硬件准备**: - Arduino开发板 - 一块支持I2C通信的OLED显示,例如SSD1306、 ili9341等 - 温湿度传感器,如DHT11、DHT22或AM2302 - 如果OLED不是I2C接口,可能还需要I2C扩展模块 2. **软件库安装**: - 首先,在Arduino IDE中安装相应的库,比如Adafruit库(对于SSD1306)和DHT库(用于读取温湿度传感器的数据)。 3. **编写代码**: ```cpp #include <Wire.h> #include <Adafruit_SSD1306.h> #include <DHT.h> Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32); // OLED幕尺寸,宽度128px,高度32px DHT dht(DHTpin, DHT_TYPE_DHT11); // 根据使用的传感器选择DHT类型,DHT11 或 DHT22 void setup() { Serial.begin(9600); display.begin(SSD1306_I2C); // 初始化I2C连接 delay(1500); // 等待OLED稳定 clearDisplay(); // 清 } void loop() { float humidity, temperature; if (dht.readData(&humidity, &temperature) == DHT_OK) { // 检查读取是否成功 String text = "温度: " + String(temperature) + "℃\n" + "湿度: " + String(humidity) + "%"; setText(text); } else { Serial.println("读取失败"); } delay(2000); // 每隔两秒更新一次数据显示 } void clearDisplay() { for(int i=0; i<display.width(); i++) { display.pixel(i, 0, 0); } display.display(); } void setText(String text) { display.setTextSize(1); display.setCursor(0, 0); display.print(text); display.display(); } ``` 4. **程序运行**: 将这段代码上传到Arduino,它会在循环中每隔一段时间读取并显示温湿度数据。如果传感器读取失败,会打印错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值