Проблема с выводом данных на oled 128x64

АВРчик

✩✩✩✩✩✩✩
18 Дек 2020
10
1
Доброй ночи.
Проблема странная как для моей головы.

Вот так, всё работает как надо, данные из массива по очереди выводятся на дисплей, каждый в новую строчку:
C++:
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;

void setup() {
    Wire.begin();
    Wire.setClock(400000L);

    const char* const test[] PROGMEM = { "One", "two", "three", "4" };

    oled.begin(&Adafruit128x64, I2C_ADDRESS);
    oled.setContrast(1);
    oled.setFont(Callibri15);
    oled.clear();

    for (int j = 0; j < 4; j++)
    {
        oled.println(test[j]);
    }

void loop() {}
Теперь вынесем массив за метод setup и избавимся от цикла for:
C++:
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
const char* const test[] PROGMEM = { "One", "two", "three", "4" };

void setup() {
    Wire.begin();
    Wire.setClock(400000L);

    oled.begin(&Adafruit128x64, I2C_ADDRESS);
    oled.setContrast(1);
    oled.setFont(Callibri15);
    oled.clear();

    oled.println(test[0]);
    oled.println(test[1]);
    oled.println(test[2]);
    oled.println(test[3]);

    //for (int j = 0; j < 4; j++)
    //{
    //    oled.println(test[j]);
    //}

void loop() {
}
И снова всё работает как задумано.

Но стоит вернуть цикл for, и на дисплее пустота -
C++:
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
const char* const test[] PROGMEM = { "One", "two", "three", "4" };

void setup() {
    Wire.begin();
    Wire.setClock(400000L);

    oled.begin(&Adafruit128x64, I2C_ADDRESS);
    oled.setContrast(1);
    oled.setFont(Callibri15);
    oled.clear();

    //oled.println(test[0]);
    //oled.println(test[1]);
    //oled.println(test[2]);
    //oled.println(test[3]);

    for (int j = 0; j < 4; j++)
    {
        oled.println(test[j]);
    }

void loop() {

}
Буду благодарен идеям где может быть проблема.
 

xof

★✩✩✩✩✩✩
24 Окт 2020
123
44
Матчасть: https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
Не проверял, но вот так должно работать:

C++:
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "String 0"; // "String 0" etc are strings to store - change to suit.
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";
const char* const string_table[] PROGMEM = { string_0, string_1, string_2, string_3, string_4, string_5 };
char buffer[30];  // make sure this is large enough for the largest string it must hold

void setup() {
    Wire.begin();
    Wire.setClock(400000L);

    oled.begin(&Adafruit128x64, I2C_ADDRESS);
    oled.setContrast(1);
    oled.setFont(Callibri15);
    oled.clear();

    for (int i = 0; i < 6; i++) {
        strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i])));  // Necessary casts and dereferencing, just copy.
        oled.println(buffer);
        delay(500);
    }
}

void loop() {

}
 
  • Лойс +1
Реакции: АВРчик