реально работающий несколько лет проект, переработан на модуль 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
'




