OLED (I2 C) и модуль Micro SD карты не работают вместе в Arduino - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь записать некоторые данные на SD-карту и прочитать их обратно на последовательный монитор, а также отобразить их на OLED.

И SD-карта, и oled работают раздельно, но, похоже, они мешают друг с другом, когда объединены. Я использовал библиотеки Arduino SD и Adafruit OLED.

Подключения от 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 display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while(!Serial) {
    ;
  }

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // CODE GETS STUCK HERE. DISPLAY NEVER INITIALISES
  }     
  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.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    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);
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

Код застревает при инициализации OLED, как упомянуто выше. Если я заменю эти строки

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // CODE GETS STUCK HERE. DISPLAY NEVER INITIALISES
    } 

На это-

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

Я запустил код сканера I2 C на OLED, поэтому адрес "0X3 C" правильный.

OLED по-прежнему не работает, и SD-карта инициализируется, но arduino записывает неправильные данные в файл TXT на SD-карте следующим образом -

teóting 1,à2, ó® 

Вместо -

testing 1, 2, 3.

Я также пытался использовать эскизы библиотеки U8G2 с SD-картой на случай, если у Arduino заканчивается ОЗУ, но она все еще не работает. Я также изменил выбор микросхемы SD на Arduino digital pin 4, но результаты остались прежними.

При просмотре и экспериментировании я обнаружил, что PIN-код MISO OR MOSI SD может мешать выводам SDA / SCL OLED. Может быть, нужно изменить проводку.

ЛЮБЫЕ ПРЕДЛОЖЕНИЯ ???

1 Ответ

0 голосов
/ 09 мая 2020

(у меня была та же проблема) Просто отправив предложения комментариев в качестве ответа, все благодарности @ gre_gor и @ datafiddler за обнаружение этого:

В обеих библиотеках не хватает оперативной памяти (основной памяти).

По результатам моего тестирования библиотека SD может продолжать работать, если она будет инициализирована первой в setup(). Решение состоит в том, чтобы использовать драйвер OLED U8G2 , который значительно экономит память c. Драйвер также находится в официальной директиве библиотеки Arduino, так что вы можете установить и использовать его прямо из IDE.

...