Вс апр 01, 2018 22:01:53
kip96 писал(а):Может это и есть ответ?
Даже не знаю.......
Ну я для себя решил, что декодер dtmf быстрее, дешевле, и.... уже давно работает ( и мк свободен. для других задач)
Пн апр 02, 2018 07:51:20
Пн апр 02, 2018 10:12:42
Пн апр 02, 2018 14:50:12
Пн апр 02, 2018 17:23:02
Вт апр 03, 2018 15:27:37
Вт апр 03, 2018 15:41:15
aleksandr-zh писал(а):в модуле sim900d есть встроенный декодер.
если надо такая прошивка для данного модуля - пишите. Выпускается несколько лет, работает без сбоев.
Вт апр 03, 2018 16:14:39
' +DTMF:* +DTMF:# +DTMF:1 +DTMF:0
If Tstr$ = "+DTMF" Then
Tstr$ = Mid(sms$ , 7 , 1) ' Выделим символ, переданный сигналом DTMF
Komanda$ = Komanda$ + Tstr$
If Len(komanda$) > 2 Then ' Если длина большая, то явно ошибка
Komanda$ = "" ' - не то нажали, обнуляем
End If
If Komanda$ = "1" Then ' меняем Чувствительность микрофона, режим 1
Print "AT+CMIC=0,2" ' минимальная
Goto Nam_pozvonili_konec
End If
Вт апр 03, 2018 19:24:42
aleksandr-zh писал(а):вы меня не поняли
получив DTMF модуль выдаёт в порт данные о коде. Символом.
я всё пишу на Баском, никаких костылей не использую.
Вт апр 03, 2018 20:04:09
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
Led = 0
End If ' получили какое-то сообщение
Waitms 50
Loop
'================
Nam_pozvonili: ' Обработка Входящего голосового вызова ----
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"
Tstr$ = Left(sms$ , 5) ' +DTMF:* +DTMF:# +DTMF:1 +DTMF:0
If Tstr$ = "+DTMF" Then
Tstr$ = Mid(sms$ , 7 , 1) ' Выделим символ, переданный сигналом DTMF
Komanda$ = Komanda$ + Tstr$
If Len(komanda$) > 2 Then ' Если длина большая, то явно ошибка
Komanda$ = "" ' - не то нажали, обнуляем
End If
Print #1 , "$=" ; Komanda$
Peredal_net220 = 255 ' Сброс переменной
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
Print "AT" : Gosub Waitms_100
Print "AT" : Gosub Waitms_100
Print "ATE0"
' 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 ' ждём когда модуль даст имя оператора, а не пустоту
Led = 1 ' GSM-модем ответил
Gosub Delete_sms ' Удалим СМС
Reset Watchdog
Print "AT+CMGF=1" : Gosub Waitms_100 ' включить текстовый режим SMS
Print "AT+CSCS=" ; Chr(34) ; "GSM" ; Chr(34) : Gosub Waitms_100 ' Кодировка текста GSM (только латинские)
Print "AT+GSMBUSY=0" : Gosub Waitms_100 ' 0 = разрешить входящие
Print "AT+CLIP=1" : Gosub Waitms_100 ' включить АОН
Print "AT+DDET=1" : Gosub Waitms_100 ' Включить детектор DTMF
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 возможных.
Gosub Getline
'Print #1 , Sms$ ' Читаем строку с данными
Sms$ = Mid(sms$ , 13 , 1)
'Print #1 , Sms$
Temp = Val(sms$) ' количество записей в SIM
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
Print "AT+CPBR=" ; Str(counter_c) : Gosub Waitms_500 ' Считывает запись SIM #X
Gosub Getline ': Print #1 , Sms$ ' Читаем строку с данными +CPBR: 1,"+79208381234",145,"0A1234F51F98"
Otvet$ = Sms$ ' Сохраним
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
Ср апр 04, 2018 11:30:29
aleksandr-zh писал(а):код полностью не выложу, но дам базовое:
Ср апр 04, 2018 11:32:29
Ср апр 04, 2018 11:39:32
aleksandr-zh",url="/forum/viewtopic.php?p=3346127#p3346127 писал(а):да пожалуйста
Вы в какой версии работаете? (у меня лицензия: подарили за перевод оболочки).
Хочу книжку дописать по Баском и основам электроники и выложить её тут, на форуме
Сб апр 07, 2018 04:54:01
$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
Сб апр 07, 2018 07:31:04
Сб апр 07, 2018 08:23:51
Сб апр 07, 2018 15:27:32
Сб апр 07, 2018 16:49:42
$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
Сб апр 07, 2018 18:08:01
a = Getadc(3)
cap0 = a * Vop
cap0 = cap0 / 1024
cap0 = cap0 / rez
cap0 = cap0 / 3.600
cap = cap + cap0
cap0 = cap0 * 3600
Сб апр 07, 2018 22:45:24