Это что за циклы такие, больше 30 сек? Для вачдога 8 сек максимум и это никогда не было проблемой. Вставьте в loop вывод millis() в порт и посмотрите.
Kvolk, Вы из контекста слова выдергиваете или не поняли. Я говорю что сперва появляется спрос, потом кто-то реализует устройство, которое удовлетворяет потребностям, но дорогое, а потом китайцы это повторяют и делают максимально дешевым и с разного цвета пуговицами. И если на первом и втором этапе еще есть смысл заморачиваться с самостоятельной реализацией, то на третьему уже не очень. Разве что если хочется. Это я про копеешные бесперебойники на 18650. Да в общем-то и сигналки есть у них готовые, но тут интереснее творческий процесс плюс возможность самому сделать именно так как хочется. Но никто же не будет сам модем паять.
а то, что пишут здесь этому отвечает? :) вот поэтому я написал вопрос за 30 сек.. :)
Тут его сложнее нужно прописывать, как - я пока не знаю.
Так не его нужно сложнее прописывать. а архитектуру программы, чтобы в ней не было торчаний в loop по часу. Ну, или, как костыль, в тело длинного куска периодические ресет дога вставлять.
тоесть каждый, весь цикл в программе должен проходить всегда не медленнее чем 8 сек? а то, что пишут здесь этому отвечает? :) вот поэтому я написал вопрос за 30 сек.. :)
простите, но 8 сек для микроконтроллера - это вечность. Особенно в программе сигнализации.
Сигнализация. у которой цикл занимает больше секунды - это сторож, который спит на работе. За 8 секунд злоумышленник легко откроет дверь, зайдет и закроет за собой - а вы даже не заметите.
Так что проблема-то не в собаке, а в кривом и не оптимальном коде. Даже если вы не станете встраивать в программу вотчдог - код все равно надо кардинально переписывать., так как сигналка, у которой цикл занимает несколько секунд и более - по сути бесполезна.
Так что проблема-то не в собаке, а в кривом и не оптимальном коде. Даже если вы не станете встраивать в программу вотчдог - код все равно надо кардинально переписывать., так как сигналка, у которой цикл занимает несколько секунд и более - по сути бесполезна.
так я о том же:)
но ведь реально должно быть иначе. ведь скетчи с претензией на приличные, поэтому и топлю за то, чтобы бы и вочдог был и скетч оптимизированый.
Интересно сколько времени занимает выполнение моего кода?)
вставьте миллис в начале и конце loop да и посмотрите. Только величина эта очень непостоянная. Как только в коде начинается работа с модемом, идут куча задержек и таймаутов. Думаю, при отправке и приеме СМС тормоза максимальны и счет может идти на десятки секунд.
Кто пробовал или освоил язык программирования FBD и программу FLProg
Вы думаете стоит тратить время на "FLProg", если его разработчики жирным красным шрифтом, буквально на знамени пишут абсолюную ахинею: "Чтобы программировать микроконтроллеры не обязательно знать языки программирования!"? так и хочется добавить, а "чтобы делать операции на сердце не обязательно знать анатомию, физиолгию и иметь навыки кардиохирурга".
Идиотизм там зашкаливает: "Они могут придумать, нарисовать, собрать, отладить и запустить сложнейшие схемы, но If, For, Case, Void и т.п. - это не для них". Похоже, авторы сами не сумели "if" освоить и не понимают, что если у человека есть голова, то уж как-нибудь эту хрень он поймёт, а если нет головы, то никакие "сложнейшие схемы" всё равно никогда не заработают.
Реализовал несколько проектов с помощью FLProg. В том числе сигналку на дачу. Работала с Sim 900? потом переделал на М590. Собственно сигналка, еще собирает данные с трех датчиков температуры, мониторит расход злектричества, дисплей hd44780. Полтора года, все отработало отлично. На данном форуме вы получите только негатив относительно данной программы. Тут может быть много слов про правильность кода и бла бла бла. Может правильно. Но проекты созданные в FLPog работают. Хотите научиться работать с FLProg, найдите профильный форум.
На данном форуме вы получите только негатив относительно данной программы. Тут может быть много слов про правильность кода и бла бла бла. Может правильно. Но проекты созданные в FLPog работают.
Конечно работают. Ведь и на трехколесном велосипеде можно кататься, и даже удобнее - не надо учиться держать равновесие. Только почему-то дети, когда становятся чуть постарше, уже хотят "на взрослом".
Любые подобные системы сильно ограничивают программиста в наборе железа и в написании программы. Без них программы получаются интереснее и эффективнее. Если конечно, уметь программировать. Это как панельное здание против частного дома. Частный дом может быть уродливым и неудобным, а может быть произведением искусства. А панель - она панель и есть.
Если "я не знаю С++" - это предмет гордости, то разговор бесполезен. Мы живем в разных мирах. Если хочется вообще ни во что не вникать - FLProg, наверно, выход. Хотя лично я не понимаю, в чем радость собирать систему. не понимая. как она работает... Ведь самое интересное - именно вникнуть.
ЗЫ Хотя, конечно, собирать свое в FLProg - это уже явно лучше, чем повторять чужие проекты по готовым схемам и прошивкам...
Набросал скетч, в нем оправка смс с несколькими строками.
1) ПАмять оперативная. Есть процедуры или фнкции которые вызывают или передают параметры в другие функции и процдуры, и так дале.
Если вы передаёте из одной функции/процедуры строку типа "Бла-бла-бла" в другую функцию/процедуру, то пока не закончится выполнение всех этих вложенных функций/процедур оперативная память выделенная под эти передаваемые переменные высвобождена не будет, и при передаче строки из функции/процедуры в функцию/процедуру для каждой строки "Бла-бла-бла" будет резервироваться объём памяти.
2) Увеличить буфер софтваресериал, если вы этого не сделали.
У меня смс с информацией о состоянии системы 135 символов, Скетч занимает 66%, и 36% динамической.
Завтра выложу оптимизированные скетчи с lcd1602 который с кнопками (задержка при постановке на охрану с него), и без шилда.
2) а до какого размера увеличить? я не был уверен, что проблема может быть в этом.
1) как после передачи данных "чистить память" ? может есть специальные приемы?
2) В своём проекте использую значение:
В файл SoftwareSerial.h (C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h) необходимо внести изменения
#define _SS_MAX_RX_BUFF 192
1) Вот пример, во время выполнения функций/процедур, эти параметры в памяти будут плодить дубликаты самих себя. То есть, пока не выполнится последняя процедура eepromeditsensor все пременные и строки передаваемые до вызова этой вложенной функции будух храниться в озу. Никаких приёмов нет, всё чистится само после выполнения вложенных функций или процедур.
И при компиляции вы видите что объём памяи озу занят лишь на 30 процентов, а при выплнении подобного кода память может сожраться в момент, и после этого начинаются глюки и неадекватное поведение программы.
И при компиляции вы видите что объём памяи озу занят лишь на 30 процентов, а при выплнении подобного кода память может сожраться в момент, и после этого начинаются глюки и неадекватное поведение программы.
ну да, есть и у меня подобное, но ведь по другому вроде никак?
Плохой пример, негодный - вас кто учил передавать комплексные типы в функцию по значению? У вас кучу ненужных, и даже вредных, с точки зрения расхода памяти, созданий копий объектов на стеке. Надо так:
Плохой пример, негодный - вас кто учил передавать комплексные типы в функцию по значению? У вас кучу ненужных, и даже вредных, с точки зрения расхода памяти, созданий копий объектов на стеке. Надо так:
Не видя всего кода пытаетесь искать учителей? Как вы думаете есть ли смысл передавать строку из одной функции в другую без дальнейшей модификации этой строки? А если следуя вашему примеру попробовать откомпилить этот код?
String val = "Bla-bla-bla";
void setup() {
Serial.begin(9600);
one ();
}
void loop() {
// put your main code here, to run repeatedly:
}
void one () {
val += "-one";
Serial.println(val);
two (const String & val);
}
void two (const String & val) {
val += "-two";
Serial.println(val);
three (const String & val);
}
void three (const String & val) {
val += "-three";
Serial.println(val);
}
Плохой пример, негодный - вас кто учил передавать комплексные типы в функцию по значению? У вас кучу ненужных, и даже вредных, с точки зрения расхода памяти, созданий копий объектов на стеке. Надо так:
Не видя всего кода пытаетесь искать учителей? Как вы думаете есть ли смысл передавать строку из одной функции в другую без дальнейшей модификации этой строки? А если следуя вашему примеру попробовать откомпилить этот код?
String val = "Bla-bla-bla";
void setup() {
Serial.begin(9600);
one ();
}
void loop() {
// put your main code here, to run repeatedly:
}
void one () {
val += "-one";
Serial.println(val);
two (const String & val);
}
void two (const String & val) {
val += "-two";
Serial.println(val);
three (const String & val);
}
void three (const String & val) {
val += "-three";
Serial.println(val);
}
Получится?
ЗЫ Что там с комплексными не так? :)
Хинт: модификатор const ставится там, где он нужен, и не ставится - где не нужен. В любом случае - передача по ссылке, а не по значению - хороший тон программирования, стоит это просто запомнить ;)
Если вам нужно модифицировать входящий по ссылке объект - не ставьте const, делов-то. Но если стоит const - даже ежу ясно, что этот объект изменять нельзя, и вызывающая сторона будет уверена, что после отработки вызванной функции на вызывающей стороне объект будет в том же состоянии, что и до вызова. И не будет тупого копирования всего содержимого объекта на стек, что здорово экономит ресурсы.
И да - у вас написана чушь: строка 16, строка 22 - так функции не вызываются :) :) :)
З.Ы. "Не видя всего кода пытаетесь искать учителей?" - это вообще о чём?
З.З.Ы. "Что там с комплексными не так? :)" - всё с ними так, как видите - просто лично вы не умеете их готовить, от слова "совсем".
И да - у вас написана чушь: строка 16, строка 22 - так функции не вызываются :) :) :)
Согласен, скопипастил и не обратил внимания, поправил всё откомпилилось.
DIYMan пишет:
Если вам нужно модифицировать входящий по ссылке объект - не ставьте const, делов-то. Но если стоит const - даже ежу ясно, что этот объект изменять нельзя, и вызывающая сторона будет уверена, что после отработки вызванной функции на вызывающей стороне объект будет в том же состоянии, что и до вызова.
String val = "Bla-bla-bla";
void setup() {
Serial.begin(9600);
one ();
}
void loop() {
// put your main code here, to run repeatedly:
}
void one () {
val += "-one";
Serial.println(val);
two (val);
}
void two (const String & val) {
val += "-two";
Serial.println(val);
three (val);
}
void three (const String & val) {
val += "-three";
Serial.println(val);
}
kvolk - и тут снова всплывает вопрос, почему вы скрываете свой код. Глядя на эти примеры - становится понятно.
Хинт2 - если вы хотите экономить память - не используйте String. Вообще. использование String в большом проекте на ардуино - можно считать маркером плохого программиста.
kvolk - и тут снова всплывает вопрос, почему вы скрываете свой код. Глядя на эти примеры - становится понятно.
Я уже объяснял почему. Этот пример кода был выдернут из февральской прошивки, проблема с памятью в то время остро не стояла, сейчас это выглядит немного иначе. Расставлю точки, многоуважаемый b707, я тут не пытаюсь доказать всем что мой код идеальный, а всё что вы тут делаете - это неправильно. Каждый кодит как может, в силу своих знаний и способностей.
Смотрите в чём дело, товарищ Short Circuit в этом посте сообщил, что у него есть проблема и попросил совета, так как я уже "имел дело" с этой проблемой в своём проекте, я сообщил причину и привёл пример из старого "говнокода", чтобы это было наглядно. Товарищ DIYMan в своём посте показал более эффективную реализацию. Что-то не увидел я вашей активновности в поиске причин и методов устранения этого бага, но личную оценку всему происходящему вы просто обязаны были оставить в свойм посте.
У вас есть своё мнение, но если, например, класс String придумали и он существует в среде программирования, то значит в некоторых случаях его использование вполне оправдано, и если для вас это "маркер плохого программиста" - чтож, пусть будет так.
Хинт: модификатор const ставится там, где он нужен, и не ставится - где не нужен. В любом случае - передача по ссылке, а не по значению - хороший тон программирования, стоит это просто запомнить ;)
Почему этот код занимает меньше (именно) флэш памяти
String val = "Bla-bla-bla";
void setup() {
Serial.begin(9600);
one ();
}
void loop() {
// put your main code here, to run repeatedly:
}
void one () {
val += "-one";
Serial.println(val);
two (val);
}
void two (const String & val) {
val += "-two";
Serial.println(val);
three (val);
}
void three (const String & val) {
val += "-three";
Serial.println(val);
}
//Скетч использует 3076 байт (10%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 232 байт (11%) динамической памяти, оставляя 1816 байт для локальных переменных. Максимум: 2048 байт.
чем этот
String val = "Bla-bla-bla";
void setup() {
Serial.begin(9600);
one ();
}
void loop() {
// put your main code here, to run repeatedly:
}
void one () {
val += "-one";
Serial.println(val);
two (val);
}
void two (String val) {
val += "-two";
Serial.println(val);
three (val);
}
void three (String val) {
val += "-three";
Serial.println(val);
}
//Скетч использует 3172 байт (10%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 232 байт (11%) динамической памяти, оставляя 1816 байт для локальных переменных. Максимум: 2048 байт.
и почему нет выигрыша в памяти ОЗУ?
DIYMan пишет:
Если вам нужно модифицировать входящий по ссылке объект - не ставьте const, делов-то.
Меняет и там и там, но это правильно, я так понимаю.:)
И что с "const и &" что без этого ОЗУ используется одинаково.
Господи, по сообщению компиляции делать выводы о занимаемой памяти на куче - это просто праздник какой-то! Вы вообще понимаете, как работает вызов функции, что происходит со стеком? Вам компилятор ничего не скажет об этом. Прекращайте демонстрировать свою безграмотность, плз.
И что с "const и &" что без этого ОЗУ используется одинаково.
Господи, по сообщению компиляции делать выводы о занимаемой памяти на куче - это просто праздник какой-то! Вы вообще понимаете, как работает вызов функции, что происходит со стеком? Вам компилятор ничего не скажет об этом. Прекращайте демонстрировать свою безграмотность, плз.
То есть если я "не понимаю" "как работает вызов функции, что происходит со стеком", то автоматически попадаю в группу безграмотных? :) Глубоко копаете, здесь большая часть сообщества не то что "не знает что происходит со стеком", а даже слова такого не знает.
А по существу вы можете прокоментировать "почему этот код занимает меньше (именно) флэш памяти?".
Потому что в первом случае объект тупо не копируется на стек, что я вам и пытаюсь донести. Меньше команд - менше размер скетча. Вопросы?
Разве это не касается только оперативной памяти?
Вопрос: МК как-то нужно уметь копировать объект на стек? Как он это делает? В хрустальный шар смотрит или таки выполняет набор команд, которые входят в состав прошивки и размещаются во флеше?
Вопрос: МК как-то нужно уметь копировать объект на стек? Как он это делает? В хрустальный шар смотрит или таки выполняет набор команд, которые входят в состав прошивки и размещаются во флеше?
Вот, курить можно, чтобы понять, чем отличаются вызовы функции с передачей объекта по значению и по ссылке:
int freeRam()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
int byReferenceCall(const String& val)
{
int ramFree = freeRam();
Serial.print(F("By reference call with string: "));
Serial.println(val);
Serial.print(F("Free RAM inside func: "));
Serial.println(ramFree);
return ramFree;
}
int byValueCall(String val)
{
int ramFree = freeRam();
Serial.print(F("By value call with string: "));
Serial.println(val);
Serial.print(F("Free RAM inside func: "));
Serial.println(ramFree);
return ramFree;
}
void setup()
{
Serial.begin(57600);
String test = F("1234567890");
int ramFree = freeRam();
Serial.print(F("Free ram here: "));
Serial.println(ramFree);
ramFree = freeRam();
int ramFreeTester = byReferenceCall(test);
Serial.print(F("By reference call result (freeRam, diff): "));
Serial.print(ramFreeTester);
Serial.print(F(", "));
Serial.println(ramFree - ramFreeTester);
ramFree = freeRam();
ramFreeTester = byValueCall(test);
Serial.print(F("By value call result (freeRam, diff): "));
Serial.print(ramFreeTester);
Serial.print(F(", "));
Serial.println(ramFree - ramFreeTester);
}
void loop()
{
// put your main code here, to run repeatedly:
}
У меня вывело (комплировал под мегу):
Free ram here: 7938
By reference call with string: 1234567890
Free RAM inside func: 7931
By reference call result (freeRam, diff): 7931, 7
By value call with string: 1234567890
Free RAM inside func: 7918
By value call result (freeRam, diff): 7918, 20
Как видно, передача по значению - насилует оперативку.
З.Ы. Для атомарных типов данных - без разницы, как передавать, по значению или по ссылке. Для сложных типов данных - разница есть, как видно на тестовом скетче. String - это класс, следовательно...
Например, если есть несколько функций, в которые по ходу выполнения программы передаётся строка, тогда для экономии флэш памяти можно прописать указатель на какую нибудь одну строку?
...
void a (const String & val, int x)
void b (const String & val, byte s)
void c (const String & val, uint8_t ds)
void d (const String & val, uint8_t ccc)
Например, если есть несколько функций, в которые по ходу выполнения программы передаётся строка, тогда для экономии флэш памяти можно прописать указатель на какую нибудь одну строку?
...
void a (const String & val, int x)
void b (const String & val, byte s)
void c (const String & val, uint8_t ds)
void d (const String & val, uint8_t ccc)
...
Именно так, только в приведённых объявлениях не указатель - а ссылка, указатель - это оператор *, т.е., передача по указателю - это:
void a (String* val, int x)
void b (String* val, byte s)
void c (String* val, uint8_t ds)
void d (String* val, uint8_t ccc)
При этом тоже передаваться будет только указатель, а не копироваться всё нутро объекта типа String.
Плюс ко всему - экономится не только флеш-память (из-за отказа от ненужных команд создания копии объекта на стеке), но ещё и оперативка не так насилуется.
З.Ы. Вы мой скетч-то запустите, и гляньте - есть разница в используемой оперативке или нет? И попробуйте ответить на простой вопрос: что будет, если свободной оперативки всего 15 байт осталось - какая функция из пары byValueCall/byReferenceCall отработает, а какая - сведёт ардуину с ума вследствие заезжания кучи в область данных?
При этом тоже передаваться будет только указатель, а не копироваться всё нутро объекта типа String.
Плюс ко всему - экономится не только флеш-память (из-за отказа от ненужных команд создания копии объекта на стеке), но ещё и оперативка не так насилуется.
З.Ы. Вы мой скетч-то запустите, и гляньте - есть разница в используемой оперативке или нет? И попробуйте ответить на простой вопрос: что будет, если свободной оперативки всего 15 байт осталось - какая функция отработает, а какая - сведёт ардуину с ума вследствие заезжания кучи в область данных?
А почему никто тоновый набор не использует для команд?
Это же надо команды все помнить. А так отправил сообщение "info" и вот тебе весь список команд и заодно текущее состояние.
System on
Sirena on
Ring off
SMS on
Pir on
Door on
Door2 on
Gas on
Temp 15*C
Ну, тем же макаром и тоновые команды захелпить. Зато есть тарифы халявые у большинства операторов и любимые номера. А СМС как правило денег стоят. И обратка платная.
У меня тариф безлимит, на сигналке без абонентской платы, и пакет смс подключен.
Ну на данный момент думаю как на GPRS перейти, не могу найти примеров использования MQTT с GPRS, и приложение на андроид.
Не взлетит скорее всего. Скорость для MQTT не подходящая и задержки. Тут лучше на ESP8266 делать имхо. И мозгов больше и вифи и уровни 3,3В. Приложения MQTT на Андроид использую несколько. Могу подсказать что знаю.
Мозгов больше, пинов меньше. UART там тот же самый и команды те же для GSM модуля. Ну плюс WEB-интерфейс еще не сложно прикрутить и mqtt руление. Либы есть, поддержка в Arduino IDE есть, поддержка практически всех датчиков тоже есть. Вот только 1 АЦП не радует.
Это что за циклы такие, больше 30 сек? Для вачдога 8 сек максимум и это никогда не было проблемой. Вставьте в loop вывод millis() в порт и посмотрите.
Kvolk, Вы из контекста слова выдергиваете или не поняли. Я говорю что сперва появляется спрос, потом кто-то реализует устройство, которое удовлетворяет потребностям, но дорогое, а потом китайцы это повторяют и делают максимально дешевым и с разного цвета пуговицами. И если на первом и втором этапе еще есть смысл заморачиваться с самостоятельной реализацией, то на третьему уже не очень. Разве что если хочется. Это я про копеешные бесперебойники на 18650. Да в общем-то и сигналки есть у них готовые, но тут интереснее творческий процесс плюс возможность самому сделать именно так как хочется. Но никто же не будет сам модем паять.
а то, что пишут здесь этому отвечает? :) вот поэтому я написал вопрос за 30 сек.. :)
Тут его сложнее нужно прописывать, как - я пока не знаю.
Так не его нужно сложнее прописывать. а архитектуру программы, чтобы в ней не было торчаний в loop по часу. Ну, или, как костыль, в тело длинного куска периодические ресет дога вставлять.
тоесть каждый, весь цикл в программе должен проходить всегда не медленнее чем 8 сек? а то, что пишут здесь этому отвечает? :) вот поэтому я написал вопрос за 30 сек.. :)
простите, но 8 сек для микроконтроллера - это вечность. Особенно в программе сигнализации.
Сигнализация. у которой цикл занимает больше секунды - это сторож, который спит на работе. За 8 секунд злоумышленник легко откроет дверь, зайдет и закроет за собой - а вы даже не заметите.
Так что проблема-то не в собаке, а в кривом и не оптимальном коде. Даже если вы не станете встраивать в программу вотчдог - код все равно надо кардинально переписывать., так как сигналка, у которой цикл занимает несколько секунд и более - по сути бесполезна.
Umka, хороший обзор! спасибо что поделился знаниями ;)
Стараюсь. Спасибо.
Так что проблема-то не в собаке, а в кривом и не оптимальном коде. Даже если вы не станете встраивать в программу вотчдог - код все равно надо кардинально переписывать., так как сигналка, у которой цикл занимает несколько секунд и более - по сути бесполезна.
но ведь реально должно быть иначе. ведь скетчи с претензией на приличные, поэтому и топлю за то, чтобы бы и вочдог был и скетч оптимизированый.
Интересно сколько времени занимает выполнение моего кода?)
вставьте миллис в начале и конце loop да и посмотрите. Только величина эта очень непостоянная. Как только в коде начинается работа с модемом, идут куча задержек и таймаутов. Думаю, при отправке и приеме СМС тормоза максимальны и счет может идти на десятки секунд.
Привет парни.
Кто пробовал или освоил язык программирования FBD и программу FLProg
Интересно там составить аналогичную программу сигнализации и скомпилировать код.
kkzim, пробовал, но до сигналки не дошел.
Кто пробовал или освоил язык программирования FBD и программу FLProg
Вы думаете стоит тратить время на "FLProg", если его разработчики жирным красным шрифтом, буквально на знамени пишут абсолюную ахинею: "Чтобы программировать микроконтроллеры не обязательно знать языки программирования!"? так и хочется добавить, а "чтобы делать операции на сердце не обязательно знать анатомию, физиолгию и иметь навыки кардиохирурга".
Идиотизм там зашкаливает: "Они могут придумать, нарисовать, собрать, отладить и запустить сложнейшие схемы, но If, For, Case, Void и т.п. - это не для них". Похоже, авторы сами не сумели "if" освоить и не понимают, что если у человека есть голова, то уж как-нибудь эту хрень он поймёт, а если нет головы, то никакие "сложнейшие схемы" всё равно никогда не заработают.
Реализовал несколько проектов с помощью FLProg. В том числе сигналку на дачу. Работала с Sim 900? потом переделал на М590. Собственно сигналка, еще собирает данные с трех датчиков температуры, мониторит расход злектричества, дисплей hd44780. Полтора года, все отработало отлично. На данном форуме вы получите только негатив относительно данной программы. Тут может быть много слов про правильность кода и бла бла бла. Может правильно. Но проекты созданные в FLPog работают. Хотите научиться работать с FLProg, найдите профильный форум.
Вот собственно начальный вариант сигнализации. Там все очень страшно с точки зрения монтажа. ))) Попросили снять видео, я снял. Сейчас все переделал.
https://youtu.be/mmt7hjMBfvE
Я не знаю С++ Все написанно в FLProge
неплохо сделано но ценник...6500....
http://gsmgps.narod.ru/example.htm
На данном форуме вы получите только негатив относительно данной программы. Тут может быть много слов про правильность кода и бла бла бла. Может правильно. Но проекты созданные в FLPog работают.
Конечно работают. Ведь и на трехколесном велосипеде можно кататься, и даже удобнее - не надо учиться держать равновесие. Только почему-то дети, когда становятся чуть постарше, уже хотят "на взрослом".
Любые подобные системы сильно ограничивают программиста в наборе железа и в написании программы. Без них программы получаются интереснее и эффективнее. Если конечно, уметь программировать. Это как панельное здание против частного дома. Частный дом может быть уродливым и неудобным, а может быть произведением искусства. А панель - она панель и есть.
Если "я не знаю С++" - это предмет гордости, то разговор бесполезен. Мы живем в разных мирах. Если хочется вообще ни во что не вникать - FLProg, наверно, выход. Хотя лично я не понимаю, в чем радость собирать систему. не понимая. как она работает... Ведь самое интересное - именно вникнуть.
ЗЫ Хотя, конечно, собирать свое в FLProg - это уже явно лучше, чем повторять чужие проекты по готовым схемам и прошивкам...
Набросал скетч, в нем оправка смс с несколькими строками.
Так вот ньюанс - после какого то события в смс отправляется только 1-2 последние строки.
в каком аправлении можно или нужно искать проблему?
после перезагрузки все нормально может работать и день и два и неделю.. а может и через час вылезти эта странность.
Может это особенность самой атмеги?
Набросал скетч, в нем оправка смс с несколькими строками.
1) ПАмять оперативная. Есть процедуры или фнкции которые вызывают или передают параметры в другие функции и процдуры, и так дале.
Если вы передаёте из одной функции/процедуры строку типа "Бла-бла-бла" в другую функцию/процедуру, то пока не закончится выполнение всех этих вложенных функций/процедур оперативная память выделенная под эти передаваемые переменные высвобождена не будет, и при передаче строки из функции/процедуры в функцию/процедуру для каждой строки "Бла-бла-бла" будет резервироваться объём памяти.
2) Увеличить буфер софтваресериал, если вы этого не сделали.
2) а до какого размера увеличить? я не был уверен, что проблема может быть в этом.
1) как после передачи данных "чистить память" ? может есть специальные приемы?
У меня смс с информацией о состоянии системы 135 символов, Скетч занимает 66%, и 36% динамической.
Завтра выложу оптимизированные скетчи с lcd1602 который с кнопками (задержка при постановке на охрану с него), и без шилда.
2) а до какого размера увеличить? я не был уверен, что проблема может быть в этом.
1) как после передачи данных "чистить память" ? может есть специальные приемы?
2) В своём проекте использую значение:
В файл SoftwareSerial.h (C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.h) необходимо внести изменения
#define _SS_MAX_RX_BUFF 192
1) Вот пример, во время выполнения функций/процедур, эти параметры в памяти будут плодить дубликаты самих себя. То есть, пока не выполнится последняя процедура eepromeditsensor все пременные и строки передаваемые до вызова этой вложенной функции будух храниться в озу. Никаких приёмов нет, всё чистится само после выполнения вложенных функций или процедур.
И при компиляции вы видите что объём памяи озу занят лишь на 30 процентов, а при выплнении подобного кода память может сожраться в момент, и после этого начинаются глюки и неадекватное поведение программы.
И при компиляции вы видите что объём памяи озу занят лишь на 30 процентов, а при выплнении подобного кода память может сожраться в момент, и после этого начинаются глюки и неадекватное поведение программы.
ну да, есть и у меня подобное, но ведь по другому вроде никак?
или можно подобный код оптимизировать?
1) Вот пример, во время выполнения функций/процедур,
Плохой пример, негодный - вас кто учил передавать комплексные типы в функцию по значению? У вас кучу ненужных, и даже вредных, с точки зрения расхода памяти, созданий копий объектов на стеке. Надо так:
и далее по списку.
оптимизировал до:
// max длинна сообщения в данный момент 135 символов.
работает пока без перебоев, сообщения нормально отправляются и принимаются, глюков не заметил.
Плохой пример, негодный - вас кто учил передавать комплексные типы в функцию по значению? У вас кучу ненужных, и даже вредных, с точки зрения расхода памяти, созданий копий объектов на стеке. Надо так:
и далее по списку.
Не видя всего кода пытаетесь искать учителей? Как вы думаете есть ли смысл передавать строку из одной функции в другую без дальнейшей модификации этой строки? А если следуя вашему примеру попробовать откомпилить этот код?
Получится?
ЗЫ Что там с комплексными не так? :)
Плохой пример, негодный - вас кто учил передавать комплексные типы в функцию по значению? У вас кучу ненужных, и даже вредных, с точки зрения расхода памяти, созданий копий объектов на стеке. Надо так:
и далее по списку.
Не видя всего кода пытаетесь искать учителей? Как вы думаете есть ли смысл передавать строку из одной функции в другую без дальнейшей модификации этой строки? А если следуя вашему примеру попробовать откомпилить этот код?
Получится?
ЗЫ Что там с комплексными не так? :)
Хинт: модификатор const ставится там, где он нужен, и не ставится - где не нужен. В любом случае - передача по ссылке, а не по значению - хороший тон программирования, стоит это просто запомнить ;)
Если вам нужно модифицировать входящий по ссылке объект - не ставьте const, делов-то. Но если стоит const - даже ежу ясно, что этот объект изменять нельзя, и вызывающая сторона будет уверена, что после отработки вызванной функции на вызывающей стороне объект будет в том же состоянии, что и до вызова. И не будет тупого копирования всего содержимого объекта на стек, что здорово экономит ресурсы.
И да - у вас написана чушь: строка 16, строка 22 - так функции не вызываются :) :) :)
З.Ы. "Не видя всего кода пытаетесь искать учителей?" - это вообще о чём?
З.З.Ы. "Что там с комплексными не так? :)" - всё с ними так, как видите - просто лично вы не умеете их готовить, от слова "совсем".
И да - у вас написана чушь: строка 16, строка 22 - так функции не вызываются :) :) :)
Согласен, скопипастил и не обратил внимания, поправил всё откомпилилось.
Если вам нужно модифицировать входящий по ссылке объект - не ставьте const, делов-то. Но если стоит const - даже ежу ясно, что этот объект изменять нельзя, и вызывающая сторона будет уверена, что после отработки вызванной функции на вызывающей стороне объект будет в том же состоянии, что и до вызова.
Консоль:
И что с "const и &" что без этого ОЗУ используется одинаково.
Не видя всего кода пытаетесь искать учителей?
kvolk - и тут снова всплывает вопрос, почему вы скрываете свой код. Глядя на эти примеры - становится понятно.
Хинт2 - если вы хотите экономить память - не используйте String. Вообще. использование String в большом проекте на ардуино - можно считать маркером плохого программиста.
kvolk - и тут снова всплывает вопрос, почему вы скрываете свой код. Глядя на эти примеры - становится понятно.
Я уже объяснял почему. Этот пример кода был выдернут из февральской прошивки, проблема с памятью в то время остро не стояла, сейчас это выглядит немного иначе. Расставлю точки, многоуважаемый b707, я тут не пытаюсь доказать всем что мой код идеальный, а всё что вы тут делаете - это неправильно. Каждый кодит как может, в силу своих знаний и способностей.
Смотрите в чём дело, товарищ Short Circuit в этом посте сообщил, что у него есть проблема и попросил совета, так как я уже "имел дело" с этой проблемой в своём проекте, я сообщил причину и привёл пример из старого "говнокода", чтобы это было наглядно. Товарищ DIYMan в своём посте показал более эффективную реализацию. Что-то не увидел я вашей активновности в поиске причин и методов устранения этого бага, но личную оценку всему происходящему вы просто обязаны были оставить в свойм посте.
У вас есть своё мнение, но если, например, класс String придумали и он существует в среде программирования, то значит в некоторых случаях его использование вполне оправдано, и если для вас это "маркер плохого программиста" - чтож, пусть будет так.
Хинт: модификатор const ставится там, где он нужен, и не ставится - где не нужен. В любом случае - передача по ссылке, а не по значению - хороший тон программирования, стоит это просто запомнить ;)
Почему этот код занимает меньше (именно) флэш памяти
чем этот
и почему нет выигрыша в памяти ОЗУ?
Если вам нужно модифицировать входящий по ссылке объект - не ставьте const, делов-то.
Меняет и там и там, но это правильно, я так понимаю.:)
И что с "const и &" что без этого ОЗУ используется одинаково.
Господи, по сообщению компиляции делать выводы о занимаемой памяти на куче - это просто праздник какой-то! Вы вообще понимаете, как работает вызов функции, что происходит со стеком? Вам компилятор ничего не скажет об этом. Прекращайте демонстрировать свою безграмотность, плз.
И что с "const и &" что без этого ОЗУ используется одинаково.
Господи, по сообщению компиляции делать выводы о занимаемой памяти на куче - это просто праздник какой-то! Вы вообще понимаете, как работает вызов функции, что происходит со стеком? Вам компилятор ничего не скажет об этом. Прекращайте демонстрировать свою безграмотность, плз.
То есть если я "не понимаю" "как работает вызов функции, что происходит со стеком", то автоматически попадаю в группу безграмотных? :) Глубоко копаете, здесь большая часть сообщества не то что "не знает что происходит со стеком", а даже слова такого не знает.
А по существу вы можете прокоментировать "почему этот код занимает меньше (именно) флэш памяти?".
То есть если я "не понимаю" "как работает вызов функции, что происходит со стеком", то автоматически попадаю в группу безграмотных?
Именно так. Это то же самое, что брать в руки скальпель без знания анатомии - хирург выйдет так себе. А уж если он этим ещё и бравирует - вообще бяда.
А по существу вы можете прокоментировать "почему этот код занимает меньше (именно) флэш памяти?".
Потому что в первом случае объект тупо не копируется на стек, что я вам и пытаюсь донести. Меньше команд - меньше размер скетча. Вопросы?
Потому что в первом случае объект тупо не копируется на стек, что я вам и пытаюсь донести. Меньше команд - менше размер скетча. Вопросы?
Разве это не касается только оперативной памяти?
вопрос - как чистить принудительно память или стек?
вопрос - как чистить принудительно память или стек?
Никак. http://robocraft.ru/blog/arduino/531.html
http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-pa...
Потому что в первом случае объект тупо не копируется на стек, что я вам и пытаюсь донести. Меньше команд - менше размер скетча. Вопросы?
Разве это не касается только оперативной памяти?
Вопрос: МК как-то нужно уметь копировать объект на стек? Как он это делает? В хрустальный шар смотрит или таки выполняет набор команд, которые входят в состав прошивки и размещаются во флеше?
Вопрос: МК как-то нужно уметь копировать объект на стек? Как он это делает? В хрустальный шар смотрит или таки выполняет набор команд, которые входят в состав прошивки и размещаются во флеше?
Да, спасибо, этот момент был мной упущен.
Да, спасибо, этот момент был мной упущен.
Вот, курить можно, чтобы понять, чем отличаются вызовы функции с передачей объекта по значению и по ссылке:
У меня вывело (комплировал под мегу):
Как видно, передача по значению - насилует оперативку.
З.Ы. Для атомарных типов данных - без разницы, как передавать, по значению или по ссылке. Для сложных типов данных - разница есть, как видно на тестовом скетче. String - это класс, следовательно...
Меньше команд - меньше размер скетча. Вопросы?
Например, если есть несколько функций, в которые по ходу выполнения программы передаётся строка, тогда для экономии флэш памяти можно прописать указатель на какую нибудь одну строку?
Меньше команд - меньше размер скетча. Вопросы?
Например, если есть несколько функций, в которые по ходу выполнения программы передаётся строка, тогда для экономии флэш памяти можно прописать указатель на какую нибудь одну строку?
Именно так, только в приведённых объявлениях не указатель - а ссылка, указатель - это оператор *, т.е., передача по указателю - это:
При этом тоже передаваться будет только указатель, а не копироваться всё нутро объекта типа String.
Плюс ко всему - экономится не только флеш-память (из-за отказа от ненужных команд создания копии объекта на стеке), но ещё и оперативка не так насилуется.
З.Ы. Вы мой скетч-то запустите, и гляньте - есть разница в используемой оперативке или нет? И попробуйте ответить на простой вопрос: что будет, если свободной оперативки всего 15 байт осталось - какая функция из пары byValueCall/byReferenceCall отработает, а какая - сведёт ардуину с ума вследствие заезжания кучи в область данных?
При этом тоже передаваться будет только указатель, а не копироваться всё нутро объекта типа String.
Плюс ко всему - экономится не только флеш-память (из-за отказа от ненужных команд создания копии объекта на стеке), но ещё и оперативка не так насилуется.
З.Ы. Вы мой скетч-то запустите, и гляньте - есть разница в используемой оперативке или нет? И попробуйте ответить на простой вопрос: что будет, если свободной оперативки всего 15 байт осталось - какая функция отработает, а какая - сведёт ардуину с ума вследствие заезжания кучи в область данных?
Спасибо.
А почему никто тоновый набор не использует для команд?
Я один раз по приколу импульсный использовал. Присобачил номеронабиратель от старого телефона для ввода цифрового пин-кода.
А почему никто тоновый набор не использует для команд?
Это же надо команды все помнить. А так отправил сообщение "info" и вот тебе весь список команд и заодно текущее состояние.
System on
Sirena on
Ring off
SMS on
Pir on
Door on
Door2 on
Gas on
Temp 15*C
Ну, тем же макаром и тоновые команды захелпить. Зато есть тарифы халявые у большинства операторов и любимые номера. А СМС как правило денег стоят. И обратка платная.
У меня тариф безлимит, на сигналке без абонентской платы, и пакет смс подключен.
Ну на данный момент думаю как на GPRS перейти, не могу найти примеров использования MQTT с GPRS, и приложение на андроид.
Не взлетит скорее всего. Скорость для MQTT не подходящая и задержки. Тут лучше на ESP8266 делать имхо. И мозгов больше и вифи и уровни 3,3В. Приложения MQTT на Андроид использую несколько. Могу подсказать что знаю.
Могу подсказать что знаю.
Буду признателен за примеры, очень интересно esp + gsm.
На почту pasha413@mail.ru
если не трудно поделитесь с нами тоже, интересно и за темой слежу....
Umka что вы имели в виду когда сказали что у esp8266 мозгов больше?
с gsm модулем 3.3в согласовать легко, а весь остальной обвес как согласовывать?
Мозгов больше, пинов меньше. UART там тот же самый и команды те же для GSM модуля. Ну плюс WEB-интерфейс еще не сложно прикрутить и mqtt руление. Либы есть, поддержка в Arduino IDE есть, поддержка практически всех датчиков тоже есть. Вот только 1 АЦП не радует.