INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Rotary Encoder und I2C Display gleichzeitig verwenden
26.07.2020, 19:18 (Dieser Beitrag wurde zuletzt bearbeitet: 27.07.2020 10:30 von Bitklopfer.)
Beitrag #1
Rotary Encoder und I2C Display gleichzeitig verwenden
Ich habe versucht, ein ic2 oled display und einen Rotary Encoder an meinen Arduino Leonardo anzuschließen. Das Display zeigt ein Menü an und mit dem Encoder kann man durch eben jenes Menü navigieren.
Beides alleine funktioniert super, wenn ich aber versuche, beides in einem Sketch zu verwenden, funktioniert keines von beidem mehr so richtig. Wie kann ich beides zusammen laufen lassen? Vielen Dank für die Hilfe im Vorause!
Hier ist der Code:
Code:
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

#define rot_A 2
#define rot_B 3
#define rot_Push 4

volatile int buttonState = 0;

int m1p[4] = {25, 3, 24, 24};
int m2p[4] = {53, 3, 24, 24};
int m3p[4] = {80, 3, 24, 24};
int m4p[4] = {25, 28, 24, 24};
int m5p[4] = {53, 28, 24, 24};
int m6p[4] = {80, 28, 24, 24};

int current_mode = 1;
int current_brightness = 50;
int current_color = 0;
int current_band_level = 1;

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void){
  pinMode(rot_A,INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(rot_A), onButtonAPressed, LOW);
  u8g2.begin();
  
}
void onButtonAPressed() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
void loop(void){
  toggleBrightness();
   u8g2.firstPage();
  do {
    drawConstantLayout();
    drawModeFrame();
    drawBrightnessIndicator();
    drawColorSlider();
    drawBandSelector();
  } while (u8g2.nextPage());
}
// Ab hier ist der Code nurnoch Animations-Zeug, also ich glaube unwichtig für dieses Problem
void drawConstantLayout() {
  // Initial Layout Setup
    u8g2.drawFrame(0, 0, 128, 64);
    // Brightness Seperator
    u8g2.drawLine(22, 0, 22, 64);
    // Color Seperator
    u8g2.drawLine(22, 54, 106, 54);
    // Lines Seperator
    u8g2.drawLine(106, 0, 106, 64);
    // Brightness Indicator
    
    u8g2.drawRFrame(6, 15, 10, 45, 1);
    // Lamp Symbol --start
    u8g2.drawPixel(7, 8);
    u8g2.drawPixel(8, 7);
    u8g2.drawPixel(9, 5);
    u8g2.drawPixel(9, 4);
    u8g2.drawPixel(10, 5);
    u8g2.drawPixel(10, 4);
    u8g2.drawPixel(10, 3);
    u8g2.drawPixel(11, 5);
    u8g2.drawPixel(11, 4);
    u8g2.drawPixel(11, 3);
    u8g2.drawPixel(12, 5);
    u8g2.drawPixel(12, 4);
    u8g2.drawPixel(13, 5);
    u8g2.drawPixel(13, 4);
    u8g2.drawPixel(12, 3);
    u8g2.drawPixel(11, 8);
    u8g2.drawPixel(11, 7);
    u8g2.drawPixel(14, 7);
    u8g2.drawPixel(15, 8);
    // Lamp Symbol --end
    // O --begin
    u8g2.drawPixel(26, 60);
    u8g2.drawPixel(27, 61);
    u8g2.drawPixel(28, 61);
    u8g2.drawPixel(29, 61);
    u8g2.drawPixel(30, 60);
    u8g2.drawPixel(30, 59);
    u8g2.drawPixel(30, 58);
    u8g2.drawPixel(29, 57);
    u8g2.drawPixel(28, 57);
    u8g2.drawPixel(27, 57);
    u8g2.drawPixel(26, 58);
    u8g2.drawPixel(26, 59);
    // O --end
    // Color Slide Line
    u8g2.drawLine(33, 60, 98, 60);
    u8g2.drawPixel(33, 61);
    u8g2.drawPixel(98, 61);
    // R --begin
    u8g2.drawPixel(104, 61);
    u8g2.drawPixel(104, 60);
    u8g2.drawPixel(103, 59);
    u8g2.drawPixel(102, 59);
    u8g2.drawPixel(101, 59);
    u8g2.drawPixel(101, 60);
    u8g2.drawPixel(101, 61);
    u8g2.drawPixel(104, 58);
    u8g2.drawPixel(103, 57);
    u8g2.drawPixel(102, 57);
    u8g2.drawPixel(101, 57);
    u8g2.drawPixel(101, 58);
    // R --end

    // Bands --begin
    u8g2.drawFrame(111, 5, 13, 6);
    u8g2.drawFrame(111, 13, 13, 6);
    u8g2.drawFrame(111, 21, 13, 6);
    u8g2.drawFrame(111, 29, 13, 6);
    u8g2.drawFrame(111, 37, 13, 6);
    u8g2.drawFrame(111, 45, 13, 6);
    u8g2.drawFrame(111, 53, 13, 6);
    // Bands --end  
    // Only-Light-Mode Logo --begin
    u8g2.drawLine(33, 5, 40, 5);
    u8g2.drawLine(32, 6, 32, 7);
    u8g2.drawLine(31, 8, 31, 10);
    u8g2.drawLine(41, 6, 41, 7);
    u8g2.drawLine(42, 8, 42, 10);
    u8g2.drawLine(32, 11, 41, 11);
    u8g2.drawLine(30, 11, 29, 12);
    u8g2.drawLine(29, 13, 31, 15);
    u8g2.drawPixel(32, 15);
    u8g2.drawLine(43, 11, 44, 12);
    u8g2.drawLine(44, 13, 42, 15);
    u8g2.drawPixel(41, 15);
    u8g2.drawLine(33, 16, 40, 16);
    u8g2.drawLine(31, 17, 28, 24);
    u8g2.drawLine(35, 18, 34, 24);
    u8g2.drawLine(38, 18, 39, 24);
    u8g2.drawLine(42, 17, 45, 24);
    // Only-Light-Mode Logo --end
    // Simple Visualizer Logo --begin
    u8g2.drawLine(55, 24, 63, 24);
    u8g2.drawLine(55, 22, 55, 14);
    u8g2.drawLine(57, 22, 57, 19);
    u8g2.drawPixel(59, 22);
    u8g2.drawLine(61, 22, 61, 21);
    u8g2.drawLine(63, 22, 63, 20);
    u8g2.drawLine(59, 14, 68, 14);
    u8g2.drawLine(66, 12, 68, 14);
    u8g2.drawLine(66, 16, 68, 14);
    u8g2.drawFrame(71, 7, 3, 18);
    u8g2.drawLine(72, 14, 72, 23);
    // Simple Viualizer Logo --end
    // Ray Visualizer Logo -- begin
    u8g2.drawLine(82, 24, 90, 24);
    u8g2.drawLine(82, 22, 82, 14);
    u8g2.drawLine(84, 22, 84, 19);
    u8g2.drawPixel(86, 22);
    u8g2.drawLine(88, 22, 88, 21);
    u8g2.drawLine(90, 22, 90, 20);
    u8g2.drawLine(86, 14, 95, 14);
    u8g2.drawLine(93, 12, 95, 14);
    u8g2.drawLine(93, 16, 95, 14);
    u8g2.drawPixel(100, 5);
    u8g2.drawRFrame(99, 6, 3, 5, 1);
    u8g2.drawPixel(100, 11);
    u8g2.drawRBox(99, 12, 3, 5, 1);
    u8g2.drawPixel(100, 17);
    u8g2.drawRFrame(99, 18, 3, 5, 1);
    u8g2.drawPixel(100, 23);

    // Mode selector test
}





/// Just Animation Stuff
void toggleMode(){
  if (current_mode != 6){
    current_mode = current_mode + 1;
  } else {
    current_mode = 1;
  }
}
void toggleBrightness(){
  if(current_brightness != 100){
    current_brightness = current_brightness + 10;
  } else {
    current_brightness = 0;
  }
}

void toggleColor(){
  if(current_color != 100){
    current_color = current_color + 5;
  } else {
    current_color = 0;
  }
}

void toggleBandLevel() {
  if(current_band_level != 13) {
    current_band_level = current_band_level + 1;
  } else {
    current_band_level = 1;
  }
}

// End of Animation Stuff
void drawModeFrame(){
  switch (current_mode){
    case 1:
      u8g2.drawFrame(m1p[0], m1p[1], m1p[2], m1p[3]);
    break;
    case 2:
      u8g2.drawFrame(m2p[0], m2p[1], m2p[2], m2p[3]);
     break;
    case 3:
      u8g2.drawFrame(m3p[0], m3p[1], m3p[2], m3p[3]);
     break;
    case 4:
    u8g2.drawFrame(m4p[0], m4p[1], m4p[2], m4p[3]);
    break;
    case 5:
    u8g2.drawFrame(m5p[0], m5p[1], m5p[2], m5p[3]);
    break;
    case 6:
    u8g2.drawFrame(m6p[0], m6p[1], m6p[2], m6p[3]);
    break;
    default:
    u8g2.drawFrame(30, 30, 29, 29);
    break;
  }
  
}

void drawBrightnessIndicator() {
  // Max heights: 15       -      60
  int true_height = 59 - (current_brightness * 0.44);
  u8g2.drawLine(6, true_height, 15, true_height);
  
}

void drawColorSlider() {
  // Max widths: 33   - 98
  int true_width = 33 + current_color * 0.65;
  u8g2.drawLine(true_width, 58, true_width, 62);
}

void drawBandSelector() {
  if((current_band_level / 7.0) > 1) {
    u8g2.drawBox(120, 7 + ((current_band_level - 8) * 8), 2, 2);
    u8g2.drawBox(120, 15 + (( current_band_level - 8) * 8), 2, 2);
  } else {
    u8g2.drawBox(120, 7 + ((current_band_level - 1) * 8), 2, 2);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2020, 20:00 (Dieser Beitrag wurde zuletzt bearbeitet: 27.07.2020 10:29 von Bitklopfer.)
Beitrag #2
RE: Rotary Encoder und I2C_Display gleichzeitig verwenden
Stelle Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Außerdem formatiere bitte den Code ordentlich (<Strg>+T in der IDE hilft Dir dabei).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2020, 21:02 (Dieser Beitrag wurde zuletzt bearbeitet: 27.07.2020 10:29 von Bitklopfer.)
Beitrag #3
RE: Rotary Encoder und I2C_Display gleichzeitig verwenden
Und bevor du deinen Sketch mit einem besser formatierten Sketch ersetzt, solltest du auch deinen Sketch dokumentieren. Nur mit einer guten Dokumentation können externe auch den Sketch verstehen. Dann finden wir evtl. auch deine Fehler.

Diese Kommentare helfen dir auch, wenn du den Sketch in 6 Monaten ändern möchtest.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.07.2020, 10:23 (Dieser Beitrag wurde zuletzt bearbeitet: 27.07.2020 10:29 von Bitklopfer.)
Beitrag #4
RE: Rotary Encoder und I2C_Display gleichzeitig verwenden
(26.07.2020 19:18)BenGroll schrieb:  Beides alleine funktioniert super, wenn ich aber versuche, beides in einem Sketch zu verwenden, funktioniert keines von beidem mehr so richtig.

Und was genau heißt das ?
Was funktioniert ?
Und was funktioniert nicht ?

Eine richtige Fehlerangabe sollte schon möglich sein.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  HTTP GET request mit ServerCertificateValidation & SecurityProtocol verwenden TBMSam 3 249 05.11.2020 14:33
Letzter Beitrag: Tommy56
  Problem Arduino Mega und Nextion Touch Display pds14 9 492 28.10.2020 11:20
Letzter Beitrag: hotsystems
Wink Arduino TFT Display MEGA 2560 Samsuino 48 16.091 23.07.2020 15:45
Letzter Beitrag: sam_217
  OLED Display Phänomen Sulawesi 36 2.823 02.06.2020 13:06
Letzter Beitrag: Sulawesi
  7 Segment Display mit Rotary Encoder SA154 2 531 26.05.2020 13:40
Letzter Beitrag: MicroBahner
  4 Zeilen im Display Modul 0.69" IIC I2C, aber wie? Christian_Moba-Arduino 7 845 17.05.2020 13:12
Letzter Beitrag: Christian_Moba-Arduino
  Problem mit Nokia 5110 Display MKnet83 17 1.983 12.04.2020 13:31
Letzter Beitrag: Tommy56
  Frage zum richtigen verwenden einer Funktion Gerdchen03 3 757 10.04.2020 19:37
Letzter Beitrag: Tommy56
  Frage zu Uhrzeit auf Display (schneller laufen lassen) ThorstenP 3 719 07.04.2020 14:52
Letzter Beitrag: hotsystems
  I²C Display flackert JoTa2k 14 1.623 24.03.2020 16:58
Letzter Beitrag: JoTa2k

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste