Запары с памятью

Тема в разделе "Arduino & Shields", создана пользователем rishat012, 12 май 2017.

  1. rishat012

    rishat012 Нуб

    Добрый день, уважаемые форумчане!
    У меня возникла такая проблема как :
    Глобальные переменные используют 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);
                         
    }
     
  2. rkit

    rkit Гуру

    Можно
     
  3. ostrov

    ostrov Гуру

    Попробуйте макро F() в принтах, может закинет часть текста во флеш.
     
  4. rishat012

    rishat012 Нуб

    Решил проблему поменяв библиотеку к часикам реального времени
     
  5. rishat012

    rishat012 Нуб

    А кто нибудь знает как посмотреть что удалить в библиотеке ? (Знаю что вопрос сложный и не понятный, но все таки)
     
  6. ostrov

    ostrov Гуру

    Залезть в нее при помощи, например, Notepad++, разобраться как она работает, оптимизировать, сохранить, скомпилировать скетч снова.
     
    rishat012 нравится это.
  7. rkit

    rkit Гуру

    Ничего сложного. Буквально смотрите на структуру библиотеки и на свой код, и удаляет то, что не используется.
     
    rishat012 нравится это.
  8. mcureenab

    mcureenab Гуру

    Конкретно библиотека SD использует модуль SdFat.h для поддержки файловой системы FAT16, FAT32.
    Помимо тучи всякоразных статических переменных в библиотеке объявлен буфер

    Код (C++):
      static cache_t cacheBuffer_;        // 512 byte cache for device blocks
     
    Который оттяпает у вас почти 1/3 памяти.
     
    rishat012 нравится это.
  9. rishat012

    rishat012 Нуб

    Спасибо, пойду решать проблему
     
  10. Evgen_Br

    Evgen_Br Нуб

    кто-нибудь может подсказать?
    пытаюсь к ардуине нано подключить 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 ее видит?
     
  11. ImrDuke

    ImrDuke Гик

    Смог кто нибудь победить эту библиотеку?