/* //MENU EN ESP32 Y ENCODER ROTATORIO CON PANTALLA OLED NO FUNCIONA
// LA IDEA ES UTILIZAR UNA OLED Y UN ENCODER KY-040 PARA TENER UN MENU DE SELECCIÓN DONDE AL DAR CLIC EN EL BOTON DEL ENCODER SE CAMBIE DE OPCIÓN Y AL ROTAR
// SE CAMBIE EL VALOR QUE TIENE LA VARIABLE. SON TRES VARIABLES NOMBRADA VALUE A VALUE B Y VALUE C ADEMAS DE UN ESTAR IDLE DONDE SE TIENEN TRES LEDS CONECTADOS
//Y AL IR VAIANDO LOS VALORES DE A B O C SE VA CAMBIANDO EL BRILLO DE CADA LED.
//REF: Arduino + Oled + Encoder Simple Menu, https://youtu.be/emLxabiDG0w
//SI FUNCIONA SOLO QUE REQUIERE ALGUNOS AJUSTES...
//#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 //OLED DISPLAY WIDTH IN PIXELS
#define SCREEN_HEIGHT 64 //OLED DISPLAY HEIGTH IN PIXELS
#define OLED_RESET -1 //RESET PIN # (OR -1 IF SHARING ARDUINO RESET PIN)
#define OLED_ADDRESS 0x3C //SEE DATASHEET FOR ADDRESS 0x3D FOR 128x64 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define encoder0PinA 12
#define encoder0PinB 13
volatile unsigned int encoder0Pos = 0;
int valA;
int valB;
int valC;
byte SW;
byte menuCount = 1;
byte dir = 0;
bool runState = false;
void setup() {
pinMode(2, OUTPUT); //CONECTAR UN LED CON SU RESISTENCIA EN EL PIN 2 (YA ESTA INCLUIDO).
pinMode(14, OUTPUT); //CONECTAR UN LED CON SU RESISTENCIA EN EL PIN 14
pinMode(15, OUTPUT); //CONECTAR UN LED CON SU RESISTENCIA EN EL PIN 15
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.display();
display.clearDisplay();
attachInterrupt(4, doEncoder, FALLING); // CHANGE encoder pin on interrupt 4 - pin D4
}
void loop() {
SW = digitalRead(4); //CONECTAR CLK EN PIN 4 DEL ESP32
ledControl();
menuCheck();
staticMenu();
display.clearDisplay();
delay(50);
}
void staticMenu() {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, 0);
display.println("yyRobotic");
//---------------------------------
display.setTextSize(1);
display.setCursor(10, 20);
display.println("Value A:");
display.setCursor(60, 20);
display.println(valA);
display.setCursor(10, 30);
display.println("Value B:");
display.setCursor(60, 30);
display.println(valB);
display.setCursor(10, 40);
display.println("Value C:");
display.setCursor(60, 40);
display.println(valC);
display.setCursor(10, 50);
display.println("Start:");
display.setCursor(45, 50);
if (encoder0Pos > 5 && menuCount == 4) {
display.println("Run!");
runState = true;
} else {
display.println("Idle");
runState = false;
}
display.setCursor(2, (menuCount * 10) + 10);
display.println(">");
display.display();
}
void ledControl() {
if (runState == true) {
digitalWrite(2, valA);
digitalWrite(15, valB);
digitalWrite(18, valC);
// analogWrite(6, valA);
// analogWrite(9, valB);
// analogWrite(10, valC);
}
}
void menuCheck() {
if (SW == LOW && menuCount < 5) {
menuCount++;
encoder0Pos = 0;
}
if (SW == LOW && menuCount >= 5) {
menuCount = 1;
}
if (menuCount == 1) {
valA = encoder0Pos;
}
if (menuCount == 2) {
valB = encoder0Pos;
}
if (menuCount == 3) {
valC = encoder0Pos;
}
}
void doEncoder() {
if (digitalRead(encoder0PinA) == HIGH) {
if (digitalRead(encoder0PinB) == LOW && encoder0Pos > 0) {
encoder0Pos = encoder0Pos - 1;
dir = 0;
}
else {
encoder0Pos = encoder0Pos + 1;
dir = 1;
}
}
else
{
if (digitalRead(encoder0PinB) == LOW ) {
encoder0Pos = encoder0Pos + 1;
dir = 1;
}
else {
if (encoder0Pos > 0) {
encoder0Pos = encoder0Pos - 1;
dir = 0;
}
}
}
}
*/
//USO DE ENCODER ROTATIVO ÓPTICO
//https://electricdiylab.com/how-to-connect-optical-encoder-with-esp32/, 09 DE SEPTIEMBRE DE 2023
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 //OLED DISPLAY WIDTH IN PIXELS
#define SCREEN_HEIGHT 64 //OLED DISPLAY HEIGTH IN PIXELS
#define OLED_RESET -1 //RESET PIN # (OR -1 IF SHARING ARDUINO RESET PIN)
#define OLED_ADDRESS 0x3C //SEE DATASHEET FOR ADDRESS 0x3D FOR 128x64 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ENCODER_A 32 // PIN FOR ENCODER A / CLK
#define ENCODER_B 33 // PIN FOR ENCODER B / DT
volatile int encoder_value = 0; // GLOBAL VARIABLE FOR STORING THE ENCODER POSITION
int Pin_Led = 2;
//ESTA FUNCIÓN PERMITE UTILIZAR UNA INTERRUPCCIÓN PARA PODER LEER LOS VALORES DEL ENCODER
void encoder_isr() {
// READING THE CURRENT STATE OF ENCODER A AND B
int A = digitalRead(ENCODER_A);
int B = digitalRead(ENCODER_B);
// IF THE STATE OF A CHANGED, IT MEANS THE THE ENCODER HAS BEEN ROTATED
if ((A == HIGH) != (B == LOW)) {
encoder_value--;
} else {
encoder_value++;
}
}
void printReadings(){
display.setTextColor(WHITE);
display.clearDisplay(); //CLEAN ALL DATA ON OLED SCREEN
display.setTextSize(2);
display.setCursor(20, 0);
display.println("ENCODER");
display.display(); //YOU MUST WRITE THIS LINE ALWAYS OTHERWAY DATA WILL DONT SHOWS
delay(50);
display.setTextColor(WHITE);
display.clearDisplay(); //CLEAN ALL DATA ON OLED SCREEN
display.setTextSize(2);
display.setCursor(0, 25);
display.println("Value: ");
display.setCursor(50, 50);
display.println(encoder_value);
display.display(); //YOU MUST WRITE THIS LINE ALWAYS OTHERWAY DATA WILL DONT SHOWS
}
void setup() {
Serial.begin(115200); // Initialize serial communication
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.display();
delay(1000);
display.clearDisplay();
pinMode(ENCODER_A, INPUT_PULLUP);
pinMode(ENCODER_B, INPUT_PULLUP);
pinMode(Pin_Led, OUTPUT);
// ATTACHING THE ISR TO ENCODER A
attachInterrupt(digitalPinToInterrupt(ENCODER_A), encoder_isr, RISING); //RISING, FALLING AND CHANGE
printReadings();
}
void loop() {
printReadings();
//SI EL VALOR LEIDO EN EL ENCODER ES MAYOR QUE 10 SE ENCIENDE FIJAMENTE EL LED EN EL PIN 2
//SI EL VALOR LEIDO EN EL ENCODER ES MENOR QUE 0, SE ENCIENDE EL LED EN EL PIN 2 PARPADEANDO CADA 100 MILISEGUNDOS
if(encoder_value>10){
digitalWrite(Pin_Led, HIGH);
}
else if(encoder_value<0){
digitalWrite(Pin_Led, HIGH);
delay(100);
digitalWrite(Pin_Led, LOW);
}
else{
digitalWrite(Pin_Led, LOW);
}
Serial.println("Encoder value: " + String(encoder_value));
delay(100);
}