Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [115]
Наш опрос
Оцените мой сайт
Всего ответов: 1292
Главная » Статьи » Мои статьи

Кухонный таймер

Идея данного девайса навеяна усердным пилением жены... :)
От себя добавлю - очень удобная штука. Удобно варить макароны-пельмени. :D
И даже если забудешь - напомнит  :flag: 
Вот, собственно, и он - кухонный таймер.


Работает в двух режимах - таймер и секундомер.
Первоначально был один таймер-секундомер, но жена сказала - маловато будет...
Теперь 3 позиции счета. Хотя можно сделать и больше.
Синяя кнопка - старт, красная - стоп, три серые - пред-установка таймера 1час, 10мин, 1мин.
Боковые серые - переключение по позициям счета.
Диоды двухцветные - работа-зеленый, стоп-красный.
Экран нокия 1110i + платка согласования уровней взята тут.
Сама коробка - пластиковый бокс под силовые автоматы на 4шт. 
Кстати, универсальный корпус получился, и не дорогой.
Да, еще предусмотрена пищалка (динамик от наушников) - пищит 5 последних секунд таймера, и один пы-ы-ык длинный противный настойчивый :) 
В качестве питания взял зарядку от мобильного + 7805. 
Схему не рисовал. Собирал сразу в пластике-железе. Собранная коробка лежала-ждала с пол-года... 
Программу писал уже по факту собранного девайса.

 

Добавлена программа с комментариями:

$regfile = "m8def.dat"
$crystal = 4000000
$framesize = 64
$hwstack = 64
$swstack = 64

'библиотека взята с сайта Модели LCD для Протеуса
$lib "glcd-Nokia1100.lib"

'настраиваем таймер1 на импульс длительностью 1 сек
Config Timer1 = Timer , Prescale = 64
Const Timer1pre = 3035

Config Debounce = 50

Config Portd.2 = Output : Portd.2 = 0 : Led3 Alias Portd.2                       'led3
Config Portd.1 = Output : Portd.1 = 0 : Led2 Alias Portd.1                       'led2
Config Portd.0 = Output : Portd.0 = 0 : Led1 Alias Portd.0                       'led1

Config Portb.5 = Output : Sound , Portb.5 , 330 , 1000                            'buzer

Config Portb.0 = Input : Portb.0 = 1                                                      'buton  стоп
Config Portb.1 = Input : Portb.1 = 1                                                      'buton  1мин
Config Portb.2 = Input : Portb.2 = 1                                                      'buton  10мин
Config Portb.3 = Input : Portb.3 = 1                                                      'buton  60мин
Config Portb.4 = Input : Portb.4 = 1                                                      'buton  старт

Config Portd.3 = Input : Portd.3 = 1                                                     'buton_timer_nomer_up
Config Portd.4 = Input : Portd.4 = 1                                                     'buton_timer_nomer_down

Config Graphlcd = 128x64sed , Cs1 = Portc.3 , Si = Portc.4 , Sclk = Portc.5 , Rst = Portc.2
Const Negative_lcd = 0
Const Mirror_y = -1
Const Mirror_x = 1
Initlcd
Cls

'Переменная для секундных импульсов от таймера1
Dim Puls_time As Bit : Puls_time = 0
Dim Time_rabora As Integer : Time_rabora = 0
'Номер таймера в строке 1-2-3
Dim Nomer_timer As Byte : Nomer_timer = 1
'Переменная для позиции курсора
Dim Poza_nomer_timer As Byte

'Переменные для функции перевода количества секунд в формат времени чч-мм-сс
'Время считаю прямым счетом в секундах, в сутках 86400 секунд
'по этому переменные типа Long.
'если суточный таймер не нужен,
'можно использовать переменные типа Integer(32768 Секунд)
'или типа Word (65535 секунд)
Dim Time_funk_val As Long
Dim Time_funk_str As String * 8
Dim _4as_val As Long
Dim _4as_str As String * 2
Dim _m_in_val As Long
Dim _m_in_str As String * 2
Dim _s_ec_val As Long
Dim _s_ec_str As String * 2

Declare Function Time_str(byval Time_val As Long) As String * 8

'Признак нажатия первой кнопки старт, тогда стразу секундомер
Dim Buton_start_press(3) As Byte
Buton_start_press(1) = 0
Buton_start_press(2) = 0
Buton_start_press(3) = 0

Dim Regim_rabota(3) As Integer
Regim_rabota(1) = 0                                         '0-stop, 1-cekundomer, 2-timer
Regim_rabota(2) = 0
Regim_rabota(3) = 0

'Переменная для надписей "Секн"и"Тайм"
Dim Regim_rabota_str(3) As String * 4

'Переменные для счета секунд
Dim Period_rabota(3) As Long
Period_rabota(1) = 0
Period_rabota(2) = 0
Period_rabota(3) = 0
'Переменные для счета секунд в формате чч-мм-сс
Dim Period_rabota_str(3) As String * 8

Dim I As Byte

Enable Interrupts
Enable Timer1
On Timer1 Pulse:

'Рисуем первую картинку
Setfont Font6x8
Lcdat 1 , 1 , "----------------"
Lcdat 2 , 1 , "=> 00:00:00     "
Lcdat 3 , 1 , "----------------"
Lcdat 4 , 1 , "   00:00:00     "
Lcdat 5 , 1 , "----------------"
Lcdat 6 , 1 , "   00:00:00     "
Lcdat 7 , 1 , "----------------"
Lcdat 8 , 1 , "----------------"

Do

Debounce Pind.3 , 0 , Buton_timer_nomer_up , Sub
Debounce Pind.4 , 0 , Buton_timer_nomer_down , Sub
Debounce Pinb.0 , 0 , Buton_stop , Sub

If Buton_start_press(nomer_timer) <> 0 Then Goto 10

Debounce Pinb.1 , 0 , Buton_1_minut , Sub
Debounce Pinb.2 , 0 , Buton_10_minut , Sub
Debounce Pinb.3 , 0 , Buton_60_minut , Sub

Debounce Pinb.4 , 0 , Buton_start , Sub

10:

If Puls_time = 0 Then Goto Konec_scheta

For I = 1 To 3
   Select Case Regim_rabota(i)
      Case 1                                                                         ' 1-cekundomer
         Incr Period_rabota(i)
         If Period_rabota(i) => 86400 Then Period_rabota(i) = 0
         Period_rabota_str(i) = Time_str(period_rabota(i))
         Poza_nomer_timer = I * 2
         Lcdat Poza_nomer_timer , 19 , Period_rabota_str(i)
      Case 2                                                                         ' 2-timer
         Decr Period_rabota(i)
         Period_rabota_str(i) = Time_str(period_rabota(i))
         Poza_nomer_timer = I * 2
         Lcdat Poza_nomer_timer , 19 , Period_rabota_str(i)
            Select Case Period_rabota(i)
            Case 1 To 5
            Sound , Portb.5 , 330 , 500
            Case 0
            Sound , Portb.5 , 330 , 1000
                Select Case I
                  Case 1
                     Led1 = 0
                  Case 2
                     Led2 = 0
                  Case 3
                     Led3 = 0
                End Select
                Period_rabota(i) = 0
                Period_rabota_str(i) = "00:00:00"
                Regim_rabota(i) = 0
                Poza_nomer_timer = I * 2
                Lcdat Poza_nomer_timer , 19 , "00:00:00     "
                Buton_start_press(i) = 0

            End Select
   End Select
Next I
Puls_time = 0
Konec_scheta:
Loop
End                                                         'end program

$include "font6x8.font"

Pulse:
   Timer1 = Timer1pre
   Puls_time = 1
Return

Buton_timer_nomer_down:
Incr Nomer_timer
If Nomer_timer > 3 Then Nomer_timer = 1
Select Case Nomer_timer
   Case 1
     Lcdat 2 , 1 , "=>"
     Lcdat 6 , 1 , "  "
   Case 2
     Lcdat 4 , 1 , "=>"
     Lcdat 2 , 1 , "  "
   Case 3
     Lcdat 6 , 1 , "=>"
     Lcdat 4 , 1 , "  "
End Select
Return

Buton_timer_nomer_up:
Decr Nomer_timer
If Nomer_timer < 1 Then Nomer_timer = 3
Select Case Nomer_timer
   Case 1
     Lcdat 2 , 1 , "=>"
     Lcdat 4 , 1 , "  "
   Case 2
     Lcdat 4 , 1 , "=>"
     Lcdat 6 , 1 , "  "
   Case 3
     Lcdat 6 , 1 , "=>"
     Lcdat 2 , 1 , "  "
End Select
Return

Buton_stop:
Select Case Nomer_timer
  Case 1
    Led1 = 0
  Case 2
    Led2 = 0
  Case 3
    Led3 = 0
End Select
Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = "00:00:00"
Regim_rabota(nomer_timer) = 0
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , "00:00:00     "
Buton_start_press(nomer_timer) = 0
Return

Buton_1_minut:
Period_rabota(nomer_timer) = Period_rabota(nomer_timer) + 60
If Period_rabota(nomer_timer) => 86400 Then Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = Time_str(period_rabota(nomer_timer))
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Return

Buton_10_minut:
Period_rabota(nomer_timer) = Period_rabota(nomer_timer) + 600
If Period_rabota(nomer_timer) => 86400 Then Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = Time_str(period_rabota(nomer_timer))
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Return

Buton_60_minut:
Period_rabota(nomer_timer) = Period_rabota(nomer_timer) + 3600
If Period_rabota(nomer_timer) => 86400 Then Period_rabota(nomer_timer) = 0
Period_rabota_str(nomer_timer) = Time_str(period_rabota(nomer_timer))
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Return

Buton_start:
Buton_start_press(nomer_timer) = 1
Poza_nomer_timer = Nomer_timer * 2
Lcdat Poza_nomer_timer , 19 , Period_rabota_str(nomer_timer)
Select Case Period_rabota(nomer_timer)
Case 0
  Regim_rabota(nomer_timer) = 1
  Lcdat Poza_nomer_timer , 73 , "Секн"
Case Else
  Regim_rabota(nomer_timer) = 2
  Lcdat Poza_nomer_timer , 73 , "Тайм"
End Select
Select Case Nomer_timer
  Case 1
    Led1 = 1
  Case 2
    Led2 = 1
  Case 3
    Led3 = 1
End Select
Return

Function Time_str(byval Time_val As Integer) As String * 8
Time_funk_val = Time_val
'-------------------------------------------------------------
_4as_val = Time_funk_val / 3600
If _4as_val < 10 Then _4as_str = "0" + Str(_4as_val)
If _4as_val >= 10 Then _4as_str = Str(_4as_val)
'-------------------------------------------------------------
_4as_val = _4as_val * 3600
_m_in_val = Time_funk_val - _4as_val
_m_in_val = _m_in_val / 60
If _m_in_val < 10 Then _m_in_str = "0" + Str(_m_in_val)
If _m_in_val >= 10 Then _m_in_str = Str(_m_in_val)
'-------------------------------------------------------------
_m_in_val = _m_in_val * 60
_s_ec_val = Time_funk_val - _4as_val
_s_ec_val = _s_ec_val - _m_in_val
If _s_ec_val < 10 Then _s_ec_str = "0" + Str(_s_ec_val)
If _s_ec_val >= 10 Then _s_ec_str = Str(_s_ec_val)
'-------------------------------------------------------------
Time_str = _4as_str + ":" + _m_in_str + ":" + _s_ec_str
End Function

Двухцветные светодиоды подключал по этой схеме.
Резисторы подбирал в зависимости от примененного транзистора, и по яркости свечения. Чтоб не сильно ярко. 
Удобно применить пару BC546(547,548)-BC556(557,558). У них базовый вывод в центре.


http://sh.uploads.ru/t/eKzLS.jpg


Динамик от наушников подключал по схеме


http://s4.uploads.ru/t/svcr1.jpg


Для светодиодов и бипера собрал маленькие платки.

Схема (как смог, так и нарисовал... художник из меня еще тот)

 

 

Еще пара фотографий: 

 

 

Видео работы:

 

pavel1969 (http://bascomavr.3bb.ru/viewtopic.php?id=1804)

 

Категория: Мои статьи | Добавил: bascom (05.07.2017)
Просмотров: 5668 | Комментарии: 1
Всего комментариев: 1
1 Zot08  
0
Киньте пожалуйста ссылку на библиотеку на Nokia LCD.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Radan Studio © 2024