Arduino and OLED display Knob + Menu FREE CODE




#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define NUM_MENU 3

#define OLED_RESET 13

Adafruit_SSD1306 display(OLED_RESET);

#if (SSD1306_LCDHEIGHT != 64)

#error("Height incorrect, please fix Adafruit_SSD1306.h!");

#endif

const char menu1[] PROGMEM = "ITEM_1";
const char menu2[] PROGMEM = "ITEM_2";
const char menu3[] PROGMEM = "ITEM_3"; 

const char * const menus[] PROGMEM =
{
    menu1,
    menu2,
    menu3

};

int val=-1;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;


void setup() {
  pinMode (encoder0PinA, INPUT);
  pinMode (encoder0PinB, INPUT);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
 
  Serial.begin (9600);
}

void loop() {
 
  updateKnob();

if( val != encoder0Pos ){
    val = encoder0Pos;
    updateMenu();
}
}
void updateKnob()
{
   n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
       if( encoder0Pos > 0 ){
           encoder0Pos--;
       }else{
           encoder0Pos = NUM_MENU-1;
       }
    } else {
      if( encoder0Pos < (NUM_MENU-1) ){
          encoder0Pos++;
      }else{
          encoder0Pos = 0;
      }
    }
    Serial.print (encoder0Pos);
    Serial.println();
  }
  encoder0PinALast = n;
}
void updateMenu(){
 
   char tBuffer[22];
 
   display.clearDisplay();

   display.setTextSize(2);
   
 
   for(int i=0; i < NUM_MENU;i++){
   
        display.setCursor(5,(i*20)+5);
        display.setTextColor(WHITE);
        if( (encoder0Pos) == i ){
          display.setTextColor(BLACK, WHITE);
        }
        display.println(strcpy_P(tBuffer, (char*)pgm_read_word(&(menus[i]))));
               
   }
   
   display.display();
 
}


ความคิดเห็น