OLED (I2C) и модуль карты Micro SD не работают вместе в Arduino
Я пытаюсь записать некоторые данные на SD-карту и считывать их обратно на последовательный монитор, а также отображать их на OLED-дисплее.
И sd-карта, и oled-дисплей работают отдельно, но при объединении они, похоже, мешают друг другу. Я использовал OLED-библиотеки Arduino SD и Adafruit.
Подключения от Arduino Uno к модулю карты Micro SD-
5V to SD VCC
GND TO SD GND
PIN 10 TO SD Chip Select
PIN 11 TO SD MOSI
PIN 12 TO SD MISO
PIN 13 TO SD SCK
Подключение к OLED-дисплею-
3.3V to OLED VCC
GND TO OLED GND
A4 TO OLED SDA
A5 TO OLED SCK
Вот код -
#include <SPI.h>
#include <SD.h>
File myFile;
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 //ширина OLED-дисплея, в пикселях
#define SCREEN_HEIGHT 64 //высота OLED-дисплея, в пикселях
// Объявление для дисплея SSD1306, подключенного к I2C (контакты SDA, SCL)
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// поместите сюда свой установочный код, чтобы запустить его один раз:
Serial.begin(9600);
while(!Serial) {
;
}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // КОД ЗАСТРЕВАЕТ ЗДЕСЬ. ДИСПЛЕЙ НИКОГДА НЕ ИНИЦИАЛИЗИРУЕТСЯ
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(29,29);
display.print("INITIALISING");
display.display();
delay(5000);
if (!SD.begin(10)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// закрыть файл:
myFile.close();
Serial.println("done.");
} else {
// если файл не открылся, выведите сообщение об ошибке:
Serial.println("error opening test.txt");
}
display.clearDisplay();
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
while (myFile.available()) {
Serial.write(myFile.read());
display.setCursor(0,0);
display.print(myFile.read());
display.display();
delay(5000);
}
// закрыть файл:
myFile.close();
} else {
// если файл не открылся, выведите сообщение об ошибке:
Serial.println("error opening test.txt");
}
}
void loop() {
// поместите сюда свой основной код для повторного запуска:
}
Код застревает при инициализации OLED, как упоминалось выше. Если я заменю эти строки-
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // КОД ЗАСТРЕВАЕТ ЗДЕСЬ. ДИСПЛЕЙ НИКОГДА НЕ ИНИЦИАЛИЗИРУЕТСЯ
}
К этому-
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Я запустил код сканера I2C на OLED, поэтому адрес "0X3C" правильный.
OLED по-прежнему не работает, и SD-карта инициализируется, но arduino записывает неправильные данные в текстовый файл на SD-карте следующим образом:
teóting 1,à2, ó®
Вместо того , чтобы ...
testing 1, 2, 3.
Я также пробовал использовать скетчи библиотеки U8G2 с SD-картой на случай, если у Arduino заканчивалась оперативная память, но она по-прежнему не работает. Я также изменил выбор SD-чипа на Arduino digital pin 4, но результаты все те же.
Просматривая и экспериментируя дальше, я обнаружил, что вывод MISO ИЛИ MOSI SD может мешать выводам SDA / SCL OLED. Возможно, проводку нужно поменять.
ЕСТЬ КАКИЕ-НИБУДЬ ПРЕДЛОЖЕНИЯ ???
@Rohan, 👍0
Обсуждение2 ответа
Для I2C необходим подтягивающий резистор, и их добавление может исправить некоторые ошибки.
https://github.com/greiman/SSD1306Ascii используйте это, оно работает с модулем SD-карты и OLED-дисплеем
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылку, могут стать недействительными, если страница, на которую ведет ссылка, изменится., @sempaiscuba
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- SD-карта не инициализируется
- Что означают эти контакты? Куда мне их подключить?
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Соединение I2C зависает Ведущий если ведомый отключается
Недавно у меня была аналогичная проблема с I2C, убедитесь, что только в одном из модулей установлены подтягивающие резисторы I2C., @ElectronSurf
Я новичок в этом, пожалуйста, не могли бы вы объяснить подробнее., @Rohan
Разместите ссылку на оба ваших модуля., @ElectronSurf
Для OLED - "https://www.amazon.in/Generic-0-96-Display-Module-Arduino/dp/B01GNZEM22/ref=sr_1_10?adgrpid=57784712326&ext_vrnc=hi&gclid=Cj0KCQiAkKnyBRDwARIsALtxe7hvU7JNkEkK9sgmz4vHRgCd4Wk9_GVjZXkkyP9KDhzt6beU8AOcoiwaAtrwEALw_wcB&hvadid=294141455465&hvdev=c&hvlocphy=9061654&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=8620698541412480040&hvtargid=kwd-301353041996&hydadcr=26462_1900820&keywords=oled+128x64&qid=1582009576&sr=8-10", @Rohan
Для SD - карты ... "https://www.amazon.in/Storage-Memory-Shield-Adapter-Arduino/dp/B00HFQEKI0 ", @Rohan
microSD - это не I2C, он использует последовательное соединение. так что то, что я предлагал, не соответствует действительности. надеюсь, кто-нибудь вам поможет., @ElectronSurf
Я только что переключился на библиотеку U8G2 из OLED-библиотеки Adafruit и использовал ее примеры u8x8, которые не используют никакой оперативной памяти. Это была проблема с оперативной памятью. Спасибо, что занялись этим вопросом. @ElectronSurf, @Rohan
Рад, что вы это исправили, удачи вам в вашем проекте., @ElectronSurf
ВЫ МОЖЕТЕ ПОПРОБОВАТЬ ЭТОТ КОД https://forum.arduino.cc/index.php?topic=510106.0 ........, @Yulin Lee