Arduino+OLED实现简单菜单程序功能


本实验使用SH1106-OLED + DS1307 + DHT11 + HC-SR04 + BUTTON 制作了一个简单的菜单程序功能,可以通过按钮选择想要显示的具体部分,例如当选择到时间选项时,按下BUTTON即可显示时间
引脚连接:

SH1106UNOMEGA
VCC5V5V
GNDGNDGND
CLK1352
MOSI1151

其它三个引脚可以自己定义,我的连接如下:
RES --------> 8
DC ---------> 9
CS ---------> 10

简单菜单程序的实现

#include <Arduino.h>
#include<U8g2lib.h>
#include<SPI.h>
#include<Wire.h>
#include "RTClib.h"
#include "SRO4.h"      //使用了SR04
SR04 mysr04 = SR04(3,4);      //Trig pin:3 , Echo pin:4
#include "DHT.h"
#define DHTPIN 5       //温湿度传感器连接到5号Pin
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);//使用硬件ICC总线通信
//U8G2_SH1106_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, 10, 9, 8);
//使用硬件SPI总线通信
RTC_DS1307 rtc; 
void setup() {
  // put your setup code here, to run once:
  u8g2.begin(/*select_pin */A0, /*next_pin */ A1, /* prev_pin*/ U8X8_PIN_NONE, U8X8_PIN_NONE, U8X8_PIN_NONE, /*home_pin*/ A2);     //设置A0 pin 为选择按钮, A1 pin 为切换到下一个选项 , A2 pin 为HOME键
  u8g2.setFont(u8g2_font_6x12_tr);    //设置显示字体
  u8g2.enableUTF8Print();   //启用 UTF8打印
  rtc.begin();         //初始化时钟模块
  dht.begin();           //初始化DHT11模块
}

const char *string_menu_list =           //setup the selection list   设置菜单界面显示类容
  "Time\n"
  "Distance\n"
  "Temperature\n"
  "Humidity";

uint8_t current_selection1 = 0;   //set the default selectes
int8_t button_event = 0;      //a variable to check the button event
void check_button_event(){            // the fuction of check the button event
  if (button_event == 0)
    button_event = u8g2.getMenuEvent();
    //这个函数的功能是为了实现检测按钮事件,当按下HOME键时结束当前执行程序返回至菜单界面
}

void loop() {
  // put your main code here, to run repeatedly:
  if (button_event >0)
    button_event = 0;//按下HOME键后,button_event值会变为U8X8_PIN_NONE,此时会跳出当前程序,将值改为0
  
   switch ( current_selection1 ){           // to chose which display to show
   //选择要显示的界面(事件、温度、湿度、距离)
    case 0: 
    menu_display();
    break;
     
     case 1: 

     time_display();
     break;

     case 2: ;  //to display distance
     distance_display();
     break;

     case 3:   //to display temperature 
     temp_display();
     break;

     case 4: 
     humidity_display();
     break;    //to display humidity
   }
}

void menu_display(){
  u8g2.setFont(u8g2_font_6x12_tr);
  current_selection1 = u8g2.userInterfaceSelectionList(   // show the menu
    "Menu",
    1,
    string_menu_list);  
}

void hello(){          // show the "Hello World!", you instead of it to use anything you want display
    u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.drawStr(0,24,"Hello World!");
    check_button_event();
    if (button_event == U8X8_MSG_GPIO_MENU_HOME)      // check the button event of HOME BUTTON, If: return menu ,No: keep state
      current_selection1 = 0;

  } while ( u8g2.nextPage() );
  //delay(1000);

}

void time_display(){     // to display time

  
  DateTime now = rtc.now();
  u8g2.setFontDirection(0);
  u8g2.firstPage();
  do{
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.setCursor(20,10);
    u8g2.print("Welcome!");
    u8g2.setCursor(0,30);
    u8g2.print("Date:");
    u8g2.setCursor(50,30);
    u8g2.print(now.year());
    u8g2.print('/');
    u8g2.print(now.month());
    u8g2.print('/');
    u8g2.println(now.day());
    u8g2.setCursor(0,50);
    u8g2.print("Time:");
    u8g2.setCursor(50,50);
    u8g2.print(now.hour());
    u8g2.print(':');
    u8g2.print(now.minute());
    u8g2.print(':');
    u8g2.println(now.second()+10);
    check_button_event();
    if(button_event == U8X8_MSG_GPIO_MENU_HOME)
      current_selection1 = 0;
    
  }while (u8g2.nextPage());

#define FILTER_N 10
void distance_display(){
    int i;
    float filter_sum = 0;
    for (i = 0; i < FILTER_N; i++){
      filter_sum += mysr04.Get();
      delay(10);
    }
    int distance = (int)(filter_sum / FILTER_N);
  u8g2.setFontDirection(0);
  u8g2.firstPage();
  do{
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.setCursor(20,10);
    u8g2.print("Welcome!");
    u8g2.setCursor(0,30);
    u8g2.print("Recent distance:");
    u8g2.setCursor(50,50);
    u8g2.print(distance);
    u8g2.print(" cm");
    check_button_event();
    if(button_event == U8X8_MSG_GPIO_MENU_HOME)
      current_selection1 = 0;
    
  }while (u8g2.nextPage());

  }

void temp_display(){    //使用官方DHT Sensor库可自行参考
  float temp = dht.readTemperature();
  u8g2.setFontDirection(0);
  u8g2.firstPage();
  do{
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.setCursor(20,10);
    u8g2.print("Welcome!");
    u8g2.setCursor(0,30);
    u8g2.print("Recent temperature:");
    u8g2.setCursor(50,50);
    u8g2.print(temp);
    u8g2.print(" °C");
    check_button_event();
    if(button_event == U8X8_MSG_GPIO_MENU_HOME)
      current_selection1 = 0;
    
  }while (u8g2.nextPage());
  
}
   

void humidity_display(){  //显示湿度,使用为官方DHT Sensor 库,可自行参考
  float humidity = dht.readHumidity();
u8g2.setFontDirection(0);
  u8g2.firstPage();
  do{
    u8g2.setFont(u8g2_font_ncenB08_tr);
    u8g2.setCursor(20,10);
    u8g2.print("Welcome!");
    u8g2.setCursor(0,30);
    u8g2.print("Recent humidity:");
    u8g2.setCursor(50,50);
    u8g2.print(humidity);
    u8g2.print(" %");
    check_button_event();
    if(button_event == U8X8_MSG_GPIO_MENU_HOME)
      current_selection1 = 0;
    
  }while (u8g2.nextPage());
   
}

  }

代码部分在注释中已经讲的差不多了,如何有不懂我推荐去这里学习;经过测试,相应的选择后会进入对应的程序,而每次按下HOME按键也可以被检测到,细心的可以发现检测事件函数是在相应的显示程序最后才调用的,如果代码短可能可以立马检测到,但是如果代码运行事件长了之后是什么效果我也不知道。

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值