$regfile = "m32def.dat" $crystal = 16000000 $baud = 19200 $hwstack = 32 'default $swstack = 32 'default $framesize = 100 'пока минимум, посмотрим как разрастется программа Declare Sub Getline(s As String) Declare Sub Flushbuf() Config Serialin = Buffered , Size = 60 Config 1wire = Portd.4 'тут датчик 18b20 Enable Interrupts 'подключение светодиода '====================================================================================== Config Porta.2 = Output Led Alias Porta.2 Led = 0 Config Portd.6 = Input 'пин контроля включенности модуля Vkl Alias Pind.6 Config Portd.7 = Input 'датчик движения Pir Alias Pind.7 Reset Pind.7 '====================================================================================== Config Portd.5 = Output 'пин для включения модуля Powerkey Alias Portd.5 Powerkey = 0 Dim Volt As Single Dim Number As String * 11 'номер телефона Dim Temp As String * 10 Dim Temp1 As String * 10 Dim Temp2 As String * 10 Dim Rs As Byte Dim A As Byte Dim S As String * 50 Dim B As Byte Dim R As Byte Dim Z As String * 15 Dim Sms_num As String * 2 'порядковый номер смс Dim Stmp As String * 1 Dim Sms As String * 120 Dim Otvet As String * 60 'сообщение, которое модуль будет отправлять Dim Sk As String * 120 Dim Tmr As Byte Dim Sms_val As Byte Dim T As Byte 'температура Dim Sign As String * 5 'знак температуры Dim Byte0 As Byte Dim Byte1 As Byte Dim T1 As Byte Dim T2 As Byte Dim Tstr As String * 4 'Const Phonenumber = "+7908ххххххх" 'номер на который будут отправляться смс Const Phonenumber = "+79164799xxx" Gosub Module 'предварительные настройки '******************************************************** Print "AT+CMGF=1" 'включаем текстовый формат сообщений Flushbuf 'Главный цикл программы '******************************************************** Do R = Ischarwaiting() 'проверка наличия сообщения в буфере If R = 1 Then 'там что-то есть, поэтому Led = 1 Getline Sk 'уходим на подпрограмму и смотрим что пришло Z = Left(sk , 4) 'вытаскиваем левые 4 символа If Z = "+CMT" Then 'если +СМТ, значит пришло смс которое надо прочитать Sms_num = Right(sk , 2) 'смотрим какая по счету смс Stmp = Left(sms_num , 1) 'смотрим первый символ слева If Stmp = "," Then Sms_num = Right(sk , 1) 'если там "," значит берем первый символ справа. это и будет номером пришедшего смс End If Wait 1 Number = "" Print "AT+CMGR=" ; 'команда на чтение смс Print Sms_num 'отправляем номер смски которую надо прочитать Waitms 10 Getline Sk Getline Sk Number = Mid(sk , 22 , 12) 'достаем номер с которого пришла смска Sms = Sk 'здесь первая строка ответа Waitms 10 Getline Sk Sms = Sk If Sms = "1" Then 'померяем и отправим температуру Gosub 18b20 Tstr = Str(t) Otvet = Sign + Tstr Gosub Sendsms Flushbuf End If If Sms = "2" Then Print "AT+CBC" 'питание, милливольт Wait 1 Getline Sk Getline Sk Getline Sk Otvet = Mid(sk , 12 , 4) Gosub Sendsms Led = 1 Waitms 50 Led = 0 Waitms 300 Led = 1 Waitms 50 Led = 0 Wait 2 End If Flushbuf If Sms = "3" Then Print "ATD*100#" 'баланс Wait 1 Getline Sk Getline Sk Getline Sk Otvet = Mid(sk , 11 , 7) Gosub Sendsms End If Print "AT+CMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34) 'удаление смс End If Waitms 100 Flushbuf End If Led = 0 Waitms 500 If Vkl = 0 Then Gosub Module 'если модуль выключен Else End If '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! If Pir = 1 Then 'если сработал датчик Led = 1 Wait 5 Led = 0 'Otvet = "Srabotal datchik na verande" 'раскоментировать для отправки смс 'Gosub Sendsms 'раскоментировать для отправки смс End If Loop End 'подпрограмма для разбора сообщения модуля '============================================================================= Sub Getline(s As String) S = "" 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 Loop End Sub 'очистка буфера '============================================================================= Sub Flushbuf() Waitms 100 Do B = Inkey() 'забираем все из буфера Loop Until B = 0 End Sub 'подпрограмма отправки смс '******************************************************** Sendsms: Print "AT+CMGS=" ; Chr(34) ; Phonenumber ; Chr(34) Waitms 200 Print Otvet ; Chr(26) Print Chr(26); Wait 1 Print Chr(13) 'мигнем светодиодом Led = 1 Waitms 50 Led = 0 Waitms 300 Led = 1 Waitms 50 Led = 0 Return 'чтение данных с датчика '******************************************************** 18b20: 1wreset If Err = 1 Then T = 255 Sign = "error" Else 1wwrite &HCC 1wwrite &H44 Waitms 750 1wreset 1wwrite &HCC 1wwrite &HBE Byte0 = 1wread() Byte1 = 1wread() If Byte1 > 248 Then Byte0 = &HFF - Byte0 Byte1 = &HFF - Byte1 Sign = "-" Else Sign = "+" End If T1 = Byte0 / 16 T2 = Byte1 * 16 T = T1 + T2 'коррекция полученных значений If Sign = "-" Then T = T1 + 1 End If If Sign = "+" And T = 0 Then Sign = " " End If End If Return '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Module: 'включим модуль Led = 1 Powerkey = 1 Wait 1 Powerkey = 0 Led = 0 Wait 10 'ждем окончания регистрации Print "AT" Print "AT" Flushbuf 'очистка буфера Wait 1 Flushbuf Do Waitms 10 Print "AT" Waitms 400 Getline Sk Loop Until Sk = "OK" 'не выйдет из цикла пока модуль не ответит OK Flushbuf Led = 1 Wait 1 Led = 0 Print "AT+CMGDA=" ; Chr(34) ; "DEL ALL" ; Chr(34) 'удаление смс Wait 1 Return