заставить SPI SSD1307 работать на Arduino Mega
После некоторого перерыва я решил вернуться к своему проекту после некоторой помощи из этой темы, которую я начал ранее Разница в распиновке (типах?) 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");
}
Теперь вопрос в том, что я упускаю? ТИА!
@sdieters, 👍-1
Обсуждение2 ответа
Дисплеи не используют вывод SPI MISO. Это 12 в Uno и 50 в Mega. В Mega вы пытаетесь использовать контакт 50 для контакта постоянного тока дисплеев, и это создает конфликт с SPI. MISO должен быть ВХОДОМ, а DC — ВЫХОДОМ.
Обнаружил проблему... после перерыва я забыл, что команда .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
- Разница в распиновке (типы?) Uno/Mega
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
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