Problem Menü / Nokia 5110 Display / Rotary

Hallo Gemeinde,

ich bin immer noch am lernen und wollte heute einen Sketch aus dem Netz umarbeiten auf einen Encoder.
Unter Zuhilfenahme der Rotary und OneButton Lib´s funktioniert das ja auch schon mal, ABER :slight_smile:

Quell Sketch: Arduino Tutorial: Menu on a Nokia 5110 LCD Display Tutorial - YouTube

Eigentlich funktioniert alles bis auf das, dass mein Display beim drehen des Contrast aussteigt. Soll heißen wenn ich in das Contrast Menü gehe kann ich den Contrast ändern und plötzlich steigt das Display aus als ob ein Buffer oder was auch immer überläuft. Es kommt keine Textausgabe mehr. Der Contrast kann aber immer noch verändert werden.

Hier mal der umgearbeitete Sketch:

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <OneButton.h>
#include <Rotary.h>

boolean backlight = true;
int contrast=55;

int menuitem = 1;
int page = 1;

Adafruit_PCD8544 display = Adafruit_PCD8544(12, 11, 5, 7, 6);

// Encoder
int Up = 2;
int Down = 3;
Rotary r = Rotary(Up, Down); 

// Encoder Taster
int buttonPin = 4;
OneButton button(buttonPin, false);

// Display Backlight
int backlightled = 10;

void setup() {
  Serial.begin(9600);

  pinMode(buttonPin, INPUT);
  pinMode(backlightled, OUTPUT);
  digitalWrite(backlightled, LOW);
  
  display.begin();      
  display.setContrast(contrast);
  display.clearDisplay(); 
  display.display();   

  // OneButton
  button.attachClick(clicked);
  button.attachDoubleClick(doubleClicked);
  button.attachLongPressStart(longPressStart);
  
  // Interrupt fuer Drehgeber konfigurieren
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
}

void loop() {
  button.tick();  
  drawMenu();
}


void clicked() {
    if (page == 1 && menuitem == 2) 
    {
      if (backlight) 
      {
        backlight = false;
        turnBacklightOff();
        }
      else 
      {
        backlight = true; 
        turnBacklightOn();
       }
    }

    if(page == 1 && menuitem == 3)
    {
      resetDefaults();
    }
    else if (page == 1 && menuitem == 1) {
      page = 2;
    }
    else if (page == 2) {
      page = 1;
    }
}

void doubleClicked() {

}

void longPressStart() {

}

void drawMenu() {
if (page == 1) 
   {    
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("MAIN MENU");
    display.drawFastHLine(0,10,84,BLACK);
    display.setCursor(0, 15);
   
if (menuitem == 1) 
    { 
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }
      display.print("> Contrast");
      display.setCursor(0, 25);
   
if (menuitem == 2) 
    {
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }    
      display.print("> Light: ");
    
if (backlight) 
    {
      display.print("ON");
    }
      else 
    {
      display.print("OFF");
    }
    
if (menuitem == 3)  
    { 
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }  
    display.setCursor(0, 35);
    display.print("> Reset");
    display.display();
    }
else if (page == 2) 
    {
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("CONTRAST");
    display.drawFastHLine(0,10,83,BLACK);
    display.setCursor(5, 15);
    display.print("Value");
    display.setTextSize(2);
    display.setCursor(5, 25);
    display.print(contrast);
    display.setTextSize(2);
    display.display();
    }
}


void resetDefaults() {
    contrast = 50;
    setContrast();
    backlight = true;
    turnBacklightOn();
}


void setContrast() {
    display.setContrast(contrast);
//    display.display();
}


void turnBacklightOn() {
    digitalWrite(backlightled, LOW);
}


void turnBacklightOff() {
    digitalWrite(backlightled, HIGH);
}


void moveup() {
  if (page == 1) {
    menuitem++;
    if (menuitem > 3) 
    {
      menuitem = 1;
    }      
  }else if (page == 2 ) {
    contrast++;
    setContrast();
  }
}


void movedown() {
  if (page == 1 ) {
    menuitem--;
    if (menuitem < 1)
    {
      menuitem = 3;
    }      
  }else if (page == 2) {
    contrast--;
    setContrast();
  }
}


ISR(PCINT2_vect) {
 unsigned char result = r.process();
 if (result) {
   if (result == DIR_CW) {
          moveup();
   } else {
          movedown();
   }  
 }
}

Vielleicht kann mir da ja jemand wie schon so oft eine Hilfstellung geben warum das so sein könnte.

Gruß Wolfi

Also ich hab nun mal weiter versucht mein Problem in den Griff zu bekommen.

Wenn ich setContrast(); nicht ausführe, also das Ergebnis von "contrast" nicht schreibe passiert der aufhänger nicht. Da kann ich den Rotary drehen wie ein wilder .. Der Value ändert sich, aber wird natürlich nicht geschrieben.

Nur warum macht er das ?

Gruß

Wolfi

Du solltest die Contrast-Einstellung mal einfach mit einem (zwei) Taster probieren. Up und Down.

Contrast_Up++ oder Contrast_Down--

Wenn das funktioniert, liegt es am Sketch für den Encoder.

Wenn nicht, geht es mit dem Display so nicht.

Edit: Evtl. auch die Zähler bis zum Endwert frei laufen lassen, da die Taster prellen.

Danke HotSystems für die Info … Ich hab das ganze nun mal ohne die Rotary.h versucht. Leider das selbe in Grün. Beim schreiben des Contrast´s will das Display plötzlich nicht mehr.

Hier der Aktuelle Sketch ohne Encoder Lib.

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <OneButton.h>


boolean backlight = true;
int contrast = 55;

int menuitem = 1;
int page = 1;

Adafruit_PCD8544 display = Adafruit_PCD8544(12, 11, 5, 7, 6);

// Encoder
static int pinA = 2;
static int pinB = 3;

volatile byte aFlag = 0;
volatile byte bFlag = 0;
volatile byte reading = 0;

// Encoder Taster
int buttonPin = 4;
OneButton button(buttonPin, false);

// Display Backlight
int backlightled = 10;

void setup() {
  Serial.begin(9600);
  
  pinMode(pinA, INPUT_PULLUP);
  pinMode(pinB, INPUT_PULLUP);
  attachInterrupt(0,PinA,RISING);
  attachInterrupt(1,PinB,RISING);

  pinMode(buttonPin, INPUT);
  pinMode(backlightled, OUTPUT);
  
  digitalWrite(backlightled, LOW);
  
  display.begin();      
  display.setContrast(contrast);
  display.clearDisplay(); 
  display.display();   

  // OneButton
  button.attachClick(clicked);
}

void loop() {
  button.tick();  
  drawMenu();
}


void clicked() {
    if (page == 1 && menuitem == 2) 
    {
      if (backlight) 
      {
        backlight = false;
        turnBacklightOff();
        }
      else 
      {
        backlight = true; 
        turnBacklightOn();
       }
    }

    if(page == 1 && menuitem == 3)
    {
      resetDefaults();
    }
    else if (page == 1 && menuitem == 1) {
      page = 2;
    }
    else if (page == 2) {
      page = 1;
    }
}


void drawMenu() {
if (page == 1) 
   {    
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("MAIN MENU");
    display.drawFastHLine(0,10,84,BLACK);
    display.setCursor(0, 15);
   
if (menuitem == 1) 
    { 
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }
      display.print("> Contrast");
      display.setCursor(0, 25);
   
if (menuitem == 2) 
    {
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }    
      display.print("> Light: ");
    
if (backlight) 
    {
      display.print("ON");
    }
      else 
    {
      display.print("OFF");
    }
    
if (menuitem == 3)  
    { 
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }  
    display.setCursor(0, 35);
    display.print("> Reset");
    display.display();
    }
else if (page == 2) 
    {
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("CONTRAST");
    display.drawFastHLine(0,10,83,BLACK);
    display.setCursor(5, 15);
    display.print("Value");
    display.setTextSize(2);
    display.setCursor(5, 25);
    display.print(contrast);
    display.setTextSize(2);
    display.display();
    }
}


void resetDefaults() {
    contrast = 50;
    setContrast();
    backlight = true;
    turnBacklightOn();
}


void setContrast() {
    display.setContrast(contrast);
}


void turnBacklightOn() {
    digitalWrite(backlightled, LOW);
}


void turnBacklightOff() {
    digitalWrite(backlightled, HIGH);
}


void moveup() {
  if (page == 1) {
    menuitem++;
    if (menuitem > 3) 
    {
      menuitem = 1;
    }      
  }else if (page == 2 ) {
    contrast++;
    setContrast();
  }
}


void movedown() {
  if (page == 1 ) {
    menuitem--;
    if (menuitem < 1)
    {
      menuitem = 3;
    }      
  }else if (page == 2) {
    contrast--;
    setContrast();
  }
}


void PinA(){
  cli();
  reading = PIND & 0xC;
  if(reading == B00001100 && aFlag) {
    moveup();
    bFlag = 0;
    aFlag = 0;
  }
  else if (reading == B00000100) bFlag = 1;
  sei();
}


void PinB(){
  cli();
  reading = PIND & 0xC;
  if (reading == B00001100 && bFlag) {
    movedown(); 
    bFlag = 0;
    aFlag = 0;
  }
  else if (reading == B00001000) aFlag = 1;
  sei();
}

Gruß

Wolfi

Dann trifft das zu, was ich vermutet habe. Der Kontrast kann während der Laufzeit nicht geändert werden.

Hallo …

So das Thema scheint Erledigt! … Ich bin zum Glück noch über folgendes gestolpert:

// Hardware SPI (faster, but must use certain hardware pins):
// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
// MOSI is LCD DIN - this is pin 11 on an Arduino Uno

Dort wird auch erwähnt das die Software SPI zwar flexibler aber auch langsamer ist. Nun ich musste nur von Pin 12 auf Pin 13 und und schon war ich auf der Hardware SPI. Nun funktioniert alles wie es soll und ich kann weiter lernen :slight_smile:

Hier nun der Funktionierende Sketch:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <OneButton.h>
#include <Rotary.h>

boolean backlight = true;
int contrast = 55;

int menuitem = 1;
int page = 1;

// Hardware SPI (faster, but must use certain hardware pins):
// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 7, 6);

// Encoder
int Up = 2;
int Down = 3;
Rotary r = Rotary(Up, Down); 

// Encoder Taster
int buttonPin = 4;
OneButton button(buttonPin, false);

// Display Backlight
int backlightled = 10;

void setup() {
  Serial.begin(9600);

  pinMode(buttonPin, INPUT);
  pinMode(backlightled, OUTPUT);
  digitalWrite(backlightled, LOW);
  
  display.begin();      
  display.setContrast(contrast);
  display.clearDisplay(); 
  display.display();   

  // OneButton
  button.attachClick(clicked);
  button.attachDoubleClick(doubleClicked);
  button.attachLongPressStart(longPressStart);
  
  // Interrupt fuer Drehgeber konfigurieren
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
}

void loop() {
  button.tick();  
  drawMenu();
}


void clicked() {
    if (page == 1 && menuitem == 2) 
    {
      if (backlight) 
      {
        backlight = false;
        turnBacklightOff();
        }
      else 
      {
        backlight = true; 
        turnBacklightOn();
       }
    }

    if(page == 1 && menuitem == 3)
    {
      resetDefaults();
    }
    else if (page == 1 && menuitem == 1) {
      page = 2;
    }
    else if (page == 2) {
      page = 1;
    }
}

void doubleClicked() {

}

void longPressStart() {

}

void drawMenu() {
if (page == 1) 
   {    
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("MAIN MENU");
    display.drawFastHLine(0,10,84,BLACK);
    display.setCursor(0, 15);
   
if (menuitem == 1) 
    { 
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }
      display.print("> Contrast");
      display.setCursor(0, 25);
   
if (menuitem == 2) 
    {
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }    
      display.print("> Light: ");
    
if (backlight) 
    {
      display.print("ON");
    }
      else 
    {
      display.print("OFF");
    }
    
if (menuitem == 3)  
    { 
      display.setTextColor(WHITE, BLACK);
    }
      else 
    {
      display.setTextColor(BLACK, WHITE);
    }  
    display.setCursor(0, 35);
    display.print("> Reset");
    display.display();
    }
else if (page == 2) 
    {
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("CONTRAST");
    display.drawFastHLine(0,10,83,BLACK);
    display.setCursor(5, 15);
    display.print("Value");
    display.setTextSize(2);
    display.setCursor(5, 25);
    display.print(contrast);
    display.setTextSize(2);
    display.display();
    }
}


void resetDefaults() {
    contrast = 50;
    setContrast();
    backlight = true;
    turnBacklightOn();
}


void setContrast() {
    display.setContrast(contrast);
}


void turnBacklightOn() {
    digitalWrite(backlightled, LOW);
}


void turnBacklightOff() {
    digitalWrite(backlightled, HIGH);
}


void moveup() {
  if (page == 1) {
    menuitem++;
    if (menuitem > 3) 
    {
      menuitem = 1;
    }      
  }else if (page == 2 ) {
    contrast++;
    setContrast();
  }
}


void movedown() {
  if (page == 1 ) {
    menuitem--;
    if (menuitem < 1)
    {
      menuitem = 3;
    }      
  }else if (page == 2) {
    contrast--;
    setContrast();
  }
}


ISR(PCINT2_vect) {
 unsigned char result = r.process();
 if (result) {
   if (result == DIR_CW) {
          moveup();
   } else {
          movedown();
   }  
 }
}

Gruß Wolfi

Ey...super. Das ist mal eine gute Nachricht. Dann lag ich zum Glück falsch.