Добрый день, уважаемые форумчане! У меня возникла такая проблема как : Глобальные переменные используют 1787 байт (87%) динамической памяти, оставляя 261 байт для локальных переменных. Максимум: 2048 байт. Недостаточно памяти, программа может работать нестабильно. Методом комментирования выяснилось, что половину памяти жрет библиотека SD. Вопрос: а) можно ли как то подредактировать библиотеку или же удалить не нужные функции и переменные в нем? б) или оптимизировать код все таки? Сам код: Спойлер: Мой код Код (C++): //Тестировалось на Arduino IDE 1.0.5 #include <Wire.h> // Добавляем необходимые библиотеки #include <LiquidCrystal_I2C.h> #include <dht11.h> #include <SPI.h> #include <SD.h> #include <RTC.h> RTC time; const uint8_t PIN_CS = 10; // указываем номер вывода arduino подключенного к выводу CS адаптера //const int buttonPin = 2; // номер входа, подключенный к кнопке unsigned long oldTimeLcd = 0; unsigned long oldTimeSd = 0; File myFile; dht11 DHT; // Объявление переменной класса dht11 #define DHT11_PIN 4 // Датчик DHT11 подключен к цифровому пину номер 4 LiquidCrystal_I2C lcd(0x3F ,16,2); // Задаем адрес и размерность дисплея void setup() { time.begin(RTC_DS1302,6,5,7); // на базе чипа DS1302, вывод RST, вывод CLK, вывод DATдоступны любые выводы pinMode(2, INPUT); lcd.init(); // Инициализация lcd // Включаем подсветку // lcd.createChar(1, degree); // Создаем символ под номером 1 Serial.begin(9600); // открываем последовательный порт на скорости 9600 бод // if(!SD.begin(PIN_CS)){ // lcd.setCursor(0, 0); // инициализация SD карты с указанием номера вывода CS // lcd.print("SD-card not found"); return; // ошибка инициализации. карта не обнаружена или не подключён (неправильно подключён) адаптер карт MicroSD // } //проверяем наличие файла "iarduino.txt" на SD-карте //открываем файл "iarduino.txt" для чтения и записи, начиная с конца файла, и записываем в него строку } boolean getClick(){ if (digitalRead(2) == HIGH) { oldTimeLcd = millis(); Serial.println("Кнопка нажата"); lcd.backlight(); } } void setDisplay(){ lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Hum= % "); // Выводим текст lcd.setCursor(4, 0); lcd.print(DHT.humidity, 1); lcd.setCursor(10, 0); // Устанавливаем курсор в начало 2 строки lcd.print("T= C "); // Выводим текст, \1 - значок градуса lcd.setCursor(12, 0); lcd.print(DHT.temperature,1); lcd.setCursor(0, 1); lcd.print(time.gettime("H")); // 2c Выводим минуты lcd.setCursor(2, 1); lcd.print(":"); // Выводим текст lcd.print(time.gettime("i")); // 2c Выводим минуты lcd.setCursor(5, 1); lcd.print(" "); // Выводим секунды // int chk; // chk = DHT.read(DHT11_PIN); // Чтение данных // switch (chk){ // case DHTLIB_OK: // break; // case DHTLIB_ERROR_CHECKSUM: // lcd.clear(); // lcd.print("Checksum error"); // break; // case DHTLIB_ERROR_TIMEOUT: // lcd.clear(); // lcd.print("Time out error"); // break; // default: // lcd.clear(); // lcd.print("Unknown error"); // break; // } } void loop() { if(millis() <= 3000){ oldTimeLcd = 0; oldTimeSd = 0; } if((millis() - oldTimeLcd) >= 5000){ // прошло больше или ровно 10 секунд lcd.noBacklight(); // выключаем подсветку } if((millis() - oldTimeSd) >= 5000){ Serial.println("Подготовка к записи"); Serial.println(time.gettime("d-m-y.txt")); myFile = SD.open(time.gettime("d-m-y.txt"), FILE_WRITE); // если файла с именем "iarduino.txt" - нет, то он будет создан. // Serial.println(myFile); if(myFile){ Serial.println("Запись"); myFile.print("Влажность = "); myFile.println(DHT.humidity,1); myFile.print("Температура = "); myFile.println(DHT.temperature,1); myFile.print("Время: " ); myFile.println(time.gettime("H-i-s")); myFile.println("------------------"); } oldTimeSd = millis(); myFile.close(); } getClick(); // проверяем нажата ли кнопка setDisplay(); // выводим на экран delay(1000); }
А кто нибудь знает как посмотреть что удалить в библиотеке ? (Знаю что вопрос сложный и не понятный, но все таки)
Залезть в нее при помощи, например, Notepad++, разобраться как она работает, оптимизировать, сохранить, скомпилировать скетч снова.
Ничего сложного. Буквально смотрите на структуру библиотеки и на свой код, и удаляет то, что не используется.
Конкретно библиотека SD использует модуль SdFat.h для поддержки файловой системы FAT16, FAT32. Помимо тучи всякоразных статических переменных в библиотеке объявлен буфер Код (C++): static cache_t cacheBuffer_; // 512 byte cache for device blocks Который оттяпает у вас почти 1/3 памяти.
кто-нибудь может подсказать? пытаюсь к ардуине нано подключить microSD карту. есть библиотека SD.h (родная с ардуино), скачал еще SdFat.h в примерах есть скетч дающий информацию о карте. карта на 2 гига microCD class 4, фирма mirex почему SD.h не инициализирует карту (сообщение: Card type: SD2 Could not find FAT16/FAT32 partition. Make sure you've formatted the card), а SdFat.h ее видит?