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

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Использование модуля SIM800l


Использование модуля SIM800l

Сообщений 31 страница 60 из 224

31

реально работающий несколько лет проект, переработан на модуль sim800L, работает не выключаясь несколько месяцев: передаёт метеоданные. Каждые 6 минут передача в интернет
Смотрите Init_modem

Код:
' Каждые 5 секунд замер и отображение на дисплее всех данных,
' каждые 6 минут передача в интернет.
' При отсутствии связи - перезапуск модема.

' При подаче питания проверка наличия SIM-карты:
' если её нет, то потом GSM не запускается, только отображение данных.

' Добавлено 2 текстовых буфера для данных: чтобы обновлялся дисплей без мерцания


$prog &HFF , &HFC , &HD1 , &H00                             ' generated

Const Otladka = 1


$regfile = "m16adef.dat"
$crystal = 4000000
$baud = 19200
$hwstack = 64
$swstack = 64
$framesize = 120

Dim Temp As Byte , Temp2 As Byte , Temp3 As Byte , Http_err As Byte
Dim Counter_c As Byte , Taimer_peredachi_na_server As Byte , Net_sim As Byte
Dim Tstr$ As String * 9 , Error_d As Byte , Temp_w As Word , Dlina_nizhnej_stroki As Byte


Dim Temperatura_1 As Single                                 ' , Temperatura_2 As Single , Temperatura_3 As Single
Dim Temperatura_single As Single                            '  переменная для хранения значения температуры со знаком
Dim Massiv(24) As Byte                                      '  хранилище для чтения\записи  устройства 1wire
Dim Datchik As Byte , Taimer_zamerov As Word , Znak_temperatury As Byte
Dim Popytki As Byte , Problema As Byte
Dim Znak_temperatury_1 As Byte                              ' , Znak_temperatury_2 As Byte , Znak_temperatury_3 As Byte

' Данные для GPRS
Dim Ap_internet$ As String * 15 , Login_internet$ As String * 15 , Password_internet$ As String * 15
Dim Status_server$ As String * 65                           ' Строка с данными сервера
Dim Imei$ As String * 16                                    ' IMEI модуля

Dim Otvet$ As String * 255                                  'сообщение, которое модуль будет отправлять
Dim Sms$ As String * 128                                    ' Входящее сообщение

'--------------HTU21D----------------
Dim Temperature As Single , Hum As Single
Const A = 8.1332
Const B = 1762.39
Const C = 235.66

'------------------------- SUB Routine's ---------------------------------------
Declare Function Htu21d_temp() As Single
Declare Function Htu21d_hum() As Single
Declare Sub Init_htu21d

Const Datchik_1 = 7                                         ' PortA.7  ' на эту ножку подключим DS18B20


Open "coma.0:9600,8,n,1" For Input As #1                    ' Для датчика ТЧ uart1

Open "coma.1:9600,8,n,1" For Input As #2                    ' Для датчика CO2  uart2
Open "coma.3:9600,8,n,1" For Output As #3                   ' Для датчика CO2 uart2

#if Otladka = 1
   Open "comd.7:19200,8,n,1" For Output As #4               ' Для отладки
#endif

$timeout = 340000


Led Alias Portd.5 : Config Led = Output : Led = 0           ' Включаем
Podsvetka_lcd Alias Portd.3 : Config Podsvetka_lcd = Output ' Подсветка LCD

Pwkey_gsm Alias Portd.4 : Config Pwkey_gsm = Output : Pwkey_gsm = 0
Gsm_status Alias Pind.6 : Config Portd.6 = Input : Portd.6 = 0       ' Вход, Status от модема



Config Portb = Output


'--------------------------------------------------------
Sms$ = Version(1)
Gosub Config_lcd
Lcd "Start...    Ver:" : Lowerline : Lcd Sms$


#if Otladka = 1
   Print #4 , "Start!"
   Print #4 , "Version: " ; Sms$
   Print #4 , "File: " ; Version(3)
#endif


'конфигурация I2C
Scl_m Alias Portb.0 : Sda_m Alias Portb.1
Config I2cbus = 0 , Scl = Scl_m , Sda = Sda_m
I2cbus = 0
Config I2cdelay = 50
I2cinit


Waitms 1800

Config Watchdog = 2048 : Start Watchdog


Config Serialin = Buffered , Size = 180                     ' Буфер для принятых по UART символов
Enable Interrupts                                           ' Чтобы буфер работал!

Ap_internet$ = "internet"
Login_internet$ = ""
Password_internet$ = ""
Status_server$ = "http://тут АДРЕС, куда шлём данные"

Net_sim = 0

Gosub Gsm_modem_off
Gosub Init_modem                                            ' запуск модема
If Net_sim = 1 Then Disable Interrupts

Reset Watchdog
Call Init_htu21d

Taimer_zamerov = 10                                         ' 5 секунд
Taimer_peredachi_na_server = 23                             ' через 2 минуты


Start_prg:                                                  ' ===================================
   Toggle Led
   Reset Watchdog

   Gosub Waitms_500

   Decr Taimer_zamerov

   #if Otladka = 1
      Print #4 , Taimer_zamerov ; " ";
   #endif

   If Taimer_zamerov = 0 Then

      If Net_sim = 0 Then Decr Taimer_peredachi_na_server
      #if Otladka = 1
         Print #4 , "До передачи на сервер: " ; Taimer_peredachi_na_server
      #endif

      Popytki = 0

      Snova:
         #if Otladka = 1
            Print #4 , "Замеры"
         #endif

         Reset Watchdog
         Gosub Config_lcd

         Otvet$ = ""
         Incr Popytki

      ' Опрос датчика CO2
         Otvet$ = Otvet$ + "&carbond="
         Printbin #3 , &HFF ; &H01 ; &H86 ; &H00 ; &H00 ; &H00 ; &H00 ; &H00 ; &H79
         Inputbin #2 , Massiv(1) , 9

         If Massiv(1) = &HFF And Massiv(2) = &H86 Then
            Temp_w = Massiv(3) * 256
            Temp_w = Temp_w + Massiv(4)
         'Temp_w = 456
            Otvet$ = Otvet$ + Str(temp_w)
            Lcd "CO2:" ; Temp_w
         End If


         Reset Watchdog
         Temperature = Htu21d_temp()
         'Temperature = 23.4
         Hum = Htu21d_hum()                                 ' Влажность
         'Hum = 56.7
         Temp_w = Hum
         #if Otladka = 1
            Print #4 , "Hw:" ; Temp_w
         #endif
         Otvet$ = Otvet$ + "&humidity="

         Sms$ = Fusing(hum , "#.#")
         Otvet$ = Otvet$ + Sms$
         Lcd " " ; Chr(0) ; ":" ; Sms$                      ' Влажность

         Sms$ = Fusing(temperature , "#.#")
         Otvet$ = Otvet$ + "&temp_i=" + Sms$
         Otvet$ = Otvet$ + "&t=" + Sms$
             'Lcd " t" ; Sms$                                    ' температура датчика влажности

         Reset Watchdog
         Lowerline

       ' Примем данные датчика ТЧ, он выдаёт их каждую секунду
         Inputbin #1 , Temp
         If Temp = &H42 Then

            Reset Watchdog
            Inputbin #1 , Temp
            If Temp = &H4D Then

               Reset Watchdog
               Inputbin #1 , Temp
               If Temp = &H00 Then

                  Reset Watchdog
                  Inputbin #1 , Temp
                  If Temp = &H14 Then

                     Reset Watchdog
                     Inputbin #1 , Massiv(1) , 20

                     Otvet$ = Otvet$ + "&CF:1.0="           ' ----------     Первый пакет
                     Temp_w = 256 * Massiv(1)
                     Temp_w = Temp_w + Massiv(2)
                          'Temp_w = 23
                     If Temp_w <= 999 Then
                        Otvet$ = Otvet$ + Str(temp_w)
                     Else
                        Otvet$ = Otvet$ + "999"
                     End If

                     Otvet$ = Otvet$ + ",2.5="
                     Temp_w = 256 * Massiv(3)
                     Temp_w = Temp_w + Massiv(4)
                          'Temp_w = 34
                     If Temp_w <= 999 Then
                        Otvet$ = Otvet$ + Str(temp_w)
                     Else
                        Otvet$ = Otvet$ + "999"
                     End If

                     Otvet$ = Otvet$ + ",10="
                     Temp_w = 256 * Massiv(5)
                     Temp_w = Temp_w + Massiv(6)
                         'Temp_w = 45
                     If Temp_w <= 999 Then
                        Otvet$ = Otvet$ + Str(temp_w)
                     Else
                        Otvet$ = Otvet$ + "999"
                     End If

                     Otvet$ = Otvet$ + "&AT:1.0="           ' ----------     Второй пакет

                     Temp_w = 256 * Massiv(7)
                     Temp_w = Temp_w + Massiv(8)
                        'Temp_w = 56
                     If Temp_w <= 999 Then
                        Otvet$ = Otvet$ + Str(temp_w)
                     Else
                        Otvet$ = Otvet$ + "999"
                     End If
                     Lcd Chr(1) ; Temp_w
                     Dlina_nizhnej_stroki = 2
                     If Temp_w > 99 Then Dlina_nizhnej_stroki = 3


                     Otvet$ = Otvet$ + ",2.5="
                     Temp_w = 256 * Massiv(9)
                     Temp_w = Temp_w + Massiv(10)
                         'Temp_w = 67
                     If Temp_w <= 999 Then
                        Otvet$ = Otvet$ + Str(temp_w)
                     Else
                        Otvet$ = Otvet$ + "999"
                     End If
                     Lcd " " ; Chr(2) ; Temp_w
                     Dlina_nizhnej_stroki = Dlina_nizhnej_stroki + 2
                     If Temp_w > 99 Then Dlina_nizhnej_stroki = Dlina_nizhnej_stroki + 1

                     Otvet$ = Otvet$ + ",10="
                     Temp_w = 256 * Massiv(11)
                     Temp_w = Temp_w + Massiv(12)
                        'Temp_w = 78
                     If Temp_w <= 999 Then
                        Otvet$ = Otvet$ + Str(temp_w)
                     Else
                        Otvet$ = Otvet$ + "999"
                     End If
                     Lcd " " ; Chr(3) ; Temp_w
                     Dlina_nizhnej_stroki = Dlina_nizhnej_stroki + 2
                     If Temp_w > 99 Then Dlina_nizhnej_stroki = Dlina_nizhnej_stroki + 1

                  End If
               End If
            End If
         End If

         Reset Watchdog

         Gosub Zamer_t
            'Temperatura_1 = 22.2
         Sms$ = Fusing(temperatura_1 , "#.#")
         Temp_w = Temperatura_1
         #if Otladka = 1
            Print #4 , "Tw:" ; Temp_w
         #endif

         Otvet$ = Otvet$ + "&temp="
         Lcd " " ;
         If Znak_temperatury = "-" Then
            Otvet$ = Otvet$ + "-"
            Lcd "-"
         End If

         Otvet$ = Otvet$ + Sms$

         If Dlina_nizhnej_stroki < 9 Then Lcd Temp_w ; Chr(4)       ' Температура внешнего термометра

         If Len(otvet$) < 65 Then                           ' Слишком короткое, что-то не считалось!
            If Popytki <= 2 Then Goto Snova                 ' делаем 2 попытки
         End If


         Reset Watchdog

         #if Otladka = 1
            Print #4 , "Выдаём: " ; Len(otvet$)
            Print #4 , Otvet$
         #endif

         Led = 1                                            ' отключим


         If Taimer_peredachi_na_server = 0 Then
            #if Otladka = 1
               Print #4 , "Передача по таймеру"
            #endif

            Taimer_peredachi_na_server = 11                 '59                 ' раз в 5 минут

            Reset Watchdog
            If Gsm_status = 0 Then
               Gosub Init_modem                             ' запуск модема
               If Error_d > 0 Then
                  Gosub Gsm_modem_off                       ' Ошибки!  Отключаем GSM-модем
                  Taimer_zamerov = 2                        ' Попробуем через 10 секунд
               End If
            End If


            If Gsm_status = 1 Then                          ' GSM-модем включен
               #if Otladka = 1
                  Print #4 , "Передаём на сервер"
               #endif
               Gosub Gprs_msg                               ' Передаём на сервер через GPRS

               If Http_err = 0 Then                         '  OK
                  #if Otladka = 1
                     Print #4 , "Сообщение на сервер Отправлено"
                  #endif
               Else
                  #if Otladka = 1
                     Print #4 , "Сообщение на сервер НЕ отправлено"
                  #endif
                  Gosub Gsm_modem_off
                  Taimer_zamerov = 6                        ' Попробуем через 30 секунд
                  Taimer_peredachi_na_server = 1            ' сразу передать
               End If

            End If
         End If

         Taimer_zamerov = 10
   End If

   Goto Start_prg


' ------------------------------------------------------------------------------------------------------------------------
Config_lcd:
   Config Lcd = 16 * 2
   Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.2 , Rs = Portb.3
   Cursor Off Noblink                                       ' Выключим мигающий курсор на экране

   Deflcdchar 0 , 24 , 20 , 24 , 20 , 24 , 3 , 5 , 5        ' Влажность

   Deflcdchar 1 , 31 , 17 , 17 , 17 , 17 , 31 , 31 , 31     ' ТЧ 1
   Deflcdchar 2 , 31 , 17 , 17 , 31 , 31 , 17 , 17 , 31     ' ТЧ 2.5
   Deflcdchar 3 , 31 , 31 , 31 , 17 , 17 , 17 , 17 , 31     ' ТЧ 10

   Deflcdchar 4 , 8 , 8 , 3 , 4 , 4 , 4 , 3 , 32            ' `c

   Podsvetka_lcd = 1
   Cls
Return






' ------------------------------------------------------------------------------------------------------------------------
Zamer_t:                                                    ' Измерим температуру
   Reset Watchdog

   Datchik = Datchik_1
   Gosub Opros_18b20
   Temperatura_1 = Temperatura_single                       '* 10
   Znak_temperatury_1 = Znak_temperatury

         '   Temperatura_2 = 0
         '   Znak_temperatury_2 = "E"

         '   Temperatura_3 = 0
         '   Znak_temperatury_3 = "E"

Return


' ------------------------------------------------------------------------------------------------------------------------
Opros_18b20:                                                ' Опрос датчика
   Problema = 0

Opros_18b20_a:
   Reset Watchdog

        '  Установим разрядность 11 бит
   1wreset Pina , Datchik                                   ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pina , Datchik                        ' Выдаем команду SKIP ROM
   1wwrite &H4E , 1 , Pina , Datchik                        ' Установим...
   1wwrite 0 , 1 , Pina , Datchik
   1wwrite 0 , 1 , Pina , Datchik
   1wwrite &B01011111 , 1 , Pina , Datchik                  '... разрядность 11 бит
   Waitms 5

   1wreset Pina , Datchik                                   ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pina , Datchik                        ' Выдаем команду чтения ПЗУ
   1wwrite &H44 , 1 , Pina , Datchik                        ' Запуск измерения

   Reset Watchdog : Waitms 385                              ' Ждем окончания преобразования

   1wreset Pina , Datchik                                   ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pina , Datchik
   1wwrite &HBE , 1 , Pina , Datchik                        ' Команда чтения ОЗУ датчика

   Massiv(1) = 1wread(9 , Pina , Datchik )                  ' Принимаем 8 байт данных  во временный буфер
   If Err = 0 Then                                          ' Если получили ответ датчика без ошибок

      If Massiv(9) = Crc8(massiv(1) , 8) Then               '   Проверяем CRC полученных данных

         Znak_temperatury = "+"

           ' Проверяем на отрицательную температуру. 248 в десятичном, 11111000 в двоичном.
         If Massiv(2) >= 248 Then                           ' Если температура отрицательная – инвертируем (вычитаем из 255)
            Massiv(1) = 255 - Massiv(1)
            Massiv(2) = 255 - Massiv(2)
            Znak_temperatury = "-"                          '  -   температура отрицательная
         End If


         Temp2 = Massiv(1) : Temp2 = Temp2 And &B00001111   ' оставим 4 младших бита = Т после запятой

         Shift Massiv(1) , Right , 4                        ' Сдвигаем первый байт вправо на 4 бита
         Shift Massiv(2) , Left , 4                         ' Сдвигаем второй байт влево на 4 бита

         Temperatura_single = Temp2 * 0.0625                ' получаем температуру после запятой
         Temp2 = Massiv(1) + Massiv(2)                      ' Целое значение температуры
         Temperatura_single = Temperatura_single + Temp2    ' Формируем результат
         #if Otladka = 1
            Print #4 , "temp_S=" ; Temperatura_single
         #endif

         If Znak_temperatury = "-" Then                     '  -   температура отрицательная
            Temperatura_single = 0 - Temperatura_single     ' Для тестов, чтобы получить отрицательную температуру
         End If

      Else                                                  ' Ошибка
            ' пробуем перезапустить датчик и повторить 2 раза
         Incr Problema
         If Problema < 3 Then
            Goto Opros_18b20_a
         Else
            Znak_temperatury = "E"
            Temperatura_single = 0
         End If
      End If

   Else                                                     ' Ошибка
        ' пробуем перезапустить датчик и повторить 2 раза
      Incr Problema
      If Problema < 3 Then
         Goto Opros_18b20_a
      Else
         Znak_temperatury = "E"
         Temperatura_single = 0
      End If
   End If
Return




'======================================================================

Waitms_100:
   Waitms 100
Return

Waitms_500:
   Waitms 500 : Reset Watchdog
Return


Waitms_750:
   Waitms 750 : Reset Watchdog
Return


Wait_5sec:
   For Temp3 = 0 To 9                                       ' 5 сек
      Gosub Waitms_500
   Next
Return


Wait_4sec:
   Led = 0
   For Temp3 = 0 To 3                                       ' 4 сек
      Led = 1 : Waitms 100 : Led = 0
      Waitms 50
      Led = 1 : Waitms 100 : Led = 0
      Waitms 750 : Reset Watchdog
   Next
Return


'======================================================================
Flushbuf:                                                   ' очистка буфера
   Gosub Waitms_100
   Clear Serialin
Return


'======================================================================
Getline:                                                    ' подпрограмма для разбора сообщения модуля
   Gosub Waitms_100
   Sms$ = ""
   Do
      Temp3 = Inkey()                                       ' берем символ из буфера в формате ASCII
      Select Case Temp3
         Case 0 : Exit Do                                   ' если в буфере нет символа - выход!
         'Case 13              ' возврат каретки (Enter)                  'возврат каретки (Enter)
         Case 10 : If Sms$ <> "" Then Exit Do               'конец строки,  выходит из подпрограммы
         Case Else : If Temp3 > 31 Then Sms$ = Sms$ + Chr(temp3)       ' составляем строку
      End Select
   Loop
Return




'*******************************************************************************
Function Htu21d_temp() As Single
   Local Msb As Byte
   Local Lsb As Byte
   Local Crc As Byte
   Local Temp As Single

   I2cstart
   I2cwbyte &H80
   I2cwbyte &HE3                                            'temp hold

   I2crepstart
   I2cwbyte &H81
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

   Temp = Msb
   Shift Temp , Left , 8
   Temp = Temp + Lsb
   Shift Temp , Right , 2                                   'trunc LSB status bits
   Shift Temp , Left , 2

   Temp = Temp / 65536
   Temp = Temp * 175.72
   Temp = -46.85 + Temp

   Htu21d_temp = Temp
End Function


'-------------------------------------------------------------------------------
Function Htu21d_hum() As Single
   Local Msb As Byte
   Local Lsb As Byte
   Local Crc As Byte
   Local Hum As Single

   I2cstart
   I2cwbyte &H80
   I2cwbyte &HE5                                            'hum hold

   I2crepstart
   I2cwbyte &H81
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   I2crbyte Crc , Nack
   I2cstop

   Hum = Msb
   Shift Hum , Left , 8
   Hum = Hum + Lsb
   Shift Hum , Right , 2                                    'Trunc lsb status bits
   Shift Hum , Left , 2

   Hum = Hum / 65536
   Hum = Hum * 125
   Hum = -6 + Hum

   Htu21d_hum = Hum
End Function

'-------------------------------------------------------------------------------
Sub Init_htu21d                                             'HTU21D Sensor Start up (set in idle mode)
   Reset Watchdog

   Set Scl_m                                                'SCL
   Waitms 20
   Reset Scl_m                                              'SCL

   'Soft Reset
   I2cstart
   I2cwbyte &H80
   I2cwbyte &HFE
   I2cstop
End Sub





'##########################################################
Init_modem:                                                 ' Инициализация модема,  чтение номеров с SIM карты
   #if Otladka = 1
      Print #4 , "Запуск модема... "
   #endif

   Reset Watchdog

   Cls
   Lcd "Init GSM ..."

   ' Error_d  ' Флаг ошибки И счетчик попыток перезапуска. При входе в эту ПП он был Error_d=0

   If Gsm_status = 0 Then                                   ' GSM-модем отключен, включаем
      Gosub Gsm_pwr_key_imp_3sec                            ' Даём импульс 3 сек на PowerKey модема
      Gosub Wait_4sec                                       ' ждем пока модем активируется
   End If

   Reset Watchdog

   Lowerline
   Lcd "Connecting ..."

   Print "AT" : Gosub Waitms_100
   Print "ATE0"


   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
   Print "AT+GSV" : Gosub Waitms_750                        ' Запрос модели и версии прошивки    Выдаёт 3 строки
   Gosub Getline
   #if Otladka = 1
      Print #4 , Sms$                                       ' ответ модема SIMCOM_Ltd
   #endif

   Gosub Getline
   #if Otladka = 1
      Print #4 , Sms$                                       ' ответ модема SIMCOM_SIM900D
   #endif

   Gosub Getline
   #if Otladka = 1
      Print #4 , Sms$                                       ' ответ модема Revision:  
   #endif

   'Gosub Getline : Print #4 , Sms$       ' ответ модема   ok

   Reset Watchdog
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
   Print "AT+GSN" : Gosub Waitms_100                        ' вернет IMEI модуля
   Gosub Getline                                            ' ответ модема
   Imei$ = Sms$                                             ' Читаем строку с IMEI
   #if Otladka = 1
      Print #4 , "IMEI: " ; Imei$
   #endif

   Cls
   Lcd Imei$
   Lowerline

   Reset Watchdog
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100

   Print "AT+CPBS=" ; Chr(34) ; "SM" ; Chr(34) : Gosub Waitms_100       ' Выбрать Сим-карту как память
   Gosub Getline
   #if Otladka = 1
      Print #4 , "SIM: " ; Sms$
   #endif

   If Sms$ = "ERROR" Then                                   ' Нет СИМ-карты!
      #if Otladka = 1
         Print #4 , "Нет СИМ-карты! "
      #endif

      Cls
      Lcd "Error SIM card!!"
      Lowerline
      Lcd "Mode: LCD only"
      Error_d = 255
      Net_sim = 1
      Goto Init_modem_end                                   ' Выходим
   End If



   For Temp = 0 To 15                                       ' ждем 8 сек пока модем активируется
      Gosub Waitms_500
      #if Otladka = 1
         Print #4 , ".";
      #endif

      Toggle Led
      Reset Watchdog
      Lcd "#"
   Next

   Counter_c = 50                                           ' до 35 секунд ожидания регистрации
   Do
      Decr Counter_c
      If Counter_c = 0 Then                                 ' Время ожидания решистрации модема вышло
         If Error_d < 1 Then                                ' Делаем 2 попыток перезапустить GSM-модем
            Incr Error_d
            Goto Init_modem                                 ' Перезапуск модема
         Else                                               ' Если и так не удалось, то:
            #if Otladka = 1
               Print #4 , "Связь не восстановили"
            #endif

            Goto Init_modem_end                             ' Выходим
         End If
      End If

      Reset Watchdog
      Print "ATE0"
      Gosub Flushbuf
                                             'очистка буфера. Внутри есть waitms 100
      Print "AT+COPS?" : Gosub Waitms_750                   ' выдаст имя оператора связи
      Gosub Getline
      #if Otladka = 1
         Print #4 , ">" ; Sms$ ; ".";                       ' ответ модема
      #endif

      Toggle Led
   Loop Until Len(sms$) > 12                                ' ждём когда модуль даст имя оператора, а не пустоту


   Sms$ = Mid(sms$ , 13 , 9 )                               ' Выделим название оператора
   #if Otladka = 1
      Print #4 , Sms$
   #endif

   Cls
   Lcd Sms$

   Gosub Flushbuf
   Print "AT+CSQ"                                           ' Параметры принимаемого сигнала
   Gosub Waitms_500
   Gosub Getline                                            ' ответ модема
   Sms$ = Mid(sms$ , 7 , 2)                                 ' Выделим "силу сигнала"
   Lcd "  " ; Sms$ ; "%"

   Lowerline

   Led = 0                                                  ' GSM-модем ответил 0=On

   Print "AT+CMGF=1" : Gosub Waitms_100                     ' включить текстовый режим SMS
   Print "AT+CSCS=" ; Chr(34) ; "GSM" ; Chr(34) : Gosub Waitms_100       ' Кодировка текста GSM (только латинские)
   Reset Watchdog

   Print "AT+GSMBUSY=0" : Gosub Waitms_100                  ' 0 = разрешить входящие, 1=Запретить
   Print "AT+CLIP=1" : Gosub Waitms_100                     ' включить АОН
   Print "AT+DDET=1" : Gosub Waitms_100                     ' Включить детектор DTMF
   Print "AT+CSCB=0" : Gosub Waitms_100                     ' прием широковещательных сообщений

   Reset Watchdog
   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 Delete_sms                                         ' Удалим СМС

   Led = 0                                                  ' Включим
   Error_d = 0                                              ' Без ошибок

Init_modem_end:
   Reset Watchdog
   If Error_d = 0 Then                                      ' Без ошибок
      #if Otladka = 1
         Print #4 , " GSM OK!!"
      #endif

      Lcd "GSM Link - Ok!"
   Else                                                     ' Нет связи GSM
      #if Otladka = 1
         Print #4 , " Ошибка GSM!"
      #endif

      Gosub Gsm_modem_off                                   ' Отключаем GSM-модем
   End If

   Gosub Wait_4sec
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
Return





'======================================================================
Delete_sms:                                                 ' Удалим СМС
   Reset Watchdog
   Print "AT+CMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34)
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
Return




'*******************************************************************************
Zhdem_otvet_ok:                                             ' Ждём ответ GSM-модема
   Counter_c = 100                                          ' 10 секунд ожидания
   Sms$ = ""
   Error_d = 0

   While Sms$ <> "OK"                                       ' ждём
      Decr Counter_c
      If Counter_c = 0 Then
         Error_d = 1                                        ' Ошибка!
         Exit While
      End If

      Reset Watchdog
      Gosub Getline
      #if Otladka = 1
         Print #4 , Sms$ ; " <"
      #endif

      If Sms$ = "ERROR" Then
         Error_d = 1                                        ' Ошибка!
         Exit While
      End If
   Wend


   If Error_d = 0 Then                                      ' Без ошибок
      #if Otladka = 1
         Print #4 , "> " ; Sms$                             ' ответ модема
      #endif

   Else
      #if Otladka = 1
         Print #4 , "ERROR"
      #endif

   End If

Return



   '======================================================================
Gsm_modem_off:                                              ' Отключим GSM-модем
   #if Otladka = 1
      Print #4 , "Отключим GSM-модем... " ;
   #endif

   Reset Watchdog
   Led = 1                                                  ' Отключим
   Cls
   Lcd "Power off GSM"

   If Gsm_status = 1 Then                                   ' GSM-модем включен - отключаем
      Gosub Flushbuf                                        'очистка буфера. Внутри есть waitms 100
      Gosub Gsm_pwr_key_imp_3sec                            ' Даём импульс 3 сек на PowerKey модема

      Counter_c = 80                                        ' модем долго засыпает, ждём до 8 секунд
      Do
         Toggle Led
         Decr Counter_c
         If Counter_c = 0 Then
            Error_d = 1
            Goto Gsm_modem_off_end
         End If
         Gosub Waitms_100
         If Gsm_status = 0 Then Goto Gsm_modem_off_end      ' GSM-модем отключен
         Reset Watchdog
         Toggle Led
         Gosub Getline
      Loop Until Len(sms$) > 12                             ' ждём когда модуль даст длинное сообщение

      #if Otladka = 1
         Print #4 , "GSM: " ; Sms$                          ' GSM-модем должен ответить "NORMAL POWER DOWN"
      #endif

      Error_d = 0
   End If

Gsm_modem_off_end:
   Lowerline
   If Error_d = 0 Then
      #if Otladka = 1
         Print #4 , "GSM-модем отключен"
      #endif

      Lcd "Ok!"
   Else
      #if Otladka = 1
         Print #4 , "Состояние GSM неизвестно"
      #endif

      Lcd "???"
   End If
Return



'========================================================================
Gsm_pwr_key_imp_3sec:                                       ' Даём импульс 3 секунды на вывод PowerKey модема
   #if Otladka = 1
      Print #4 , "/=" ;
   #endif

   Pwkey_gsm = 1                                            ' питание модема
   For Temp = 9 To 0 Step -1                                ' 3 сек
      Reset Watchdog
      Toggle Led
      Locate 1 , 16 : Lcd Temp
      Waitms 300
   Next
   Pwkey_gsm = 0                                            ' питание модема
   #if Otladka = 1
      Print #4 , "\"
   #endif

   Locate 1 , 16 : Lcd " "
Return




'========================================================================
Gprs_msg:                                                   '  Формируем сообщение и передаём его на сервер через GPRS
   #if Otladka = 1
      Print #4 , ""
      Print #4 , "Передача через GPRS"
   #endif

   Reset Watchdog

   'Otvet$ = Status_server$ + "&devid=" + Imei$ + Otvet$


Gprs_msg_01:
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
   Reset Watchdog

   #if Otladka = 1
      Print #4 , "AT+SAPBR=2,1 " ;                          ' Чтобы понять на какую команду ответил модем
   #endif

   Print "AT+SAPBR=2,1"                                     ' Запрос состояния соединения
'   Gosub Waitms_100
   Gosub Getline                                            ' Внутри есть пауза 50mS!
   #if Otladka = 1
      Print #4 , Sms$
   #endif

   Temp = Instr(sms$ , "SAPBR: 1,")
   'Print #4 , "@ " ; Temp
   If Temp > 0 Then
      Temp = Temp + 9                                       ' Начало записи статуса
      Tstr$ = Mid(sms$ , Temp , 1)
      #if Otladka = 1
         Print #4 , "> " ; Tstr$
      #endif

   End If

   If Tstr$ <> "1" Then                                     ' если сеанс не открыт, то:
      Gosub Http_opening                                    ' открываем сеанс GPRT и HTTP
   Else
      #if Otladka = 1
         Print #4 , "Сеанс уже открыт"
      #endif

   End If

   #if Otladka = 1
      Print #4 , "Передаю: " ; Len(otvet$)
      Print #4 , Otvet$
   #endif


   Reset Watchdog
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100

   Locate 1 , 16 : Lcd "G"

 ' Чтобы понять на какую команду ответил модем
   #if Otladka = 1
      Print #4 , "HTTPPARA=URL,http://... ";                ' AT+HTTPPARA="URL","http: "
   #endif

   Print "AT+HTTPPARA=" ; Chr(34) ; "URL" ; Chr(34) ; "," ; Chr(34) ; _
   Status_server$ ; "&devid=" ; Imei$ ; Otvet$ ; Chr(34)

   Gosub Zhdem_otvet_ok                                     ' Ждём ответ GSM-модема

   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
   Reset Watchdog

   #if Otladka = 1
      Print #4 , "HTTPACTION=0 " ;                          ' Чтобы понять на какую команду ответил модем
   #endif

   Print "AT+HTTPACTION=0"                                  '  AT+HTTPACTION=0
   Gosub Zhdem_otvet_ok                                     ' Ждём ответ OK GSM-модема

   If Sms$ = "ERROR" Then Goto Gprs_msg_02                  ' если ошибка

   Gosub Wait_4sec                                          ' Без паузы нет соединения

   Locate 1 , 16 : Lcd "A"

   Temp = 180                                               ' выход через 18 секунд     Без паузы нет соединения
   Do                                                       'Ждём длинный ответ модема
      Reset Watchdog
      Decr Temp
      Gosub Getline                                         ' Внутри есть пауза 50mS!
      If Temp = 0 Then Sms$ = "ERROR"                       ' Время ожидания ответа модема вышло! Выходим!
      If Sms$ = "ERROR" Then                                ' если ошибка
         #if Otladka = 1
            Print #4 , "Нет HTTP!"
         #endif

         Exit Do
      End If
   Loop Until Len(sms$) > 15


Gprs_msg_02:
   #if Otladka = 1
      Print #4 , "Ответ: " ; Sms$                           ' GSM-модем выдаст "+HTTPACTION: 0,200,###", где 200=Статус OK
   #endif


   ' Выделим статус (200) из этой строки
 '  Флаг ответа сервера (200=OK, 0 или иное значение = Ошибка)
   Tstr$ = ""
   Temp = Instr(sms$ , "ACTION: 0,")
   'Print #4 , "@ " ; Temp
   If Temp > 0 Then
      Temp = Temp + 10                                      ' Начало записи статуса
      Tstr$ = Mid(sms$ , Temp , 3)
      #if Otladka = 1
         Print #4 , "St=" ; Tstr$
      #endif

   End If

   If Tstr$ = "200" Then                                    ' Статус HTTP 200 = OK
      Http_err = 0
      Locate 1 , 16 : Lcd "Y"
   Else
      Http_err = 1                                          ' Ошибка!
      Locate 1 , 16 : Lcd "N"
   End If

   #if Otladka = 1
      Print #4 , "GPRS end"
   #endif

   Gosub Wait_4sec
Return







'==========================================================
Http_opening:                                               ' открываем сеанс GPRT и HTTP
   Reset Watchdog
'   If Off_sending_sms = 1 Then       ' Перемычка НЕ установлена
'   Print "ATE1"
'   Gosub Flushbuf             'очистка буфера. Внутри есть waitms 100

   Locate 1 , 16 : Lcd "H"

   #if Otladka = 1
      Print #4 , "Включаем GPRS"
      Print #4 , "Ap: " ; Ap_internet$
      Print #4 , "Login: " ; Login_internet$
      Print #4 , "Password: " ; Password_internet$
      Print #4 , "Server: " ; Status_server$
   #endif

   'для настройки GPRS соединения
   Print "AT+SAPBR=3,1," ; Chr(34) ; "CONTYPE" ; Chr(34) ; "," ; Chr(34) ; "GPRS" ; Chr(34)       '  AT+SAPBR=3,1,"CONTYPE","GPRS"
   Gosub Wait_4sec

   Locate 1 , 16 : Lcd "?"

      'Print "AT+SAPBR=3,1," ; Chr(34) ; "APN" ; Chr(34) ; "," ; Chr(34) ; "internet" ; Chr(34)                   ' МЕГАФОН  internet
      'Print "AT+SAPBR=3,1," ; Chr(34) ; "APN" ; Chr(34) ; "," ; Chr(34) ; "internet.tele2.ru" ; Chr(34)       ' ТЕЛЕ2       internet.tele2.ru

   Print "AT+SAPBR=3,1," ; Chr(34) ; "APN" ; Chr(34) ; "," ; Chr(34) ; Ap_internet$ ; Chr(34)       ' AP
   Gosub Waitms_100

   Print "AT+SAPBR=3,1," ; Chr(34) ; "USER" ; Chr(34) ; "," ; Chr(34) ; Login_internet$ ; Chr(34)       ' Login
   Gosub Waitms_100

   Print "AT+SAPBR=3,1," ; Chr(34) ; "PWD" ; Chr(34) ; "," ; Chr(34) ; Password_internet$ ; Chr(34)       ' Password
   Gosub Waitms_100

   Gosub Flushbuf                                           'очистка буфера
   Reset Watchdog


   #if Otladka = 1
      Print #4 , "AT+SAPBR=1,1 " ;                          ' Чтобы понять на какую команду ответил модем
   #endif

   Print "AT+SAPBR=1,1"                                     ' AT+SAPBR=1,1
   Gosub Zhdem_otvet_ok                                     ' Ждём ответ GSM-модема

   Gosub Wait_4sec                                          ' Без паузы нет соединения
'   Gosub Wait_4sec                                          ' Без паузы нет соединения

   Locate 1 , 16 : Lcd "I"

   #if Otladka = 1
      Print #4 , "Открываем сеанс HTTP:"
      Print #4 , "AT+HTTPINIT " ;                           ' Чтобы понять на какую команду ответил модем
   #endif

   Print "AT+HTTPINIT"                                      '  AT+HTTPINIT
   Gosub Zhdem_otvet_ok                                     ' Ждём ответ GSM-модема

   Gosub Wait_4sec                                          ' Без паузы нет соединения
'   Gosub Wait_4sec                                          ' Без паузы нет соединения

   Locate 1 , 16 : Lcd "+"

   #if Otladka = 1
      Print #4 , "AT+HTTPPARA=CID,1 " ;                     ' Чтобы понять на какую команду ответил модем
   #endif

   Print "AT+HTTPPARA=" ; Chr(34) ; "CID" ; Chr(34) ; "," ; "1"       '   AT+HTTPPARA="CID",1
   Gosub Zhdem_otvet_ok                                     ' Ждём ответ GSM-модема

'   End If
Return


  '

+3

32

вот вам GSM-сигнализация, DTMF и SMS управление:

Код:
$regfile = "m168pdef.dat"                                   '   Сигнализатор перегрева
$crystal = 4000000                                          ' При нагреве выше 40с -SMS, выше 45с- дозвон
$baud = 19200
$hwstack = 64
$swstack = 64
$framesize = 128                                            ' Для теле2 послать 1 раз с нужной симки *120# для перекл USSD в транслит
                                                                     ' Megafon *105*1250# и ответить 1


Dim Temp As Byte , Temp2 As Byte , Temp3 As Byte , Temp_w As Word , Menu_timer As Byte
Dim B As Byte , Counter_c As Byte , Gsm_ok As Byte
Dim Znak_temperatury_1 As Byte , Znak_temperatury_2 As Byte

Dim Timer_net220v As Byte                                   ' , Timer_gsm As Byte

Dim Temperatura_1 As Word , Temperatura_2 As Word , Problema As Byte
Dim Temperatura_single As Single                            '  переменная для хранения значения температуры со знаком
Dim Temp_massiv_9bait(9) As Byte                            '  хранилище для чтения\записи  устройства 1wire

Dim Simvol$ As String * 1 , Tstr$ As String * 19 , Error_d As Byte , Phone_balans$ As String * 19
Dim Number$ As String * 19 , Phone_boss$ As String * 19 , Phone_user$ As String * 19
Dim Otvet$ As String * 162                                  'сообщение, которое модуль будет отправлять
Dim Sms$ As String * 162                                    ' Входящее SMS сообщение

Dim Peredal_net220 As Byte , Komanda$ As String * 6

Dim Dver_1_byla_otkryta As Byte , Dver_2_byla_otkryta As Byte

Dim Peredal_vysokaya_temp_sms As Byte , Peredal_vysokaya_temp_call As Byte
Dim Peredal_net_220v_sms As Byte , Peredal_net_220v_call As Byte


Termometr_1 Alias Pind.7
Termometr_2 Alias Pinb.0


Open "comd.5:19200,8,n,1" For Output As #1

Datchik_1 Alias Pinc.5 : Config Portc.5 = Input : Portc.5 = 1       ' Помещение 1
Datchik_2 Alias Pinc.4 : Config Portc.4 = Input : Portc.4 = 1       ' Помещение 2

Rele1 Alias Portc.1 : Config Rele1 = Output
Rele2 Alias Portc.0 : Config Rele2 = Output
Out_1 Alias Portc.3 : Config Out_1 = Output

Rele1 = 0 : Rele2 = 0 : Out_1 = 0

Jumper Alias Pinb.1
Config Portb.1 = Input : Portb.1 = 1                        ' Перемычка отключения передачи СМС (для тестов)

Pwkey_gsm Alias Portd.2 : Config Pwkey_gsm = Output

Led Alias Portd.4 : Config Led = Output

Led_ohrana Alias Portd.6 : Config Led_ohrana = Output : Led_ohrana = 0       ' Отключаем
Led_net220v Alias Portb.2 : Config Led_net220v = Output : Led_net220v = 0       ' Отключаем



Config Serialin = Buffered , Size = 161                     ' Буфер для принятых по UART символов
Enable Interrupts                                           ' Чтобы буфер работал!

Config Watchdog = 2048 : Start Watchdog


Reset Watchdog

Print #1 , "Start!"
Print #1 , "Version: " ; Version(1)
Print #1 , "File: " ; Version(3)

' Настройка АЦП
Config Adc = Single , Prescaler = Auto , Reference = Avcc : Start Adc

Reset Watchdog

Gosub Init_modem                                            ' Если модем отключен - Запуск GSM-модема

' При включении на указанные номера отправим СМС и позвоним
Number$ = Phone_user$
Otvet$ = "3anyck... "

Gosub Zamer_t                                               ' Измерим температуру на двух датчиках
Gosub Vstavim_temperaturu                                   ' Вставим в СМС данные температуры

Gosub Zamer_napryazheniya                                   ' Измерим напряжение питания
Gosub Vstavim_napryazhenie                                  ' Вставим в СМС данные о режиме питания


Number$ = Phone_user$
Gosub Sendsms                                               ' Отправим в сообщении ответ

Number$ = Phone_boss$
Gosub Sendsms                                               ' Отправим в сообщении ответ

'Gosub Nabor_nomera                                          ' Звоним


Const Dver_zakryta = 0
Const Dver_otkryta = 1

Const Net = 0
Const Da = 1


Reset Watchdog

Led_net220v = 0                                             ' Отключаем
Led_ohrana = 0                                              ' Отключаем

Peredal_vysokaya_temp_sms = 0
Peredal_vysokaya_temp_call = 0


Do                                                          ' =====================================
   Incr Menu_timer
   Toggle Led


   If Datchik_1 = Dver_otkryta Then                         ' Дверь-1 открыта!
      Led_ohrana = 0                                        ' Отключаем
      'Print #1 , "Дверь_1 открыта"

      If Dver_1_byla_otkryta = Net Then                     ' До этого дверь_1 была закрыта
         Print #1 , "ТРЕВОГА-1!"
         Otvet$ = "DBEPb OTKPbITA! "                        ' + Otvet$

         Gosub Zamer_t                                      ' Измерим температуру на двух датчиках
         Gosub Vstavim_temperaturu                          ' Вставим в СМС данные температуры
         Gosub Zamer_napryazheniya                          ' Измерим напряжение питания
         Gosub Vstavim_napryazhenie                         ' Вставим в СМС данные о режиме питания

         Number$ = Phone_user$
         Gosub Sendsms                                      ' Отправим сообщение
         Dver_1_byla_otkryta = Da                           ' Флаг, Дверь 1 открыта. Чтобы только 1 раз
      End If

   Else                                                     ' Дверь-1 закрыта
      Led_ohrana = 1
      'Print #1 , "Дверь_1 закрыта"

      If Dver_1_byla_otkryta = Da Then                      ' До этого дверь_1 была открыта
         Print #1 , "Дверь_1 закрыли"
         Otvet$ = "DBEPb 3AKPbITA. "                        ' + Otvet$

         Gosub Zamer_t                                      ' Измерим температуру на двух датчиках
         Gosub Vstavim_temperaturu                          ' Вставим в СМС данные температуры
         Gosub Zamer_napryazheniya                          ' Измерим напряжение питания
         Gosub Vstavim_napryazhenie                         ' Вставим в СМС данные о режиме питания

         Number$ = Phone_user$
         Gosub Sendsms                                      ' Отправим сообщение
         Dver_1_byla_otkryta = Da                           ' Флаг, Дверь 1 открыта. Чтобы только 1 раз
      End If

      Dver_1_byla_otkryta = Net

   End If                                                   '  If Datchik_1 = 1 Then                       ' Дверь открыта!


   ' ---  Опрос модема ---
   Gosub Getline                                            ' смотрим что пришло от модема в буфер  - Sms$
   If Sms$ <> "" Then                                       ' получили какое-то сообщение
      Led = 1
      Gosub Waitms_750                                      ' чтобы всё сообщение успело попасть в приёмный буфер!
      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: "+79309871234",145,"",,"",0
         Sms$ = Mid(sms$ , 9 , 19)                          ' достаем номер отправителя SMS
         Gosub Vydelim_nomer_iz_stroki                      ' Выделение # из строки в ковычках и с "+" вначале в переменную Number$
         Print #1 , "Звонит " ; Number$
         Temp_w = 0 : Temp = 0 : Sms$ = ""
         If Number$ = Phone_boss$ Or Number$ = Phone_user$ Then Gosub Nam_pozvonili       ' если номер = Владелец устройства
         Gosub Flushbuf                                     'очистка буфера. Внутри есть waitms 100
      End If                                                '   If Tstr$ = "+CLI" Then

      Led = 0
   End If                                                   ' получили какое-то сообщение



   If Menu_timer > 19 Then                                  ' Раз в 10 секунд
      Reset Watchdog
      Otvet$ = ""

      Gosub Zamer_t                                         ' Измерим температуру на двух датчиках
      Gosub Zamer_napryazheniya                             ' Измерим напряжение питания

      Print #1 , "T1=" ; Chr(znak_temperatury_1) ; Temperatura_1 ; ", T2=" ; Chr(znak_temperatury_2) ; Temperatura_2 ;

      If Znak_temperatury_1 = "+" Then
         If Temperatura_1 > 419 Then                        ' 42.0C
            If Peredal_vysokaya_temp_call = 0 Then          ' Флаг дозвона любому
               Number$ = Phone_user$
               Gosub Nabor_nomera                           ' Звоним
            End If
            If Peredal_vysokaya_temp_call = 0 Then          ' Флаг дозвона любому
               Number$ = Phone_boss$
               Gosub Nabor_nomera                           ' Звоним
            End If

            'Timer_gsm = 180                                 ' 1800 секунд = 30 минут
         End If


         If Temperatura_1 > 399 And Temperatura_2 < 419 Then       ' в диапазоне 40.0 - 42.0 C - только СМС
            If Peredal_vysokaya_temp_sms < 9 Then           ' Флаг дозвона любому

               Gosub Vstavim_temperaturu                    ' Вставим в СМС данные температуры
               Gosub Vstavim_napryazhenie                   ' Вставим в СМС данные о режиме питания

               Number$ = Phone_user$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Number$ = Phone_boss$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Peredal_vysokaya_temp_sms = 255              ' чтобы больше не слать СМС
            End If
         End If

      End If


      If Znak_temperatury_2 = "+" Then

         If Temperatura_2 > 369 And Temperatura_2 < 380 Then       ' в диапазоне 37.0 - 38.0 C - только СМС
            If Peredal_vysokaya_temp_sms = 0 Then           ' передаём 1 раз

               Gosub Vstavim_temperaturu                    ' Вставим в СМС данные температуры
               Gosub Vstavim_napryazhenie                   ' Вставим в СМС данные о режиме питания

               Number$ = Phone_user$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Number$ = Phone_boss$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Peredal_vysokaya_temp_sms = 1                ' чтобы не слать СМС всем
            End If
         End If


         If Temperatura_2 > 380 And Temperatura_2 < 390 Then       ' в диапазоне 38.0 - 39.0 C - еще СМС
            If Peredal_vysokaya_temp_sms < 9 Then           ' передаём 1 раз

               Gosub Vstavim_temperaturu                    ' Вставим в СМС данные температуры
               Gosub Vstavim_napryazhenie                   ' Вставим в СМС данные о режиме питания

               Number$ = Phone_user$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Number$ = Phone_boss$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Peredal_vysokaya_temp_sms = 255              ' чтобы больше не слать СМС всем
               'Timer_gsm = 180                              ' 1800 секунд = 30 минут
            End If
         End If

         If Temperatura_2 > 389 Then                        ' если больше 39.0 - дозвон на оба номера
            If Peredal_vysokaya_temp_call = 0 Then          ' Флаг дозвона любому
               Number$ = Phone_user$
               Gosub Nabor_nomera                           ' Звоним
            End If
            If Peredal_vysokaya_temp_call = 0 Then          ' Флаг дозвона любому
               Number$ = Phone_boss$
               Gosub Nabor_nomera                           ' Звоним
            End If

            'Timer_gsm = 180                                 ' 1800 секунд = 30 минут
         End If

      End If


      If Temperatura_1 < 359 Or Temperatura_2 < 359 Then    ' температура нормальная
         Peredal_vysokaya_temp_sms = 0                      ' сбросим флаги,чтобы в следующий раз оповещал
         Peredal_vysokaya_temp_call = 0
      End If

      If Znak_temperatury_1 = "-" Or Znak_temperatury_2 = "-" Then
         Peredal_vysokaya_temp_sms = 0                      ' сбросим флаги,чтобы в следующий раз оповещал
         Peredal_vysokaya_temp_call = 0
      End If


      If Temp_w < 268 Then                                  '  НЕТ 220 Вольт!!  питание ниже 14 вольт! А БП выдаёт 14.6в
         Print #1 , ", HET 220v!"
         Led_net220v = 1                                    ' Включаем НЕТ 220в!

         If Timer_net220v = 0 Then
            If Peredal_net_220v_sms = 0 Then                ' SMS уведомление 1 раз
               Gosub Vstavim_temperaturu                    ' Вставим в СМС данные температуры
               Gosub Vstavim_napryazhenie                   ' Вставим в СМС данные о режиме питания

               Number$ = Phone_user$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Number$ = Phone_boss$
               Gosub Sendsms                                ' Отправим в сообщении ответ

               Peredal_net_220v_sms = 1                     ' флаг Сообщения отправлены
               Timer_net220v = 60                           ' 600 секунд = 10 минут
               'Timer_gsm = 180                              ' 1800 секунд = 30 минут
            End If
         Else
            Decr Timer_net220v
            If Timer_net220v = 51 Then                      ' Через 1.5 мин после SMS- дозвон 10-1.5=8.5 8.5*60=510/10=51

               If Peredal_net_220v_call = 0 Then            ' Флаг дозвона любому
                  Number$ = Phone_user$
                  Gosub Nabor_nomera                        ' Звоним
               End If

               If Peredal_net_220v_call = 0 Then            ' Флаг дозвона любому
                  Number$ = Phone_boss$
                  Gosub Nabor_nomera                        ' Звоним
               End If

               'Timer_gsm = 180                              ' 1800 секунд = 30 минут
            End If
         End If

      Else                                                  ' Питание 220в в норме
         Led_net220v = 0                                    ' 220в в норме
         Print #1 , ", 220v норма"

         If Timer_net220v > 0 Then                          ' Питание восстановилось
            Otvet$ = "220v HOPMA, " + Otvet$
            Gosub Vstavim_temperaturu                       ' Вставим в СМС данные температуры

            Number$ = Phone_user$
            Gosub Sendsms                                   ' Отправим в сообщении ответ

            Number$ = Phone_boss$
            Gosub Sendsms                                   ' Отправим в сообщении ответ

            Peredal_net_220v_call = 0                       ' Флаг успешного дозвона
         End If

         Timer_net220v = 0

      End If



'      If Gsm_ok = 1 Then                                    ' При наличии связи (т.е., включенного GSM-модема)
'         If Timer_gsm > 0 Then
'            Decr Timer_gsm
'            Print #1 , "Gsm Off: " ; Timer_gsm
'            If Timer_gsm = 0 Then                           ' Через 30 минут после последнего обращения к GSM-модему...
'               Print #1 , "Время вышло, отключим GSM-модем"
'               Gosub Gsm_modem_off                          ' Отключаем GSM-модем
'            End If
'         End If
'      End If

      Menu_timer = 0
   End If

   Reset Watchdog
   Gosub Waitms_500

Loop


'======================================================================
Nabor_nomera:                                               ' Звоним
   If Gsm_ok = 0 Then Gosub Init_modem                      ' Если модем отключен - Запуск GSM-модема
   Reset Watchdog

   If Gsm_ok = 0 Then                                       ' Нет связи GSM
      Print #1 , "Нет связи!"
      Error_d = 1
   Else                                                     ' Если модем включен

      Print #1 , ""
      Print #1 , "Дозвон на " ; Number$
      Gosub Flushbuf                                        'очистка буфера

      Led = 1

      Reset Watchdog

      Print "AT+CLCC=1" : Gosub Waitms_500                  ' включить отображение изменений вызовов
   ' при дозвоне абоненту GSM выдаёт:  +CLCC: 1,0,3,0,0,"+79151104561",145,""
   ' когда подняли трубку:                          +CLCC: 1,0,0,0,0,"+79151104561",145,""
   ' когда положили:                                    +CLCC: 1,0,6,0,0,"+79151104561",145,""

      Print "ATD+" ; Number$ ; ";"                          ' обязательно точка с запятой в конце
      Gosub Flushbuf                                        'очистка буфера

   ' пошел гудок? номер набран верно?
      For Temp3 = 0 To 100                                  ' в течение 10 секунд ждём подтверждения базой исх.вызова
         Gosub Waitms_100 : Toggle Led                      ' св.диод
         Reset Watchdog

         Gosub Getline                                      ' смотрим что пришло от модема в буфер
         If Sms$ <> "" Then Print #1 , "GSM=" ; Sms$

         Sms$ = Left(sms$ , 12)

         If Sms$ = "+CLCC: 1,0,3" Then                      ' при дозвоне абоненту  - гудок пошел
            Print #1 , "Гудок пошел..."
            Gosub Waitms_750

         ' Ждём установки связи с вызываемым абонентом
            For Temp2 = 30 To 0 Step -1                     ' сколько гудков пытаться дозвониться
               Reset Watchdog : Gosub Waitms_750
               Toggle Led                                   ' св.диод
               Print #1 , Temp2 ; "|";
               Gosub Getline                                ' смотрим что пришло от модема в буфер
               Sms$ = Left(sms$ , 12)

               If Sms$ = "+CLCC: 1,0,0" Then                ' подняли трубку
                  Print #1 , "Дозвонились"
                  Print "ATA"                               ' ответить на звонок
                  Reset Watchdog
                  Gosub Waitms_750                          ' Пауза обязательна!!!
                  Print #1 , "Связь установлена"

                  Peredal_vysokaya_temp_call = 1            ' Флаг успешного дозвона
                  Peredal_net_220v_call = 1                 ' Флаг успешного дозвона

                  For Temp3 = 0 To 14
                     Reset Watchdog
                     Print "AT+VTS=" ; Chr(34) ; "A" ; Chr(34)       '  звуковой сигнал звонящему в линию
                     Gosub Waitms_750                       ' Пауза обязательна!!!
                  Next
                  Exit For
               End If
            Next
            Print "ATH0" : Gosub Waitms_100
            Print "ATH0" : Gosub Waitms_100                 '  положить трубку
            Print #1 , "Положим трубку"
         End If

         If Sms$ = "NO CARRIER" Or Sms$ = "NO DIALTONE" Then       ' положили трубку / пропала связь - разорвать
            Print "ATH0"                                    '  положить трубку
            Print #1 , "Закончили вызов"
         End If                                             '   If Sms$ = "NO CARRIER"

      Next

      Reset Watchdog
      Print "ATH0"                                          '  положить трубку
      Gosub Waitms_750                                      ' Пауза обязательна!!!

      Print "AT+CLCC=0" : Gosub Waitms_100                  ' Отключить отображение изменений вызовов
   End If

Return




'======================================================================
Sendsms:                                                    '  подпрограмма отправки смс
   Print #1 , ""
   Print #1 , "Передача SMS:"

   If Gsm_ok = 0 Then Gosub Init_modem                      ' Если модем отключен - Запуск GSM-модема
   Reset Watchdog

   If Gsm_ok = 0 Then                                       ' Нет связи GSM
      Print #1 , "Нет связи!"
      Error_d = 1
   Else                                                     ' Если модем включен
      Led = 1
      Reset Watchdog
      ' Error_d = Флаг ошибки,  0=Без ошибок, иное=Ошибка
      Gosub Flushbuf                                        'очистка буфера

      Print #1 , "Кому " ; Number$
      Print #1 , Otvet$


 '    If Jumper = 1 Then                                    ' Если перемычка не установлена, то передаём SMS
      Print "AT+CMGS=" ; Chr(34) ; "+" ; Number$ ; Chr(34) ; ","       ' AT+CMGS="+79129871234", #010
      Gosub Waitms_750                                      ' появится запрос ">"
      Print Otvet$ ; Chr(26)                                ' Теперь само сообщение +  Завершить

      Temp = 200                                            ' выход через 22-25 секунд
      Do
         Toggle Led
         Reset Watchdog
         Gosub Getline                                      ' Внутри есть пауза 100mS!
         Decr Temp
         If Temp = 0 Then Sms$ = "ERROR"                    ' Время ожидания ответа модема вышло! Выходим!
         If Sms$ = "ERROR" Then                             ' если ошибка
            Error_d = 1                                     ' Ошибка!
            Goto Sendsms_end
         End If
      Loop Until Sms$ = "OK"                                'не выйдет из цикла пока модуль не ответит OK
      Error_d = 0                                           ' Без ошибок
'      Else
'         Print #1 , "Отключена отправка SMS"
'      End If

   End If

Sendsms_end:
   If Error_d = 0 Then                                      ' Без ошибок
      Print #1 , "SMS отправил"
   Else
      Print #1 , "SMS ERROR!"
      Gosub Wait_4sec                                       ' Пауза 4 сек, чтобы оператор не глючил, особенно важно для МТС
   End If

   Gosub Flushbuf                                           'очистка буфера
   Led = 0                                                  ' 0=Off
Return






'======================================================================
Zamer_napryazheniya:                                        ' Измерим напряжение питания
   Temp_w = Getadc(2)                                       ' Измеряем напряжение в канале 2
   Shift Temp_w , Right , 1                                 ' Превращаем 10 бит в 9 бит
   Temperatura_single = Temp_w * 0.0521276596               ' Питание МК: 5в, делитель 20 КОm + 4.7 КОm
   Tstr$ = Fusing(temperatura_single , "#.&" )
   'Print #1 , " U" ; Temp_w ; "= " ; Tstr$ ; "v"
Return



'==========================================================
Vstavim_napryazhenie:                                       ' Вставим в СМС данные о режиме питания
   Print #1 , "Вставим в СМС данные о питании"
   Reset Watchdog

   If Temp_w < 268 Then                                     '  НЕТ 220 Вольт!!  питание ниже 14 вольт! А БП выдаёт 14.6в
      Otvet$ = Otvet$ + ", HET 220v! "

      If Temp_w < 215 Then                                  ' разряжен! Напряжение аккум-ра ниже 10,5 (+ 0,7в падения на диоде = 11,3в)
         Otvet$ = Otvet$ + "AKKYM PA3P! "
      End If

   Else
      Otvet$ = Otvet$ + ", 220v HOPMA "
   End If

'   Print #1 , Otvet$
Return






'======================================================================
Zamer_t:                                                    ' Измерим температуру двумя датчиками
   Reset Watchdog
   Temperatura_1 = 0
   Temperatura_2 = 0
   Temperatura_single = 0


' 1-й датчик    Установим разрядность 11 бит
   1wreset Pind , 7                                         ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pind , 7                              ' Выдаем команду SKIP ROM
   1wwrite &H4E , 1 , Pind , 7                              ' Установим...
   1wwrite 0 , 1 , Pind , 7
   1wwrite 0 , 1 , Pind , 7
   1wwrite &B01011111 , 1 , Pind , 7                        '... разрядность 11 бит

   1wreset Pind , 7                                         ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pind , 7                              ' Выдаем команду чтения ПЗУ
   1wwrite &H44 , 1 , Pind , 7                              ' Запуск измерения

   Reset Watchdog : Waitms 385                              ' Ждем окончания преобразования

   1wreset Pind , 7                                         ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pind , 7
   1wwrite &HBE , 1 , Pind , 7                              ' Команда чтения ОЗУ датчика

   Temp_massiv_9bait(1) = 1wread(9 , Pind , 7 )             ' Принимаем 8 байт данных  во временный буфер
   If Err = 0 Then                                          ' Если получили ответ датчика без ошибок

      If Temp_massiv_9bait(9) = Crc8(temp_massiv_9bait(1) , 8) Then       '   Проверяем CRC полученных данных
         Znak_temperatury_1 = "+"

         ' Проверяем на отрицательную температуру. 248 в десятичном, 11111000 в двоичном.
         If Temp_massiv_9bait(2) >= 248 Then                ' Если температура отрицательная – вычитаем из &HFF
            Temp_massiv_9bait(1) = &HFF - Temp_massiv_9bait(1)
            Temp_massiv_9bait(2) = &HFF - Temp_massiv_9bait(2)
            Znak_temperatury_1 = "-"                        '  -   температура отрицательная
         End If

         Temp2 = Temp_massiv_9bait(1) : Temp2 = Temp2 And &B00001111       ' оставим 4 младших бита = Т после запятой

         Shift Temp_massiv_9bait(1) , Right , 4             ' Сдвигаем первый байт вправо на 4 бита
         Shift Temp_massiv_9bait(2) , Left , 4              ' Сдвигаем второй байт влево на 4 бита

         Temperatura_single = Temp2 * 0.0625                ' получаем температуру после запятой
         Temp2 = Temp_massiv_9bait(1) + Temp_massiv_9bait(2)       ' Целое значение температуры
         Temperatura_single = Temperatura_single + Temp2    ' Формируем результат
         Temperatura_1 = Temperatura_single * 10
      Else                                                  ' Ошибка
         Incr Problema
         Print #1 , "Err=t1"
      End If

   Else                                                     ' Ошибка
      Incr Problema
      Print #1 , "Err=t1a"
   End If


   Reset Watchdog

' 2-й датчик   Установим разрядность 11 бит
   1wreset Pinb , 0                                         ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pinb , 0                              ' Выдаем команду SKIP ROM
   1wwrite &H4E , 1 , Pinb , 0                              ' Установим...
   1wwrite 0 , 1 , Pinb , 0
   1wwrite 0 , 1 , Pinb , 0
   1wwrite &B01011111 , 1 , Pinb , 0                        '... разрядность 11 бит

   1wreset Pinb , 0                                         ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pinb , 0                              ' Выдаем команду чтения ПЗУ
   1wwrite &H44 , 1 , Pinb , 0                              ' Запуск измерения

   Reset Watchdog : Waitms 385                              ' Ждем окончания преобразования

   1wreset Pinb , 0                                         ' Инициализация шины 1Wire
   1wwrite &HCC , 1 , Pinb , 0
   1wwrite &HBE , 1 , Pinb , 0                              ' Команда чтения ОЗУ датчика

   Temp_massiv_9bait(1) = 1wread(9 , Pinb , 0 )             ' Принимаем 8 байт данных  во временный буфер
   If Err = 0 Then                                          ' Если получили ответ датчика без ошибок

      If Temp_massiv_9bait(9) = Crc8(temp_massiv_9bait(1) , 8) Then       '   Проверяем CRC полученных данных
         Znak_temperatury_2 = "+"

         ' Проверяем на отрицательную температуру. 248 в десятичном, 11111000 в двоичном.
         If Temp_massiv_9bait(2) >= 248 Then                ' Если температура отрицательная – вычитаем из &HFF
            Temp_massiv_9bait(1) = &HFF - Temp_massiv_9bait(1)
            Temp_massiv_9bait(2) = &HFF - Temp_massiv_9bait(2)
            Znak_temperatury_2 = "-"                        '  -   температура отрицательная
         End If

         Temp2 = Temp_massiv_9bait(1) : Temp2 = Temp2 And &B00001111       ' оставим 4 младших бита = Т после запятой

         Shift Temp_massiv_9bait(1) , Right , 4             ' Сдвигаем первый байт вправо на 4 бита
         Shift Temp_massiv_9bait(2) , Left , 4              ' Сдвигаем второй байт влево на 4 бита

         Temperatura_single = Temp2 * 0.0625                ' получаем температуру после запятой
         Temp2 = Temp_massiv_9bait(1) + Temp_massiv_9bait(2)       ' Целое значение температуры
         Temperatura_single = Temperatura_single + Temp2    ' Формируем результат
         Temperatura_2 = Temperatura_single * 10
      Else                                                  ' Ошибка
         Incr Problema
         Print #1 , "Err=t2"
      End If

   Else                                                     ' Ошибка
      Incr Problema
      Print #1 , "Err=t2a"
   End If

Return




'==========================================================
Vstavim_temperaturu:                                        ' Вставим в СМС данные температуры
   Print #1 , "Вставим температуру в СМС"
   Reset Watchdog

   Tstr$ = Str(temperatura_1)
   If Temperatura_1 < 100 Then Tstr$ = " " + Tstr$
   Tstr$ = Left(tstr$ , 2) + "." + Right(tstr$ , 1)
   Otvet$ = Otvet$ + " T1=" + Chr(znak_temperatury_1) + Tstr$

   Tstr$ = Str(temperatura_2)
   If Temperatura_2 < 100 Then Tstr$ = " " + Tstr$
   Tstr$ = Left(tstr$ , 2) + "." + Right(tstr$ , 1)
   Otvet$ = Otvet$ + ", T2=" + Chr(znak_temperatury_2) + Tstr$

'   Print #1 , Otvet$
Return



'======================================================================

Waitms_100:
   Waitms 100
Return

Waitms_500:
   Waitms 500 : Reset Watchdog
Return


Waitms_750:
   Waitms 750 : Reset Watchdog
Return


Wait_5sec:
   For Temp3 = 0 To 9                                       ' 5 сек
      Gosub Waitms_500
   Next
Return


Wait_4sec:
   For Temp3 = 0 To 3                                       ' 4 сек
      Led = 1 : Waitms 100 : Led = 0
      Waitms 50
      Led = 1 : Waitms 100 : Led = 0
      Waitms 750 : Reset Watchdog
   Next
Return


'======================================================================
Flushbuf:                                                   ' очистка буфера
   Gosub Waitms_100
   Clear Serialin
Return


'======================================================================
Getline:                                                    ' подпрограмма для разбора сообщения модуля
   Gosub Waitms_100
   Sms$ = ""
   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 , "Запуск модема... " ;
   Reset Watchdog
   ' Error_d  ' Флаг ошибки И счетчик попыток перезапуска. При входе в эту ПП он был Error_d=0

   Pwkey_gsm = 1                                            ' питание модема
   For Temp = 0 To 35                                       ' ~1.7 сек
      Toggle Led
      Waitms 50
      Reset Watchdog
   Next
   Pwkey_gsm = 0                                            ' питание модема

   Gosub Wait_4sec                                          ' ждем пока модем активируется

   Print "AT" : Gosub Waitms_100
   Print "ATE0"

   Reset Watchdog

   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


'   Gosub Flushbuf             'очистка буфера. Внутри есть waitms 100
'   Print "AT+GSN" : Gosub Waitms_750       ' вернет IMEI модуля
'   Gosub Getline              ' ответ модема
'   Imei$ = Sms$               ' 359772030617832
'   Print #1 , "IMEI=" ; Imei$ ' Читаем строку с IMEI


   Reset Watchdog
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100

   Print "AT+CPBS=" ; Chr(34) ; "SM" ; Chr(34) : Gosub Waitms_100       ' Выбрать Сим-карту как память
   Gosub Getline
   Print #1 , "SIM: " ; Sms$
   If Sms$ = "ERROR" Then                                   ' Нет СИМ-карты!
      Print #1 , "Нет СИМ-карты! "
      Gsm_ok = 0                                            ' Нет связи GSM
      Goto Init_modem_end                                   ' Выходим
   End If

   For Temp = 0 To 29                                       ' ждем 15 сек пока модем активируется
      Toggle Led                                            ' Св.диод
      Gosub Waitms_500
      Print #1 , ".";
      Reset Watchdog
   Next


   Reset Watchdog

   Counter_c = 50                                           ' до 35 секунд ожидания регистрации
   Do
      Decr Counter_c
      If Counter_c = 0 Then                                 ' Время ожидания решистрации модема вышло
         If Error_d < 1 Then                                ' Делаем 2 попыток перезапустить GSM-модем
            Incr Error_d
            Goto Init_modem                                 ' Перезапуск модема
         Else                                               ' Если и так не удалось, то:
            Print #1 , "Связь не восстановили"
            Gsm_ok = 0                                      ' Нет связи GSM
            Goto Init_modem_end                             ' Выходим
         End If
      End If
      Toggle Led
      Reset Watchdog
      Print "ATE0"
      Gosub Flushbuf                                        'очистка буфера. Внутри есть waitms 100
      Print "AT+COPS?" : Gosub Waitms_750                   ' выдаст имя оператора связи
      Gosub Getline : Print #1 , ">" ; Sms$ ; ".";          ' ответ модема
   Loop Until Len(sms$) > 12                                ' ждём когда модуль даст имя оператора, а не пустоту

   Led = 1                                                  ' GSM-модем ответил 1=On

   Print "AT+CMGF=1" : Gosub Waitms_100                     ' включить текстовый режим SMS
   Print "AT+CSCS=" ; Chr(34) ; "GSM" ; Chr(34) : Gosub Waitms_100       ' Кодировка текста GSM (только латинские)
   Reset Watchdog

   Print "AT+GSMBUSY=0" : Gosub Waitms_100                  ' 0 = разрешить входящие, 1=Запретить
   Print "AT+CLIP=1" : Gosub Waitms_100                     ' включить АОН
   Print "AT+DDET=1" : Gosub Waitms_100                     ' Включить детектор DTMF
   Print "AT+CSCB=0" : Gosub Waitms_100                     ' прием широковещательных сообщений

   Reset Watchdog
   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 Delete_sms                                         ' Удалим СМС

   Led = 0                                                  '  0=Off
   Gsm_ok = 1                                               ' Есть связь GSM  ' Всё хорошо, Без ошибок

Init_modem_end:
   Reset Watchdog
   If Gsm_ok = 1 Then                                       ' Без ошибок
      Print #1 , " GSM OK!!"
      Gosub Chitaem_nomera                                  ' Читаем номера
      If Error_d = 1 Then                                   ' Мало записей! Обязано быть 2: Номер босса, Номер пользователя
         Print #1 , "Нет номера на SIM!"
         Goto Error_loop
      End If

   Else                                                     ' Нет связи GSM
      Print #1 , " Ошибка GSM!"
      Gosub Gsm_modem_off                                   ' Отключаем GSM-модем
   End If

   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
Return





'======================================================================
Delete_sms:                                                 ' Удалим СМС
   Reset Watchdog
   Print "AT+CMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34)
   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
Return





'======================================================================
Vydelim_nomer_iz_stroki:                                    ' Выделение Номера Из Строки В Ковычках И С "+" вначале
   Number$ = ""
   For Temp2 = 1 To Len(sms$)                               '  От ковычки до ковычки
      Simvol$ = Mid(sms$ , Temp2 , 1)                       ' символ из номера
      If Simvol$ = Chr(34) Then Exit For                    ' как только встретили "кавычки" = выход, так как номер закончился
      If Simvol$ <> Chr(43) Then                            ' если не +
         'If Simvol$ >= "0" Then
         'If Simvol$ =< "9" Then
         Number$ = Number$ + Simvol$
         'End If                                ' Simvol$ < "9"
         'End If                                   '  If Simvol$ > "0"
      End If                                                '  if Simvol$ <> Chr(43)
   Next                                                     '  For temp2
   ''Print #1 , "!>  " ; Number$
Return




'===========================================================
Error_loop:                                                 ' Пищим и мигаем бесконечно

   Led = 0                                                  ' Отключаем

   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



'*******************************************************************************
Zhdem_otvet_ok:                                             ' Ждём ответ GSM-модема
   Counter_c = 100                                          ' 10 секунд ожидания
   Sms$ = ""
   Error_d = 0

   While Sms$ <> "OK"                                       ' ждём
        'Toggle Led
      Decr Counter_c
      If Counter_c = 0 Then
         Error_d = 1                                        ' Ошибка!
         Exit While
      End If

      Reset Watchdog
      Gosub Getline
      'Print #1 , Sms$ ; " <"
      If Sms$ = "ERROR" Then
         Error_d = 1                                        ' Ошибка!
         Exit While
      End If
   Wend

   'Led = 1                                                ' Off

   If Error_d = 0 Then                                      ' Без ошибок
      Print #1 , "> " ; Sms$                                ' ответ модема
   Else
      Print #1 , "ERROR"
   End If

Return



   '======================================================================
Gsm_modem_off:                                              ' Отключим GSM-модем
   Print #1 , "Отключим GSM-модем... " ;
   Reset Watchdog

   Gosub Flushbuf                                           'очистка буфера. Внутри есть waitms 100
   Print "AT"
   Gosub Zhdem_otvet_ok                                     ' Ждём ответ GSM-модема
   If Error_d = 1 Then                                      ' Если НЕ ответил - значит УЖЕ отключен
      Error_d = 0
      Goto Gsm_modem_off_end
   Else                                                     ' Если ответил
      'Print #1 , "Ответ модема: " ; Sms$       ' ответ модема
'      Print "AT+CPOWD=1"      ' Отключим GSM-модем программно
'      Print #1 , "Аппаратно отключим модем..."
      Pwkey_gsm = 1                                         ' не менее 1.5 сек для управления питанием !!!
      Led = 1                                               ' Включим
      Reset Watchdog
      Waitms 1700
      Reset Watchdog
      Led = 0                                               ' Отключим
      Pwkey_gsm = 0
   End If

   Counter_c = 80                                           ' модем долго засыпает, ждём до 8 секунд
   Do
      Toggle Led
      Reset Watchdog
      Decr Counter_c
      If Counter_c = 0 Then
         Error_d = 1
         Goto Gsm_modem_off_end
      End If
      Gosub Getline                                         ' в ПП есть пауза 100mS
   Loop Until Len(sms$) > 12                                ' ждём когда модуль даст длинное сообщение

'  Print #1 , ">> " ; Sms$             ' GSM-модем должен ответить "NORMAL POWER DOWN"
   Error_d = 0

Gsm_modem_off_end:
   Print #1 , "GSM-модем отключен"
   Gsm_ok = 0
Return



'===========================================================
Chitaem_nomera:                                             ' Читаем номера телефонов с sim
   Print #1 , "Читаем номера телефонов с SIM"
   Error_d = 0
   Reset Watchdog

   Print "AT+CPBS?" : Gosub Waitms_100
   ' сообщит тип памяти, количество имеющихся записей и их максимальное количество.
   ' Например:  +Cpbs : «sm»,5,250  Значит , Что на SIM -карте есть 5 записей из 250 возможных.

   Gosub Getline
   'Print #1 , Sms$       ' Читаем строку с данными

   Sms$ = Mid(sms$ , 13 , 2)
   Temp = Val(sms$)                                         ' количество записей в SIM
   'Print #1 , Sms$ ; " " ; Temp

'      Print "AT+CPBW=1" : Gosub Waitms_500
'      Print "AT+CPBW=1," ; Chr(34) ; "79151104561" ; Chr(34) ; ",145," ; Chr(34) ; "Call" ; Chr(34)
'      Gosub Waitms_500

'      Print "AT+CPBW=2" : Gosub Waitms_500
'      Print "AT+CPBW=2," ; Chr(34) ; "79151104561" ; Chr(34) ; ",145," ; Chr(34) ; "SMS" ; Chr(34)
'      Gosub Waitms_500

   If Temp < 3 Then                                         ' Мало записей! Обязано быть 3: Номер босса, Номер пользователя и баланс
      Error_d = 1

'      Print "AT+CPBW=1" : Gosub Waitms_500
'      Print "AT+CPBW=1," ; Chr(34) ; "79151104561" ; Chr(34) ; ",145," ; Chr(34) ; "Call" ; Chr(34)
'      Gosub Waitms_500

'      Print "AT+CPBW=2" : Gosub Waitms_500
'      Print "AT+CPBW=2," ; Chr(34) ; "79151104561" ; Chr(34) ; ",145," ; Chr(34) ; "SMS" ; Chr(34)
'      Gosub Waitms_500

'      Print "AT+CPBW=3" : Gosub Waitms_500
'      Print "AT+CPBW=3," ; Chr(34) ; "*100#" ; Chr(34) ; ",255," ; Chr(34) ; "USSD" ; Chr(34)
'      Gosub Waitms_500
   Else

    ' В записях 1-3
      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,"имя"

         Sms$ = Mid(sms$ , 11 , 19 )
         Gosub Vydelim_nomer_iz_stroki                      ' Выделение # из строки в ковычках и с "+" вначале в переменную Number$

         If Counter_c = 1 Then
            Phone_boss$ = Number$
            Print #1 , "Звонить на " ; Phone_boss$          '  Номер для звонков
         End If

         If Counter_c = 2 Then
            Phone_user$ = Number$
            Print #1 , "SMS на " ; Phone_user$              '  Номер для SMS
         End If

         If Counter_c = 3 Then
            Phone_balans$ = Number$
            Print #1 , "Баланс " ; Phone_balans$            '  Номер для запроса баланса
         End If


         If Jumper = 0 Then                                 ' Если перемычка установлена, то заменим считанные номера
            Phone_boss$ = "79151104561"
            Phone_user$ = "79151104562"
         End If


      Next

   End If

Return




'======================================================================
Opros_sms:                                                  ' обработка новой SMS
   Reset Watchdog
   Gosub Waitms_750
   Gosub Getline                                            'читаем, здесь сама СМС команда
   Sms$ = Lcase(sms$)                                       ' Все символы SMS - в нижний регистр!

Opros_sms_for_test:
   Print #1 , "Команда: " ; Sms$

   If Sms$ = "balans" Then                                  ' Запрос баланса
      Print "AT+CUSD=1," ; Chr(34) ; Phone_balans$ ; Chr(34)       ' Запросим баланс
      Gosub Flushbuf                                        'очистка буфера
      Gosub Wait_5sec                                       ' Не меньше!!! чтобы оператор успел ответить!!!
      Gosub Wait_5sec                                       ' Не меньше!!! чтобы оператор успел ответить!!!
      Gosub Getline
      Print #1 , Sms$ ; " <!"                               ' Читаем строку с ответом оператора
      Otvet$ = Otvet$ + Mid(sms$ , 11 , 150 )               ' уберём начало ответа оператора.
      'Gosub Sendsms                               ' Отправим сообщение
   End If


   If Sms$ = "info" Then                                    ' Запрос состояния
      Otvet$ = ""
      Gosub Zamer_t                                         ' Измерим температуру на двух датчиках
      Gosub Vstavim_temperaturu                             ' Вставим в СМС данные температуры

      Gosub Zamer_napryazheniya                             ' Измерим напряжение питания
      Gosub Vstavim_napryazhenie                            ' Вставим в СМС данные о режиме питания
   End If



   If Sms$ = "reset" Then
      Goto Reset_device                                     ' Полный перезапуск устройства!!
   End If


   If Sms$ = "rele1+" Then                                  ' Включим реле1
      Rele1 = 1 : Otvet$ = "Rele1 vkl!"
   End If

   If Sms$ = "rele1-" Then                                  ' Отключим реле1
      Rele1 = 0 : Otvet$ = "Rele1 otkl!"
   End If

   If Sms$ = "rele2+" Then                                  ' Включим реле2
      Rele2 = 1 : Otvet$ = "Rele2 vkl!"
   End If

   If Sms$ = "rele2-" Then                                  ' Отключим реле2
      Rele2 = 0 : Otvet$ = "Rele2 otkl!"
   End If

   If Sms$ = "rele--" Then                                  ' Отключим все реле
      Rele1 = 0 : Rele2 = 0 : Otvet$ = "Vse rele otkl!"
   End If

   If Sms$ = "impuls" Then                                  ' импульс на выходе o1
      Out_1 = 1 : Gosub Waitms_750 : Out_1 = 0
      Otvet$ = "Impuls OK!!"
   End If


   If Len(sms$) > 6 Then
      Tstr$ = Mid(sms$ , 7 )
      Sms$ = Mid(sms$ , 1 , 6 )
      Print #1 , Sms$
      Print #1 , Tstr$

      If Sms$ = "ussd: " Then                               ' Запросы или управление через USSD
         '  Print "ATD" ; Chr(34) ; Tstr$ ; Chr(34)  ' Запросим
         Print "ATD" ; Tstr$                                ' Запросим баланс
         Gosub Flushbuf                                     'очистка буфера
         Gosub Wait_5sec                                    ' Не меньше!!! чтобы оператор успел ответить!!!
         Gosub Wait_5sec                                    ' Не меньше!!! чтобы оператор успел ответить!!!
         Gosub Getline
         Print #1 , Sms$ ; " <U"                            ' Читаем строку с ответом оператора
         Otvet$ = Mid(sms$ , 11 , 150 )                     ' уберём начало ответа оператора.
         'Gosub Sendsms                            ' Отправим сообщение
      End If
   End If

   Gosub Sendsms                                            ' Отправим в сообщении ответ

Return                                                      ' обработка принятой SMS завершена




'======================================================================
Nam_pozvonili:                                              ' Обработка Входящего голосового вызова ----
   Reset Watchdog
   Toggle Led

   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 Peredal_net220 = 1 Then                               ' Нет 220 Вольт!
      Print "AT+VTS=" ; Chr(34) ; "A" ; Chr(34)             '  звуковой сигнал звонящему в линию
      Gosub Waitms_750
   End If


   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                               ' Сброс флагов тревоги
         'Timer_gsm = 180
         Peredal_vysokaya_temp_sms = 2 : Peredal_vysokaya_temp_call = 2
         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$ = "*#" Then                               ' Импульс на выход o1
         Out_1 = 1                                          ' Включить выход o1
         Gosub Waitms_750
         Out_1 = 0                                          ' Отключить выход o1
         Goto Nam_pozvonili_konec
      End If


      If Komanda$ = "5" Then                                ' смс-отчет на вызывающий номер
         Print "ATH0"                                       '  положить трубку
         Sms$ = "info"                                      ' Запрос состояния
         Goto Opros_sms_for_test
         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$ = "4" Then                                ' меняем Чувствительность микрофона, режим 4
'         Print "AT+CMIC=0,9"
'         Goto Nam_pozvonili_konec
'      End If
'      If Komanda$ = "5" Then                                ' меняем Чувствительность микрофона, режим 5
'         Print "AT+CMIC=0,10"
'         Goto Nam_pozvonili_konec
'      End If
'      If Komanda$ = "6" Then                                ' меняем Чувствительность микрофона, режим 6
'         Print "AT+CMIC=0,11"
'         Goto Nam_pozvonili_konec
'      End If
'      If Komanda$ = "7" Then                                ' меняем Чувствительность микрофона, режим 7
'         Print "AT+CMIC=0,13"
'         Goto Nam_pozvonili_konec
'      End If
'      If Komanda$ = "8" Then                                ' меняем Чувствительность микрофона, режим 8
'         Print "AT+CMIC=0,14"
'         Goto Nam_pozvonili_konec
'      End If
'      If Komanda$ = "9" Then                                ' меняем Чувствительность микрофона, режим 9
'         Print "AT+CMIC=0,15"                               ' максимальная
'         Goto Nam_pozvonili_konec
'      End If

      If Komanda$ = "0" Then                                ' Сброс флагов тревоги
         Peredal_vysokaya_temp_sms = 2 : Peredal_vysokaya_temp_call = 2
         Peredal_net220 = 0
         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

      If Komanda$ = "*2" Then
         Rele2 = 1                                          ' Включить реле 2
         Goto Nam_pozvonili_konec
      End If
      If Komanda$ = "#2" Then
         Rele2 = 0                                          ' Отключить реле 2
         Goto Nam_pozvonili_konec
      End If

      If Komanda$ = "*3" Then
         Out_1 = 1                                          ' Включить выход 1
         Goto Nam_pozvonili_konec
      End If
      If Komanda$ = "#3" Then
         Out_1 = 0                                          ' Отключить выход 1
         Goto Nam_pozvonili_konec
      End If

   End If                                                   '   If Tstr$ = "+DTMF:"


   Gosub Getline                                            ' смотрим что пришло от модема в буфер
   '   If Sms$ <> "" Then 'Print #1 , Sms$

   Goto Nam_pozvonili

Nam_pozvonili_konec:
   Gosub Waitms_100
   Print "AT+VTS=" ; Chr(34) ; "C" ; Chr(34)                '  звуковой сигнал звонящему в линию
   '   Print "AT+CLDTMF=1," ; Chr(34) ; "C,C" ; Chr(34)       ' зв.сигнал звонящему
   'Gosub Flushbuf                                 'очистка буфера. Внутри есть waitms 100
   Gosub Waitms_100
   Komanda$ = ""                                            ' обязательно вычистить переменную
   Sms$ = ""                                                ' обязательно вычистить переменную
   Temp_w = 0                                               ' Сбросим счетчик - Увеличим время до отключения связи
   Goto Nam_pozvonili



   '======================================================================
Reset_device:                                               ' ----  Перезапуск устройства!!  ----
   Gosub Gsm_modem_off                                      ' Отключим GSM-модем
   Config Watchdog = 512
   Start Watchdog
   Print #1 , "_ Перезапуск устройства _"
   'Pwkey_gsm = 1                                  ' не менее 1.5 сек для управления питанием !!!
   Do : Loop                                                ' Зависнем, чтобы перезапустить по сторожевому таймеру



  '

+3

33

MACTEPok написал(а):

какой ответ на запрос AT+CSMP?


AT+CSMP?
+CSMP: 17,255,0,0

А как переводите в UCS2?
И получение СМС в PDU или UCS2 не зависит от оператора или СМС центра, а только от настроек модуля. Это формат, в котором он отдает СМС а не получает от оператора, простите, сразу не сообразил сказать об этом.

+1

34

А как переводите в UCS2?
И получение СМС в PDU или UCS2 не зависит от оператора или СМС центра, а только от настроек модуля. Это формат, в котором он отдает СМС а не получает от оператора, простите, сразу не сообразил сказать об этом.

Командой AT+CSCS="UCS2", но это тоже не помогает.

0

35

Умопомрачительной фигнёй вы тут занимаетесь.  :D
Что вы там переключать пытаетесь, что оператор вам отдаёт (настройки) - то и будет. UCS2 как правило стандарт для наших операторов. Я лет 5 с этим столкнулся, думаю ничего не поменялось. Я в своё время на этом ресурсе оставлял перекодировщик (туда/сюда), потом удалил/обиделся (как Mrshilov).  :tomato:

0

36

RDW, а вот сфия ли мне оператор начал присылать смс с 7-и битным кодированием символов? Это если в сообщении только латиница и числа.

0

37

MACTEPok, ну а чего панику поднимать, в инете вся информация есть. Если лень делать гибкую поддержку всех форматов, то довольствуемся одной симкой/оператором и под неё всё делаем.

0

38

7 битная кодировка приходит только в PDU режиме, если я правильно помню. Я выше давал пример настройки, нужен текстовый режим смс.

0

39

MACTEPok
При первом включении модуля делаешь настройки на прием в текстовом формате.

Код:
'предварительные настройки
'********************************************************
Led = 1
Print "AT+CMGF=1"                                           'включаем текстовый формат сообщений
Waitms 50
Print "AT+CLIP=1"                                           'определение номера входящего вызова
Wait 3
Led = 0
Flushbuf

Все СМС отправленные с телефона будут приходить в нормальном текстовом формате. Но если хоть один символ в отправляемой СМС будет на кириллице, все будет получено SIM800 в UCS2.

+1

40

автор ленив - спасу нет! Я ж дал два исходника, сказал куда смотреть... Всё же по три раза разъяснили!

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 = разрешить входящие, 1=Запретить
   Print "AT+CLIP=1" : Gosub Waitms_100                     ' включить АОН
   Print "AT+DDET=1" : Gosub Waitms_100                     ' Включить детектор DTMF
   Print "AT+CSCB=0" : 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

Отредактировано Александр Д. (2019-05-23 11:52:11)

+1

41

rom-i, попробую так.

0

42

MACTEPok
Вообще эти настройки начинают работать когда SIM800L вошел в режим, то есть проморгался, связался с оператором. Для этого в программе задержку ставишь не меньше Wait 10. Дальше делаешь необходимые установки.
Вот полный код подготовки. Других настроек не делаю, нет необходимости.

Код:
    $regfile = "m8adef.dat"
$crystal = 16000000
$baud = 19200
$hwstack = 160
$swstack = 160
$framesize = 60

Declare Sub Getline(s As String)
Declare Sub Flushbuf()
Config Serialin = Buffered , Size = 120

Dim B As Byte
Dim S As String * 50
Dim Sk As String * 60

 Wait 10
    Do
     Print "AT"
     Waitms 40
    Getline Sk
    Loop Until Sk = "OK"  'не выйдет из цикла пока модуль не ответит OK
    Flushbuf

   Waitms 270

   Print "AT+CMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34)        'удаление смс

   Do
    Waitms 40
    Getline Sk
    Loop Until Sk = "OK" 'не выйдет из цикла пока модуль не ответит OK

    Flushbuf
    Waitms 270
    Print "AT+CMGF=1" 'включаем текстовый формат сообщений
    Waitms 50  
    Print "AT+CLIP=1"   'определение номера входящего вызова
    Wait 3
    Flushbuf
'подпрограмма для разбора сообщения модуля
'=========================================================================
Sub Getline(s As String)
   S = ""
   Do

      B = Inkey()                                           'берем символ из буфера в формате ASCII
      Select Case B
          Case 10 : If S <> "" Then Exit Do                 'конец строки, значит выходит из подпрограммы
          Case Else : If B > 31 Then S = S + Chr(b)         'печатаемые символы начинаются с кода 32 по таблице АСКИ, из них составляем строку
      End Select
   Loop
End Sub
'очистка буфера
'=========================================================================
Sub Flushbuf()
 Waitms 100
 Do
 B = Inkey()                                                'забираем все из буфера
 Loop Until B = 0
End Sub

Для разбора ответов свои подпрограммы. Единствеено где приходится работать с юникодом, это когда узнаешь баланс. Запрос USSD. Наши операторы обязательно добавят чего на кириллице.

Код:
'==========Переменные баланса счета======================================================================
Dim Bal As Byte
Dim Sim As Byte : Sim = 1
Dim Sim_str As String * 4
Dim Cifra As String * 1
Dim Val_numeric As Byte : Val_numeric = 1
'=========================================================================
Balanse:
  Print "AT+CUSD=1,{034}*105#{034}"
  Wait 1
  Getline Sk
  Getline Sk
  Getline Sk
  Getline Sk
  Getline Sk
  Waitms 10
  Gosub Баланс
Flushbuf
Return
'========Баланс=============================================================
Баланс:
    Sim = 1
    Val_numeric = 1
    Otvet = ""
    Cifra = ""
    For Bal = 0 To 60
     Sim_str = Mid(sk , Sim , 4)
    Select Case Sim_str
      Case "0030" : Cifra = "0"
      Case "0031" : Cifra = "1"
      Case "0032" : Cifra = "2"
      Case "0033" : Cifra = "3"
      Case "0034" : Cifra = "4"
      Case "0035" : Cifra = "5"
      Case "0036" : Cifra = "6"
      Case "0037" : Cifra = "7"
      Case "0038" : Cifra = "8"
      Case "0039" : Cifra = "9"
      Case "002E" : Cifra = "."
      Case "002C" : Cifra = "."
      Case "0070" : Cifra = "p"
      Case Else : Cifra = ""
    End Select

      If Cifra <> "" Then Val_numeric = 4
        Otvet = Otvet + Cifra
      If Cifra = "p" Then Bal = 60
      Sim = Sim + Val_numeric
      Cifra = ""
    Next Bal

    Otvet = "Balans:" + Otvet
  Gosub Sendsms
Return
'======подпрограмма отправки смс===== 
Sendsms:
Print "AT+CMGS=" ; Chr(34) ; Phonenumber ; Chr(34)
Waitms 200
Print Otvet ; Chr(26)
Print Chr(26);
Wait 1
Print Chr(13)
Waitms 100

Return

Количество строк в ответе Getline Sk можно уменьшить на одну если отключить в модуле эхо. В установках добавить ATE0.
Так же AT+CSCS="GSM" кодировка текстового режима, но он такой по умолчанию
Там в ответе идет наколько помню.
1 Эхо
2 Пустая строка
3 Пустая строка
4 Ок
5 Нужный ответ
Как то так  :nope:
Если использовать еще как звонилку, настройка чутья микрофона. Пугать воров по громкой связи, количество гудков до подъема трубки. Скорость USART, но прекрасно работают по умолчанию 19200.
Настройками интернет не занимался, и не собираюсь.
Использую для контроля (типа охранки). Принимает команды, отправляет СМС с данными. Типа

Код:
 If Sms = "?" Then  'если придет знак вопроса отправим в ответ полное состояние модуля
   Otvet = "SIM800L" + Chr(10)
   Otvet = Otvet + "Kotel:" + Tstr1 + "'C" + Chr(10)
   Otvet = Otvet + "Max:" + Tds1_maxstr + "'C  Min:" + Tds1_minstr + "'C" + Chr(10)
   Otvet = Otvet + "Dat1:" + Tdsrx2_str + "'C " + "Bat:" + B2str + "V" + Chr(10)
   Otvet = Otvet + "Dat2:" + Tdsrx3_str + "'C " + "Bat:" + B3str + "V" + Chr(10)
   Otvet = Otvet + "Ulica:" + Tdsrx1_str + "'C " + "Bat:" + B1str + "V" + Chr(10)
   Otvet = Otvet + "Akkum:" + Vbatstr + "V" + Chr(10)
   Otvet = Otvet + "Pitanie:" + Pitanie
   Gosub Sendsms
   Sms = ""
 End If

http://s9.uploads.ru/t/Lf2qJ.png

Или просто раз в сутки отправляет данные с температурами например в погребе. Часто просят такую штучку. Особенно когда погреб не обкатан.

Отредактировано rom-i (2019-06-01 00:48:26)

0

43

rom-i, с текстовым режимом прокатило, спасибо!

Код:
AT+CSCS="GSM"
AT+CLIP=1
AT+CMGF=1

+CMT: "+79xxxxxxxxx","","19/05/24,07:49:03+12"
041F04400438043204350442
--> "Привет"

+CMT: "+79xxxxxxxxx","","19/05/24,08:01:47+12"
1111
--> "1111"


Для себя сделал вывод, что с PDU режимом AT+CMGF=0 нечего и связываться  :angry:

0

44

MACTEPok
Честно не понял чем Вы занимаетесь с SIM800l. Пытать черезь терминал, или реально работать с МК.
Дык, абсолютно разные веши.
Заинтерисовала тема SIM808. Пока только повторил чужей проект. Но там уже GSM, GPS, BT. Вот где можно с АТ коммандами поиграться. Но у чела, мега8 не только СМС принимает. Можно голосом комманды посылать. В ответ тебе СМС с координатами где находится твой девайс. Хотишь для Gugl, или Yanex карт. Просто разные прошивки.
Круть.

0

45

Работаю с SIM800C, разницы по командам нет. Делаю сигналку с автозапуском. Голосове меню с DTMF, координаты от оператора сети тоже выдает, BT есть, но она как бы и никчему, с МК напрямую общается. А по настройкам смс, задача была предусмотреть возможность пересылки входящих смс всех форматов (на SIM800) на номер хозяина.

0

46

MACTEPok
Смысл передовать хозяину бред от оператора. Хотишь бреда, включи первый канал телевидения.
С этой херней борюсь до сих пор. Не умею разкладывать переменные в памяти. Из за этого идет перехлест переменных. Сотовые операторы спецом банят номера (купи, возьми, и тд). Это борьба с терроризмом. Не сможешь к сотовому оператору закладку привязать.
Пишут все на кириллице тож спецом.
Вопрос. Ну, и зачем это нужно передовать хозяину?
Если она нужна, придется таблицу Case рисовать на дохрена символов. Переводить на транслит.
У мну СМС не от хозяина, просто стираються. Их дажа МК не читает. Номер телефона не сошелся, нахрен сразу удаление.
Print "AT+CMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34)
Повторение пока не будет ответ Ок.
Number = Mid(sk , 22 , 12)                       'достаем номер с которого пришла смска

Отредактировано rom-i (2019-05-25 16:03:55)

0

47

Такое ТЗ, что поделать.
USSD модем запрашивать не будет, т.к. есть возможность проверять баланс через личный кабинет. Переадресация смс хозяину на случай, если на модем придет код авторизации или что то еще полезное. Функция переадресации смс отключаемая.
Я изначально хотел с PDU форматом работать, чтобы кириллица и латиница одинаково отображалась, из входящего PDU пакета забрать DATA без расшифровки, скомпоновать смс и отправить хозяину. Но вот фиг. Столкнулся с проблемой, что PDU может приходить в разных кодировках (8 и 7 битной).

По приему и хранению смс, модуль настраиваю сразу:

Код:
AT+CNMI=2,2,0,0,0

СМСки в памяти модуля не сохраняются, содержимое СМС выдается вместе с индикатором нового сообщения.

0

48

MACTEPok
Про 7 бит, не видал.
Это из области андроидов. Там мона, и 3 битную встретить.
Кинь образец 7 битной.

0

49

rom-i
смотри 31 сообщение выше. режим pdu включен

0

50

MACTEPok
Понял.
У Вас операторы не ученые. По этому кодировки меняються.
Про 7 битную выл вопрос. Операторы ТЕЛЕ2 только черезь полгода появились.

Отредактировано rom-i (2019-05-25 19:53:03)

0

51

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

0

52

MACTEPok
Если не бытовуха, можно с операторами (сотовыми) заключить договор. Это может сделать даже обычное физическое лицо. Будет сниматься трафик. Но, но СМС будут приходить только в нужной форме. Форма обговаривается в договоре.
У мну одна тема заводская так работает давно. Договор с операторами только на транслит. И ни каких юникодов.
Но оформлен договор как юридическое лицо.
От Вас только узнал, что действительно СМС могут приходить в 7 битном формате.
Век живи, век учись.  o.O

0

53

читаю как сказку... Чем дальше - тем страшнее
А просто набрать команду ussd не пробовали? я ж в исходниках указал для двух операторов.
просто набираете и все СМС придут в указанной форме. Никаких договоров!

Отредактировано Александр Д. (2019-05-26 14:59:50)

0

54

Всем привет, хочу адаптировать данное устройство SIM 900 под свои нужды.
Как я понимаю подпрограмма разбора сообщения считывает по одной строчки за обращение к ней, то есть если мне нужна вторая строчка то я должен обратится к ней дважды?

Код:
Sub Getline(s As String)
   S = ""
    Dim Bb As Byte
   Do
      B = Inkey()                                           'берем символ из буфера в формате ASCII
      Select Case B
          Case 0                                            'возвращает в случае пустого буфера
         Case 13                                            'возврат каретки (Enter), заместо него можно поставить пробел
          Case 10 : If S <> "" Then Exit Do                 'конец строки, значит выходит из подпрограммы
          Case Else : If B > 31 Then S = S + Chr(b)         'печатаемые символы начинаются с кода 32 по таблице АСКИ, из них составляем строку
      End Select
Incr Bb
  If Bb > 100 Then                                          'выйдем после 100 итераций
   Res = 1
   Waitms 300
   Res = 0
   Exit Do
End If
   Loop
Bb = 0                                                      'обнуляем переменную
End Sub


Getline Sk
  Waitms 100
  Getline Sk

К подпрограмме очистки буфера нужно обращаться перед или после AT команд?

0

55

1. да, сколько строк надо, столько раз и вычитываете.
2. я очищаю делаю паузу 50ms, очищаю буфер и даю AT команду. Дальше по ситуации: или жду ответа (или OK), или работаю дальше и время от времени анализирую буфер и его содержимое.

0

56

Какая то беда с прошивкой, есть три меги 8 и одна 238р, заливаю во все одно и то же и все не работают по разному.
Установил другую версию баскома, может из нее глюки. Причем глюки непонятные, то после прихода нового смс перезагружается контроллер (блок питания 3,5А)
Сегодня целый день провозился...
Благо модуль работает исправно правда пока только от терминала.
Взял за основу все таки SIM800L 7cn In/Out, без путаницы с выводом на дисплей.

0

57

в теме лежат два исходника, рабочие. Какой-то под sim900d - можете его попробовать

0

58

Подскажите о каких спец сообщениях идет речь?
AT+CSCB=0 OK Приём специальных сообщений
0 – разрешен (по умолчанию)
1 – запрещен

Александр Д.
У вас в исходниках используется хранение номеров телефона не в ееprom контроллера, а на сим карте, скорее всего так правильнее попробую реализовать так же.

0

59

есть проект, где и в EEPROm, но что это меняет, если вы работаете с самим модулем?

0

60

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

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Использование модуля SIM800l