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. Возможно, проводку нужно поменять.

ЕСТЬ КАКИЕ-НИБУДЬ ПРЕДЛОЖЕНИЯ ???

, 👍0

Обсуждение

Недавно у меня была аналогичная проблема с 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


1 ответ


1

Для I2C необходим подтягивающий резистор, и их добавление может исправить некоторые ошибки.

,