
схемка набросана ещё сырая:
Спойлер

Спойлер

Спойлер

Спойлер

http://www.youtube.com/watch?feature=pl ... fPoX_-UY#!
Кипятильник пробило ( нужен новый, помпа нужна безшумная и всасывающая. А так автоматика еле влезла в код.
Неготовый, но работающий на видео исходник:
Спойлер
Код: Выделить всё
'$regfile = "m8def.dat"
'$crystal = 8000000
'$hwstack = 40
'$swstack = 16
'$framesize = 32
$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
'===================== ДЛЯ ДИСПЛЕЯ (НЕ ТРОГАТЬ) =================
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 Bit 'Хранит Информацию "Кипячённая вода или нет, сбрасывается при наливе."
'Dim Bb1 As Byte
Banka = 19 'МАКСИМАЛЬНЫЙ УРОВЕНЬ БАНКИ
M = 1
Kn = 0
Call Nokia_clear()
'Waitms 10
Goto Xpom1 ' Отправляемся на программу
$include "Nokia-1100 Library.inc"
'==============
'======= ТУТ ПОДПРОГРАММЫ ======
'====== незнаю почему, но в этом компиляторе они не глючат когда пишутся в начале =====
'==============
'================== НАГРЕВ БАНКИ ===
Nagrev:
If Kran = 0 Then
If Davlenie >= Banka Then
If Tempr3 < 80 Then
Portd.6 = 1 ' ВКЛЮЧАЕМ НАГРЕВАТЕЛЬ
End If
End If
End If
If Davlenie < 5 Then Portd.6 = 0 'Если урвоень воды маленький, выключить нагреватель.
If Tempr3 >= 105 And Vskipel = 0 Then 'Режим кипичения. Отключаем нагрев при достижении температуры кипения
Portd.6 = 0
Vskipel = 1
End If
If Tempr3 >= 95 And Vskipel = 1 Then 'Режим подогрева. Отключаем нагрев при достижении температуры кипения
Portd.6 = 0
End If
Return
'================= Обслуживание БАНКИ!!! ===============
Obsluzhivanie:
If Kran = 0 Then 'расчёт налива кружки происходит при закрытом кране
If Davlenie > 15 Then
Bankaup = Davlenie - 13 'расчёт кружки (недаёт перелить если в банке больше положенного)
Else
Bankaup = 2
End If ' расчёт предела кружки (недаёт перелить от положенного уровня банки)
End If
If Kran = 2 And Davlenie <= Bankaup Then
Portd.6 = 0 ' ОТКЛЮЧАЕМ НАГРЕВАТЕЛЬ
Kran = 3
End If
'If M < 5 Then 'долив банки
' If Davlenie <= 2 Then Portb.1 = 1
' If Davlenie >= Banka Then Portb.1 = 0
'End If
'======== ПОМПА ======
If M = 1 Then 'воду доливаем только в первом меню
If Davlenie <= 2 Then
Kran = 0
Gosub Naliv
Portb.1 = 1 ' порт Б №1 помпа
Vskipel = 0 ' указваем, что вода сырая
M = 1
End If
If Davlenie >= Banka Then ' предельный уровень банки
Wait 2 ' здержка долива с верху
Portb.1 = 0 ' отлючаем помпу
End If
End If
Return
'================ ОХЛАЖДЕНИЕ БАНКИ ==
Ohladit:
If Tempr4 <> 0 And Vskipel = 1 Then
Portb.2 = 1
If Tempr3 <= Tempr4 Then
'Sound , Portd.4 , 20 , 400
Tempr4 = 0
If Portb.4 = 1 Then ' Автоналитие (если сработала лягушка на порте Б №4
If Davlenie >= Banka Then
Kran = 1
End If
End If
End If
End If
If Tempr4 = 0 Thenportb.2 = 0
Return
'=== ПРИГОТОВЛЕНИЕ - НАСЫПАНИЕ ==================
Gotovka:
If Napitok = 1 Then
Portb.6 = 1 'порт дозатора сахара
Waitms Doza ' длительность насыпания сахара
Portb.6 = 0 'порт дозатора сахара
End If
If Napitok = 2 Then
Portb.7 = 1 'порт дозатора кофе
Waitms Doza ' длительность насыпания кофе
Portb.7 = 0 'порт дозатора кофе
End If
If Napitok = 3 Then
Portd.5 = 1 'порт дозатора чая
Waitms Doza ' длительность насыпания чая
Portd.5 = 0 'порт дозатора чая
Doza = 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
For O = 100 To 900 Step 10
Sound , Portd.4 , Kn , O
Next O
Call Nokia_clear() 'очищаем дисплей
Waitms 300 'задержка
End If
Return
Naliv:
'===== КРАН =====
If Portb.4 = 1 Then ' Автоналитие (если сработала лягушка на порте Б №4
If Davlenie > Bankaup Then Kran = 1
End If
If Kran <> 0 Then ' озвучка крана
O = Davlenie * 30 'расчёт частоты звучание, зависит от уровня в банке
Sound , Portd.4 , 10 , O ' вывод звука в борт Д №4
End If
If Vskipel = 0 And Kran = 1 Then 'Не даём открыть кран, пока вода не вскипела
Kran = 0
For O = 50 To 150 Step 2 'выдааём противный звук какой нибудь
Sound , Portd.4 , 24 , O
Next O
End If
If Kran = 1 Then 'Открываем кран, управление происходит думя портами
Portd.6 = 0 ' один порт включает общее питание мотора
Portd.7 = 1 ' второй реверсирует сменой полярности одним реле,
Portb.0 = 1 ' тоесть если реле не включено, кран закроется,
Waitms 700 ' если реле включено, откроется, но при условии,
Portd.7 = 0 'что другой порт включил питание мотора.
Portb.0 = 0
Kran = 2
End If
If Kran = 3 Then
Portd.7 = 0
Portb.0 = 1
Waitms 700
Portd.7 = 0
Portb.0 = 0
Kran = 0
End If
' можно отключить при надёжном редуктре на кране, алгоритм толча закрытия крана.
'If Kran = 0 And Portb.5 = 1 Then 'если не закрылся кран!!!!!!!!!!!!!!! концевик на порте Б №5
' Portd.7 = 1
' Portb.0 = 1
' Waitms 100
' Portd.7 = 0
' Portb.0 = 1
' Waitms 300
' Kran = 0
' End If
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 = 1500 ' доза 1500 милисек.
Gosub Gotovka
Napitok = 3 ' напиток чай
Doza = 1500 ' доза 1500 милисек.
Gosub Gotovka
M = 4
End If
If Kn = 2 Then
Napitok = 3 ' напиток чай
Doza = 1500 ' доза 1500 милисек.
Gosub Gotovka
M = 4
End If
If Kn = 3 Then
Napitok = 2 ' напиток кофе
Doza = 1000 ' доза 1500 милисек.
Gosub Gotovka
Napitok = 1 ' напиток сахар
Doza = 1500 ' доза 1500 милисек.
Gosub Gotovka
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
Napitok = 3
Doza = 3000
M = 5
End If
If Kn = 4 Then M = 1
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)
If Tempr4 = 60 Then
P = 1
Else
P = 0
End If
Call Nokia_text(1 , 4 , "2.Охладить до 60" , P)
If Tempr4 = 80 Then
P = 1
Else
P = 0
End If
Call Nokia_text(1 , 5 , "3.Охладить до 80" , P)
Call Nokia_text(1 , 6 , "4.Выход" , 0)
Gosub Knopki
If Kn = 1 And Kran = 0 Then Kran = 1
If Kn = 1 And Kran = 2 Then Kran = 3
Gosub Naliv
If Kn = 2 Then Tempr4 = 60
If Kn = 3 Then Tempr4 = 80
If Kn = 4 Then M = 1
' Portb.1 = 0
If Tempr4 <> 0 Then Gosub Ohladit:
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 2 'будет глючить, ставьте задержку
Stop Adc
Disable Interrupts
'=========== ОПРОС АЦП №0 УРОВЕНЬ ВОДЫ ============
Start Adc 'запуск опроса АЦП
Davlenie = Getadc(0) ' чтение в переменну значение АЦП 0
'Waitms 2 'будет глючить, ставьте задержку
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
схему и прошивку писал сам, извиняюсь за свой стиль и ошибки, образвания нет, а школа моя вот:

Скоро выложу видео, как готовит, схему доведу до ума, а так возможности:
- Чай по басятски и кофе в одно нажатие
Авоналив - если установлена кружка (1 нажатие и готово)
Автоостыване-налив
Дуракозащита
Доступность в деталях
Зелёный - постоянный
Синий - когда нагревает
Включение ультрафиалета для обеззараживания
Думаю сделать функцию серебрения воды
....память 8кб мала (


