заставить SPI SSD1307 работать на Arduino Mega

arduino-mega ssd1306

После некоторого перерыва я решил вернуться к своему проекту после некоторой помощи из этой темы, которую я начал ранее Разница в распиновке (типах?) Uno/Mega. К сожалению, даже несмотря на то, что я много раз читал, что было сказано о выводах SPI на мега, дисплеи просто не будут работать. И мои светодиодные ленты, и поворотный энкодер работают, поэтому мой код компилируется и загружается как надо. Дисплеи ssd1307 с использованием SPI.

Pinout from MEGA to displays
49 > RST for display1/display2/display3
50 > DC for display1/display2/display3
51 > SDA for display1/display2/display3
52 > SCK for display1/display2/display3

33 > CS for display1
34 > CS for display2
35 > CS for display3

Вот код, который я пытаюсь использовать:

#include <Adafruit_NeoPixel.h>
#include "HCuOLED.h"
#include "SPI.h"

Adafruit_NeoPixel REVLEDS = Adafruit_NeoPixel(7, 2, NEO_GRB);
Adafruit_NeoPixel DASHLEDS = Adafruit_NeoPixel(3, 3, NEO_GRB);

#define SCK 52
#define SDA 51
#define DC 50
#define RST 49

HCuOLED HCuOLED_5(SSD1307, 33, DC, RST); // Для дисплеев SSD1307 (HCMODU0050 и HCMODU0052)
HCuOLED HCuOLED_4(SSD1307, 34, DC, RST); // Для дисплеев SSD1307 (HCMODU0050 и HCMODU0052)
HCuOLED HCuOLED_3(SSD1307, 35, DC, RST); // Для дисплеев SSD1307 (HCMODU0050 и HCMODU0052)

#define s1 6
#define s2 5
#define key 4

int newCounter = 0;
int oldCounter = 0;
int oldState;
int newState;
int rotated = 0;
int keyState = 0;
int keyReset = 0;

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

  REVLEDS.begin();
  REVLEDS.setBrightness(25);

  DASHLEDS.begin();
  DASHLEDS.setBrightness(25);

  pinMode(s1, INPUT);
  pinMode(s2, INPUT);

  oldState = 1;
  newState = oldState;

  HCuOLED_5.Reset();
  pinMode(53, OUTPUT);
}

void loop() {

  newState = digitalRead(s1);
  if(newState != oldState){
    if(digitalRead(s2)!= oldState){
      newCounter ++;
    } else {
      newCounter --;
    }
    if(newCounter == (oldCounter+2) ||newCounter == (oldCounter-2)){
      if(newCounter > oldCounter) rotateRight();
      else rotateLeft();
      oldCounter = newCounter;
    }    
  }
  oldState = newState;

  keyState = digitalRead(key);
  //Serial.println(keyState);
  if(keyState == LOW && keyReset == 0){
    onButtonPress();
    keyReset = 1;
  } else if (keyReset == 1 && keyState == HIGH){
    keyReset = 0;
  }  

  for(int i = 0; i < 7; i++){
  REVLEDS.setPixelColor(i, 0,255,0);}
  REVLEDS.show();

  for(int i = 0; i < 3; i++){
  DASHLEDS.setPixelColor(i, 0,0,255);}
  DASHLEDS.show();

  // отображение 5
  HCuOLED_5.SetFont(Terminal_8pt);
  HCuOLED_5.Cursor(44,0);
  HCuOLED_5.Print("Cpt");
  HCuOLED_5.Cursor(20,10);
  HCuOLED_5.Print("Fastlane");
}

void onButtonPress(){
  Serial.println("Pressed button");
}

void rotateLeft(){
  Serial.println("Rotated left");
}

void rotateRight(){
  Serial.println("Rotated right");
}

Теперь вопрос в том, что я упускаю? ТИА!

, 👍-1

Обсуждение

SSD1307 поддерживает SPI и I2C. вы должны предоставить ссылку на дисплейный модуль. SDA и SCK используются для маркировки выводов I2C., @Juraj

Извините, забыл добавить, что это была версия SPI ssd1307., @sdieters

Вывод 53 настроен на ВЫХОД, как вы можете видеть в коде. По ссылке на мой исходный пост вы можете видеть, что эти SPI-дисплеи уже работали на mu UNO, но не на моей MEGA. Речь идет о следующих дисплеях: https://nl.aliexpress.com/item/5pcs-7pin-0-96-White-OLED-module-0-96-OLED-New-128X64-OLED-LCD-LED-Display/32650457238.html?spm= a2g0s.9042311.0.0.6d864c4dvMy0SY Я также планирую добавить 2 больших, а именно: https://nl.aliexpress.com/item/1pcs-Blue-1-3-SPI-Serial-128X64-OLED-LCD-LED-Display-Module-for-Arduino-UNO-R3/32650144885.html?spm= a2g0s.9042311.0.0.6d864c4dvMy0SY, @sdieters


2 ответа


0

Дисплеи не используют вывод SPI MISO. Это 12 в Uno и 50 в Mega. В Mega вы пытаетесь использовать контакт 50 для контакта постоянного тока дисплеев, и это создает конфликт с SPI. MISO должен быть ВХОДОМ, а DC — ВЫХОДОМ.

,

0

Обнаружил проблему... после перерыва я забыл, что команда .refresh() на самом деле является командой, которая отображает что-то на экране, в то время как я продолжал думать, что она очищает экран. После добавления этого в мой код вместе с .clearBuffer() все работает со следующей распиновкой:

Pinout from MEGA to displays
48 > RST for display1/display2/display3
49 > DC for display1/display2/display3
51 > SDA for display1/display2/display3
52 > SCK for display1/display2/display3

33 > CS for display1
34 > CS for display2
35 > CS for display3

Со следующим кодом для отображения различных элементов на экране:

#include "HCuOLED.h"
#include "SPI.h"

#define SCK 52
#define SDA 51
#define DC 49
#define RST 48

HCuOLED HCuOLED_5(SH1106, 33, DC, RST); // Для дисплеев SSD1307 (HCMODU0050 и HCMODU0052)
HCuOLED HCuOLED_4(SH1106, 34, DC, RST); // Для дисплеев SSD1307 (HCMODU0050 и HCMODU0052)
HCuOLED HCuOLED_3(SH1106, 35, DC, RST); // Для дисплеев SSD1307 (HCMODU0050 и HCMODU0052)

int tCounter = 0;

void setup(){  
  HCuOLED_5.Reset();
  //pinMode(53, ВЫХОД);
}

void loop() {
  // отображение 3
  HCuOLED_3.SetFont(Terminal_8pt);
  HCuOLED_3.Cursor(44,0);
  HCuOLED_3.Print("Cpt");
  HCuOLED_3.Cursor(20,10);
  HCuOLED_3.Print("Fastlane");
  HCuOLED_3.SetFont(LCDLarge_24pt);
  HCuOLED_3.Cursor(20,30);
  HCuOLED_3.Print("3 - ");  
  HCuOLED_3.Cursor(65,30);
  HCuOLED_3.Print(tCounter);
  HCuOLED_3.Refresh();
  HCuOLED_3.ClearBuffer();

  // отображение 4
  HCuOLED_4.SetFont(Terminal_8pt);
  HCuOLED_4.Cursor(44,0);
  HCuOLED_4.Print("Cpt");
  HCuOLED_4.Cursor(20,10);
  HCuOLED_4.Print("Fastlane");
  HCuOLED_4.SetFont(LCDLarge_24pt);
  HCuOLED_4.Cursor(20,30);
  HCuOLED_4.Print("4 - ");
  HCuOLED_4.Cursor(65,30);
  HCuOLED_4.Print(tCounter);
  HCuOLED_4.Refresh();
  HCuOLED_4.ClearBuffer();

  // отображение 5
  HCuOLED_5.SetFont(Terminal_8pt);
  HCuOLED_5.Cursor(44,0);
  HCuOLED_5.Print("Cpt");
  HCuOLED_5.Cursor(20,10);
  HCuOLED_5.Print("Fastlane");
  HCuOLED_5.SetFont(LCDLarge_24pt);
  HCuOLED_5.Cursor(20,30);
  HCuOLED_5.Print("5 - ");
  HCuOLED_5.Cursor(65,30);
  HCuOLED_5.Print(tCounter);
  HCuOLED_5.Refresh();
  HCuOLED_5.ClearBuffer();

  tCounter++;
}
,

а пин 50?, @Juraj

Неиспользованный. Однако это также работает, если я не устанавливаю вывод 53 на ВЫХОД. Почему это?, @sdieters

Библиотека SPI делает это в начале, @Juraj

Было ли использование контакта 50 в качестве постоянного тока одной из причин, по которой это не сработало?, @Juraj