Проблема стыковки oled и sd модуля.

Dezar
Offline
Зарегистрирован: 06.01.2020

Доброго времени форумчане. Имеется китайская uno, oled 0.96 (I2C) 128x64 и sd модуль HW125(SPI). Требуется в реальном времени выводить на экран показания цифрового датчика (не принципиально какого), и с определенной периодичностью писать показания датчика на карту. Так же, с интервалом в 1 секунду, в монитор порта выводятся показания датчика. В скетче прописаны следующие библиотеки, OLED_I2C.h, SPI.h, SD.h Ситуация 1 - SD.h закомментирована, на экран выводятся показания датчика и дублируются в мониторе порта. Ситуация 2- подключаем SD.h, экран не инициализируется, код в loope не выполняется, в порт выводится сообщение об ошибке инициализации oled (из setup), и далее порт молчит. И все это при том, что sd модуль физически не подключен к плате. Замена библиотеки oled на adafruit ситуацию не меняет. В чем может быть причина?

sadman41
Offline
Зарегистрирован: 19.10.2016

Почему мне каждый вопрос в последнее время начинает напоминать игру "Угадай мелодию", но без призового фонда?

Dezar
Offline
Зарегистрирован: 06.01.2020

sadman41 пишет:
Почему мне каждый вопрос в последнее время начинает напоминать игру "Угадай мелодию", но без призового фонда?

Что конкретно Вас интересует? Если вопрос питания платы, то по USB. Питание экрана от платы 5v. Экран подключен на 4 и 5 аналоговые выводы. Вопрос, какой датчик я использую, тоже не принципиален, можно вообще без него. Еще раз, проблема в том, что я не могу вывести hello world на экран при подключенной библиотеке sd.h Как то так.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dezar пишет:
не принципиально какого

Значит, что имеем:

Непринципиально какой датчик, непринципиально какой дисплей и HW125 подключены к непринципиально какой китайской uno по непринципиально какой схеме. Всё это управляется непринципиально каким скетчем. В результате нифига не работает. Я правильно понял?

Dezar пишет:
В чем может быть причина?

Забейте. Это непринципиально.

Dezar пишет:
Что конкретно Вас интересует?

Нас? Ничего. Это Вы пришли с вопросом.

Dezar
Offline
Зарегистрирован: 06.01.2020

Ок, я чуть позже выложу скетч, надеюсь будет более понятно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

...подключены к непринципиально какой китайской uno...

О как!

Ну, раз в теме появился человек с хрустальным шаром, могу предположить, что экран (с буфером 1к) и SD-карта (с буфером 0.5к) оказываются неприемлемо тяжелы для контроллера (uno, у которого на все про все 2к памяти). Тогда первое, что можно посоветовать, это взять контроллер помощнее, например, Мегу к 8к памяти. Ну либо использовать безбуферную библиотеку для экрана.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dezar пишет:
Ок, я чуть позже выложу скетч, надеюсь будет более понятно.
И схему тоже.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

ЕвгенийП пишет:

...подключены к непринципиально какой китайской uno...

Ну, раз в теме появился человек с хрустальным шаром

Вы, простите, кого имеете в виду? :-)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sadman41 пишет:
Почему мне каждый вопрос в последнее время начинает напоминать игру "Угадай мелодию", но без призового фонда?
Скорее игра как стать миллионером. А темы на форуме это помощь зала.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Почему мне каждый вопрос в последнее время начинает напоминать игру "Угадай мелодию", но без призового фонда?

мне кажется потому, что ты можешь отгадать эту мелодию совсем без нот )))

Dezar
Offline
Зарегистрирован: 06.01.2020

Скетч на библиотеке adafruit

#include <SPI.h>
#include <SD.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int i =1;
void setup() {
  Serial.begin(9600);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
    display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(1,1);             
  display.println("Void setup()");
  display.display();
  delay(2000); 
  display.clearDisplay();
   }

void loop() {
   i = i+1;
  display.clearDisplay();
  display.setCursor(1,1); 
   display.println(i);
  display.display();
  delay(500);
  Serial.println(i);
}

 

Dezar
Offline
Зарегистрирован: 06.01.2020

Скетч сваял на скорую руку. Если закомментировать #include <SD.h>, то все будет работать. Еще раз повторюсь, не имеет значения какую периферию (датчики) я буду подключать, будь то bmp280 или датчик сероводорода под ободком унитаза. Факт в том, что при подключении SD.h все что в цикле loop не исполняется, и монитор порта сообщает "SSD1306 allocation failed" и не более

sadman41
Offline
Зарегистрирован: 19.10.2016

В интернетах есть такое: https://playground.arduino.cc/Code/AvailableMemory/

Перед вызовом display.begin() объем памяти свободной измерьте.

Dezar
Offline
Зарегистрирован: 06.01.2020

Благодарю за подсказку. Монитор сообщил:

freeMemory()=919
SSD1306 allocation failed

Если раскомментировать строку то:

freeMemory()=1530

и счетчик в loop начинает работать

Dezar
Offline
Зарегистрирован: 06.01.2020

Полагаете в этом причина?

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот adriano и пишет, что библиотеке дисплея нужен 1Kb RAM, а его нет.

Меняйте библиотэку. Можете на адриановскую asoled, можете на u8g с половинным буфером.

Dezar
Offline
Зарегистрирован: 06.01.2020

Значит я правильно думал, что имеет место быть аппаратная проблема. ASOLED была в закромах. Буду тестить и отпишусь. Благодарю за наводку, в т.ч. и adriano

genia1991
Offline
Зарегистрирован: 25.12.2019

SD + adafruit работать вместе не будят. надо менять библиотеку для экрана. оперативки не хватит на uno. может на mega и будет работать

 

 

Dezar
Offline
Зарегистрирован: 06.01.2020

Я это уже понял, т.к. adafruit перегружена лишним функционалом. Asoled превосходно завел экран вместе с картой памяти, но при дальнейшем расширении периферии стал конфликтовать с bmp280 (i2c). Похоже придется менять ардуинку.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dezar пишет:
Похоже придется менять ардуинку.
:-)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Dezar пишет:
Похоже придется менять ардуинку.
на вотку.

Dezar
Offline
Зарегистрирован: 06.01.2020

Я оценил Ваше тонкое чувство юмора, не смотря на то, что вопрос был задан в разделе для новичков.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dezar пишет:
вопрос был задан в разделе для новичков.

Так шутка была не про вопрос, а про выстраданный Вами ответ :-)

Коль скоро Вы новичок, наверное Вы этого не видели. Сходите по линке, т.к. здесь боюсь выкладывать - сожрут за всем надоевший "боян".

genia1991
Offline
Зарегистрирован: 25.12.2019

Dezar пишет:
Я это уже понял, т.к. adafruit перегружена лишним функционалом. Asoled превосходно завел экран вместе с картой памяти, но при дальнейшем расширении периферии стал конфликтовать с bmp280 (i2c). Похоже придется менять ардуинку.

я тестил на UNO этой https://github.com/greiman/SSD1306Ascii

работает отлично кроме русского языка но там есть 1 вариант. если кто то знает как добавить в эту библиотеку русский язык нормально. отпишитесь