Как уменьшить код Adafruit_SSD1306

Тема в разделе "Arduino & Shields", создана пользователем PSLeon, 8 авг 2015.

  1. PSLeon

    PSLeon Нуб

    У меня мониторчик http://ru.aliexpress.com/item/Brand...-Module-For/32324491926.html?isOrigTitle=true, DTH22 и Ардуино про мини, мне не хватает памяти под проект. В связи с этим хочу оптимизировать код библиотек <SPI.h>, <Wire.h>, <Adafruit_GFX.h>, <Adafruit_SSD1306.h> под конкретно мой пример.

    Подскажите плиз, ведь эти библиотеки и под I2C, если почистить, то код в целом станет меньше??? Мне всего-то нужно вывести на экран 2 строчки: температуру и время.

    Или как это сделать без этим МОНСТРОИДАЛЬНЫХ библиотек. Пожалуйста помогите новичку :)
     
  2. Alex19

    Alex19 Гуру

    Вариант 1.
    Покажите код (если там нет ни ничего секретного), может там есть возможности оптимизации. К примеру может, что-то повторяющееся можно вынести в отдельные функции и т.д.

    Вариант 2.
    Взять к примеру Mega 2560R3.

    Вариант 3.
    Перейти на уровень ниже AVR и Си.
    Путь далеко не самый простой и легкий, но в сети все есть. Минус такие решения будут работать, только с теми платами, для которых напишите код.

    Лучше конечно, если Вы выберите вариант 1 или 2, для новичка это будет значительно проще.

    Если Вы все таки остановитесь на 3.
    Требуется знание СИ. Вот почти готовые решения (но их нужно понять, а это потребует не мало времени, далеко не неделю).
    1. I2C (TWI) - http://chipenable.ru/index.php/prog...ispolzovaniya-twi-modulya-osnovy-i2c-ch1.html. (5 статей).
    2. SPI - http://chipenable.ru/index.php/programming-avr/item/137-avr-spi-module.html (3 статьи).
    и т.д.
    3. Библиотеку придется переписать саму (задача далеко не простая, лучше поискать в интернете может найдете в сети, что-то более оптимальное).

    Ближе к вечеру, попробую подключить библиотеки и посмотреть, сколько им нужно.
     
  3. PSLeon

    PSLeon Нуб

    Спасибо за отклик :)) Вот нашел один вариант: https://github.com/stanleyseow/Ardu...aster/libraries/SSD1306_text/SSD1306_text.cpp, но у меня кучу ошибок компиляции выскакивает. А так как я понял на Ардуино Про мини есть HW SPI, и по словам автора памяти в два раза меньше требуется чем для Adafruit. Помогите мне этот пример дожать. Пока отлаживаюсь на Ардуино УНО.

    Arduino: 1.6.5 (Windows 7), Плата"Arduino Uno"

    In file included from SSD1306_text.cpp:14:0:
    SSD1306_text.cpp: In member function 'virtual size_t SSD1306_text::write(uint8_t)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.h:17:27: warning: comparison is always false due to limited range of data type [-Wtype-limits]
    #define SSD1306_LCDWIDTH 128
    ^
    SSD1306_text.cpp:120:17: note: in expansion of macro 'SSD1306_LCDWIDTH'
    if (col_ >= SSD1306_LCDWIDTH) return 0;
    ^
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.h:17:27: warning: comparison is always false due to limited range of data type [-Wtype-limits]
    #define SSD1306_LCDWIDTH 128
    ^
    SSD1306_text.cpp:130:19: note: in expansion of macro 'SSD1306_LCDWIDTH'
    if (col_ >= SSD1306_LCDWIDTH) break;
    ^
    In file included from C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example\SSD1306_text.cpp:14:0:
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example\SSD1306_text.cpp: In member function 'virtual size_t SSD1306_text::write(uint8_t)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.h:17:27: warning: comparison is always false due to limited range of data type [-Wtype-limits]
    #define SSD1306_LCDWIDTH 128
    ^
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example\SSD1306_text.cpp:120:17: note: in expansion of macro 'SSD1306_LCDWIDTH'
    if (col_ >= SSD1306_LCDWIDTH) return 0;
    ^
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.h:17:27: warning: comparison is always false due to limited range of data type [-Wtype-limits]
    #define SSD1306_LCDWIDTH 128
    ^
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example\SSD1306_text.cpp:130:19: note: in expansion of macro 'SSD1306_LCDWIDTH'
    if (col_ >= SSD1306_LCDWIDTH) break;
    ^
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::write(char const*)'
    SSD1306_text.cpp.o:C:\Users\SergeyLP\AppData\Local\Temp\build3486508190815244967.tmp/SSD1306_text.cpp:179: first defined here
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::sendCommand(unsigned char)'
    SSD1306_text.cpp.o:C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI/SPI.h:209: first defined here
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::init()'
    SSD1306_text.cpp.o:C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI/SPI.h:209: first defined here
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::clear()'
    SSD1306_text.cpp.o:C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI/SPI.h:209: first defined here
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::setCursor(unsigned char, unsigned char)'
    SSD1306_text.cpp.o:C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI/SPI.h:209: first defined here
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::sendData(unsigned char)'
    SSD1306_text.cpp.o:C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI/SPI.h:209: first defined here
    OLED_text_HW_SPI_example\SSD1306_text.cpp.o: In function `SSD1306_text::write(char const*)':
    C:\Program Files (x86)\Arduino\libraries\OLED_text_HW_SPI_example/SSD1306_text.cpp:179: multiple definition of `SSD1306_text::write(unsigned char)'
    SSD1306_text.cpp.o:C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI/SPI.h:209: first defined here
    collect2.exe: error: ld returned 1 exit status
    Ошибка компиляции.

    Это сообщение будет содержать больше информации чем
    "Отображать вывод во время компиляции"
    включено в Файл > Настройки
     
  4. PSLeon

    PSLeon Нуб

    Не секрет, это свободный код, на его основе я хотел писать на экранчике текст и вставлять значения. https://github.com/adafruit/Adafruit_SSD1306/tree/master/examples/ssd1306_128x64_spi
     
  5. PSLeon

    PSLeon Нуб

    ЗАРАБОТАЛ :)))))))))))))))) Вариант

    .
     
  6. PSLeon

    PSLeon Нуб

    Если не сложно проверте у себя пример выше с длинным списком ошибок :) очень интересно в чем ошибка, а то так и помру тупым:)
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    Вот новая библиотека конкретно для этого дисплея, причем с поддержкой русских букв. Для уменьшения размеров выкинута графика и совместимость с другими дисплеями.
     
    Последнее редактирование: 8 авг 2015
    akl и PSLeon нравится это.
  8. Alex19

    Alex19 Гуру

    У меня нет IDE 1.65 (на турбазе, не смогу скачать плохой инет), но есть 1.61.

    У меня не появилось ошибок. Возможно у Вас проблема, в подключенной библиотеки, ругается на многое, все описывать не буду посмотрите тут - http://forum.amperka.ru/threads/Работа-с-библиотеками.4253/.

    Залил у себя, вот результат
    Он говорит, о том, что могут быть проблемы.
    Речь идет о оперативной памяти.

    Да HW SPI, есть, как и у Uno и т.д.

    В примере SSD1306_text используется я библиотека SPI или софт SPI. Просто выводит текст.А в примере ssd1306_128x64_spi только библиотека SPI и I2C, для разных интерфейсов. Тут уже есть возможность рисовать на дисплее.
     
    PSLeon нравится это.
  9. PSLeon

    PSLeon Нуб

    понятно:) огромное спасибо. буду разбираться с библиотеками :)