Дисплей на SSD1309

Всё возможно …

Вот код под 128х32:


#include <Wire.h>
#define ssd1306_addr 0x3C
static const uint8_t PROGMEM init_bytes[]={0x00, 0xae, 0xd5, 0x80, 0xa8, 0x1f, 0xd3, 0x00, 0x40, 0x8d, 0x14, 0x20, 0x00, 0xa1, 0xc8,
  0x81, 0xff, 0xda, 0x02, 0xd9, 0xf1, 0xdb, 0x40, 0x21, 0x00, 0x7f, 0x22, 0x00, 0x03, 0xa4, 0xa6, 0xaf};

static const uint8_t PROGMEM arduino[] = {
	0x00, 0x7c, 0x12, 0x12, 0x12, 0x7c, 0x00, 0x7e, 0x12, 0x12, 0x12, 0x6c, 0x00, 0x7e, 0x42, 0x42, 
	0x42, 0x3c, 0x00, 0x3e, 0x40, 0x40, 0x40, 0x3e, 0x00, 0x7a, 0x00, 0x7e, 0x08, 0x10, 0x20, 0x7e, 
	0x00, 0x3c, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x40, 0x00, 0x7e, 0x12, 0x12, 0x12, 0x6c, 0x00, 0x3e, 
	0x40, 0x40, 0x40, 0x3e, 0x00
};

void setup() {
  Wire.begin();
  Wire.setClock(800000);
  Wire.beginTransmission(ssd1306_addr);
  for (uint8_t i=0; i<sizeof(init_bytes); i++) {
    Wire.write(pgm_read_byte(init_bytes+i));
  }
  Wire.endTransmission();
}

void loop() {
  uint8_t p=0;
  Wire.beginTransmission(ssd1306_addr);
  Wire.write(0x40);
  for (uint8_t i=0;i<28;i++) Wire.write(pgm_read_byte(arduino+p++));
  Wire.endTransmission();
  Wire.beginTransmission(ssd1306_addr);
  Wire.write(0x40);
  for (uint8_t i=0;i<25;i++) Wire.write(pgm_read_byte(arduino+p++));
  Wire.endTransmission();
  for (uint8_t i=0;i<128*4/16-3;i++) {
    Wire.beginTransmission(ssd1306_addr);
    Wire.write(0x40);
    Wire.write(0x33);
    Wire.write(0x33);
    Wire.write(0xCC);
    Wire.write(0xCC);
    Wire.write(0x33);
    Wire.write(0x33);
    Wire.write(0xCC);
    Wire.write(0xCC);
    Wire.write(0x33);
    Wire.write(0x33);
    Wire.write(0xCC);
    Wire.write(0xCC);
    if (i<(128*4/16-4)) {
      Wire.write(0x33);
      Wire.write(0x33);
      Wire.write(0xCC);
      Wire.write(0xCC);
    }
    Wire.endTransmission();
  }
}

Тот что на Wokwi под 128х64 и должен был перезатирать надпись на 128х32 дисплее …

Проблему удалось решить. Хоть и с применением своеобразного костыля… Но это работает. Библиотека родная 1306 из скетча.

А моргание ? Там же в коде постоянная перерисовка через стирание экрана …

После пройденного это мелочь.

Какого???

Моргания нет, картинка статична, прыгают только столбики уровня. Видимо в этом и есть прикол команды инверсии отдельного пикселя, а не всего экрана.

Когда заливал примеры с библиотек для работы дисплея, заметил, что когда залито под 128х64 картинка без искажений, только пол экрана нету…

Я декларировал дисплей 128х64 и сдвинул все координаты вниз… ))

Молодец! Отметь #127 как «ответ».

И снова здравствуйте! ) История с дисплеем получила продолжение. В общем когда настало время монтировать дисплей в устройство, я заметил, что дисплей зависает. Зависает намертво картинка ( столбики уровня ). Виснет рандомно, через минуту работы, две или три, или сразу же… На шине осциллографом нет шевеления никакого в этот момент… Питается дисплей от 5в, сделана подтяжка по шине через резисторы 4,7 к 5в. В чем дело не могу пока понять… На самой плате ардуино есть стабилизатор 3,3в, Может имеет смысл запитать дисплей от него?

Первое устройство, собранное на мелком дисплее, работает стабильно, никакой подтяжки по шине нет даже.

ну она как бы на другой стороне платы))

Да и на большом дисплее тоже подтяжка есть. Я сразу не заметил.

Пытаюсь понять в чем проблема. В скетче? В железе? …. Или сама ардуинка виснет?

Может пайка гамно? Покажи фото пайки.

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

Попробую завтра во время зависона залить скетч… Если не зальётся, наверное в ардуинке проблема…

Бессмысленная затея - во время прошивки будет задействован Reset и «зависон» сам собой может решиться. Лучше просто сам нажми Reset и расскажи что получится (для достоверности повторить несколько раз),

Если нажать кнопку ресет на ардуинке, все начинает работать. Пока не зависнет снова.

Может уровень слишком большой на аналоговых входах?

Я тоже об этом думал. Нужно завтра проверить. А какого размаха амплитуда допустима?

Размах не должен быть более уровня VCC. То есть если питание (VCC) 5В, то желательно размах входного напряжения иметь не более 4-4.5В.
А ещё желательно защитные диоды поставить. Но, блин, без схемы обсуждать такое странно. Приложи схему входной части.

Кому интересно, фото монтажа.