Работа с eeprom
- Войдите на сайт для отправки комментариев
Подскажите, решил сделать GSM контроллер для автоматики (приводы ворот) на ардуине. Более менее всё понятно с основами и как настроить. цикл, который будет проверять наличие вызова, получать входящий номер и класть трубку, Дальше самое интересное, номер надо проверить по базе, если он в базе - автоматика срабатывает, если нет - то не срабатывает (вот тут не совсем понимаю как проверять номер по базе, хотелось бы пример увидеть). и более сложный для меня момент - запись новых номеров в базу. Суть - шлю смс, ардуина принимает смс, сверяет мой номер с эталонным (тут вроде всё довольно просто), из смс получает новый номер и добавляет его в "базу". Тут опять же непонятно как в эту базу добавить. При этом вся база должна быть в eeprom. С массивами работал в детстве - проблем не было, а с микроконтроллерами никогда. Подскажите как правильнее работатьс "базой" в этом случае. Возможно кто-то делал подобные программы - буду признателен и готов отблагодарить за готовые решения!
ещё возможно есть вариант с телефонной книгой, если она есть на GSM модуле, возможно получится записывать в неё и проверять в книге ли номер
Заполнение базы обязательно удалённое? Ворота открываются по звонку, или по СМС? Если по звонку, то можно обойтись без ардуино вообще, одним сотовым телефоном и простейшей автоматикой. А так надо смотреть в сторону sd-card модулей для ардуино, хранить базу номеров в eeprom не выйдет, в силу его мизерного размера.
решение найдено всё же. открытие по звонку (но с определённого списка номеров)
на деле всё оказалось проще, SIM900 поддерживает запись номеров на симку, оттуда же можно потом и считывать номер для проверки. так что думаю тему можно и закрывать, хотя если есть готовые решения - то будет интересно увидеть
>> хранить базу номеров в eeprom не выйдет, в силу его мизерного размера.
Ну почему же так категорично. Чип atmega328 имеет два килобайта еепром памяти. Если хранить базу номеров в виде 10 символов (байт) на номер, то 200 номеров легко поместятся. Нормальная база.
>> хранить базу номеров в eeprom не выйдет, в силу его мизерного размера.
Ну почему же так категорично. Чип atmega328 имеет два килобайта еепром памяти. Если хранить базу номеров в виде 10 символов (байт) на номер, то 200 номеров легко поместятся. Нормальная база.
угу, а можно еще SDcard прицепить на 32 гига.. можно даже историю болезни по владельцу каждого номера там хранить.. и обойдется дополнительно в 10 баксов
Мы же не знаем, что это за ворота, может они в палисадник с рассадой ведут, а может в закрытый коттеджный посёлок, или на МЕЧЕЛ.
Мы же не знаем, что это за ворота
Зато мы знаем, что человек берется сразу за "разработку устройства", не освоив азов-кирпичиков.
Работу с кнопками освоили (ловить момент нажатия, дребезг и т.п.). Помигать светодиодом без delay()? Включить его на фиксированное время (опять-таки без delay()).
Принять, не блокируя строку из Serial? Распарсить ее и выполнить комманду? Да вообще работу с c-шными строками-массивами уже умеем? Скопировать скажем строку... разбить на токены..., сравнить две строки... Как объявить массив строк, прикинуть сколько памяти занимает, как в PROGMEM все это поместить, как работать с ним.
Как строку сохранить EEPROM?
Это контроллер. Тут никаких "баз" - нету. Никаких "select id,phone from users " тут не будет. Все самому. Массивами, связанными списками, работой с указателями... а значит и браться за это нужно когда синтаксис, типы, указатели и массивы - вообще не требуют напряжения мозга.
Мы же не знаем, что это за ворота
Зато мы знаем, что человек берется сразу за "разработку устройства", не освоив азов-кирпичиков.
Работу с кнопками освоили (ловить момент нажатия, дребезг и т.п.). Помигать светодиодом без delay()? Включить его на фиксированное время (опять-таки без delay()).
Принять, не блокируя строку из Serial? Распарсить ее и выполнить комманду? Да вообще работу с c-шными строками-массивами уже умеем? Скопировать скажем строку... разбить на токены..., сравнить две строки... Как объявить массив строк, прикинуть сколько памяти занимает, как в PROGMEM все это поместить, как работать с ним.
Как строку сохранить EEPROM?
Это контроллер. Тут никаких "баз" - нету. Никаких "select id,phone from users " тут не будет. Все самому. Массивами, связанными списками, работой с указателями... а значит и браться за это нужно когда синтаксис, типы, указатели и массивы - вообще не требуют напряжения мозга.
Эммм... Солидный камушек прилетел, хорошо, что голова крепкая. База есть список номеров, хоть в текстовом файле на sd, никто про selectы ничего не писал, так как есть понимание, что лафы не будет. Меньше бессмысленной ярости, человече.
ну всё, пошло в другую степь, лучше закрыть тему.
гораздо проще работать с номернами на симке, чем с памятью
с ардуинами не работал ниразу, с Си тоже. раньше писал на всяких дельфях и вба
думаю и тут разберусь, всё-равно за меня никто не неапишет - поэтому буду разбираться. примеры работы с gsm нашёл, сравнение строк тоже - думаю разберусь, главное что алгоритм продуман уже
Меньше бессмысленной ярости, человече.
Причем тут ярость? Я просто перечислил с чем нужно разобраться что бы реализовать этот проект. И начинать нужно совсем не GSM шилда и EEPROM. Причем похоже человек понимает что "все равно никто за меня не напишет", так что перечень - думаю пригодится. Если я вижу что "начинают не с того", то почему об этом не сказать? Или нужно ждать пока начнут вопросы появлятся "как соеденить два скетча", потому что нет понимания как писать неблокирующие скетчи?
Проект целиком: ну тут же ничего "по теме" не скажешь, кроме "да это возможно". Поэтому я и раздробил на "элементы". И осваивать элементы нужно именно на "отдельных тестовых примерах". И начинать нужно, хоть процессор за ногу укуси, именно с кнопок и диодов, с уверенной работы в Serial. А уж когда диод будет загораться когда нужно к той же ноги подвесить привод ворот дело не самое сложное.
гораздо проще работать с номернами на симке, чем с памятью
Проблема в том, что "в симке" ардуина ничего не знает про номер. Что-бы сделать сравнение вам все равно нужно будет его вытащить в память из телефонной книги, получить входящий номер от шилда (опять-таки в оперативку) и уже тут сравнить. Так что обойти "разобраться со строками" - вряд ли получится.
И ничего в этом "старшного нет". Просто нужно именно эту цель себе поставить. GSM шилд временно отложить в сторону просто как "отвлекающий внимание". Потом - работа с ним будет "очевидна". И, на самом деле, после этого откуда номер вытаскивать. Из flash, eeprom или книги шилда - вам будет практически без разницы.
с ардуинами не работал ниразу, с Си тоже. раньше писал на всяких дельфях и вба
А вот этот опыт - пригодится. Особенно дельфи (там тоже указатели есть). Будет намного легче. По крайней мере что такой тип, циклы и т.п. - не прийдется разбираться. Основное отличие именно в строках, насколько я помню у Delphi string - это объект. Который сам знает "какой длины строка в нем хранится", у в сях, строка это "набор байтов заканчивающийся нулевым символом". Вот по этому "окончанию" и определяется длина строки всеми стандартными функциями работы со строками. Главное про это не забывать (и память под это выделить и т.п.)
Никто не сомневается что "думаю и тут разберусь", просто нужно определиться с чего именно нужно "начинать разбиратся". А начинать нужно с мигания диодом, с delay() и без. И т.п.
P.S. Я знаю что у ардуины есть объект String, похожий на дельфевский, только.... лучше привыкать именно к стандартным сишным строкам изначально.
[quote=leshak]
Проблема в том, что "в симке" ардуина ничего не знает про номер.
[quote]
Да ладно? при включении CLI модуль GSM будет выдавать строку с номером ! И ! именем в записной книжке.
Можно записывать все номера с именем User1,2,3...n и просто искать упоминание User в строке. Если упоминание есть - значит данный номер в записной книжке есть, значит открываем ворота. Если нет - то шлём лесом, для удобства можно добавить DTMF сигналы подтверждения.
Да ладно? при включении CLI модуль GSM будет выдавать строку с номером ! И ! именем в записной книжке.
Куда выдавать? В Serial.... да в виде какой-то строки. Которую нужно уметь принять (в память, обработать корретно конец строки и т.п.) и распарсить. И сравнить. Поэтому "попробовать это" можно и без модуля. Просто в Serial мониторе руцями посылая строку. На чем-то же нужно осваиваться с синтаксисом C. Вы что думаете редкость когда принимают и сравнивают строки вот так:
Да раз в неделю, две такая тема поднимается. И пытаются разбираться с этим на скетче с 10-ть сенсорами и 300-ми строчек кода и 30-тью ветвлениями. И дальше начинаются попытки угадать. Сделать char* ch и т.д (а читать, сравнивать так же).
Можно записывать все номера с именем User1,2,3...n и просто искать упоминание User в строке.
Ну, а сформировать строку для записи "UserNNN" и подставлять в цикл NNN - умеем? А "просто искать упоминание" - умеем? На Cи?
В итоге пришли к тому с чего я начал: уметь работать со строками, массивами строк, сравнивать и т.п.
Я же не говорю что "это что-то сверх-сверх". Но разобраться-то с этим нужно?
Вот тогда уже и будет "просто искать упоминание".
ну получу ардуину - буду разбираться потихоньку
ну получу ардуину - буду разбираться потихоньку
Ну, а я про что? Про это же... взять ардуину, помигать диодом... Будете скорее всего мотор через какой-нибудь реле-шилд включать... а чем отличается подобные шилды, с точки зрения ардуины от светодиода? А ничем. Просто светик проще подключить и места на столе меньше занимает.
научиться с помощью millis() интервалы задавать (вам же нужно будет открывать его на какое-тов время, при этом если вдруг от шилда что-то пришло - не прошляпить. потоков - тут у нас нет, так что тупой delay() - не покатит). Значит начать нужно с "мигаем без delay()".....
Потом, скорее всего потребуется концевики ловить. Крайние положения ворот. А что такое концевик, с точки зрения ардуины? Да та же кнопка. Поэтому и написал "работу с кнопками освоили (ловить момент нажатия, дребезг и т.п.)?"
Вообщем в итоге вы либо возмете готовое "кто-то написал, работает как магия", либо все-таки освоите ВСЕ перечисленное в #7. Где я на вас "напал в бессмысленной ярости". Но почему-то перечислил только "то что нужно для вашего проекта". Ни акселерометры, ни GPS-сы, ни разбирательств с таймерами и прямым воводом через порты - я вам, почему-то, в список не включал.
На ворота надо будет ещё датчик блокирования вешать. А то заглохнет ктонить, или дурак какой перегородит, а они как начнут закрываться, или совсем наоборот!
А чего сложного в подавителе дребезга кнопки? Проблема имеет как аппаратное (в простейшем случае интегрирующая цепь), так и программное решение.
на воротах автоматика стоит. нужно только подать импульс на контроллер чтобы они открылись и закрылся после проезда
А чего сложного в подавителе дребезга кнопки? Проблема имеет как аппаратное (в простейшем случае интегрирующая цепь), так и программное решение.
Ничего сложного. На то это и азы. Которые нужно освоить. Тем не менее, постоянно возникают вопросы "как зажечь светик на определенное время, не останавливая скетч" и просят примеры. Хотя я вообще не понимаю какие знания и примеры нужны для этого. imho достаточно знать про существование функции millis() (а если не знаешь, то в справочнике найти ее не представляет проблем) и здравого смысла. IMHO все игры со временем требует только здравого смысла и уметь последовательно рассуждать. Но, тем не менее, постоянно с этим проблемы люди имеют...