//esp32_c3_u8g2_2023_ssd1306_128*64
#include <AcaiaArduinoBLE.h>
AcaiaArduinoBLE scale;
#include <Arduino.h>
#include<U8g2lib.h>
#include<Wire.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4); // ESP32 Thing, HW I2C with pin remapping
//ch340,SCL D1(5) SDA D3(0)
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);//使用硬件ICC总线通信
//cp2012,D1(5),D2(4)
/*
U8G2_SH1106_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, 10, 9, 8);//使用硬件SPI总线通信
*/
#if defined(ESP8266)|| defined(ESP32) || defined(AVR)
#include <EEPROM.h>
#endif
//ch340_u8g2_2023_ssd1306_128*64
//dose
float dose1 = 0;
float dose1_set = 0;
int dose1_addr = 5;
//cup
float cup = 0;
float cup_set = 0;
int cup_addr = 20;
//offset
#define MAX_OFFSET 1 // In case an error in grinding occured
float offset = 0;
float offset_set = 0;
int offset_addr = 30;
#define relayOutput 2
#define led 7
#define buzzer 6
//time
float starttime = 0;
float endtime = 0;
float resulttime = 0;
float resulttime_a = 0;
//weight
float currentWeight = 0;
//BLE peripheral device
BLEService weightService("00002a98-0000-1000-8000-00805f9b34fb"); // create service
BLEByteCharacteristic goalCharacteristic("0x2A97", BLEWrite | BLERead);
BLEByteCharacteristic offsetCharacteristic("0x2A98", BLEWrite | BLERead);
BLEByteCharacteristic cupCharacteristic("0x2A99", BLEWrite | BLERead);
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(relayOutput, OUTPUT);
digitalWrite(relayOutput, LOW);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, HIGH);
EEPROM.begin(512); // uncomment this if you use ESP8266/ESP32 and want to fetch the value from eeprom
// Get stored setpoint
dose1 = EEPROM.get(dose1_addr,dose1);
dose1_set = EEPROM.get(dose1_addr,dose1);
offset = EEPROM.get(offset_addr,offset);
offset_set = EEPROM.get(offset_addr,offset);
cup = EEPROM.get(cup_addr,cup);
cup_set = EEPROM.get(cup_addr,cup);
u8g2.begin(/*select_pin */3, /* next_pin */ 18, /*prev_pin */ 19, U8X8_PIN_NONE, U8X8_PIN_NONE, /*home_pin*/ 2);
u8g2.enableUTF8Print(); //启用 UTF8打印
u8g2.setFontDirection(0);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
// initialize the BLE hardware
BLE.begin();
BLE.setDeviceName("KafaTek");
BLE.setLocalName("MF_GBW_H");
BLE.setAdvertisedService(weightService);
weightService.addCharacteristic(goalCharacteristic);
weightService.addCharacteristic(offsetCharacteristic);
weightService.addCharacteristic(cupCharacteristic);
BLE.addService(weightService);
goalCharacteristic.writeValue(dose1);
offsetCharacteristic.writeValue(offset);
cupCharacteristic.writeValue(cup);
BLE.advertise();
Serial.println("Bluetooth® device active, waiting for connections...");
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(0,10);
u8g2.print("ACAIA LUNAR SCALE ");
u8g2.setCursor(0,20);
u8g2.print("FOR ESP GRINDER ");
u8g2.setCursor(0,30);
u8g2.print("5V_RELAY_HIGH IO02 ");
}while (u8g2.nextPage());
delay(1000);
}
const char *string_menu_list = //setup the selection list
"manual\n"
"auto\n"
"scale\n"
"offset\n"
"cup set\n"
"quick menu\n"
"factory reset\n"
"restart\n"
"about";
// "eeprom_clear";
uint8_t current_selection1 = 1; //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:
//Blink LED while grinding
if (digitalRead(relayOutput) == HIGH){
digitalWrite(led,(millis()/400) % 2 == 0);
} else {
digitalWrite(led,LOW);
}
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:
manual();
break;
case 2:
auto_();
break;
case 3:
scale_();
break;
case 4:
offset_();
break;
case 5:
cupset();
break;
case 6:
quick_menu();
break;
case 7:
factory_set();
break;
case 8:
restart();
break;
case 9:
about();
break;
/*
case 10:
eeprom_clear();
break; */
}
// Check for setpoint updates
BLE.poll();
if (goalCharacteristic.written()) {
dose1 = goalCharacteristic.value();
EEPROM.put(dose1_addr, dose1);
EEPROM.commit();
}
if (offsetCharacteristic.written()) {
offset = offsetCharacteristic.value();
EEPROM.put(offset_addr, offset);
EEPROM.commit();
}
if (cupCharacteristic.written()) {
cup = cupCharacteristic.value();
EEPROM.put(cup_addr, cup);
EEPROM.commit();
}
//
if ((dose1 ==0)||(cup ==0)){
factory_set();
}
// Connect to scale
while(!scale.isConnected()){
digitalWrite(relayOutput, LOW);
digitalWrite(led,LOW);
scale.init();
scale.tare();
/*
//显示未连接提示
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(0,10);
u8g2.print("failed to find lunar.");
}while (u8g2.nextPage()); */
}
// Send a heartbeat message to the acaia periodically to maintain connection
if (scale.heartbeatRequired()) {
scale.heartbeat();
}
// Reset local weight value in case disconnected.
if(!scale.isConnected()){
currentWeight = 0;
}
// always call newWeightAvailable to actually receive the datapoint from the scale,
// otherwise getWeight() will return stale data
if(scale.newWeightAvailable()){
currentWeight = scale.getWeight();
// Serial.println(currentWeight);
}
//Detect error of dose
if(starttime
&& endtime
&& currentWeight >= (dose1 + offset)
&& millis() > (endtime + 3000) ){
starttime = 0;
endtime = 0;
Serial.print("I detected a final weight of ");
Serial.print(currentWeight);
Serial.print("g. The goal was ");
Serial.print(dose1);
Serial.print("g with an offset of ");
Serial.print(offset);
if( abs(dose1 - currentWeight) > MAX_OFFSET ){
Serial.print("g. Error assumed. Offset unchanged. ");
}
else{
Serial.print("g. Next time I'll create an offset of ");
offset += dose1 - currentWeight;
// EEPROM.put(offset_addr,offset);
// EEPROM.commit();
Serial.print(offset);
}
}
}
void menu_display(){
// u8g2.setFont(u8g2_font_7x14_tr);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setFontRefHeightAll(); /* this will add some extra space for the text inside the buttons */
current_selection1 = u8g2.userInterfaceSelectionList( //show the menu
"GRINDER MENU",
1,
string_menu_list);
}
void manual(){
//1
float i = currentWeight;
auto str = String(i,1);
auto d1 = String(dose1,1);
auto rt = String(resulttime,1);
//refreshTime
if (digitalRead(relayOutput)==LOW){
starttime=millis();
}else
if(digitalRead(relayOutput)==HIGH){
endtime=millis();
resulttime=(endtime-starttime)/1000;
}
//待机显示
if(digitalRead(relayOutput)==LOW){
u8g2.firstPage();
do{
u8g2.setFontDirection(0);
u8g2.drawBox(0,0,12,13);
u8g2.drawHLine(0,14,128);
u8g2.setFont(u8g2_font_7x14_tf);
u8g2.setDrawColor(0);
u8g2.setCursor(2,11);
u8g2.print("M");
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(55,10);
u8g2.print(rt);
u8g2.setCursor(98,10);
u8g2.print(offset);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(35,12,0x23f1);//显示计时图标
u8g2.setFont(u8g2_font_siji_t_6x10);
u8g2.drawGlyph(83,9,0xe12f);//显示offset图标
if(scale.isConnected()){
u8g2.setFont(u8g2_font_waffle_t_all);
u8g2.drawGlyph(18,10,0xe00b);//显示bluetooth图标
}
if (i <cup){
if (i ==0){
if (dose1 == dose1_set){
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_unifont_t_77);
u8g2.drawGlyph(0,40,0x2691);//显示旗子图标
// u8g2.setFont(u8g2_font_UnnamedDOSFontIV_tr);
u8g2.setFont(u8g2_font_commodore64_tr);
u8g2.setCursor(20,40);
u8g2.print(d1);
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_waffle_t_all);
u8g2.drawGlyph(0,64,0xe0f4);//显示home图标
u8g2.drawGlyph(118,64,0xe0fa);//显示select图标
check_button_event();
if ((button_event == U8X8_MSG_GPIO_MENU_HOME)&&(i==0))
current_selection1 = 6;
if ((button_event == U8X8_MSG_GPIO_MENU_SELECT)&&(i==0))
current_selection1 = 2;
//底部提示图标圆点点
u8g2.drawPixel(18,60);
u8g2.drawPixel(36,60);
u8g2.drawPixel(54,60);
u8g2.drawPixel(72,60);
u8g2.drawPixel(90,60);
u8g2.drawPixel(108,60);
u8g2.drawCircle(18,60,2);
}
if (dose1 != dose1_set){
u8g2.setFont(u8g2_font_unifont_t_77);
u8g2.drawGlyph(0,40,0x2690);//显示旗子图标
// u8g2.setFont(u8g2_font_UnnamedDOSFontIV_tr);
u8g2.setFont(u8g2_font_commodore64_tr);
u8g2.setCursor(20,40);
u8g2.print(d1);
u8g2.setFont(u8g2_font_twelvedings_t_all);
// u8g2.drawGlyph(20,40,0x0073);//save icon
// u8g2.drawGlyph(30,40,0x003c);//home icon
u8g2.drawGlyph(70,40,0x004d);//显示上下键头图标
}
}
if(i!= 0){
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_freedoomr25_tn);//mn
u8g2.setCursor(26,50);
u8g2.print(str);//g
}
}
//放置接粉杯后提示操作图标
if(i >= cup){
u8g2.setDrawColor(0);
u8g2.setFont(u8g2_font_unifont_t_77);
u8g2.drawGlyph(45,50,0x26fe);//显示杯子图标
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_7x13_t_symbols);
u8g2.drawGlyph(90, 50, 0x2192);//显示select图标
u8g2.drawGlyph(90, 64, 0x2193);//显示next图标
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(100,50);
u8g2.print("start");
u8g2.setCursor(100,64);
u8g2.print("1'");
check_button_event();
//放置接粉杯,按"NEXT"键,不去皮,启动磨粉
if(button_event == U8X8_MSG_GPIO_MENU_NEXT){
digitalWrite(relayOutput, HIGH);
}
//放上接粉杯,按"Select"键,startgrinding
if (button_event == U8X8_MSG_GPIO_MENU_SELECT){
scale.tare();
digitalWrite(relayOutput, HIGH);
}
}
}while (u8g2.nextPage());
//按键调节预设粉量
check_button_event();
if ((button_event == U8X8_MSG_GPIO_MENU_PREV)&&(i == 0))
{
dose1 = dose1+0.5; //计数+
Serial.println(cup); //输出结果
}
if ((button_event == U8X8_MSG_GPIO_MENU_NEXT)&&(i == 0))
{
dose1 = dose1-0.5; //计数-
Serial.println(cup); //输出结果
}
//存储dose1预设值
check_button_event();
if((dose1 != dose1_set)&&(button_event == U8X8_MSG_GPIO_MENU_HOME)){
EEPROM.put(dose1_addr,dose1);
EEPROM.commit();
dose1_set = EEPROM.get(dose1_addr,dose1);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
}else
//磨豆机工作显示
if(digitalRead(relayOutput)==HIGH) {
u8g2.setFontDirection(0);
u8g2.firstPage();
do{
float barXd1 = 0;
barXd1 = (i/dose1)*124;
if (barXd1 > 124){
barXd1 = 124;
}
u8g2.drawFrame(0,32,128,16);
u8g2.drawBox(2,34,barXd1,12);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0,20, 0x23f1);//显示计时图标
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(20,18);
u8g2.print(rt);
u8g2.setCursor(60,18);
u8g2.print(str);
u8g2.setCursor(90,18);
u8g2.print("/");
u8g2.setCursor(100,18);
u8g2.print(d1);
}while (u8g2.nextPage());
//按功能键"HOME",停止磨粉
check_button_event();
if(button_event == U8X8_MSG_GPIO_MENU_HOME){
digitalWrite(relayOutput, LOW);
}
//auto stopgrinding
if ((i>= dose1 + offset)&&(resulttime >1)){
digitalWrite(relayOutput, LOW);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
}
//移除接粉杯,停止磨豆,去皮
if (i < 0){
digitalWrite(relayOutput,LOW);
scale.tare();
delay(500);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
}
void auto_(){
//2
float i = currentWeight;
auto str = String(i,1);
auto d2 = String(dose1,1);
auto rt_a = String(resulttime_a,1);
float rate = i/resulttime_a;
//refreshTime
if (digitalRead(relayOutput)== LOW){
starttime=millis();
}else
if(digitalRead(relayOutput)== HIGH){
endtime=millis();
resulttime_a=(endtime-starttime)/1000;
}
//待机显示
if(digitalRead(relayOutput)==LOW){
u8g2.firstPage();
do{
u8g2.setFontDirection(0);
u8g2.drawBox(0,0,12,13);
u8g2.drawHLine(0,14,128);
u8g2.setFont(u8g2_font_7x14_tf);
u8g2.setDrawColor(0);
u8g2.setCursor(2,11);
u8g2.print("A");
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(55,10);
u8g2.print(rt_a);
u8g2.setCursor(98,10);
u8g2.print(offset);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(35,12,0x23f1);//显示计时图标
u8g2.setFont(u8g2_font_siji_t_6x10);
u8g2.drawGlyph(83,9,0xe12f);//显示offset图标
if(scale.isConnected()){
u8g2.setFont(u8g2_font_waffle_t_all);
u8g2.drawGlyph(18,10,0xe00b);//显示bluetooth图标
}
if((i> 0)&&(i<cup)){
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_freedoomr25_tn);//mn
u8g2.setCursor(26,50);
u8g2.print(str);//g
}
if(i >=cup){
u8g2.setDrawColor(0);
u8g2.setFont(u8g2_font_unifont_t_77);
u8g2.drawGlyph(58,45,0x26fe);//显示杯子图标
u8g2.setDrawColor(1);
}
if(i == 0){
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_unifont_t_77);
u8g2.drawGlyph(0,40,0x2691);//显示旗子图标
// u8g2.setFont(u8g2_font_UnnamedDOSFontIV_tr);
u8g2.setFont(u8g2_font_commodore64_tr);
u8g2.setCursor(20,40);
u8g2.print(d2);
/*
for(
int b=110;
b>=64;
b--){
u8g2.setDrawColor(0);
u8g2.setFont(u8g2_font_unifont_t_77);
u8g2.drawGlyph(b,40,0x26fe);//显示杯子图标
if (b = 64) b=110;
} */
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_waffle_t_all);
u8g2.drawGlyph(0,64,0xe0f4);//显示home图标
u8g2.drawGlyph(118,64,0xe0fa);//显示select图标
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME)
current_selection1 = 1;
if (button_event == U8X8_MSG_GPIO_MENU_SELECT)
current_selection1 = 3;
//底部提示图标圆点点
u8g2.drawPixel(18,60);
u8g2.drawPixel(36,60);
u8g2.drawPixel(54,60);
u8g2.drawPixel(72,60);
u8g2.drawPixel(90,60);
u8g2.drawPixel(108,60);
u8g2.drawCircle(36,60,2);
}
}while (u8g2.nextPage());
}
//放置接粉杯后提示操作图标
//auto start grinding
if((digitalRead(relayOutput)==LOW)&&(i >= cup)){
scale.tare();
delay(600);
scale.tare();
resulttime_a = 0;//解决自动磨豆时,lunar处置tare指令不及时,会出现bug,若无此代码,磨豆启动后会自动停止,且会反复启停
digitalWrite(relayOutput, HIGH);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
//工作显示
if(digitalRead(relayOutput)==HIGH) {
u8g2.setFontDirection(0);
u8g2.firstPage();
do{
float barXd2 = 0;
barXd2 = (i/dose1)*124;
if (barXd2 > 124){
barXd2 = 124;
}
u8g2.drawFrame(0,32,128,16);
u8g2.drawBox(2,34,barXd2,12);
u8g2.setFont(u8g2_font_unifont_t_symbols);
u8g2.drawGlyph(0,20, 0x23f1);//显示计时图标
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(20,18);
u8g2.print(rt_a);
u8g2.setCursor(60,18);
u8g2.print(str);
u8g2.setCursor(90,18);
u8g2.print("/");
u8g2.setCursor(100,18);
u8g2.print(d2);
}while (u8g2.nextPage());
//按功能键"HOME"键,停止磨粉
check_button_event();
if(button_event == U8X8_MSG_GPIO_MENU_HOME){
digitalWrite(relayOutput, LOW);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
//stopgrinding
//3" 去皮延迟时差
if ((i>= dose1 + offset)&&(resulttime_a >3)){
digitalWrite(relayOutput, LOW);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
}
//移除接粉杯,停止磨豆,去皮
if (i < 0){
digitalWrite(relayOutput,LOW);
scale.tare();
delay(500);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
resulttime_a = 0;//解决自动磨豆时,tare处置不及时的bug,无此代码,会发生磨豆启动后会自动停止,且会反复启停
}
}
void scale_(){
//3
float i = currentWeight;
auto str = String(i,1);
u8g2.setFontDirection(0);
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.drawHLine(0,14,128);
u8g2.drawBox(0, 0, 128, 13);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setDrawColor(0);
u8g2.setCursor(50,10);
u8g2.print("SCALE");
u8g2.setFont(u8g2_font_freedoomr25_tn);//mn
u8g2.setDrawColor(1);
u8g2.setCursor(20,50);
u8g2.print(i);
u8g2.drawPixel(18,60);
u8g2.drawPixel(36,60);
u8g2.drawPixel(54,60);
u8g2.drawPixel(72,60);
u8g2.drawPixel(90,60);
u8g2.drawPixel(108,60);
u8g2.drawCircle(54,60,2);
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME)
current_selection1 = 2;
if (button_event == U8X8_MSG_GPIO_MENU_SELECT)
current_selection1 = 4;
}while (u8g2.nextPage());
//按"Next"键,自动去皮
if (button_event == U8X8_MSG_GPIO_MENU_NEXT)
{
scale.tare();
}
}
void offset_(){
//4
u8g2.setFontDirection(0);
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.drawHLine(0,14,128);
u8g2.drawBox(0, 0, 128, 13);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setDrawColor(0);
u8g2.setCursor(50,10);
u8g2.print("OFFSET");
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_9x18_tr);
u8g2.setCursor(45,40);
u8g2.print(offset);
if (offset != offset_set){
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_9x18_tr);
u8g2.setCursor(95,40);
u8g2.print("!S");
}
u8g2.drawPixel(18,60);
u8g2.drawPixel(36,60);
u8g2.drawPixel(54,60);
u8g2.drawPixel(72,60);
u8g2.drawPixel(90,60);
u8g2.drawPixel(108,60);
u8g2.drawCircle(72,60,2);
}while (u8g2.nextPage());
//按键调节offset
//{}
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_PREV)
{
offset = offset+0.01; //计数+
Serial.println(offset); //输出结果
}
//{}
if (button_event == U8X8_MSG_GPIO_MENU_NEXT)
{
offset = offset-0.01; //计数-
Serial.println(offset); //输出结果
}
if (offset == offset_set){
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME)
current_selection1 = 3;
}
//无条件 右键切换菜单
if (button_event == U8X8_MSG_GPIO_MENU_SELECT)
current_selection1 = 5;
//存储offset预设值
if(offset != offset_set){
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME){
EEPROM.put(offset_addr,offset);
EEPROM.commit();
offset_set = EEPROM.get(offset_addr,offset);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
}
}
//接粉杯重量设置
void cupset(){
//5
float i = currentWeight;
u8g2.setFontDirection(0);
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.drawHLine(0,14,128);
u8g2.drawBox(0, 0, 128, 13);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setDrawColor(0);
u8g2.setCursor(45,10);
u8g2.print("CUP_SET");
u8g2.setFont(u8g2_font_9x15_tr);
u8g2.setDrawColor(1);
u8g2.setCursor(0,35);
u8g2.print("cur:");
u8g2.setCursor(50,35);
u8g2.print(String(i));
u8g2.setCursor(50,53);
u8g2.print(cup);
u8g2.drawPixel(18,60);
u8g2.drawPixel(36,60);
u8g2.drawPixel(54,60);
u8g2.drawPixel(72,60);
u8g2.drawPixel(90,60);
u8g2.drawPixel(108,60);
u8g2.drawCircle(90,60,2);
if(cup != cup_set){
u8g2.setCursor(105,53);
u8g2.print("!S");
}
}while (u8g2.nextPage());
//按键调节cup_set
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_PREV)
{
//delay(2); //消抖
cup = cup+1; //计数+
Serial.println(cup); //输出结果
//delay(10); //延时,隔开两次按键时间
}
if (button_event == U8X8_MSG_GPIO_MENU_NEXT)
{
//delay(2); //消抖
cup = cup-1; //计数-
Serial.println(cup); //输出结果
//delay(10); //延时,隔开两次按键时间
}
if(cup == cup_set){
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME)
current_selection1= 4;
}
//
if (button_event == U8X8_MSG_GPIO_MENU_SELECT)
current_selection1 = 6;
//存储cup预设值
if(cup != cup_set){
check_button_event();
if(button_event == U8X8_MSG_GPIO_MENU_HOME){
EEPROM.put(cup_addr,cup);
EEPROM.commit();
cup_set = EEPROM.get(cup_addr,cup);
digitalWrite(buzzer, LOW);
delay(60);
digitalWrite(buzzer, HIGH);
}
}
}
void quick_menu(){
//6
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_streamline_interface_essential_cursor_t);
u8g2.drawGlyph(52, 40, 0X0035);//显示图标
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setDrawColor(1);
u8g2.setCursor(50,10);
u8g2.print("scale");
u8g2.setCursor(50,60);
u8g2.print("auto");
u8g2.setCursor(0,35);
u8g2.print("about");
u8g2.setCursor(92,35);
u8g2.print("manual");
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME)
current_selection1 = 9;
if (button_event == U8X8_MSG_GPIO_MENU_PREV)
current_selection1 = 3;
if (button_event == U8X8_MSG_GPIO_MENU_NEXT)
current_selection1 = 2;
if (button_event == U8X8_MSG_GPIO_MENU_SELECT)
current_selection1 = 1;
}while (u8g2.nextPage());
}
void factory_set(){
//7
float dose1 = 16;
float cup = 90;
float offset = -0.38;
EEPROM.begin(512);
EEPROM.put(dose1_addr, dose1);//dose1
EEPROM.put(cup_addr, cup);//cup
EEPROM.put(offset_addr, offset);//offset
EEPROM.commit();
delay(2000);
current_selection1 = 8;
}
void restart(){
//8
close();
ESP.restart();
}
void close(){
u8g2.clear();
u8g2.drawBox(0, 63 / 2 - 3, 127, 6);
u8g2.drawBox(127 / 2 - 3, 0, 6, 63);
u8g2.sendBuffer();
delay(50);
u8g2.clear();
u8g2.drawBox(0, 63 / 2 - 2, 127, 4);
u8g2.drawBox(127 / 2 - 2, 0, 4, 63);
u8g2.sendBuffer();
delay(50);
u8g2.clear();
u8g2.drawBox(0, 63 / 2 - 1, 127, 2);
u8g2.drawBox(127 / 2 - 1, 0, 2, 63);
u8g2.sendBuffer();
delay(50);
u8g2.clear();
}
void about(){
//9
u8g2.firstPage();
do{
u8g2.setDrawColor(1);
u8g2.setFont(u8g2_font_6x13_tf);
u8g2.setCursor(0,10);
u8g2.print("ACAIA LUNAR SCALE ");
u8g2.setCursor(0,20);
u8g2.print("FOR ESP GRINDER ");
u8g2.setCursor(0,30);
u8g2.print("5V_RELAY_HIGH IO02 ");
u8g2.setCursor(0,40);
u8g2.print("ESP32_C3,Wald,042224 ");
u8g2.setCursor(0,50);
u8g2.print(" ");
u8g2.setCursor(0,60);
u8g2.print("auto ");
u8g2.setCursor(92,60);
u8g2.print("manual ");
check_button_event();
if (button_event == U8X8_MSG_GPIO_MENU_HOME)
current_selection1 = 2;
if (button_event == U8X8_MSG_GPIO_MENU_SELECT)
current_selection1 = 1;
if (button_event == U8X8_MSG_GPIO_MENU_NEXT)
current_selection1 = 0;
}while (u8g2.nextPage());
}
//10
void eeprom_clear() {
EEPROM.begin(512);
// write a 0 to all 512 bytes of the EEPROM
for (int i = 0; i < 512; i++) { EEPROM.write(i, 0); }
// turn the relayOutput on when we're done
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
EEPROM.end();
current_selection1 = 0;
}
/*
void refreshTime(){
if (digitalRead(relayOutput)){
starttime=millis();
}else
if(digitalRead(relayOutput)==HIGH){
endtime=millis();
resulttime=(endtime-starttime)/1000;
}
}
*/
/*
u8g2.userInterfaceInputValue("标题","提示文本",值,最低值,最高值,值的位数,"文本") //按键消息菜单
u8g2.userInterfaceMessage("Title1", "Title2", "Title3", " Ok \n Cancel "); //按键确认菜单
u8g2.userInterfaceSelectionList("Title", 默认选择项, "Select1\Select2\Select3"); //按键选择菜单
*/
/*
u8g2.userInterfaceInputValue("标题","提示文本",值,最低值,最高值,值的位数,"文本") //按键消息菜单
u8g2.userInterfaceMessage("Title1", "Title2", "Title3", " Ok \n Cancel "); //按键确认菜单
u8g2.userInterfaceSelectionList("Title", 默认选择项, "Select1\Select2\Select3"); //按键选择菜单
*/
/*
const char *string_list =
"Altocumulus\n"
"Altostratus\n"
"Cirrocumulus\n"
"Cirrostratus\n"
"Cirrus\n"
"Cumulonimbus\n"
"Cumulus\n"
"Nimbostratus\n"
"Stratocumulus\n"
"Stratus";
uint8_t current_selection = 0;
current_selection = u8g2.userInterfaceSelectionList(
"Cloud Types",
current_selection,
string_list);
if ( current_selection == 0 ) {
u8g2.userInterfaceMessage(
"Nothing selected.",
"",
"",
" ok ");
}else {
u8g2.userInterfaceMessage(
"Selection:",
u8x8_GetStringLineStart(current_selection-1, string_list ),
"",
" ok \n cancel ");
}
*/
//2024-04-22