странное поведение i2c дисплея при добавлении в скетч дополнительных функций

ZyaK

✩✩✩✩✩✩✩
15 Июн 2021
4
0
Доброго времени стуок
дисплей SH1107 64*128
камень mega328p
кварц 16 мегагерц
загрузчик minicore
Столкнулся с проблемами конфликтов библиотек или не пойму как это назвать.
подключил дисплей - работает, дальше часы реального времени на DS1307 - работают, время показывают.
начинаю подключать DS18b20 - пропадает инициализация дисплея.
методом научного тыка и перестановкой очередности инициализации дисплея добился работы.
запустил ацп - работает.
сечас начинаю подключать библиотеку microLed и если раскоментировать "//microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2818, ORDER_GRB, CLI_AVER> strip;"
опять всё перестаёт работать.
подскажите пожалуйста, что делаю не так?
""upd при включении ком порта - тоже самое, дисплей не инициализируется, плата уходит в циклический ребут.
C++:
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#define SCREEN_WIDTH 64
#define SCREEN_HEIGHT 128
#define SH110X_I2C_ADDRESS 0x3C // Замените на 0x3D, если это адрес вашего дисплея
Adafruit_SH1107 display = Adafruit_SH1107(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#include <Wire.h>
#include "RTClib.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define STRIP_PIN 9     // пин ленты
#define NUMLEDS 73      // кол-во светодиодов
#define COLOR_DEBTH 3
#include <microLED.h>
//microLED<NUMLEDS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2818, ORDER_GRB, CLI_AVER> strip;


float input_volt = 0.0;
float akb = 0.0;
float AKB = 0.0;
byte a = 0;
int i = 0;
float temp=0.0;
float r1=1000000.0; //сопротивление резистора r1
float r2=100000.0; // сопротивление резистора r2
float temp1 = 0.0; // текущее значение температуры


RTC_DS1307  rtc;
DateTime now;

#define BUTTON_HOURS 3
#define BUTTON_MINUTES 4
#define BUTTON_RESET 5
#define GABARIT 8

#define ONE_WIRE_BUS 10
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;

void setup()
{
  // Инициализация кнопок
  pinMode(BUTTON_HOURS, INPUT_PULLUP);
  pinMode(BUTTON_MINUTES, INPUT_PULLUP);
  pinMode(BUTTON_RESET, INPUT_PULLUP);
  // Инициализация часов
  if (!rtc.begin())
  {
    while (1)
      ;
  }
  if (! rtc.isrunning())
  {
   //Serial.println("RTC is NOT running!");
   rtc.adjust(DateTime(2024, 6, 29, 0, 0, 0));  // 19 августа 2020 года 0:00:00
  }
  sensor.begin(); // инициализация DS18B20
  sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
  sensor.setResolution(Thermometer, TEMPERATURE_PRECISION);
  if (!display.begin(SH110X_I2C_ADDRESS, true))
  {
    while (1)
      ;
  }
  display.clearDisplay();
  display.display();
  display.setRotation(1);// 0-3 поворот изображения на дисплее
  display.setTextSize(4);
}
void loop()
{
  int analogvalue = analogRead(A0);
  temp = (analogvalue * 5.0) / 1024.0; // формула для конвертирования значения напряжения
  input_volt = temp / (r2/(r1+r2));
  i++;
  akb = akb+input_volt;
  if(i >=10)
  {
    i=0;
    AKB = akb/10;
    akb = 0.0;
  }
  DateTime now = rtc.now();
  // Проверка нажатия кнопок
  if (digitalRead(BUTTON_HOURS) == LOW)
  {
    adjustHours();
  }

  if (digitalRead(BUTTON_MINUTES) == LOW)
  {
    adjustMinutes();
  }

  if (digitalRead(BUTTON_RESET) == LOW)
  {
    resetMinutes();
  }
   // Обновляем дисплей
  display.clearDisplay();
  display.setTextSize(4);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(8, 0);//отступ вправо
  if (now.hour() < 10)
  display.print("0");
  display.print(now.hour());
  display.print(":");
  if (now.minute() < 10)
  display.print("0");
  display.print(now.minute());
  display.setTextSize(2);
  display.setTextColor(SH110X_WHITE);
  display.setCursor(12, 40);//отступ вправо
  sensor.requestTemperatures(); // считывание значение температуры
  temp1 = sensor.getTempC(Thermometer); // температура в градусах Цельсия
  display.print(temp1,0);
  display.setCursor(80, 40);//отступ вправо
  display.print(AKB,1);
  display.display();
  delay(400);
  /*
  if (GABARIT != 0 )
  {
    if(a == 0)
    {
      strip.setBrightness(150);
      strip.clear();
      strip.show(); // вывод изменений на ленту
      delay(2);     // между вызовами show должна быть пауза минимум 40 мкс !!!!
      for (int i = 0; i < NUMLEDS ; i++)
      {
        strip.leds[i] = mRGB(0, 255, 0);
        strip.show(); // выводим изменения
        delay(30);
      }
      a = 1;
    }
    strip.setBrightness(40);
    strip.show(); // вывод изменений на ленту
    delay(2);     // между вызовами show должна быть пауза минимум 40 мкс !!!!
    strip.fill( mRGB(0, 255, 0));
    strip.show(); // выводим изменения
    delay(30);
  }
  else
  {
    a = 0;
    strip.clear();
    strip.show();
    delay(30);
  }
  */
}
void adjustHours()
{
  now = rtc.now();
  int hours = now.hour();
  hours = (hours + 1) % 24;
  rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, now.minute(), now.second()));
}

void adjustMinutes()
{
  now = rtc.now();
  int minutes = now.minute();
  minutes = (minutes + 1) % 60;
  rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), minutes, now.second()));
}

void resetMinutes()
{
  now = rtc.now();
  rtc.adjust(DateTime(now.year(), now.month(), now.day(), 0, 0, 0));
}
 
Изменено:

ZyaK

✩✩✩✩✩✩✩
15 Июн 2021
4
0
@bort707,
ошибок при компиляции нет, предупреждений тоже.
Скетч использует 20896 байт (64%) памяти устройства. Всего доступно 32384 байт.
Глобальные переменные используют 604 байт (29%) динамической памяти, оставляя 1444 байт для локальных переменных. Максимум: 2048 байт.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
@ZyaK,
Я не работал с Adafruit_SH110X.h, так что советы того у кого есть опыт, могут быть точнее и полезнее.
Основная память под буфер экрана выделяется после запуска скетча (для одноцветного 64*128 это 1 КБ)
Может еще на что выделяется.
Тут надо или разбираться с библиотеками, или перейти на МК с большим кол-вом памяти.

Если разбираться в коде интересно, то резервы есть, т.к. ВРОДЕ GyverOLED умеет работать с SH1106 в варианте без буфера в ОЗУ, а SH1107 похож на SH1106.
tinyLED - может выводить простые цвета на ленту без выделения памяти
Serial - можно уменьшить буфера приема и передачи.
Dallas - можно убрать и НЕМНОГО сохранить памяти.

Дополнение: есть еще библиотека U8g2lib.h, распространенная (но я с графическими дисплеями опыта не имею).
 
Изменено: