Побайтово чтение с SD

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

Kakmyc пишет:

На весь скетч и обработчик библиотеки 40 байт ???

Ну,ну.

А что там в скетче, если выкинуть SD, SPI и OLED?  НИЧЕГО! - код на уровне примера блинк. Смотрели, сколько памяти занимает блинк? - посмотрите. 9 байт.

Так что для вашего скетча 40 байт - это много.

А что у нас блинк использует библиотечные функции ?

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

Конкретно вот так

#include <OLED_I2C.h>
//#include <SPI.h>
//#include <SD.h>

OLED  myOLED(SDA, SCL, 8);
//File myFile;

void setup()
{
      Serial.begin(9600);
   // SD.begin(4);
   
   myOLED.begin();    
    myOLED.clrScr();
}

    void loop()
{
drawBitmap(10, 0, "img1.bmp", 64, 64);
   myOLED.update();
    
}

void drawBitmap(uint8_t x, uint8_t y,String bitmap,uint8_t sx, uint8_t sy)
{
// myFile=SD.open(bitmap);
	uint8_t bit;
	uint8_t data;
     	for(int cy=0;cy<sy;cy++){
	for(int cx=0;cx<sx;cx++){
		bit=7-(cx%8);
         // myFile.seek((cy*(sx/8)+(cx/8)));
	//	data=myFile.peek();
          
	if ((data & (1<<bit))>0)
				myOLED.setPixel(x+cx, y+cy);
			else
				myOLED.clrPixel(x+cx, y+cy);           
}
}
   // myFile.close();
    }

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

Kakmyc пишет:

На весь скетч и обработчик библиотеки 40 байт ???

Ну,ну.

А что там в скетче, если выкинуть SD, SPI и OLED?  НИЧЕГО! - код на уровне примера блинк. Смотрели, сколько памяти занимает блинк? - посмотрите. 9 байт.

Так что для вашего скетча 40 байт - это много.

Да, действительно, был не прав извиняюсь.

Изменил размер массива до [1], 

Скетч стал занимать 41 байт.

Буду много думать.

b707
Offline
Зарегистрирован: 26.05.2017

Было бы удивительно, если эта библиотека без буфера столько занимала, т.к. непонятно, куда можно деть такую прорву памяти.

Ну и потом - о чем мы спорим? вам же Ворота даже строчку процитировал. Найдите у себя в компе файл OLED_I2C.h. откройте - и примерно на 130 строке увидите вот это:

uint8_t	scrbuf[1024];

проделайте лично, чтобы убедится - а то так и будете спорить.

Не пытайтесь уменьшать буфер в этой библиотеке - без серьезной переделки работать не будет. Найдите библиотеку без буфера. проверить просто - с ней ваш скетч без SD и SPI должен отсавлять свободными не менее 1500 байт оперативки.

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Kakmyc пишет:

Голая OLED_I2C , чуть больше 800 байт занимает. 

Какой там килобайтный буфер ?

Не знаю, какую библиотеку ты используешь, но в оригинальнй от http://www.RinkyDinkElectronics.com/, см. строку 132, как я тебе писал.

Впрочем, тебя уже устроило, так что расслабься и продолжай один и тот же байт по 8 раз читать.

forfrends
Offline
Зарегистрирован: 24.02.2015

Друзья, задам вопрос в тему названия, но не совсем в тему обсуждения. Имеется связка Ардуино + SD карта. На карте хранятся логи. Файлы большие, в ОЗУ держать никак, да и не страшны отключения в следствии потери питания... Записываю простым кодом:

#include <SPI.h>
#include "SdFat.h"
SdFat SD;

byte a = 128; // пример
myFile = SD.open("LOG.log", FILE_WRITE);
myFile.println(a);
myFile.close();

При необходимости, на запрос, Ардуино должна считать с лога конкретные байты и отправить их мне (на пример в Серал). Вот вопрос в том: как правильно сделать побайтовое чтение? Я не совсем понял приведенные примеры, по этому прошу помочь.

Вот так правильно будет?

myFile = SD.open("LOG.log");
if (myFile) {
    symbol = myFile.read();
}
myFile.close();

 - считывание одного элемента (первого). Я так понимаю, что если повторить несколько раз .read() то можно сместиться на нужную позицию, на пример на 10-й байт. А как сделать так, чтобы чтение шло сразу с 10-го байта?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я не копенгаген, но общепринятых системах

myFile.seek

 

forfrends
Offline
Зарегистрирован: 24.02.2015

О! Спасибо большое!