SD-card инициализируется, но работает, если скетч менее 24к
- Войдите на сайт для отправки комментариев
С наступающим!
Хороших проектов!
Подскажите пожалуйста, пробую использовать:
- GSM/GPRS Shield (SIM900.h)
- DHT11
- LCD 1602
- SD
- RTC 1302
- Arduino UNO (328)
- Arduino IDE 1.0.6
Проблема возникает в том, что при превышении скетча более 24к, SD карта инициализируется, но писать в нее отказывается. Пробую отключать либы или вызовы, уменьшая размер скетча и все работает ок.
#include "SIM900.h" #include <SoftwareSerial.h> #include "sms.h" #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); #include "DHT.h" DHT dht(A0, DHT11); // SD #include <SD.h> SoftwareSerial Serial1(2, 3); SMSGSM sms; boolean gsmstarted=false; void setup() { Serial.begin(9600); Serial.println("GSM-SD testing."); if (gsm.begin(9600)){ Serial.println("\nstatus=READY"); gsmstarted=true; } else Serial.println("\nstatus=IDLE"); if(gsmstarted){ Serial.println("GSM OK"); } if (!SD.begin(10)) { Serial.println("Card failed, or not present"); } else Serial.println("Card initialized."); } void loop() { String dataString = ""; // for SD-card File dataFile = SD.open("datalog.txt", FILE_WRITE); dataString += "foo"; Serial.println("\nwaiting..."); if (dataFile) { dataFile.println(dataString); dataFile.close(); Serial.println(dataString); Serial.println("\nbaaar..."); }else { Serial.println("error opening datalog.txt"); } delay(2000); }
Вот такой вариант занимает 23 690 и при запуске получаю
Card initialized
и затем всегда error opening datalog.txt
стоит закоментировать работу с DHT
// DHT dht(A0, DHT11);
23 665 байт и все работает.
при том не обязательно эту строчку, просто уменьшить чуть размер.
Или как вообще правильно программно реализовать работу кода с этими библиотеками?
Почему такое ограничение для SD карт?
Спасибо
Это не ограничение, как таковое. Просто в УНО мало памяти. Я сталкивался с таким уже - на МЕГЕ работает, на УНО виснет. Вопрос не в размере скетча, а в том, сколько памяти осталось после объявления экземпляров всех классов. Если у вас IDE 1.5.. - вы должны увидеть строку, мол "под глобальные переменные использовано 99% ...". И для работы какой-то функции ардуино просто не может выделить память.
Спасибо за исчерпывающий ответ.
IDE 1.0.6 использую, т.к. пробовал 1.5.х - не все либы к нему коннектятся нормально, потому и вернулся к 1.0
Спасибо за исчерпывающий ответ.
IDE 1.0.6 использую, т.к. пробовал 1.5.х - не все либы к нему коннектятся нормально, потому и вернулся к 1.0
Это какие, например? Никогда такого не замечал...
я уже не помню, если честно.
установил 1.5.8 Java7 и загрузил скетч, вынес не нужные шлобальные переменные внутрь loop()
Sketch uses 24 972 bytes (77%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 721 bytes (84%) of dynamic memory, leaving 327 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.
Подскажите из опыта какой же % допустимый? Как считать то правильно?
Очень смущает последняя строка.
Спасибо
я уже не помню, если честно.
установил 1.5.8 Java7 и загрузил скетч, вынес не нужные шлобальные переменные внутрь loop()
Sketch uses 24 972 bytes (77%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 721 bytes (84%) of dynamic memory, leaving 327 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.
Подскажите из опыта какой же % допустимый? Как считать то правильно?
Очень смущает последняя строка.
Спасибо
Нет такого понятия "допустимый %". Если вы уверены, что ни одна библиотека не требует динамического выделения памяти - то и 99% по идее может стабильно работать. Но запись на карточку явно буферизируется - значит в вашем случае ни в чем нельзя быть уверенным. Выходов несколько - простой и в лоб - использовать МЕГУ (я если честно вообще УНО не понимаю - пинов мало, памяти мало, стоит почти столько-же...).
Не простой, но понтовый - не использовать библиотеки.
Можно попытаться PROGMEM заюзать - часто это выход.
P.S. С Новым годом!
Так теперь понятно, раньше на ZX-Spectrum хватало и 16к =)
Так теперь понятно, раньше на ZX-Spectrum хватало и 16к =)
Не знаю, кому хватало кастрированного спектрума с 16 кб, Обычный имел 48 кб. И этих 48 кб, с ассемблером еле-еле хватало...
я уже не помню, если честно.
установил 1.5.8 Java7 и загрузил скетч, вынес не нужные шлобальные переменные внутрь loop()
Sketch uses 24 972 bytes (77%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 721 bytes (84%) of dynamic memory, leaving 327 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.
Подскажите из опыта какой же % допустимый? Как считать то правильно?
Очень смущает последняя строка.
Спасибо
Здравствуйте,
Не увидел сразу эту тему и создал свою.
Дело в том что у меня та же проблема
Sketch uses 20 302 bytes (62%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 732 bytes (84%) of dynamic memory, leaving 316 bytes for local variables. Maximum is 2 048 bytes.
Low memory available, stability problems may occur.
Дело тут не в размере скетча а в том, что не хватает места под глобальные переменные.
SRAM всего 2КБ. Как я понял из них должно быть свободно не менее 25%.
Все свои глобальные переменные сократил до минимума. Видимо чтобы не превышать размер SRAM придется убирать из библиотек все неиспользуемые переменные.
Либо использовать Arduino MEGA, но уж очень не хочется, так как у нее большая избыточность в пинах.
Я решил вопрос заменив библиотеку SIM900 на стандартный пакет GSM
Но и это не помогло - пришлось выкинуть SD. А так же убрал временно RTC на DS1302
Жду посылку с 1307 и через I2C надеюсь, что хоть таймер заработает =)
Я решил вопрос заменив библиотеку SIM900 на стандартный пакет GSM
Но и это не помогло - пришлось выкинуть SD. А так же убрал временно RTC на DS1302
Жду посылку с 1307 и через I2C надеюсь, что хоть таймер заработает =)
А почему DS1307 а не DS3231?
Как я читал у DS1307 очень большой уход по времени за сутки. У меня DS3231 как раз I2C но это не помогает. Как я посмотрел мне от часов нужна всего пара функций - установка и возврат текущего времени. в последствии может быть и будильник. А библиотека что я использую очень большая и предоставляет массу ненужного сервиса.
А вот с SD будет сложнее, кушает она тоже много SRAM но переделать ее думаю не получится.
Вместо GSM у меня ENC28J60, вчера проверил, ест прилично. Так что сейчас просто соберу скетч со всеми используемыми библиотеками и функциями, и посмотрю как и где можно подкрутить. Если не получится придется делать на меге.
...
Вместо GSM у меня ENC28J60, вчера проверил, ест прилично. Так что сейчас просто соберу скетч со всеми используемыми библиотеками и функциями, и посмотрю как и где можно подкрутить. Если не получится придется делать на меге.
А еще - выкиньте ENC28J60 и возьмите W5100. Или даже начните именно с этого. В вашем шилде IP-стек реализован программно...
А почему DS1307 а не DS3231?
Как я читал у DS1307 очень большой уход по времени за сутки. У меня DS3231 как раз I2C но это не помогает. Как я посмотрел мне от часов нужна всего пара функций - установка и возврат текущего времени. в последствии может быть и будильник. А библиотека что я использую очень большая и предоставляет массу ненужного сервиса.
Так получилось. В принципе время необходимо только для логгирования в SD карту, но спасибо, закажу еще DS3231 для переделки потом на MEGA
Еще читал, что время можно брать от GSM сервиса.
А еще - выкиньте ENC28J60 и возьмите W5100. Или даже начните именно с этого. В вашем шилде IP-стек реализован программно...
Тут не могу не согласится. Вот компиляция стандартного скетча WebServer из комплекта к Aduino IDE 1.5.8
Sketch uses 12 586 bytes (39%) of program storage space. Maximum is 32 256 bytes.
Global variables use 547 bytes (26%) of dynamic memory, leaving 1 501 bytes for local variables. Maximum is 2 048 bytes.
Вот то же WebServer который идет с библиотекой UIPEthernet
Sketch uses 19 592 bytes (60%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 136 bytes (55%) of dynamic memory, leaving 912 bytes for local variables. Maximum is 2 048 bytes.
Как видно с шилдом W5100 памяти расходуется гораздо меньше.
Спасибо за совет, может приобрету W5100, они вроде еще как бывают с SD ридером?
А про W5500 ничего не можете сказать? очень размером они понравились.
http://www.aliexpress.com/item/W5500-Ethernet-Module-Hardware-TCP-IP-Protocol-Stack-SPI-Interface-Ethernet-To-SPI/2039279736.html
А модули ENC28J60 привлекли ценой. Но как выясняется везде свои недостатки.
Так получилось. В принципе время необходимо только для логгирования в SD карту, но спасибо, закажу еще DS3231 для переделки потом на MEGA
Еще читал, что время можно брать от GSM сервиса.
Если будет доступ к интернету то однозначно можно. Хотя и без доступа к инету телефоны могут синхронизировать время с мобильным оперетором.
А что собираете если не секрет?
Я хотел построить на UNO автоматику для теплицы, поэтому взял DS3231. У нее есть будильники.
Но видимо на UNO построить не получится, всетаки маловато у нее памяти.
В итоге приобрету наверное MEGA. Тогда и GSM можно будет подключить для удаленного мониторнига и управления.
А что собираете если не секрет?
Для начала это GSM модуль с приемо-передатчиками 433Мгц для контроля температур и подогрев перед нашим приездом (обогреватели работают в режиме антизаморозки 7-9 градусов).
Это зимний вариант с расширением для остальных сезонов =)
Я так же понимаю, что UNO это ничтожно мало и буду переходить на MEGA
W5100 все идут с кардридером, ибо полноценный сервер без карточки - никак.
А про W5500 даже не слышал, вероятно новинка...
W5100 все идут с кардридером, ибо полноценный сервер без карточки - никак.
А про W5500 даже не слышал, вероятно новинка...
Не всегда, встречаются и усеченные варианты. Вот например:
http://www.aliexpress.com/item/TOP-Mini-W5100-LAN-Ethernet-Shield-Network-Module-board-for-Arduino-Best/1990146986.html
Да все мои изыскания привели к тому что надо брать MEGA + W5100 ну а остальное у меня есть :-)
Так же сейчас продают W5200, тоже с SD ридером. Вот описание по стравнению с W5100
http://www.aliexpress.com/store/product/Free-shipping-New-Ethernet-SHIELD-W5200-FOR-arduino-UNO-R3-mega-2560-R3/1184212_32261803925.html
Спасибо за подсказки :-)
А что собираете если не секрет?
Для начала это GSM модуль с приемо-передатчиками 433Мгц для контроля температур и подогрев перед нашим приездом (обогреватели работают в режиме антизаморозки 7-9 градусов).
Это зимний вариант с расширением для остальных сезонов =)
Я так же понимаю, что UNO это ничтожно мало и буду переходить на MEGA
Да, я уже смотрю цены на MEGA.
А GSM модуль у вас какой? Я нашел такой, но както не дешево :-(
http://www.aliexpress.com/store/product/Free-shipping-GSM-SIM900-SIM900A-Module-GPRS-Shield-Compatible-for-Arduino-for-GSM-Cell-Phone-Achieve/1184212_32218573011.html
Если позволите - дам еще один совет - не связывайтесь с алиэкспрессом. На ибэе то-же самое, как минимум не дороже, но зато с такой защитой покупателя, что али нервно курит в сторонке.
Это я как шопер с пятилетним стежем советую...
http://www.ebay.com/itm/261679201038?_trksid=p2060778.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Да, на Али иногда бывает дешевле, но сроки доставки и непонятная защита клиента не впечатляют. Ebay самое оно.
По поводу модуля GSM, я брал shield ибо перед этим намучался с упрощенным модулем очень сильно.
Цены на MEGA на Али 8.45 на Ebay - 10.50 минимум
Цены на MEGA на Али 8.45 на Ebay - 10.50 минимум
Интересные цены...
Я и по 10.5 с доставкой не видел. Хватать и тикать! (с)
Если позволите - дам еще один совет - не связывайтесь с алиэкспрессом. На ибэе то-же самое, как минимум не дороже, но зато с такой защитой покупателя, что али нервно курит в сторонке.
Это я как шопер с пятилетним стежем советую...
http://www.ebay.com/itm/261679201038?_trksid=p2060778.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Насчет защиты на али - всем доволен!
Было пару конфликтов, но первый раз продавец добровольно уладил конфликт, второй раз модератор вернул деньги после жалобы. Просто продавец упертый попался, я долго с ним переписывался. В итоге написал администрации, там есть кнопочка, из переписки с продавцшм можно стразу администрации все переслать. И сразу деньги вернули. Все остальные покупки проходили без проблем.
А на ebay тоже покупал года 2 назад, но на али нравится навигация больше. Хотя ebay тоже за последние пару лет, что у них не покупаю, немного подтянул функционал.
Покупаю Arduino в этом магазине http://www.aliexpress.com/store/1184212
Пока и качеством и сроками доволен.
вот MEGA за $8.8
http://www.aliexpress.com/store/product/Freeshipping-Mega-2560-R3-Mega2560-REV3-ATmega2560-16AU-Board-USB-Cable-compatible-for-arduino-good-quality/1184212_1718380594.html
А вот GSM шилды на али подороже, но не на много. Рублей на 200.
http://www.ebay.com/itm/Microcontroller-Board-ATmega2560-16AU-USB-Cable-...
http://ru.aliexpress.com/item/-/1941915450.html?recommendVersion=1
Да, на Али иногда бывает дешевле, но сроки доставки и непонятная защита клиента не впечатляют. Ebay самое оно.
По поводу модуля GSM, я брал shield ибо перед этим намучался с упрощенным модулем очень сильно.
А какой именно, я нашел только под UNO
Для MEGA не нашел.
Вот самый компактный который нашел.
http://www.aliexpress.com/store/product/SIM900A-Extension-Module-GSM-GPRS-900-1800MHz-Board-Antenna-for-Arduino/203833_32224068807.html
я как раз с подобным и намучался, пока не купил shield
и вообще понял, что покупая новый, не знакомый модуль, сначала надо погуглить хорошо
вот например сначала купил DC1302 намучался (не хватало портов), увидел DC1307 на I2C... обрадовался и купил, а теперь, в этой теме выяснилось, что надо было брать DS3231
А какой именно, я нашел только под UNO
Для MEGA не нашел.
Это он и есть. Мега - это удлинненый УНО, "голова" у них одинаковая.
Вот самый компактный который нашел.
http://www.aliexpress.com/store/product/SIM900A-Extension-Module-GSM-GPRS-900-1800MHz-Board-Antenna-for-Arduino/203833_32224068807.html
не советую, "900 А" - не совсем кошерный модуль. Нужно просто "900" брать. Хотя на этом форуме есть ветка - вроде бы разница только в прошивке и можно перешить.
http://www.ebay.com/itm/Microcontroller-Board-ATmega2560-16AU-USB-Cable-...
http://ru.aliexpress.com/item/-/1941915450.html?recommendVersion=1
Жалко мне не нужно - у меня и так 6 разных ардуин...
Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)
Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)
На самом деле DC1307 не так уж и плох. Во всяком случае он полностью совместим с библиотекой от DC1307.
Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)
так есть еще и DS3234
тут можно почитать:
http://www.compel.ru/lib/ne/2012/2/6-if-it-is-electronics-it-needs-a-clock-chasyi-realnogo-vremeni-ot-kompanii-maxim/
Изучаю DS3231 и вон уже DS3232 оказывается есть, так что не уследишь =)
так есть еще и DS3234
тут можно почитать:
http://www.compel.ru/lib/ne/2012/2/6-if-it-is-electronics-it-needs-a-clock-chasyi-realnogo-vremeni-ot-kompanii-maxim/
потому наверное проще инициализировать время:
- GSM от оператора
- Ethernet от интернета
потому наверное проще инициализировать время:
- GSM от оператора
- Ethernet от интернета
Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(
Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(
В смысле - не потянул?
Вот только, что доделал проект для аквариума на УНО, все прекрасно работает с этими библиотеками:
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(
В смысле - не потянул?
Вот только, что доделал проект для аквариума на УНО, все прекрасно работает с этими библиотеками:
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
У меня еще GSM, DHT, SD
Может и так. Но в DS3231 есть еще и будильники которые можно вешать на прерывания. А для MEGA DS3231 незначительная нагрузка в плане памяти SRAM. Это UNO не потянул :-(
В смысле - не потянул?
Вот только, что доделал проект для аквариума на УНО, все прекрасно работает с этими библиотеками:
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
Какую библиотеку используете для DS3231?
Я использую https://github.com/jarzebski/Arduino-DS3231
У меня проблема в том что библиотеки SD карты и Ethernet кушают много, с остальным все в порядке.
Какую библиотеку используете для DS3231?
Я использую https://github.com/jarzebski/Arduino-DS3231
похоже, что у меня другая
Проблема возникает в том, что при превышении скетча более 24к, SD карта инициализируется, но писать в нее отказывается. Пробую отключать либы или вызовы, уменьшая размер скетча и все работает ок.
К стати попробуй убрать из кода мониторинг в Serial
У меня после того как убрал всю отладку резко освободилась SRAM.
теперь занято 59% вменсто 84%
Да и библиотеку для DS3231 урезал оставил функции установки даты и времени и возврата строкой даты и времени. Если нужна напиши почту, скину.
из личной практики скажу,что у меня сд инициализировалась,но не писало в нее в двух случаях ..1-какая-то из библиотек использует пин CS кардридера(вероятнее всего библиотека дисплея).решается переназначением пина для дисплея..2-переполняется буфер ,он общий что для Serial,что для записи в sd...попробуйте эксперимента ради отказаться от Serial....ну,как минимум убрать вывод в сериал dataString,только чтоб выводил "да" или "нет" ну типа удачно записали или ошибка,без излишеств......узнать свободную RAM при подключенной библиотеке SD.h, в работе очень просто: Serial.print(FreeRam());
или вот выдернутая функция freeRam из библиотеки,чтоб не подключать всю библиотеку,добавьте себе в скетч:
http://arduino.ru/Tutorial/Memory
Получил посылку с MEGA... блин сколько всего добавил и даже дебаг не удаляю =)