Что то с памятью моей стало...

Megawollt
Offline
Зарегистрирован: 06.12.2015

Компилятор пишет:

Скетч использует 15 960 байт (51%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 1 675 байт (81%) динамической памяти, оставляя 373 байт для локальных переменных. Максимум: 2 048 байт.
Недостаточно памяти, программа может работать нестабильно.
 
И действительно работает нестабильно. А как понять почему? программа вроде небольшая. Вот текст
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>


#define potPin      A6     //Вывод резистора скорости
#define uPin        A5    //Вывод напряжения батареи
#define fwdPin      5    //Вывод кнопки "Вперед"
#define bwdPin      6   //Вывод кнопки "Назад"

#define OLED_MOSI   3  //Выводы дисплея
#define OLED_CLK   0
#define OLED_DC    1
#define OLED_CS    2
#define OLED_RESET 14

//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
RF24 radio(7, 8);

const unsigned char PROGMEM logo[] = {                                         //Код логотипа
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x7c, 0xfb, 0xe7, 0xc0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0xf, 0xfc, 0xfb, 0xe3, 0xff, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x7f, 0xfc, 0xfb, 0xe3, 0xdf, 0xe0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x3, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xfc, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x1f, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0x0, 0x0, 0x0, 
0x0, 0x0, 0xff, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xe0, 0x0, 0x0, 
0x0, 0x3, 0xff, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 
0x0, 0xf, 0xdf, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 
0x0, 0x1f, 0xdf, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 
0x0, 0x3f, 0xdf, 0xff, 0xfc, 0xfb, 0xe3, 0xdf, 0xff, 0xf8, 0x0, 0x0, 
0x0, 0xff, 0xdf, 0xff, 0xfc, 0xfb, 0xe7, 0xdf, 0xff, 0xfc, 0x0, 0x0, 
0x1, 0xff, 0xdf, 0xe1, 0xfc, 0xfb, 0xe7, 0xdf, 0x7f, 0xfc, 0x30, 0x0, 
0x3, 0xff, 0xdf, 0x80, 0xfc, 0xfb, 0xe7, 0xdf, 0x1f, 0xfc, 0x38, 0x0, 
0x7, 0xff, 0xff, 0x0, 0xfe, 0xfb, 0xef, 0x9f, 0x1f, 0xfc, 0x38, 0x0, 
0x7, 0xff, 0xff, 0x0, 0xff, 0xfb, 0xff, 0x1f, 0x1f, 0xfe, 0x3c, 0x0, 
0xf, 0xff, 0xff, 0x0, 0xff, 0xfb, 0xfc, 0x1f, 0x1f, 0xfe, 0x3e, 0x0, 
0x1f, 0xff, 0xff, 0x1, 0xff, 0xfb, 0xff, 0x9f, 0x1f, 0xfe, 0x3f, 0x0, 
0x1f, 0xe7, 0xff, 0x1f, 0xfd, 0xfb, 0xff, 0xdf, 0x1f, 0xff, 0x3f, 0x0, 
0x3f, 0xc7, 0xff, 0xff, 0xfc, 0xfb, 0xff, 0xdf, 0x1f, 0xff, 0x7f, 0x80, 
0x3f, 0x87, 0xff, 0xff, 0xfc, 0xfb, 0xf7, 0xdf, 0x1f, 0xff, 0xff, 0x80, 
0x3f, 0x87, 0xff, 0xe3, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xff, 0xff, 0x80, 
0x7f, 0x7, 0xff, 0x80, 0xfc, 0xfb, 0xe3, 0xdf, 0x1f, 0xff, 0xff, 0xc0, 
0x7f, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xdf, 0x1f, 0xff, 0xff, 0xc0, 
0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xff, 0xff, 0xc0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfd, 0xef, 0xc0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfd, 0xef, 0xe0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfd, 0xef, 0xe0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xef, 0xe0, 
0xfe, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xe0, 
0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 
0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 
0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 
0x7e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0xc0, 
0x3e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0xf, 0x80, 
0x3e, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe7, 0xff, 0x1f, 0xfc, 0x1f, 0x80, 
0x1f, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x1f, 0x0, 
0x1f, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x1f, 0x0, 
0xf, 0x7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x1e, 0x0, 
0x7, 0x87, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x3c, 0x0, 
0x7, 0x87, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x3c, 0x0, 
0x3, 0xc7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x38, 0x0, 
0x1, 0xc7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x70, 0x0, 
0x0, 0xe7, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x60, 0x0, 
0x0, 0x67, 0xff, 0x0, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x0, 0x0, 
0x0, 0x7, 0xff, 0x80, 0xfc, 0xfb, 0xe3, 0xff, 0x1f, 0xfc, 0x0, 0x0, 
0x0, 0x7, 0xff, 0xc1, 0xfc, 0xfb, 0xe3, 0xff, 0x7f, 0xfc, 0x0, 0x0, 
0x0, 0x3, 0xff, 0xfb, 0xfc, 0xfb, 0xe3, 0xff, 0xff, 0xf8, 0x0, 0x0, 
0x0, 0x0, 0xff, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xff, 0xe0, 0x0, 0x0, 
0x0, 0x0, 0x1f, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xff, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x7, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xfc, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x1, 0xff, 0xfc, 0xfb, 0xe3, 0xff, 0xf0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x1f, 0xfc, 0xfb, 0xe3, 0xff, 0x80, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0xfc, 0xfb, 0xe3, 0xe0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
};



const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи

bool fwd = false;                     //Переменная "Вперед"
bool bwd = false;                    //Переменная "Назад"
bool con = false;                   //Статус соединения
int u_value = 0;                   //Значение напряжения
int spd = 0;                      //Скорость
float ubat = 0.00;               //Напряжение батареи
int spd_d = 0;                  //Скорость для отображения на дисплее

void setup()
{
  radio.begin();
  radio.openWritingPipe(pipe);             // Открываем канал передачи
  display.begin();                        //Инициализация дисплея
  pinMode(fwdPin, INPUT);                //Режимы пинов
  pinMode(bwdPin, INPUT);
  pinMode(uPin, INPUT);
  pinMode(potPin, INPUT);
  digitalWrite(bwdPin, LOW);
  digitalWrite(fwdPin, LOW);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.drawBitmap(18, 0 , logo, 92, 64, WHITE); //Печать логотипа
  display.display();
  delay(3500);
} //end setup

void loop()
{ //start loop

  display.clearDisplay();             //Очистка дисплея
  u_value = analogRead(uPin);        //Замер напряжения батареи
  ubat = (u_value * 5.0) / 1024.0;  //Рассчет напряжения
  spd = analogRead(potPin);        //Обработка данных резистора скорости
  spd = map(spd, 0, 1023, 0, 255); //Маппинг 10 бит в 8 бит
  spd_d = map(spd, 0, 255, 0, 100); //Маппинг скорости для дисплея из 255 в 100


  //Строка напряжения батареи
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Battery voltage ");
  display.setCursor(94, 0);
  display.print(ubat);
  display.print("V");

  //Строка скорости
  display.setCursor(9, 12);
  display.println("Current speed  ");
  display.setCursor(92, 12);
  display.print(spd_d);
  display.print("%");


  //Строка соединения
  if (con == true) {
    display.setCursor(23, 55);
    display.print("Connection OK");
    display.display();
  }//endif
  else {
    display.setCursor(23, 55);
    display.print("Not connected!");

  }//end else

  //если кнопка "Вперед" нажата ...
  if (digitalRead(fwdPin) == HIGH && !digitalRead(bwdPin) == HIGH)
  {
    fwd == true;
    radio.write(&fwd, 1);
    radio.write(&spd, 1);
    display.setTextSize(2);
    display.setCursor(15, 25);
    display.println("Move FWD");

  }//endif

  //если кнопка "Назад" нажата ...
  if (digitalRead(bwdPin) == HIGH && !digitalRead(fwdPin) == HIGH)
  {
    bwd == true;
    radio.write(&bwd, 1);
    radio.write(&spd, 1);
    display.setTextSize(2);
    display.setCursor(10, 25);
    display.println("Move BACK");

  }//endif

  //если обе кнопки нажаты ...
  if (digitalRead(fwdPin) == HIGH && digitalRead(bwdPin) == HIGH)
  {
    display.setTextSize(2);
    display.setCursor(5, 25);
    display.println("BTN ERROR!");

  } //endif



  display.display();
} //end loop

 

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

наверное из-за строки 29:)

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Недавно попадалась статья про распределение памяти. Детали не помню, но главное это то что снизу идут глобальные переменные, потом локальные, потом "куча", а от верхнего адреса вниз идет стек. т.к. использовано много оперативы - возможно наползание кучи на стек.... результат естессно непредсказуем.

 

http://robocraft.ru/blog/arduino/531.html

Megawollt
Offline
Зарегистрирован: 06.12.2015

29 строка идет сразу в eeprom, а не в прошивку

итак уж задефайнил все, что мог, чтобы память не жрало

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

но вы же логотип выводите строка 121, попробуйте не выводить, что компилятор скажет?

Megawollt
Offline
Зарегистрирован: 06.12.2015

29-код логотипа в память

121-вывод на экран. Убираем логотип, ничего не меняется

toc
Offline
Зарегистрирован: 09.02.2013

Megawollt, только не в еепром, а во флеш (память программ)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Оперативы не хватат. Или отказываться от части библиотек .. надо смотреть кто и зачем жрет столько оперативы под глобалы и динамическую память .. или смотреть в сторону "старших моделей": Atmega128A, Atmega2560 .. а заодно и сюда: http://arduino.ru/forum/proekty/nedovolnym-super-dunya-est-zhelayushchie...

.. или уходить на иные камни, тиа STM32.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Adafruit_SSD1306.h буфер размеров во весь экран в памяти дежржит. Вот и отъела.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я бы переместил во flash еще и текстовые строки. Когда 2/3 доступной памяти занимает экранный буфер, приходится экономить на мелочах.

Впрочем, экранный буфер, скорее всего, Вам не нужен. Найдите библиотеку без него - жизнь стазу станет легче.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо ребят. Давно не выходил, так как моделировал блок управления двигателем под эту самую программу.

Так вот. Использовать stm32 я не могу, так как не знаком ни с какими языками программирования кроме ардуиновского процессинга и то немного.

 

А что это за буфер и как найти библиотеку без него?

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Megawollt пишет:

Так вот. Использовать stm32 я не могу, так как не знаком ни с какими языками программирования кроме ардуиновского процессинга и то немного.

Где ж ты родимый такой язык то нашел?

НЕТ такого языка. Есть простой Си/Си++

Керниган и Ричи, Кнут тебе в помощь. Плюс немного мозгов......

Megawollt
Offline
Зарегистрирован: 06.12.2015

Я не буду вступать в полемику по этому поводу. Джереми Блюм утверждал, что это процессинг на основе С++. Я думаю он прав

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Megawollt пишет:

Я не буду вступать в полемику по этому поводу. Джереми Блюм утверждал, что это процессинг на основе С++. Я думаю он прав

 А Дима Осипов так не думает. Твоему Джереми до Димки еще учится и учится...

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012
Megawollt
Offline
Зарегистрирован: 06.12.2015

Хорошо, С. Да простит меня Деннис Ритчи.
А что по теме? Как разобраться с памятью?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Еще в #9 ответили, что нужно делать, искать другую библиотеку. Меня не спрашивайте, графические дисплеи использую крайне редко.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Да это я понял. А вот есть ли они, эти библиотеки...

Megawollt
Offline
Зарегистрирован: 06.12.2015

Никто не знает?