Вывод информации с sd карты на экран

Тема в разделе "Arduino & Shields", создана пользователем maxS2004, 19 авг 2020.

  1. maxS2004

    maxS2004 Гик

    Здравствуйте форумчане Столкнулся с такой вот проблемой :
    Мне нужно вывести на экран (у меня old 0.91) некую информацию (к примеру: "Привет мир"), записанную на sd карту. Ну вот, купил я значит все комплектующие, всё подключил, написал скетч, но ничего не получилось, в скетчи для вывода на экран использовал переменную типа char, но символы на экран выводятся по одному, с масивом ничего не получается(т.к его нельзя перезаписать). Пробовал использовать String, но экран выводит не буквы, а цифры(почему ?- незнаю ).
    Прошу помощи !

    Скетч (если нужен ) выложу чуть позже
     
    Последнее редактирование: 19 авг 2020
  2. b707

    b707 Гуру

    Когда выложите скетч, тогда и ответы будут (если нужны)
     
  3. maxS2004

    maxS2004 Гик

    Код (C++):
    #define CS_PIN 4

    #include <SPI.h>
    #include <SD.h>
    #include "U8glib.h"

    U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);

    File myFile;
    char symbol ;
    void setup() {
      Serial.begin(9600);
      while (!Serial)
      {
      }
      if (!SD.begin(CS_PIN)) {
        Serial.println("Что-то пошло не так");
        while (true)
        {
        }
      }

    }

    void loop() {

      myFile = SD.open("file.txt", FILE_READ);

      if (myFile) {
        while (myFile.available())
        {
          symbol = myFile.read();

          Serial.print(symbol);
          u8g.firstPage();
          do {
            draw();
          } while ( u8g.nextPage() );


          delay(500);
        }
        myFile.close();
      }
      else
      {
        Serial.println("Не удалось открыть файл");
      }

    }
    void draw(void) {
      u8g.setFont(rus9x15);
      u8g.setPrintPos(10, 20);
      u8g.print(symbol);
    }
    Ответы нужны )
     
  4. b707

    b707 Гуру

    и в чем вопрос? Читаете с карты по одному символу, выводите на экран тоже по одному - как написано. так и работает
     
  5. Un_ka

    Un_ka Гик

    Если не нравится, что на экран текст выводится долго, то имеет смысл сначала заполнять буферный массив, а потом его вывести на экран.
    Также стоит учесть, что символы могут иметь кодировку отличную от ASCII и не поместятся в один байт char.
     
  6. maxS2004

    maxS2004 Гик

    мне нужно на экран выводить не по одному символу, а целыми словами
     
  7. Daniil

    Daniil Гуру

    Набираете буфферный массив и когда новый символ является любым знакгм препинания, то выводить буфер
     
  8. maxS2004

    maxS2004 Гик

    Не совсем вас понял. Можно по подробней, особенно про буферный массив
     
  9. Daniil

    Daniil Гуру

    Буфер - область памяти для хранения временной информации.
    Условно я предложил (идея @Un_ka) вот что:
    Код (C++):
    char buffer[100500];//100500 - эл-тов, т.к. неизвестно сколько максимально нужно. Это число нужно выбрать с умом. Число эл-тов должно быть >= числа букв в самом длинном млове и как можно меньшим, чтобы не занимало кучу памяти.
    Char tmpSymbol;//временная переменная для текущего символа
    char i;//кол-во считанных символов
    ...
    Void Процедура вывода одного слова на экран()
    {
    tmpSymbol=считать символ с карточки
    i=0;
    while (tmpSymbol!=знак препинания)
    {
    buffer[i]=tmpSymbol;
    i++;
    tmpSymbol=считать символ с карточки
    }
    если i>0 тогда
    {
    вывести на экран i элементов массива buffer
    }
    }
    На С писать не буду
     
    maxS2004 нравится это.
  10. maxS2004

    maxS2004 Гик

    Код (C++):
    #define CS_PIN 4

    #include <SPI.h>
    #include <SD.h>
    #include "U8glib.h"

    U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);

    File myFile;
    char bufer[100];
    char symbol ;
    int i;

    void setup() {
      Serial.begin(9600);
      while (!Serial)
      {
      }
      if (!SD.begin(CS_PIN)) {
        Serial.println("Что-то пошло не так");
        while (true)
        {
        }
      }

    }

    void loop() {

      myFile = SD.open("file.txt", FILE_READ);

      if (myFile) {
        while (myFile.available())
        {
          enter();

          myFile.close();
        }
      }
      else
      {
        Serial.println("Не удалось открыть файл");
      }

    }

    void enter() {
      symbol = myFile.read();
      i = 0;
      while (symbol != ';') {
        bufer[i] = symbol;
        i++;
        symbol = myFile.read();
      }
      if (i > 0) {
        Serial.print(bufer[i]);
        u8g.firstPage();
        do {
          draw();
        } while ( u8g.nextPage() );


      }
    }

    void draw(void) {
      u8g.setFont(rus9x15);
      u8g.setPrintPos(10, 20);
      u8g.print(bufer[i]);
    }
    написал я код по вашему примеру, но на экран и в последовательный порт ничего не выводится. В чем может быть моя ошибка ?
     
  11. b707

    b707 Гуру

    в том что вы выводите в Сериал и на экран зачем-то
    Код (C++):
    buffer[i]
    вместо нужной строки .
    попробуйте выполнить свой код так, как будто вы - контроллер. может тогда придет понимание, что в ячейке i массива buffer ничего нет
     
    Daniil и maxS2004 нравится это.
  12. maxS2004

    maxS2004 Гик

    Фух, получилось, большое спасибо !!!!
     
  13. Un_ka

    Un_ka Гик

    • u8g.print подобен serial print.
    • Код (C++):
      while (symbol != ';') {
          bufer[i] = symbol;
          i++;
          symbol = myFile.read();
        }
      когда i станет больше 99 он перезапишет всю память пока не упрётся в стёк и сам себя не остановит, короче должно быть так:
    • Код (C++):
      while (symbol != ';' and i<100) {
          bufer[i] = symbol;
          i++;
          symbol = myFile.read();

        }
    • Попробуйте u8g.print(String(bufer));
     
    Daniil нравится это.