Чтение данных из sd карты arduino

Тема в разделе "Arduino & Shields", создана пользователем AlisherRobotRex, 17 янв 2018.

  1. Может я не прав, но для начинающего это вроде не сложная задача :) за час спокойно можно алгоритм придумать :)
     
  2. DIYMan

    DIYMan Гуру

    Вставьте, плз, код правильно - для этого существует кнопочка "<>" на панели инструментов редактора. Пока могу только заметить, что инициализировать SD КАЖДЫЙ раз перед чтением из файла - не надо: достаточно перенести вызов SD.begin в setup(). Остальное - без правильной вставки и форматирования - нечитабельно.
     
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    Код необходимо во всех постах оформить правильно!
    Для этого в редакторе где вы описываете проблемы код вставляйте с помощью кнопочки КОД на панели редактора
    Код (C++):
    #include <SPI.h>
    #include <SD.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>

    #include <OneWire.h>
    OneWire ds(2);

    //#include <TomThumb.h>
    //#include <gfxfont.h>
    File myFile;


    #define DHTPIN 2 // контакт, к которому подключаемся
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    const byte buttonPin = 3;
    const byte lenCupX = 13;
    const byte lenCupY = 19;
    const byte lenWaveX = 2;
    const byte lenWaveY = 20;
    byte amountScreen = 4;
    const byte speedMenuIcons = 1;
    byte numberScreen = 0;
    const byte valueLimitDown = 46;
    const byte sizeTitleFont = 1;
    const byte sizeTextFont = 2;
    const byte xBorder = 32;
    const byte shiftObject = 12;
    const byte iconX = 7;
    const byte titleY = 0;
    const byte textY = 0;
    const byte textShiftY = 11;
    const byte textWaterShiftY = 0;
    const byte secondaryIconCY = 20;
    bool oldStateButton = false, stateButton = false;
    unsigned long long int timerButton;
    unsigned long long int timerScreen;
    /*const bool figureWave[lenWaveX][lenWaveY] = {
    {1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
    {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
    };*/



    char arrImage[250];


    String utf8rus(String source)
    {
    int i,k;
    String target;
    unsigned char n;
    char m[2] = { '0', '\0' };

    k = source.length(); i = 0;

    while (i < k) {
    n = source; i++;

    if (n >= 0xC0) {
    switch (n) {
    case 0xD0: {
    n = source; i++;
    if (n == 0x81) { n = 0xA8; break; }
    if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
    break;
    }
    case 0xD1: {
    n = source; i++;
    if (n == 0x91) { n = 0xB8; break; }
    if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
    break;
    }
    }
    }
    m[0] = n; target = target + String(m);
    }
    return target;
    }

    void setSizeText(byte sizeLetter){
    display.setTextSize(sizeLetter);
    }
    void printText(String text, byte x, byte y, bool colorWord, bool language, String letterAfterIcon){
    if (colorWord){
    display.setTextColor(WHITE);
    }else{
    display.setTextColor(BLACK);
    }
    display.setCursor(x, y);
    if (language){
    display.print(utf8rus(text + letterAfterIcon));
    }else{
    display.print(text);
    }
    }
    // создаем экземпляр класса для датчика DHT11:
    void setGraph(){

    }



    void drawFigure(byte y, byte x, bool colorFigure){
    bool colorMassive = false;
    if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
    }
    myFile = SD.open("/Image/CupImage.txt");
    if (myFile) {
    while (myFile.available()) {
    bool colorMassive = false;
    for (int i = x; i > x - lenCupX; i--){
    for (int j = y; j < y + lenCupY; j++){
    char a = myFile.read();
    if (i >= 0){
    colorMassive = (byte)a;
    if (colorMassive == true){
    display.drawPixel(j, i, colorFigure * colorMassive);
    }
    }
    }
    }
    }
    myFile.close();
    } else {
    Serial.println("error opening");
    }
    }
    /*void drawFigureLineV(byte y){
    for (int j = 0; j < 64; j++){
    display.drawPixel(y, j, 1);
    }
    }

    void drawFigureLineG(byte x){
    for (byte j = 0; j < 64; j++){
    display.drawPixel(x, j, 1);
    }
    }


    void drawFigureWave(byte y, byte x, bool colorFigure){
    bool colorMassive = false;
    for (int i = x; i > x - 2; i--){
    for (int j = y; j < y + 10; j++){
    if (i > 0){
    colorMassive = figureWave[i - x + 1][j - y];
    if (colorMassive == true){
    display.drawPixel(j, i, colorFigure * colorMassive);
    }
    }
    }
    }
    }*/


    byte getTemperature(){
    byte data[2];
    ds.reset();
    ds.write(0xCC);
    ds.write(0x44);
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    byte Temp = (((data[1]<< 8)+data[0])>> 4);
    return(Temp);
    }
    void pressButton(){
    stateButton = digitalRead(buttonPin);
    if ((!oldStateButton) && (stateButton) && (millis() - timerButton >= 100)){
    timerButton = millis();
    numberScreen = (numberScreen + 1) % amountScreen;
    }
    oldStateButton = stateButton;
    }
    void setup()
    {
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
    // инициализируем объект «display» с I2C-адресом «0x3C», для 128x32
    Serial.begin(9600);
    display.cp437(true);
    display.clearDisplay();
    //display.setFont(&FreeSans9pt7b);
    //display.setFont(&TomThumb);
    pinMode(10, OUTPUT);
    display.clearDisplay();
    pinMode(buttonPin, INPUT);
    }


    void loop()
    {
    pressButton();

    Serial.println(numberScreen);
    if (numberScreen == 0){
    display.clearDisplay();
    display.setTextSize(sizeTitleFont);
    printText((String)getTemperature()+"\xB0", xBorder + shiftObject, 2 * textShiftY, true, true, "С");
    printText("вода", xBorder + shiftObject, textWaterShiftY, true, true, "");
    printText("0,5 л", xBorder + shiftObject,textShiftY, true, true, "");
    int xw = 3, yw = 10;
    drawFigure(iconX, secondaryIconCY, true);
    //drawFigureWave(iconX + 2, secondaryIconCY - 3, true);
    //drawFigureLineV(xBorder);
    display.setTextSize(sizeTitleFont);
    //printText("вода", xBorder + shiftObject, titleY, true, true, "");
    display.display();
    //drawFigure(iconX, secondaryIconCY, false);
    //drawFigureWave(iconX + 2, secondaryIconCY - 3, false);
    }
    }
    /*for (int i = 0; i < valueLimitDown; i++){
    drawFigure(iconX, yw + i - 1, false);
    drawFigure(iconX, yw + i, true);
    drawFigureWave(iconX + 2, yw - 3 + i - 1, false);
    drawFigureWave(iconX + 2, yw - 3 + i, true);
    display.display();
    delay(speedMenuIcons);
    }*/

     
     
  4. 0.96 дюймов 128 * 64 OLED I2c White
     
  5. Я посчитал что понадобится 2731 байт оперативной памяти
    Это если в один байт поместить 3 пикселя
     
  6. Мне нужно прочитать файл на sd и перевести его в картинку на дисплее, как можно меньше затратив на arduino uno динамическую память.
     
  7. Это уже было озвучено. Вам предложили варианты как уменьшить затраты :)
     
  8. b707

    b707 Гуру

    Почему все-таки именно три пикселя в байт? Откуда такой странный выбор? В байте восемь бит, каждый пиксель на экране - это тоже бит, почему три, почему не восемь?
     
  9. b707

    b707 Гуру

    Вы не ответили на вопрос, какой размер картинки (ширина Х высота) и как она закодирована в файле.
     
  10. Файл .txt. Размер картинки 13 на 19. А файл состоит из 1 или 0, следующие друг за другом. Соответственно в файле 13 столбцов и 19 строчек.
     
  11. (Мне нужно как-то, когда я читаю один символ из файла, выводить соответственный пиксель на дисплей.)
     
  12. Ну это удобно. Если нет возможности работать с битами. Ведь байт это число от 0 до 255. Значит 3 цифры. З пикселя. Например 000. 100. 101. 001
     
  13. DIYMan

    DIYMan Гуру

    Дисплей монохромный? Монохромный. Разрешение 128х64? Это 8192 бита, или 1 Кб, если кодировать весь экран. Из оптимизации: первые два байта в файле - это размер картинки, остальные - данные картинки. Получаем, для картинки 13х19 = 247 бит + 16 бит = 263 бита = 33 байта на картинку.

    Алгоритм:

    1. Открываем файл;
    2. Читаем первые 2 байта - это размер картинки (строк, столбцов);
    3. Запоминаем в переменные, с какой позиции выводить картинку на экран;
    4. Читаем побайтово из файла, затем, манипулируя прочитанным байтом, понимаем, какие пикселы в какой позиции - закрашивать.
    5. Профит.

    Всё довольно тривиально и обыденно.
     
    БАРМАТОГРАФ нравится это.
  14. DIYMan

    DIYMan Гуру

    Это в какой галактике нет такой возможности?
     
  15. Ну когда человек не умеет :)
     
  16. DIYMan

    DIYMan Гуру

    Надо учиться, ибо есть разница - 33 байта на картинку в файле, или 247 минимум байт, не находите? Разница в 7,5 раз, нормас так.
     
  17. Конечно нахожу :) и проблемы в учебе не вижу. Все зависит от решения ТС :)
     
  18. Скорее всего я понял, в чём ошибка: sd карта, если её подключить к ноутбуку, выдаёт ошибку. Ноутбук пишет, что возникли проблемы с картой. Она иногда вылетает. И поэтому карта, вставленная в модуль ардуино, то читает файл, то не читает. Скорее всего так. Спасибо.
     
  19. b707

    b707 Гуру

    простите, но это из Москвы в Париж через Калькутту. Чтобы использовать ваш метод, нужно будет сначала три бита из файла паковать в трехначные десятичные числа. а потом при выводе на дисплей - обратно.
    Причем с битами (по 8 шт в байте) в этом случае все равно придется разбираться, так как в этом дисплее пиксели кодируются именно битами по 8 пикселей в байте.
     
  20. Ну да. Не очень удобно. Не спорю :)