/**
ESP32 + DHT22 Example for Wokwi
https://wokwi.com/arduino/projects/322410731508073042
*/
#include "esp32_inc_file.h"
#include <SPI.h>
#include <Wire.h>
// OLED
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Rotary Encoder
#include "RotaryEncoder.h"
#define PIN_IN1 ROT_CLK_PIN
#define PIN_IN2 ROT_DIR_PIN
RotaryEncoder *encoder = nullptr;
// MENUS
struct legVar{
String legend;
float variable;
};
struct legString{
String legend;
String variable;
};
struct legVarUni{
String legend;
float var;
String unity;
};
struct legVarEdit{
String legend;
float variable;
};
struct legStringEdit{
String legend;
String variable;
};
struct legVarUniEdit{
String legend;
float var;
String unity;
};
struct headerLine{
String txt;
String txt1;
const unsigned char *icon1 = blank_16;
const unsigned char *icon2 = blank_16;
const unsigned char *icon3 = blank_16;
};
struct footerLine{
String txt;
const unsigned char *icon1 = blank_8;
const unsigned char *icon2 = blank_8;
const unsigned char *icon3 = blank_8;
};
struct body3Lines{
String txt1;
String txt2;
String txt3;
};
struct body4Lines{
String txt1;
String txt2;
String txt3;
String txt4;
};
struct menu3Lines{
headerLine header;
body3Lines body;
footerLine footer;
};
struct menu4Lines{
headerLine header;
body4Lines body;
footerLine footer;
};
const long SEND_OLED_DataTime = TIME_SEND_OLED;
unsigned long SEND_OLED_Data = 0;
const long TIMER_1S = 1000;
unsigned long TIMER_1S_Time = 0;
bool timer_1S_Stat = false;
unsigned long ROT_SW_TIME = 0;
unsigned long keyPressFilter = 0;
int32_t aux_int = 0;
int aux_cont = 0;
menu3Lines mainMenu;
menu4Lines sensorEncoder;
IRAM_ATTR void checkPosition()
{
encoder->tick(); // just call tick() to check the state.
}
IRAM_ATTR void centerKeyUp(){
aux_int = millis() - keyPressFilter;
if( aux_int > TIME_KEY_FILTER){
aux_cont++;
}
keyPressFilter = millis();
if(aux_cont > 10) aux_cont=0;
}
void sendToDisplay(menu4Lines _content){
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println(_content.header.txt);
display.setTextSize(1);
display.setCursor(0,16);
display.println(_content.body.txt1);
display.println(_content.body.txt2);
display.println(_content.body.txt3);
display.println(_content.body.txt4);
display.setTextSize(1);
display.setCursor(0,56);
display.println(_content.footer.txt);
//display.drawBitmap(0,0, _head.icon1,128,64,WHITE);
//display.setCursor(0,0);
display.display();
}
void sendToDisplay(menu3Lines _content){
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.println(_content.header.txt);
display.drawBitmap(112, 0, _content.header.icon1, 16, 16, WHITE );
display.drawBitmap(96, 0, _content.header.icon2, 16, 16, WHITE );
display.drawBitmap(80, 0, _content.header.icon3, 16, 16, WHITE );
display.setTextSize(1);
display.setCursor(0,24);
display.println(_content.body.txt1);
display.println(_content.body.txt2);
display.println(_content.body.txt3);
display.setTextSize(1);
display.setCursor(0,56);
if (timer_1S_Stat) display.println(_content.footer.txt);
display.drawBitmap(112, 56, _content.footer.icon1, 16, 8, WHITE);
display.drawBitmap(96, 56, _content.footer.icon2, 16, 8, WHITE);
display.drawBitmap(80, 56, _content.footer.icon3, 16, 8, WHITE);
//display.drawBitmap(0,0, _head.icon1,128,64,WHITE);
//display.setCursor(0,0);
display.display();
}
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN, 400000L); // sda /scl
pinMode(ROT_SW_PIN, INPUT_PULLUP);
encoder = new RotaryEncoder(PIN_IN1, PIN_IN2, RotaryEncoder::LatchMode::TWO03);
attachInterrupt(digitalPinToInterrupt(ROT_SW_PIN) , centerKeyUp, RISING);
attachInterrupt(digitalPinToInterrupt(ROT_CLK_PIN), checkPosition, CHANGE);
attachInterrupt(digitalPinToInterrupt(ROT_DIR_PIN), checkPosition, CHANGE);
mainMenu.header.txt = "000";
mainMenu.header.icon1 = wifi_max;
mainMenu.header.icon2 = wifi_min;
//mainMenu.header.icon3 = wifi_null;
mainMenu.body.txt1 = "txt 1";
mainMenu.body.txt2 = "txt 2";
mainMenu.body.txt3 = "txt 3";
mainMenu.footer.txt = "Main Menu";
delay(100);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS, false, false)) {
Serial.println(F("SSD1306 allocation failed"));
delay(1000);
}else{
Serial.println(F("SSD1306 OK"));
sendToDisplay(mainMenu);
}
}
void loop() {
Serial.println("---");
delay(1000);
if (millis() - SEND_OLED_Data >= SEND_OLED_DataTime) {
SEND_OLED_Data = millis();
sensorEncoder.header.txt = "1";
sensorEncoder.body.txt1 = "POS: " + (String)(int)encoder->getPosition();
sensorEncoder.body.txt2 = "DIR: " + (String)(int)encoder->getDirection();
sensorEncoder.body.txt3 = "Cont: "+ (String)aux_cont;
sensorEncoder.body.txt4 = "RPM: " + (String)(int)encoder->getRPM();
sensorEncoder.footer.txt = "Encoder";
if(aux_cont % 2 == 0 ) sendToDisplay(sensorEncoder);
else sendToDisplay(sensorEncoder);
}
}