'======Автор: Мишин Евгений Алексеевич, г.Кстово, Нижегородская обл. '========= RADIOKSTOVO.RU ======== '========= vk.com/ev3658 skype: ev3658 mail: ev3658@yandex.ru '========ПРИЯТНО ЧАЕКОФЕПИТЬЯ ))))) $regfile = "m8def.dat" $crystal = 8000000 $hwstack = 16 $swstack = 64 $framesize = 32 Config Adc = Single , Prescaler = Auto , Reference = Avcc Config Portb = Output Config Portd = Output Config Portc = Input Config Portb.5 = Input Config Portb.4 = Input 'Config Portb.3 = Input '======================================= ДЛЯ ДИСПЛЕЯ (НЕ ТРОГАТЬ) =================================== Declare Sub Nokia_init() Declare Sub Nokia_clear() Declare Sub Nokia_text(byval Nokia_x As Byte , Byval Nokia_y As Byte , Byval Nokia_text As String , Byval Nokia_inversion As Byte) '========= Конфигурация портов дисплея Nokia_spi_data Alias Portd.2 'MOSI - можно задать любую ножку Nokia_spi_clock Alias Portd.3 'SCK - можно задать любую ножку Nokia_cs Alias Portd.1 'CS - можно задать любую ножку Display_reset Alias Portd.0 'LCD_RESET - можно задать любую ножку Display_reset = 1 Nokia_cs = 1 Dim W As Iram Word At 8 Overlay Dim Nokia_data_9 As Integer 'ницилизация дисплея Call Nokia_init() '======================================= ПЕРЕМЕННЫE ДЛЯ ПРОГРАММЫ ============================ Dim Text As String * 16 Dim Tempr2 As Integer Dim Tempr3 As Single '-Переменная с температурой в цельсия Dim Tempr4 As Single '-переменная охлаждения воды (указанное значеие автоматически досигается и наливается) Dim Davlenie As Integer Dim Kn As Byte 'При нажатии на кнопку, значение 1,2,3,4 и 0, постоянно обнуляется в начале цикла программы Dim O As Integer ' переменная для циклов for-next и т.п. одноразовая Dim P As Byte ' рабоая переменая от 0 до 255 Dim M As Byte 'хранит номер меню в котором находится. Dim Doza As Integer 'Доза напитка (регулирует задержку в Waitms микросекундах) Dim Napitok As Byte 'Номер напитка 1,2,3 - сбрасывается в 0 при приготовлении (1-сахар,2-кофе,3-чай) Dim Kran As Byte ' управление краном, 1 - открыть, 2-открыт, 3 - закрыть, 0 - закрыт Dim Banka As Byte ' Уровень банки Dim Bankaup As Byte ' Уровень предела низкого уровня банки Dim Vskipel As Byte 'Хранит Информацию "Кипячённая вода или нет, сбрасывается при наливе." Dim Gogo As Bit Banka = 23 'МАКСИМАЛЬНЫЙ УРОВЕНЬ БАНКИ Bankaup = 9 'МИНИМАЛЬНЫЙ УРОВЕНЬ БАНКИ M = 1 Kn = 0 Call Nokia_clear() 'Waitms 10 Goto Xpom1 ' Отправляемся на программу $include "Nokia-1100 Library.inc" '====================================================================================== '=========================================== ТУТ ПОДПРОГРАММЫ ======================== '====== незнаю почему, но в этом компиляторе они не глючат когда пишутся в начале ===== '====================================================================================== '================= СИГНАЛ ======= Signal: For O = 350 To 950 Step 10 'выдааём противный звук какой нибудь If Kn = 0 Then Sound , Portd.4 , 5 , O Else Sound , Portd.4 , Kn , O Next O Return '================== НАГРЕВ БАНКИ ===================== Nagrev: If Tempr4 = 0 Then If Kran = 0 Then If Davlenie >= Banka Then If Tempr3 < 80 Then ' ждём или проверям минимальную температуру Portd.6 = 1 ' ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ End If End If End If 'If Davlenie >= 18 And Vskipel = 0 Then Portd.6 = 1 'для проверок End If If Tempr3 >= 95 And Vskipel = 1 Then 'Режим подогрева. Отключаем нагрев при достижении температуры кипения Portd.6 = 0 End If '======== КИПЯЧЕНИЕ БАНКИ If Davlenie <= Bankaup Then Portd.6 = 0 'Если урвоень воды маленький, выключить нагреватель. 'If Tempr3 = 100 Then Vskipel = 1 'Тупое включение ВСКИПЕЛ - если заебёт. If Tempr3 >= 102 And Vskipel = 0 Then 'Режим кипичения. Отключаем нагрев при достижении температуры кипения Portd.6 = 0 Vskipel = 1 End If 'If Vskipel = 0 And Tempr3 >= 95 Then Vskipel = 1 ' когда заебёт от скачков не наливать ) Return '================= Обслуживание БАНКИ!!! =============== Obsluzhivanie: 'If Kran = 0 Then ' ' If Davlenie <= 10 Then ' Bankaup = Davlenie ' Else ' Bankaup = Davlenie - 5 ' End If 'If Davlenie = 14 Then Bankaup = 7 'расчёт кружки (недаёт перелить если в банке больше положенного) 'If Davlenie >= 12 And Davlenie < 18 Then Bankaup = 7 ' расчёт предела кружки (недаёт перелить от положенного уровня банки) 'End If If Kran = 2 And Davlenie <= Bankaup Then Portd.6 = 0 ' ОТКЛЮЧАЕМ НАГРЕВАТЕЛЬ Kran = 3 Gosub Naliv Portb.3 = 1 'Звонок включить Waitms 300 Portb.3 = 0 'Звонок отключить End If 'If M < 5 Then 'долив банки ' If Davlenie <= 2 Then Portb.1 = 1 ' If Davlenie >= Banka Then Portb.1 = 0 'End If '========================== ПОМПА ========================================== 'воду доливаем только в первом меню If Davlenie <= Bankaup Then 'доливаем банку If Kran = 2 Then Kran = 3 'закрываем кра Gosub Naliv 'закрываем кра M = 1 'уходим в главное меню End If Portb.1 = 1 ' порт Б №1 помпа Vskipel = 3 ' указваем, что вода сырая End If If M = 1 Then 'доливаем банку если мало в первом меню и при включении If Davlenie < Banka And Vskipel = 1 Then If Kran = 2 Then Kran = 3 Gosub Naliv End If Portb.1 = 1 ' порт Б №1 помпа Vskipel = 3 End If End If If Davlenie >= Banka And Vskipel = 3 Then ' предельный уровень банки Portd.6 = 1 ' ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ Portb.1 = 0 ' отлючаем помпу Vskipel = 0 End If If M <> 1 Then Portb.1 = 0 ' порт Б №1 помпа Return '================================== ОХЛАЖДЕНИЕ БАНКИ ==================== Ohladit: If Vskipel = 1 Then Portb.2 = 1 If Tempr4 > 1 And Tempr3 <= Tempr4 Then Gosub Signal Gosub Naliv Portb.3 = 1 'Звонок включить Waitms 800 Portb.3 = 0 'Звонок отключить Tempr4 = 0 If Pinb.5 = 1 Then Kran = 1 Gogo = 1 End If End If If Tempr4 = 0 Then Portb.2 = 0 Return '===================== ПРИГОТОВЛЕНИЕ - НАСЫПАНИЕ ================== Gotovka: If Napitok = 1 Then Portd.5 = 1 'порт дозатора сахара Waitms Doza ' длительность насыпания сахара Portd.5 = 0 'порт дозатора сахара End If If Napitok = 2 Then Portb.6 = 1 'порт дозатора кофе Waitms Doza ' длительность насыпания кофе Portb.6 = 0 'порт дозатора кофе End If If Napitok = 3 Then Portb.7 = 1 'порт дозатора чая Waitms Doza ' длительность насыпания чая Portb.7 = 0 'порт дозатора чая End If Kn = 0 ' сброс кнопок в ноль Napitok = 0 'сброс напитка в ноль Doza = 0 'сброс дозы в ноль Return '======================================= ОПРОС КНОПОК ============================== 'порты кнопок указал в этой подпрограмме, алиасы в среде Bascom иногда глючат. Knopki: Kn = 0 If Pinc.4 = 1 Then Kn = 1 If Pinc.3 = 1 Then Kn = 2 If Pinc.2 = 1 Then Kn = 3 If Pinc.1 = 1 Then Kn = 4 If Kn <> 0 Then Gosub Signal Call Nokia_clear() 'очищаем дисплей Waitms 300 'задержка End If Return Naliv: '======================= КРАН ======================= If Vskipel = 0 And Kran => 1 Then 'Не даём открыть кран, пока вода не вскипела Kran = 3 Gogo = 0 Gosub Signal End If If Pinb.4 = 1 And Gogo = 1 Then ' Автоналитие (если сработала лягушка на порте Б №4 If Davlenie > Bankaup And Vskipel = 1 Then Kran = 1 End If Gogo = 0 End If If Kran = 2 Then ' озвучка крана P = Davlenie * 10 'расчёт частоты звучание, зависит от уровня в банке Sound , Portd.4 , 15 , P End If If Kran = 3 Then 'закрывает кран Portd.7 = 0 Portb.0 = 1 Waitms 1200 Portd.7 = 0 Portb.0 = 0 Kran = 0 Waitms 700 End If If Kran = 1 Then 'Открываем кран, управление происходит думя портами Portd.6 = 0 'отключаем нагреватель / один порт включает общее питание мотора Portd.7 = 1 ' второй реверсирует сменой полярности одним реле, Portb.0 = 1 ' тоесть если реле не включено, кран закроется, Waitms 1700 ' если реле включено, откроется, но при условии, Portd.7 = 0 'что другой порт включил питание мотора. Portb.0 = 0 Kran = 2 End If ' можно отключить при надёжном редуктре на кране, алгоритм толча закрытия крана. 'If Kran = 0 And Pinb.5 = 1 Then 'если не закрылся кран!!!!!!!!!!!!!!! концевик на порте Б №5 ' Portd.7 = 1 ' Portb.0 = 1 ' Waitms 100 ' Portd.7 = 0 ' Portb.0 = 1 ' Waitms 300 ' Kran = 0 ' End If Kn = 0 Return '==================================================================================================== '======================================= МЕНЮ в виде ПОДПРОГРАММЫ =================================== '==================================================================================================== '======================================= МЕНЮ1 ГЛАВНОЕ============================== Menu1: Call Nokia_text(1 , 1 , "ВЫБЕРИТЕ НАПИТОК" , 0) Call Nokia_text(1 , 3 , "1.Чай с сахаром" , 0) Call Nokia_text(1 , 4 , "2.Чай без сахара" , 0) Call Nokia_text(1 , 5 , "3.Кофе" , 0) Call Nokia_text(1 , 6 , "4.Дополнителньо" , 0) Gosub Knopki If Kn = 1 Then Napitok = 1 ' напиток сахар Doza = 2500 ' доза 1500 милисек. Gosub Gotovka Napitok = 3 ' напиток чай Doza = 1500 ' доза 1500 милисек. Gosub Gotovka M = 4 Gogo = 1 End If If Kn = 2 Then Napitok = 3 ' напиток чай Doza = 1500 ' доза 1500 милисек. Gosub Gotovka M = 4 Gogo = 1 End If If Kn = 3 Then Napitok = 2 ' напиток кофе Doza = 1500 ' доза 1500 милисек. Gosub Gotovka Napitok = 1 ' напиток сахар Doza = 2500 ' доза 1500 милисек. Gosub Gotovka Gogo = 1 M = 4 End If If Kn = 4 Then M = 2 End If Kn = 0 '======================================= Return Menu2: '======================================= МЕНЮ 2 Дополнительно ============================== Call Nokia_text(1 , 1 , "=ДОПОЛНИТЕЛЬНО=" , 0) Call Nokia_text(1 , 3 , "1.Добавка" , 0) Call Nokia_text(1 , 4 , "2.Кипяток" , 0) Call Nokia_text(1 , 5 , "3.Подогрев" , 0) Call Nokia_text(1 , 6 , "4.Отмена" , 0) Gosub Knopki If Kn = 1 Then M = 3 End If If Kn = 2 Then M = 4 End If If Kn = 3 Then If Tempr3 <= 99 And Davlenie => 5 Then Portd.6 = 1 End If End If If Kn = 4 Then M = 1 End If Kn = 0 Return '======================================= МЕНЮ3 ДОБАВКА============================= Menu3: Call Nokia_text(1 , 1 , "====ДОБАВКА!====" , 0) Call Nokia_text(1 , 3 , "1.+Сахару" , 0) Call Nokia_text(1 , 4 , "2.+Кофе" , 0) Call Nokia_text(1 , 5 , "3.+Чай" , 0) Call Nokia_text(1 , 6 , "4.Назад" , 0) Gosub Knopki If Kn = 1 Then Napitok = 1 ' напиток сахар Doza = 1000 ' доза 1500 милисек. Gosub Gotovka End If If Kn = 2 Then Napitok = 2 ' напиток чай Doza = 1000 ' доза 1500 милисек. Gosub Gotovka End If If Kn = 3 Then Napitok = 3 ' напиток кофе Doza = 1000 ' доза 1500 милисек. Gosub Gotovka End If If Kn = 4 Then M = 2 End If Kn = 0 '======================================= Return '======================================= МЕНЮ 4 НАЛИВ ВОДЫ ============================== Menu4: Call Nokia_text(1 , 1 , "=ПРИГОТОВЛЕНИЕ!=" , 0) If Kran = 2 Then Call Nokia_text(1 , 3 , "1.ЗАКРЫТЬ КРАН!" , 0) If Kran = 0 Then Call Nokia_text(1 , 3 , "1.НАЛИТЬ КРУЖКУ" , 0) P = 0 If Tempr4 = 60 Then P = 1 Call Nokia_text(1 , 4 , "2.Охладить до 60" , P) Call Nokia_text(1 , 5 , "3.Добавки" , 0) Call Nokia_text(1 , 6 , "4.Выход" , 0) Gosub Knopki If Gogo = 1 Then Gosub Naliv If Kn = 1 And Kran = 0 Then Kran = 1 Gogo = 0 Tempr4 = 0 Gosub Naliv End If If Kn = 1 And Kran = 2 Then Kran = 3 Gosub Naliv End If If Kn = 2 Then If Tempr4 = 60 Then Tempr4 = 0 Else Tempr4 = 60 End If End If If Kn = 3 Then M = 3 If Kran = 1 Then Kran = 1 Gosub Naliv Tempr4 = 0 End If End If If Kn = 4 Then M = 1 Tempr4 = 0 Gogo = 0 Kran = 3 Gosub Naliv End If ' Portb.1 = 0 Gosub Ohladit: If Kran > 0 Then Gosub Naliv Gosub Obsluzhivanie End If Kn = 0 Return '================================ ВЫВОД ИНФОРМАЦИИ НА ДИСПЛЕЙ ============================ Informacia: Call Nokia_text(1 , 2 , "----------------" , 1) 'Вывод информации о воде If Vskipel = 0 Then Call Nokia_text(1 , 7 , "---не вскипел---" , 1) If Vskipel => 1 Then Call Nokia_text(1 , 7 , "---кипяточек!---" , 1) '=========== ОПРОС АЦП №5 ТЕМПЕРАТУРА ========= Disable Interrupts 'на всякий отключаем прерывания, это то, что может затормозить программу если не отключить и опросить АЦП Start Adc 'запуск опроса АЦП Tempr2 = Getadc(5) ' чтение в переменну значение АЦП 5 Waitms 20 'будет глючить, ставьте задержку Stop Adc Disable Interrupts '=========== ОПРОС АЦП №0 УРОВЕНЬ ВОДЫ ============================== Start Adc 'запуск опроса АЦП Davlenie = Getadc(0) ' чтение в переменну значение АЦП 0 Waitms 20 'будет глючить, ставьте задержку Stop Adc 'расчёт температуры Tempr2 = Tempr2 - 947 ' тупое вычесление, высчитывал сам, для каждого датчика по особому. Tempr3 = 2.5 * Tempr2 ' тупое вычесление, высчитывал сам, для каждого датчика по особому. Tempr3 = Tempr3 - 10 ' тупое вычесление, высчитывал сам, для каждого датчика по особому. Text = "T=" + Str(tempr3) 'при настройке вместо tempr3 можно указать tempr2 и убрать все расчёты, замерить лёд и кипяток, после ввести расчёт из показаний с АЦП 'расчёт уровня воды Text = Text + "г. У=" Text = Text + Str(davlenie) Text = Text + " " Call Nokia_text(2 , 8 , Text , 0) 'вывод в низу температуры и давления Return '========================================================================================= '========================================== Тело Программы =============================== '========================================================================================= Xpom1: 'Waitms 10 'общая задержка программы - ВНИМАНИЕ!!!!!!!!!!!!!!!!!!!!!!!! 'If M = 5 Then Gosub Menu5 If M = 4 Then Gosub Menu4 If M = 3 Then Gosub Menu3 If M = 2 Then Gosub Menu2 If M = 1 Then Gosub Menu1 '======================================= Gosub Informacia Gosub Obsluzhivanie ' обслуживание Gosub Nagrev ' Нагрев банки '======================================= Goto Xpom1 End 'end program