Может это и есть ответ? Даже не знаю....... Ну я для себя решил, что декодер dtmf быстрее, дешевле, и.... уже давно работает ( и мк свободен. для других задач)
Как свободен? Физически 4 порта заняты + обвязка нужна, про обработку молчу. В то время как все это дело можно сделать по uart.
Я не смотрю в сторону дудки, благо скетчей для любых задач полно. Хочу сделать на родном барсике. Модули sim80Х/900 имеют вшитые dtmf recognition и будет совсем не солидно использовать dtmf-декодер для извлечения кодов dtmf из линейного выхода. Ну правда, не серьезно получается. Вот, имеется dtmfout, почему ж dtmfin (а оно, наверно, так называлось бы) нет Может в новых релизах будет
Расшифровать dtmf код на порядок сложней, чем сгенерить. Если есть коды на других языках, так можно и от туда содрать, в чём проблема?. Но я таких не встречал, хотя особо и не искал. Обвязка - это да, устанешь паять!(сарказм). Про код вообще молчу, пару строчек проверки порта. DTMF декодер, кстати, имеет выход с открытым коллектором, так что их можно использовать ещё куда нибудь. Я, например, параллельно подключил пульт на 443, с декодером. Так у меня работают ворота в гараже, и с пульта, и с телефона. Насчёт серьёзности - так для себя давно решил, что время моё дороже, чем какая-то микросхема. Поставил и забыл. В одном камне держать кучу кодов - не моё. Потом разбирайся , что где и как. К примеру говорилку себе сделал отдельно. Работает сама по себе, а процессор даёт команды. Хотя мощности позволяют сделать всё в одном камне.
_________________ Все делают ошибки, только мудрецы - новые, а дураки - старые.
Может есть у кого опыт или задайте направление, где копать.
Нужно освоить Фурье преобразование. Готовых примеров на бейсике не будет, есть только общие описания алгоритма. При свободном времени буду разбираться. Проекты с грандиозной аналоговой обвеской и фазосдвигающими цепочками мне не интересны.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
https://static.chipdip.ru/lib/233/DOC000233963.pdf Ага, нате вот испугайтесь! Прям аж интересно, как надумаете, выложите, пожалуйста, схему и прошивку (можно без исходника), что б работала. Я имею ввиду, в живую, телефон подключил к мк и заработало. А я посчитаю, где обвеса больше будет!
_________________ Все делают ошибки, только мудрецы - новые, а дураки - старые.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Мрр.. Приветствую, коты Скажите, пожалуйста: как декодировать dtmf сигналы? (вариант с внешним декодером не предлагать) Весь интернет перелопатил - ничего не нашел Хочу GSM модуль к тини2313 по UART прикрутить и управлять нагрузкой удаленно. С обработкой СМС разобрался, а вот про распознавание DTMF в барсике нет никакой инфы. Может есть у кого опыт или задайте направление, где копать. Буду признателен
в модуле sim900d есть встроенный декодер. если надо такая прошивка для данного модуля - пишите. Выпускается несколько лет, работает без сбоев.
в модуле sim900d есть встроенный декодер. если надо такая прошивка для данного модуля - пишите. Выпускается несколько лет, работает без сбоев.
Приветствую! Да. Я в курсе и он пашет очень хорошо! Он же есть и на сим800. Главная проблема на сейчас - прикрутить обработку dtmf к барсику без сторонних декодеров и обвязок. На текущий момент только 1 вариант пришел в голову - разделить функционал (программно и аппаратно) на 2 части: 1) обрабатывать дтмф и смс на дудке (код Arduino IDE); 2) все остальное на барсике + дописать общение между первым и вторым частями через uart или подергиванием ног. Можно, конечно, все написать в Arduino IDE, - но переписывать весь проект и вспоминать вникать в синтаксис Arduino IDE (начинал с компилятора C) не очень хочется.
вы меня не поняли получив DTMF модуль выдаёт в порт данные о коде. Символом. я всё пишу на Баском, никаких костылей не использую.
О! Значит все-таки это возможно Буду признателен, если выложите весь код целиком. Хотел бы поковырять. Кстати, эти модули поддерживают воспроизведение amr файлов в сторону абонента и/или локально. Буду использовать в голосовом меню. Уже проверил, все отлично пашет! Вот: AT+CPAMR=<fileName>,<audioLocationStatus> н., воспроизвести файл 001 из памяти модуля будет выглядеть так: AT+CPAMR="001.amr", Х или так так: AT+CREC=4,"C:\User\9.amr",Х,95 Х принимает значение 0 – воспроизведение происходит в линию + локально; 1 – воспроизведение происходит только локально. а 95 - это уровень громкости.
Dim Simvol$ As String * 1 , Tstr$ As String * 19 Dim Number$ As String * 19 Dim Otvet$ As String * 162 'сообщение, которое модуль будет отправлять Dim Sms$ As String * 162 ' Входящее SMS сообщение Dim Komanda$ As String * 6
Config Serialin = Buffered , Size = 161 ' Буфер для принятых по UART символов Enable Interrupts ' Чтобы буфер работал!
'---------- Do Toggle Led Reset Watchdog
' --- Опрос модема --- Gosub Getline ' смотрим что пришло от модема в буфер - Sms$ If Sms$ <> "" Then ' получили какое-то сообщение Led = 1 Print #1 , Sms$ Tstr$ = Left(sms$ , 4) ' выделим первые 4 символов Print #1 , Tstr$
If Tstr$ = "+CMT" Then ' Нам SMS Print #1 , "Получено SMS: " ; Sms$ ' +CMT: "+79129871234","Boss1","14/03/31,12:43:29+16" Sms$ = Mid(sms$ , 8 , 19) ' достаем номер отправителя SMS Gosub Vydelim_nomer_iz_stroki ' Выделение # из строки в ковычках и с "+" вначале в переменную Number$ Print #1 , "Отправитель: " ; Number$ If Number$ = Phone_boss$ Or Number$ = Phone_user$ Then ' если номер из достоверных Gosub Opros_sms ' Расшифруем полученное и выполним, если достоверно Gosub Delete_sms ' Удалим СМС Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 End If ' если номер звонящего = Владелец устройства End If ' If Tstr$ = "+CMT: "
If Tstr$ = "+CLI" Then ' Нам звонят Reset Watchdog Print #1 , "Нам позвонили " ; Sms$ ' нам звонят Входящий звонок +CLIP: "+793********",145,"",,"",0 Sms$ = Mid(sms$ , 9 , 19) ' достаем номер отправителя SMS Gosub Vydelim_nomer_iz_stroki ' Выделение # из строки в ковычках и с "+" вначале в переменную Number$ Print #1 , "Звонит " ; Number$ Temp_w = 0 : Temp = 0 : Sms$ = "" : Komanda$ = "" If Number$ = Phone_boss$ Then Gosub Nam_pozvonili ' если номер = Владелец устройства Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 End If ' If Tstr$ = "+CLI" Then
Incr Temp_w ' Считаем время сеанса связи If Temp_w > 1150 Then ' Превышен лимит времени - 2 минуты Print #1 , "Превышен лимит времени!" Temp2 = 0 ' время вышло Goto Nam_pozvonili_end End If
If Sms$ = "RING" Then ' Звонят Incr Temp ' считаем кол-в гудков 'If Temp = 1 Then ' Сколько гудков не ложили трубку Print "ATA" ' ответить на звонок Gosub Waitms_750 ' Пауза обязательна!!! Print #1 , "Связь установлена" Print "AT+VTS=" ; Chr(34) ; "C" ; Chr(34) ' звуковой сигнал звонящему в линию Gosub Waitms_750 ' Пауза обязательна!!! 'End If ' If Temp = 1 End If ' If Sms$ = "RING"
If Sms$ = "NO CARRIER" Or Sms$ = "NO DIALTONE" Then ' положили трубку / пропала связь - разорвать Print #1 , "Закончили вызов" Nam_pozvonili_end: Print "ATH0" ' положить трубку Return ' выходим End If ' If Sms$ = "NO CARRIER"
If Komanda$ = "**" Then ' Сброс флагов тревоги Peredal_net220 = 0 Goto Nam_pozvonili_konec End If
If Komanda$ = "##" Then ' Полный перезапуск устройства!! Print "AT+VTS=" ; Chr(34) ; "*" ; Chr(34) ' зв.сигнал звонящему Gosub Waitms_750 Print "ATH0" ' положить трубку Goto Reset_device ' Полный перезапуск устройства!! Goto Nam_pozvonili_konec End If
If Komanda$ = "1" Then ' меняем Чувствительность микрофона, режим 1 Print "AT+CMIC=0,2" ' минимальная Goto Nam_pozvonili_konec End If If Komanda$ = "2" Then ' меняем Чувствительность микрофона, режим 2 Print "AT+CMIC=0,4" Goto Nam_pozvonili_konec End If If Komanda$ = "3" Then ' меняем Чувствительность микрофона, режим 3 Print "AT+CMIC=0,7" Goto Nam_pozvonili_konec End If
If Komanda$ = "*1" Then Rele1 = 1 ' Включить реле 1 Goto Nam_pozvonili_konec End If If Komanda$ = "#1" Then Rele1 = 0 ' Отключить реле 1 Goto Nam_pozvonili_konec End If
End If ' If Tstr$ = "+DTMF:"
Gosub Getline ' смотрим что пришло от модема в буфер
Goto Nam_pozvonili
Nam_pozvonili_konec: Gosub Waitms_100 Print "AT+VTS=" ; Chr(34) ; "C" ; Chr(34) ' звуковой сигнал звонящему в линию 'Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 Gosub Waitms_100 Komanda$ = "" ' обязательно вычистить переменную Sms$ = "" ' обязательно вычистить переменную Temp_w = 0 ' Сбросим счетчик - Увеличим время до отключения связи Goto Nam_pozvonili
'================ Flushbuf: ' очистка буфера Gosub Waitms_100 Do B = Inkey() 'забираем все из буфера Loop Until B = 0 Return
'================ Getline: ' подпрограмма для разбора сообщения модуля Sms$ = "" Gosub Waitms_100 Do B = Inkey() ' берем символ из буфера в формате ASCII Select Case B Case 0 : Exit Do ' если в буфере нет символа - выход! Case 13 ' возврат каретки (Enter) 'возврат каретки (Enter) Case 10 : If Sms$ <> "" Then Exit Do 'конец строки, выходит из подпрограммы Case Else : If B > 31 Then Sms$ = Sms$ + Chr(b) ' составляем строку End Select Loop Return
'############################################################################################## Init_modem: ' Инициализация модема, чтение номеров с SIM карты Print #1 , "Запуск модема..."
Pwkey_gsm = 1 ' питание модема For Temp = 0 To 29 ' 1.5 сек Toggle Led Gosub Waitms_50 Reset Watchdog Next Pwkey_gsm = 0 ' питание модема
For Temp = 0 To 139 ' ждем 14 сек пока модем зарегистрируется.... Toggle Led ' Св.диод Gosub Waitms_100 Reset Watchdog Next
' Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 ' Print "AT+GSV" : Gosub Waitms_750 ' Запрос модели и версии прошивки Выдаёт 3 строки ' Gosub Getline : Print #1 , Sms$ ' ответ модема SIMCOM_Ltd ' Gosub Getline : Print #1 , Sms$ ' ответ модема SIMCOM_SIM900D ' Gosub Getline : Print #1 , Sms$ ' ответ модема Revision: 1137B03SIM900D64_ST_ENHANCE ' Gosub Getline : Print #1 , Sms$ ' ответ модема ok
Counter_c = 40 ' 30 секунд ожидания регистрации
Do Decr Counter_c If Counter_c = 0 Then Goto Init_modem ' Перезапуск модема Toggle Led Reset Watchdog Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 Print "AT+COPS?" : Gosub Waitms_750 ' выдаст имя оператора связи Gosub Getline ' : Print #1 , Sms$ ; "."; ' ответ модема Loop Until Len(sms$) > 15 ' ждём когда модуль даст имя оператора, а не пустоту
Print "AT+CPBS=" ; Chr(34) ; "SM" ; Chr(34) : Gosub Waitms_100 ' Выбрать Как Основную Память Сим -карту
Print "AT+CNMI=1,2,2,1,0" : Gosub Waitms_100 ' Включаем оповещение о новых SMS '+CMT: "<номер телефона>", "", "<дата, время>", а на следующей строчке - текст сообщения ' +CMT: "+79129871234","Boss-1","14/03/31,12:43:29+16" '123456
Reset Watchdog Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100
Print "AT+CPBS?" : Gosub Waitms_100 ' сообщит тип памяти, количество имеющихся записей и их максимальное количество. ' Например: +Cpbs : «sm»,5,250 Значит , Что на SIM -карте есть 5 записей из 250 возможных.
If Temp < 3 Then ' Мало записей! Обязано быть 3: Номер босса, Номер пользователя и баланс Do ' Зависаем, так как нельзя работать For Temp = 20 To 0 Step -1 ' для индикации режима изменим яркость св. диода Led = 1 : Waitms Temp : Led = 0 : Reset Watchdog Temp2 = 20 - Temp : Waitms Temp2 Next Waitms 30 For Temp = 0 To 20 Led = 1 : Waitms Temp : Led = 0 : Reset Watchdog Temp2 = 20 - Temp : Waitms Temp2 Next Temp Waitms 50 Loop End If
For Counter_c = 1 To 3 ' читаем записи из телефонной книги SIM карты Reset Watchdog Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100
Sms$ = Mid(sms$ , 11 , 19 ) Gosub Vydelim_nomer_iz_stroki ' Выделение # из строки в ковычках и с "+" вначале в переменную Number$
If Counter_c = 1 Then Phone_boss$ = Number$ Print #1 , "Boss: " ; Phone_boss$ ' Номер владельца устройства End If
If Counter_c = 2 Then Phone_user$ = Number$ Print #1 , "User: " ; Phone_user$ ' Номер пользователя устройства End If
If Counter_c = 3 Then Balans$ = Number$ Print #1 , "Blns " ; Balans$ ' Номер для запроса баланса End If
Next
Print #1 , "Инициализацию завершил!" Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 Return
'================ Gsm_modem_off: Led = 1 Gosub Flushbuf 'очистка буфера. Внутри есть waitms 100 Print "AT+CPOWD=1" ' Отключим GSM-модем Gosub Wait_5sec ' модем долго засыпает, ждём Gosub Getline ' смотрим что пришло от модема в буфер - Sms$ Print #1 , Sms$ ' GSM-модем должен ответить "нормальное отключение" If Sms$ = "" Then ' Если не ответил, то Print #1 , "Придётся аппаратно отключать модем" Pwkey_gsm = 1 ' не менее 1.5 сек для управления питанием !!! Waitms 1700 Pwkey_gsm = 0 End If Led = 0 Return
То что доктор прописал! Огромнейшее вам спасибо! Пробежался глазами - вопросов пока нет, благо каждая строка закомментирована. Дома займусь вплотную и если что, я к вам за помощью и разъяснениями Спасибо еще раз!
да пожалуйста Вы в какой версии работаете? (у меня лицензия: подарили за перевод оболочки). Хочу книжку дописать по Баском и основам электроники и выложить её тут, на форуме
да пожалуйста Вы в какой версии работаете? (у меня лицензия: подарили за перевод оболочки). Хочу книжку дописать по Баском и основам электроники и выложить её тут, на форуме
Версия 2.0.7.8 ; сборка 2.0.7.8.004 ; версия ide 2.0.7.8.003. За выделенное отдельное спасибо! Я думаю коты и котики заценят ваш труд по достоинству. Мрр... Буду ждать релиз. Будем!
Не могу понять почему данные не записываются в еепром ,часть кода
Код:
$Regfile = "m8adef.dat" $Crystal = 8000000 dim capacity as eram Single dim capacity37 as eram Single dim capacity33 as eram Single dim capacity30 as eram Single dim cap as Single Config Adc = Single , Prescaler = Auto , Reference = aref cap =0 adc_channel=5 do U =Getadc(adc_channel) cap = cap +Getadc(3)*5 if U = 3.7 then capacity37l = CAP if U = 3.3 then capacity33 = CAP if U = 3.0 then capacity30 = CAP loop
в кратце-замер емкости аккумулятора,после разрядки до 3 вольт в переменных capacity... остается ноль...
Не могу понять почему данные не записываются в еепром ,часть кода
Код:
$Regfile = "m8adef.dat" $Crystal = 8000000 dim capacity as eram Single dim capacity37 as eram Single dim capacity33 as eram Single dim capacity30 as eram Single dim cap as Single Config Adc = Single , Prescaler = Auto , Reference = aref cap =0 adc_channel=5 do U =Getadc(adc_channel) cap = cap +Getadc(3)*5 if U = 3.7 then capacity37l = CAP if U = 3.3 then capacity33 = CAP if U = 3.0 then capacity30 = CAP loop
в кратце-замер емкости аккумулятора,после разрядки до 3 вольт в переменных capacity... остается ноль...
Какой канал АЦП используется, третий или пятый? Вы U считываете с пятого канала, а Cap с третьего. И, по моему, не корректная запись: cap = cap +Getadc(3)*5. Сначала попробуйте считайть значение АЦП в переменную, а потом работать с ней.
cap = cap +Getadc(3)*5 я написал в упрощенном виде,на деле вот так
Код:
a = Getadc(3) cap0 = a * Vop cap0 = cap0 / 1024 cap0 = cap0 / rez cap0 = cap0 / 3.600 cap = cap + cap0 cap0 = cap0 * 3600
переменная сар сразу выводится на экран-там все верно к аккумулятору подключены 2 резистора последовательно,каждый 10 ом ,ADC5-напряжение на аккумуляторе,adc3-напряжение на общей точке подключения резисторов 10 ом хочу собрать измеритель емкости аккумуляторов ли-ион,из доступных дисплеев только винстар 1602,нокиа 1110 и прочего нет(кроме 5110,но на нем в сети не нашел такой прибор) именно в строках if U = 3.7 then capacity37l = CAP if U = 3.3 then capacity33 = CAP if U = 3.0 then capacity30 = CAP не происходит запись,я попробовал записать и сразу считать и отправить в уарт-ноли...
попробую через writeeeprom,спасибо за подсказку
мистика какая-то,сделал так-все работает... if U = 3.7 then capacity37 = CAP end if if U = 3.3 then capacity33 = CAP end if if U = 3.0 then capacity30 = CAP end if
Я бы не советовал делать проверку на равенство если операнд имеет тип с плавающей точкой. Такие числа в машинном представлении отличаются от привычного десятичного вида. Например, константа 3.7 в реальности может быть представлена скажем в виде 3.69999 из-за чего условие не выполнится. Также при каждом арифметическом действии с таким типом ошибка может накапливаться. И величина ошибки будет возрастать с увеличением значения.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения