Работа с eeprom

savaxt
Offline
Зарегистрирован: 20.07.2014

Подскажите, решил сделать GSM контроллер для автоматики (приводы ворот) на ардуине. Более менее всё понятно с основами и как настроить. цикл, который будет проверять наличие вызова, получать входящий номер и класть трубку, Дальше самое интересное, номер надо проверить по базе, если он в базе - автоматика срабатывает, если нет - то не срабатывает (вот тут не совсем понимаю как проверять номер по базе, хотелось бы пример увидеть). и более сложный для меня момент - запись новых номеров в базу. Суть - шлю смс, ардуина принимает смс, сверяет мой номер с эталонным (тут вроде всё довольно просто), из смс получает новый номер и добавляет его в "базу". Тут опять же непонятно как в эту базу добавить. При этом вся база должна быть в eeprom. С массивами работал в детстве - проблем не было, а с микроконтроллерами никогда. Подскажите как правильнее работатьс "базой" в этом случае. Возможно кто-то делал подобные программы - буду признателен и готов отблагодарить за готовые решения!

savaxt
Offline
Зарегистрирован: 20.07.2014

ещё возможно есть вариант с телефонной книгой, если она есть на GSM модуле, возможно получится записывать в неё и проверять в книге ли номер

Leshiy
Offline
Зарегистрирован: 19.07.2014

Заполнение базы обязательно удалённое? Ворота открываются по звонку, или по СМС? Если по звонку, то можно обойтись без ардуино вообще, одним сотовым телефоном и простейшей автоматикой. А так надо смотреть в сторону sd-card модулей для ардуино, хранить базу номеров в eeprom не выйдет, в силу его мизерного размера.

savaxt
Offline
Зарегистрирован: 20.07.2014

решение найдено всё же. открытие по звонку (но с определённого списка номеров)

на деле всё оказалось проще, SIM900 поддерживает запись номеров на симку, оттуда же можно потом и считывать номер для проверки. так что думаю тему можно и закрывать, хотя если есть готовые решения  - то будет интересно увидеть

toc
Offline
Зарегистрирован: 09.02.2013

>> хранить базу номеров в eeprom не выйдет, в силу его мизерного размера.

Ну почему же так категорично. Чип atmega328 имеет два килобайта еепром памяти. Если хранить базу номеров в виде 10 символов (байт) на номер, то 200 номеров легко поместятся. Нормальная база. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

toc пишет:

>> хранить базу номеров в eeprom не выйдет, в силу его мизерного размера.

Ну почему же так категорично. Чип atmega328 имеет два килобайта еепром памяти. Если хранить базу номеров в виде 10 символов (байт) на номер, то 200 номеров легко поместятся. Нормальная база. 

угу, а можно еще SDcard прицепить на 32 гига.. можно даже историю болезни по владельцу каждого номера там хранить.. и обойдется дополнительно в 10 баксов

Leshiy
Offline
Зарегистрирован: 19.07.2014

Мы же не знаем, что это за ворота, может они в палисадник с рассадой ведут, а может в закрытый коттеджный посёлок, или на МЕЧЕЛ.

leshak
Offline
Зарегистрирован: 29.09.2011

Leshiy пишет:

Мы же не знаем, что это за ворота

Зато мы знаем, что человек берется сразу за "разработку устройства", не освоив азов-кирпичиков.
Работу с кнопками освоили (ловить момент нажатия, дребезг и т.п.). Помигать светодиодом без delay()? Включить его на фиксированное время (опять-таки без delay()).
Принять, не блокируя строку из Serial? Распарсить ее и выполнить комманду?  Да вообще работу с c-шными строками-массивами уже умеем? Скопировать скажем строку... разбить на токены..., сравнить две строки... Как объявить массив строк, прикинуть сколько памяти занимает, как в PROGMEM все это поместить, как работать с ним.
Как строку сохранить EEPROM?

Это контроллер. Тут никаких "баз" - нету. Никаких "select id,phone from users " тут  не будет. Все самому. Массивами, связанными списками, работой с указателями... а значит и браться за это нужно когда синтаксис, типы, указатели и массивы - вообще не требуют напряжения мозга.

Leshiy
Offline
Зарегистрирован: 19.07.2014

leshak пишет:

Leshiy пишет:

Мы же не знаем, что это за ворота

Зато мы знаем, что человек берется сразу за "разработку устройства", не освоив азов-кирпичиков.
Работу с кнопками освоили (ловить момент нажатия, дребезг и т.п.). Помигать светодиодом без delay()? Включить его на фиксированное время (опять-таки без delay()).
Принять, не блокируя строку из Serial? Распарсить ее и выполнить комманду?  Да вообще работу с c-шными строками-массивами уже умеем? Скопировать скажем строку... разбить на токены..., сравнить две строки... Как объявить массив строк, прикинуть сколько памяти занимает, как в PROGMEM все это поместить, как работать с ним.
Как строку сохранить EEPROM?

Это контроллер. Тут никаких "баз" - нету. Никаких "select id,phone from users " тут  не будет. Все самому. Массивами, связанными списками, работой с указателями... а значит и браться за это нужно когда синтаксис, типы, указатели и массивы - вообще не требуют напряжения мозга.

Эммм... Солидный камушек прилетел, хорошо, что голова крепкая. База есть список номеров, хоть в текстовом файле на sd, никто про selectы ничего не писал, так как есть понимание, что лафы не будет. Меньше бессмысленной ярости, человече.

savaxt
Offline
Зарегистрирован: 20.07.2014

ну всё, пошло в другую степь, лучше закрыть тему.

гораздо проще работать с номернами на симке, чем с памятью

с ардуинами не работал ниразу, с Си тоже. раньше писал  на всяких дельфях и вба

думаю и тут разберусь, всё-равно за меня никто не неапишет - поэтому буду разбираться. примеры работы с gsm нашёл, сравнение строк тоже - думаю разберусь, главное что алгоритм продуман уже

leshak
Offline
Зарегистрирован: 29.09.2011

Leshiy пишет:

 Меньше бессмысленной ярости, человече.

Причем тут ярость? Я просто перечислил с чем нужно разобраться что бы реализовать этот проект. И начинать нужно совсем не GSM шилда и EEPROM. Причем похоже человек понимает что "все равно никто за меня не напишет", так что перечень - думаю пригодится. Если я вижу что "начинают не с того", то почему об этом не сказать? Или нужно ждать пока начнут вопросы появлятся "как соеденить два скетча", потому что нет понимания как писать неблокирующие скетчи?  
Проект целиком: ну тут же ничего "по теме" не скажешь, кроме "да это возможно". Поэтому я и раздробил на "элементы". И осваивать элементы нужно именно на "отдельных тестовых примерах". И начинать нужно, хоть процессор за ногу укуси, именно с кнопок и диодов, с уверенной работы в Serial. А уж когда диод будет загораться когда нужно к той же ноги подвесить привод ворот дело не самое сложное.

savaxt пишет:

гораздо проще работать с номернами на симке, чем с памятью

Проблема в том, что "в симке" ардуина ничего не знает про номер. Что-бы сделать сравнение вам все равно нужно будет его вытащить в память из телефонной книги, получить входящий номер от шилда (опять-таки в оперативку) и уже тут сравнить. Так что обойти "разобраться со строками" - вряд ли получится. 
И ничего в этом "старшного нет". Просто нужно именно эту цель себе поставить. GSM шилд временно отложить в сторону просто как "отвлекающий внимание". Потом - работа с ним будет "очевидна". И, на самом деле, после этого откуда номер вытаскивать. Из flash, eeprom или книги шилда - вам будет практически без разницы.

savaxt пишет:

с ардуинами не работал ниразу, с Си тоже. раньше писал  на всяких дельфях и вба

А вот этот опыт - пригодится. Особенно дельфи (там тоже указатели есть). Будет намного легче.  По крайней мере что такой тип, циклы и т.п. - не прийдется разбираться. Основное отличие именно в строках, насколько я помню у Delphi string - это объект. Который сам знает "какой длины строка в нем хранится", у в сях, строка это "набор байтов заканчивающийся нулевым символом". Вот по этому "окончанию" и определяется длина строки всеми стандартными функциями работы со строками. Главное про это не забывать (и память под это выделить и т.п.)

Никто не сомневается что "думаю и тут разберусь", просто нужно определиться с чего именно нужно "начинать разбиратся". А начинать нужно  с мигания диодом, с delay() и без. И т.п.

P.S. Я знаю что у ардуины есть объект String, похожий на дельфевский, только.... лучше привыкать именно к стандартным сишным строкам изначально.

savaxt
Offline
Зарегистрирован: 20.07.2014

[quote=leshak]

Проблема в том, что "в симке" ардуина ничего не знает про номер.

[quote]

Да ладно? при включении CLI модуль GSM будет выдавать строку с номером ! И ! именем в записной книжке.

Можно записывать все номера с именем User1,2,3...n и просто искать упоминание User в строке. Если упоминание есть - значит данный номер в записной книжке есть, значит открываем ворота. Если нет - то шлём лесом, для удобства можно добавить DTMF сигналы подтверждения.

leshak
Offline
Зарегистрирован: 29.09.2011

savaxt]</p> <p>[quote=leshak]</p> <p>Проблема в том, что "в симке" ардуина ничего не знает про номер.</p> <p>[quote пишет:

Да ладно? при включении CLI модуль GSM будет выдавать строку с номером ! И ! именем в записной книжке.

Куда выдавать? В Serial.... да в виде какой-то строки. Которую нужно уметь принять (в память, обработать корретно конец строки и т.п.) и распарсить. И сравнить.  Поэтому "попробовать это" можно и без модуля. Просто в Serial мониторе руцями посылая строку. На чем-то же нужно осваиваться с синтаксисом C. Вы что думаете редкость когда принимают и сравнивают строки вот так:

char ch=Serial.read();
if(ch=="mystring"){
  что-то делаем.
}

Да раз в неделю, две такая тема поднимается. И пытаются разбираться с этим на скетче с 10-ть сенсорами и 300-ми строчек кода и 30-тью ветвлениями. И дальше начинаются попытки угадать. Сделать char* ch и т.д (а читать, сравнивать так же).

savaxt пишет:

Можно записывать все номера с именем User1,2,3...n и просто искать упоминание User в строке.

Ну, а сформировать строку для записи "UserNNN" и подставлять в цикл NNN - умеем? А "просто искать упоминание" - умеем? На Cи? 

В итоге пришли к тому с чего я начал: уметь работать со строками, массивами строк, сравнивать и т.п.
Я же не говорю что "это что-то сверх-сверх". Но разобраться-то с этим нужно?
Вот тогда уже и будет "просто искать упоминание". 

 

savaxt
Offline
Зарегистрирован: 20.07.2014

ну получу ардуину - буду разбираться потихоньку

leshak
Offline
Зарегистрирован: 29.09.2011

savaxt пишет:

ну получу ардуину - буду разбираться потихоньку

Ну, а я про что? Про это же... взять ардуину, помигать диодом...  Будете скорее всего мотор через какой-нибудь реле-шилд включать... а чем отличается подобные шилды, с точки зрения ардуины от светодиода?  А ничем. Просто светик проще подключить и места на столе меньше занимает.
научиться с помощью millis() интервалы задавать (вам же нужно будет открывать его на какое-тов время, при этом если вдруг от шилда что-то пришло - не прошляпить. потоков - тут у нас нет, так что тупой delay() - не покатит). Значит начать нужно с "мигаем без delay()".....
Потом, скорее всего потребуется концевики ловить. Крайние положения ворот. А что такое концевик, с точки зрения ардуины?  Да та же кнопка. Поэтому и написал "работу с кнопками освоили (ловить момент нажатия, дребезг и т.п.)?"
Вообщем в итоге вы либо возмете готовое "кто-то написал, работает как магия", либо все-таки освоите ВСЕ перечисленное в #7. Где я на вас "напал в бессмысленной ярости". Но почему-то перечислил только "то что нужно для вашего проекта". Ни акселерометры, ни GPS-сы, ни разбирательств с таймерами и прямым воводом через порты - я вам, почему-то, в список не включал.

 

Leshiy
Offline
Зарегистрирован: 19.07.2014

На ворота надо будет ещё датчик блокирования вешать. А то заглохнет ктонить, или дурак какой перегородит, а они как начнут закрываться, или совсем наоборот!

А чего сложного в подавителе дребезга кнопки? Проблема имеет как аппаратное (в простейшем случае интегрирующая цепь), так и программное решение.

savaxt
Offline
Зарегистрирован: 20.07.2014

на воротах автоматика стоит. нужно только подать импульс на контроллер чтобы они открылись и закрылся после проезда

leshak
Offline
Зарегистрирован: 29.09.2011

Leshiy пишет:

А чего сложного в подавителе дребезга кнопки? Проблема имеет как аппаратное (в простейшем случае интегрирующая цепь), так и программное решение.

Ничего сложного. На то это и азы. Которые нужно освоить. Тем не менее, постоянно возникают вопросы "как зажечь светик на определенное время, не останавливая скетч" и просят примеры. Хотя я вообще не понимаю какие знания и примеры нужны для этого. imho достаточно знать про существование функции millis() (а если не знаешь, то в справочнике найти ее не представляет проблем) и здравого смысла. IMHO все игры со временем требует только здравого смысла и уметь последовательно рассуждать. Но, тем не менее, постоянно с этим проблемы люди имеют...