#include <Arduino.h>
//#include <Wire.h>
#include <SSD1306Wire.h> //使用ESP8266 and ESP32 OLED driver for SSD1306 displays的library
//#include <U8g2lib.h>
//#include <Adafruit_GFX.h>
//#include <Adafruit_SSD1306.h> //使用Adafruit SSD1306的library
//印qrcode需要三個函數庫:QRcodeDisplay,QRcodeOled,ESP8266 and ESP32 OLED driver for SSD1306 displays
#include <qrcodeoled.h>
#include <Adafruit_Keypad.h>
//#define OLEDDISPLAY
#define SDA 5
#define SCL 4
//U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, 4,5,U8X8_PIN_NONE);
//Adafruit_SSD1306 display(0x3c, SDA, SCL);
SSD1306Wire display(0x3c, SDA, SCL); // OLED顯示(address, SDA, SCL)
QRcodeOled qrcode (&display);
int queue_number = 1; //排隊編號
String text = ""; //qrcode內容
String key = ""; //當下的按鍵
String last_key = ""; //總共按鍵
int last_key_int = 0; //轉換用
int wait_time = 50000 ; //(ms) = 50s //目前沒用到
int mode = 1 ; // mode1: gernerate QR code, mode2: start advertising
int adv_number = 1; //目前要廣播的號碼,好像可以不用,目前沒用到
int record_adv = 1; //上一個廣播號碼
//keypad
const byte rows = 4; // 列數(橫的)
const byte cols = 4; // 行數(直的)
char keys[rows][cols] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[rows] = {6, 7, 8, 3}; //定義列的腳位
byte colPins[cols] = {10, 11, 12, 13}; //定義行的腳位
//初始化鍵盤
Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(keys), rowPins, colPins, rows,cols);
bool display_QRcode_on_oled(int queue_num,int service_num,int broadcast_num);
String number_to_service(int num) ;
void setup() {
Serial.begin(115200);
//initializaation
display.init();
qrcode.init();
customKeypad.begin();
// 啟動時間
//setTime(0, 0, 0, 10, 15, 2023); // 設置時間1
Serial.println("Start!");
}
void loop() {
//display.clear(); //清除OLED
//display.drawString(0,0, "Counter");
//display.display(); //顯示在OLED上
/* time_t t = now(); // 獲取當前時間1
String time_test = String(year(t))+","+month(t)+","+day(t)+","+hour(t)+","+minute(t)+","+second(t);
*/
// 開始偵測使用者的按鍵狀態
customKeypad.tick();
//判斷按了哪一個鍵
if(customKeypad.available()){
keypadEvent e = customKeypad.read(); //按下放開按鍵都會被讀取,所以按一次會被讀取到兩次
//確定偵測到按下的訊號:按下的狀態是KEY_JUST_PRESSED,放開的狀態是KEY_JUST_RELEASED
if(e.bit.EVENT == KEY_JUST_PRESSED) {
Serial.print((char)e.bit.KEY);
Serial.println(" pressed");
key = (char)e.bit.KEY;
if (key=="*"){ //reset all param.
display.clear();
display.drawString(50,25, "Clear");
display.display();
key = ""; last_key="";
Serial.println(" clear");
}
else if (key=="#"){
if (mode == 1){ //generate QR code mode
last_key_int = last_key.toInt();
if (!display_QRcode_on_oled(queue_number,last_key_int,record_adv)){
//re-enter
if (queue_number==255) queue_number = 1;
else queue_number = queue_number + 1;
Serial.println("re-enter");
}
else Serial.println("display qrcode"); //已經有qrcode出現
key = "";last_key="";
}
else{ //adv. mode
Serial.println("adv.");
}
}
else if (key=="A"){// mode1
mode = 1;
display.clear();
display.drawString(18,25,"Generate QR code!");
display.display();
key = "";last_key="";
}
else if (key=="B"){// mode2
mode = 2;
display.clear();
display.drawString(40,25,"Start adv!");
display.display();
key = "";last_key="";
}
else if (key=="C" || key=="D"){ //C,D鍵 目前沒用到
display.clear();
display.drawString(40,25,"No function!");
display.display();
}
else{ //數字鍵
if (last_key == "") last_key = key;
else last_key += key;
display.clear();
display.drawString(60,25,last_key);
display.display();
}
}
}
delay(100);//delay(1000)=delay一秒
}
//display the QR code on the oled
bool display_QRcode_on_oled(int queue_num,int service_num,int broadcast_num){
String service = number_to_service(service_num);
display.clear(); //清除OLED
if (service == "None"){
/*display.drawString(0,13, "Please enter the");
display.drawString(15,28, "service code");
display.drawString(43,43, "again");*/
display.drawString(5,15, "Please enter the service");
display.drawString(35,40, "code again");
display.display(); //顯示在OLED上
return 0;
}
else{
text = "nthu_com," + String(queue_num) + "," + service + "," + String(broadcast_num);
qrcode.create(text);
return 1;
}
}
//get the corresponding service
String number_to_service(int num){
String services[] = {
"蜜汁烤雞腿飯", //1
"玫瑰油雞腿飯", //2
"現炸大雞腿飯", //3
"脆皮烤鴨飯", //4
"脆皮燒肉飯", //5
"蜜汁叉燒飯", //6
"現炸香雞排飯", //7
"現炸排骨飯", //8
"叉燒、油雞飯", //9
"叉燒、烤鴨飯", //10
"烤雞飯", //11
"香腸飯", //12
"油雞飯", //13
"麻辣雞飯", //14
//"蒜泥白肉飯" //15
};
int max_num = sizeof(services) / sizeof(services[0]);
if (num >= 1 && num <= max_num) {
return services[num - 1];
} else {
return "None";
}
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1