目录
本实验使用SH1106-OLED + DS1307 + DHT11 + HC-SR04 + BUTTON 制作了一个简单的菜单程序功能,可以通过按钮选择想要显示的具体部分,例如当选择到时间选项时,按下BUTTON即可显示时间
引脚连接:
SH1106 | UNO | MEGA |
---|---|---|
VCC | 5V | 5V |
GND | GND | GND |
CLK | 13 | 52 |
MOSI | 11 | 51 |
其它三个引脚可以自己定义,我的连接如下:
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按键也可以被检测到,细心的可以发现检测事件函数是在相应的显示程序最后才调用的,如果代码短可能可以立马检测到,但是如果代码运行事件长了之后是什么效果我也不知道。