Пятница, 26.04.2024, 18:56
progPROTON
Главная | статьи | Регистрация | Вход
Меню сайта
Категории раздела

ПРОСТОЙ многоточечный термометр

Основу устройства составляют 8 датчиков ds18b20,микроконтроллер pic16f630,семисегментные индикаторы

на MAX7219, мультиплексор к561кп2 . 
Один датчик регулярно зависал, но после отключения плюсового провода всё стало хорошо.

После в цепи питания датчика я поставил сопротивление 20 ком, не знаю почему но глюк пропал,

датчик работает стабильно. 
Для теплицы применил сетевой провод (4 витых пары), а вместо троса телефонную витую пару

со стальными жилками. Испытал на длину 55 метров (мне хватит 45), провод данных

DQ экранировал вторым проводом этой же пары путем подключения к минусу со стороны

устройства, для устойчивой работы со стороны датчик подключил добавочно подтягивающий резистор 10 ком. 
На первый датчик устанавливается звуковая сигнализация (что бы помидоры не подмерзли). 

На к561кп2 вывд 7(VEE) соединен с выводом 8 и с минусом питания.
схема

фото

код:

 

 '****************************************************************
    '*  Name    : ТЕРМОМЕТР_МАХ7219_ds18b20                         *
    '*  Автор   : Лобзанюк К.П.                                     *   
    '*          :                                                   *
    '*          :                                                   *
    '*  Дата    :  01.04.2021                                       *
    '*  Версия  : 1.00                                              *
    '*          :                                                   *
    '*          :                                                   *
    '****************************************************************

  
Device = 16F630 

'Set_OSCCAL 'сохрвняем калибровочную константу (последняя ячейка памяти программ)

Config CPD_OFF, CP_OFF, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF, INTRC_OSC_NOCLKOUT
'-------------------------------- -----Предустановки--------------------------------------------- 
    Declare Xtal 4
    '  OPTION_REG = %00100110      'бит 5: T0CS: Выбор тактового сигнала для TMR0
                                  '1 = внешний тактовый сигнал с вывода T0CKI
                                   '0 = внутренний тактовый сигнал CLKOUT
    ' INTCON = %10100000      'TMR0 активизирован 
 '-------------------------------------Настройки портов---------------------------------------------- 
       All_Digital = OFF   ;Установить все порты цифровыми входами/выходами  
    TRISA = %00101001               ' 1-вход   0-выход
     TRISC = %00110000 
 
'-----------------------------------Конфигурация переменных----------------------------------------- 

    Symbol ZBUK PORTC.3       '  динамик
    Symbol KH1 PORTA.3        ' кнопка листать датчики
    Symbol KH2 PORTA.5      '  + или -
    Symbol KH3 PORTC.5       '  температуры сигнализации + 1
    Symbol KH4 PORTC.4       '  температуры сигнализации - 1
    Symbol DIN PORTC.0        'Выход данных
    Symbol CLK PORTC.2     'Выход синхро импульсов 
    Symbol LOAD PORTC.1     'Защелка
    Symbol A PORTA.1        ' входы мультиплексора
    Symbol B PORTA.2
    Symbol S PORTA.4 
'    Symbol TOIF INTCON.2    ' TOIF - cимвол флага прерывания по переполнению таймера TMRO 
    Symbol DQ      = PORTA.0           ' Подключить 1 DS18B20 к выводу PORT 
    Dim Value As Byte 'Переменная адрес знакоместа 
    Dim Value1 As Byte 'Переменная для преобразования табличной конвертации 
    Dim Dat As Byte 'Переменная для выделения из числа цифры разряда 
    Dim R_Temp As Word ' Переменная для получения значения температуры отдельными двумя байтами 
    Dim znak As Bit   ' знак датчика N
    Dim znak1 As Bit   ' знак датчика 1
    Dim znak2 As Bit    ' знак температуры сигнализации
    Dim C As Bit 'Переменная для хранения бита сигнализации окончания преобразования
    Dim fl_n As Bit   ' биты гашения незначащего ноля
    Dim fl_n1 As Bit
    Dim n As Byte     ' номер датчика  для опроса
    Dim m As Byte     ' номер датчика  для показа
    Dim T_P11 As Byte    '  температура сигнализации
    Dim T_P1 As Byte       ' температура датчика 1
'    Dim T_P2 As Byte
'    Dim T_P3 As Byte
'    Dim T_P4 As Byte
'    Dim T_P5 As Byte
'    Dim T_P6 As Byte
'    Dim T_P7 As Byte
'    Dim T_P8 As Byte
    Dim T1 As Byte     '
    Dim T2 As Byte   
    Dim flagK1 As Bit     '  флаг, кнопка нажата и уже отпущена
    Dim flagK2 As Bit
    Dim flagK3 As Bit
    Dim flagK4 As Bit
   
'       '-------------------Инициирование прерываний-------------------
' On Interrupt GoTo EvriSec  ' Включить обработку програмных прерываний 
' On_Interrupt GoTo EvriSec  ' Включить аппаратную обработку  прерывания  
 
   '-------------------Настройка дисплея-------------------
    DelayMS 2000    ' за это время дисплей покажет кракозябру
    
    Value = %00001111
     Value1 = %00000000
  GoSub DI
  Value = %00001100
     Value1 = %00000001
  GoSub DI 
   Value = %00001011
     Value1 = %00000111
  GoSub DI
   Value = %00001001    ' 
      Value1 = %00000000
  GoSub DI
   Value = %00001010
    Value1 = %00001111
  GoSub DI
  

'-------------------------- Главная программа -------------------------         
       m = 1
     T1 = 0
       znak2 = 0 
       T_P11 = 2
'    DelayMS 2000   
Main:
     A = 0 : B = 0 : S = 0 : n = 1   ' перебор датчиков
        GoSub Opros_T
         GoSub Set_T
     A = 1 : B = 0 : S = 0 : n = 2
        GoSub Opros_T
        GoSub Set_T
      A = 0 : B = 1 : S = 0 : n = 3
        GoSub Opros_T
        GoSub Set_T
      A = 1 : B = 1 : S = 0 : n = 4
        GoSub Opros_T 
        GoSub Set_T
      A = 0 : B = 0 : S = 1 : n = 5
        GoSub Opros_T
        GoSub Set_T
     A = 1 : B = 0 : S = 1 : n = 6
        GoSub Opros_T
        GoSub Set_T
      A = 0 : B = 1 : S = 1 : n = 7
        GoSub Opros_T
        GoSub Set_T
      A = 1 : B = 1 : S = 1 : n = 8
        GoSub Opros_T 
        GoSub Set_T 
        GoSub ZBUK_
   
    GoTo Main
Set_T:                                                  ' выбор 
         GoSub KH_1 : GoSub KH_2 : GoSub KH_3 : GoSub KH_4 :
      If flagK1 = 1 Then flagK1 = 0 : m = m + 1
      If m = 9   Then m = 1
      If m = n  Then  GoSub Ind 
      If flagK2 = 1 Then flagK2 = 0 : znak2 = ~ znak2  
      If flagK3 = 1 Then flagK3 = 0 : T_P11 = T_P11 + 1
      If flagK4 = 1 Then flagK4 = 0 : T_P11 = T_P11 - 1 
   Return 
   
Opros_T:                                              ' опрос датчика
 
             
            OWrite DQ, 1, [$CC, $44]  ' Послать датчику DS18B20 команду старта измерения температуры 
            Repeat  ' Начать внутренний цикл  
            DelayMS 25                  ' Ждать 
            ORead DQ, 4, [C]  ' Ждать полного преобразования пока не придет сигнал окончания преобразования  
            Until C > 0 ' Выйти из цикла если DS18B20 закончило преобразование.  
            OWrite DQ, 1, [$CC, $BE]  ' Послать команду чтения из ОЗУ датчика DS18S20 значения температуры  
            ORead DQ, 2, [R_Temp.LowByte, R_Temp.HighByte]  ' Прочитать значение температуры и записать полученные два байта данных в 
                                        'переменную R_Temp , младщий байт в R_Temp.LowByte и старший байт в R_Temp.HighByte     
                                         '
          
                   
          If R_Temp.HighByte > 248 Then 
          R_Temp.LowByte = 255 - R_Temp.LowByte : R_Temp.HighByte = 255 - R_Temp.HighByte : znak = 0 : Else znak = 1 
            End If                       ' Проверяем на отрицательную температуру. 
                                          ' Если температура отрицательная – вычитаем из 255
                    
                  
                  
        
                 T1 = R_Temp.LowByte / 16                                    '16 это 10000  ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
                 T2 = R_Temp.HighByte * 16                                    ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
        
                 T1 = T1 + T2                                       ' Формирмируем результам и выдаем его на индикатор.
                                                                   
                  If znak = 0 Then                                  ' поправка результата на 1, для корректного вывода отрицательных температур
                   T1 = T1 + 1
                    End If
                If n = 1  Then  T_P1 = T1 : znak1 = znak :  End If
                  
        '        If n = 2  Then  T_P2 = T1
        '        If n = 3  Then  T_P3 = T1   
        '        If n = 4  Then  T_P4 = T1
        '        If n = 5  Then  T_P5 = T1   
        '        If n = 6  Then  T_P6 = T1
        '        If n = 7  Then  T_P7 = T1   
        '        If n = 8  Then  T_P8 = T1
                
  
 Return
  
 

   '----------------------------ПодпрограммЫ индикации  -------------------------------------    
Ind:

          Value = %00000100 : Value1 = %00000000    ' гасим 1-4 знакоместо
          GoSub DI
          Value = %00000000 : Value1 = %00000000 
          GoSub DI
          Value = %00000001 : Value1 = %00000000 
          GoSub DI
          Value = %00000010 : Value1 = %00000000 
          GoSub DI
          Value = %00000011 : Value1 = %00000000 
          GoSub DI
            Dat =  m
            GoSub Convert
             Value = %00001000              ' 8 знакоместо 
         GoSub DI
          If znak = 0  Then                  
            Value = %00000111  : Value1 = %00000001 :  Else  Value = %00000111  : Value1 = %00000000 :  ' 7 знакоместо
             EndIf 
              GoSub DI
         
        Dat =  Dig T1, 1 'Выделяем из числа десятки 
        If Dat = 0  Then
         fl_n = 1 : Value = %00000101  : Value1 = %00000000 : Else fl_n = 0 
         EndIf
         GoSub DI
        GoSub Convert 'и отправляем на табличную конвертацию 
         Value = %00000110               ' 6 знакоместо 
         GoSub DI
         
        Dat =  Dig T1, 0 
        GoSub Convert 
         If fl_n = 1  Then 
          Value = %00000110 : Else Value = %00000101    ' 5 знакоместо 
         EndIf
         
         GoSub DI
                                                         ' 4 знакоместо не используется
          If m = 1  Then
           GoTo Label5 : Else GoTo Label6 : 
          EndIf 
          
        Label5:
               If znak2 = 0  Then 
                Value = %00000011  : Value1 = %00000001 :  Else  Value = %00000011  : Value1 = %00000000 :  ' 3 знакоместо
                 EndIf 
                  GoSub DI
             
            Dat =  Dig T_P11, 1 'Выделяем из числа десятки 
            If Dat = 0  Then
             fl_n1 = 1 : Else fl_n1 = 0 
             EndIf
            GoSub Convert 'и отправляем на табличную конвертацию 
             Value = %00000010                                       ' 2 знакоместо
             GoSub DI
             
            Dat =  Dig T_P11, 0 
            GoSub Convert 
             If fl_n1 = 1  Then 
              Value = %00000010 : Else Value = %00000001             ' 1 знакоместо
             EndIf
             
             GoSub DI
        Label6:

    Return 
    
    
    DI:       ' динамическая индикация
         LOAD = 0
          SHOut DIN, CLK, MsbFirst, [Value \8,Value1 \8 ]
          LOAD = 1
        
         Return
         
        Convert: 
        Value1 = LookUpL Dat, [126,48,109,121,51,91,95,112,127,123] 
        '                     0, 1,  2,  3,  4, 5, 6,  7,  8,  9
    Return 

'   ------------------------прерывание---------------------------------------- 
    '  EvriSec:              
    '  Context Save
    '     Inc Sec         ' увеличение Sec
    '    m = ~ m            ' Переключить сегмент в противоположное состояние
    '     If Sec = 60 Then Sec = 0 :Inc minut 
    
    
    '  TOIF = 0                    ' сбросить флаг прерываний TOIF регистра TMRO
    'Context Restore             ' Восстановить регистры и выйти из обработки прерываний

'----------------------------Подпрограмма включения звукового сигнала-------------------------------------   
  ZBUK_:
          If T_P1 = T_P11 And  znak1 = znak2  Then  Sound ZBUK,[125,20,0,10] : EndIf 
       
     Return 
     

        
  '----------------------------Подпрограмма нажатия кн1-------------------------------------
KH_1:
          If KH1 = 0  Then DelayMS 50 : flagK1 = 1 : GoTo triger : EndIf           ; 
         GoTo Label1 
    triger: 
         If KH1 = 1 And flagK1 = 1 Then  DelayMS 50 : GoTo Label1 :  EndIf 
          GoTo triger                                                            
    Label1:
Return
 '----------------------------Подпрограмма нажатия кн2-------------------------------------
KH_2:
          If KH2 = 0  Then DelayMS 50 : flagK2 = 1 : GoTo triger2 : EndIf           ; 
         GoTo Label12 
    triger2: 
         If KH2 = 1 And flagK2 = 1 Then  DelayMS 50 : GoTo Label12 :  EndIf 
          GoTo triger2                                                            
    Label12:
Return
'----------------------------Подпрограмма нажатия кн3-------------------------------------
KH_3:
          If KH3 = 0  Then DelayMS 50 : flagK3 = 1 : GoTo triger3 : EndIf           ; 
         GoTo Label13 
    triger3: 
         If KH3 = 1 And flagK3 = 1 Then  DelayMS 50 : GoTo Label13 :  EndIf 
          GoTo triger3                                                            
    Label13:
Return 
'----------------------------Подпрограмма нажатия кн4-------------------------------------
KH_4:
          If KH4 = 0  Then DelayMS 50 : flagK4 = 1 : GoTo triger4 : EndIf           ; 
         GoTo Label14 
    triger4: 
         If KH4 = 1 And flagK4 = 1 Then  DelayMS 50 :  GoTo Label14 :   EndIf   
          GoTo triger4                                                            
    Label14:
  Return  
  ' далее широкое поле для улучшения
 

архив в протеусе

Категория: о proton и не только | Добавил: Konstantin (15.05.2021)
Просмотров: 300 | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Друзья сайта

  • Cайт,BASCOM AVR
  • Информер
    Под стеклом
    Настольная книга если показывает кракозябру в браузере ставлю кодировку UTF-8
  • ПРОГРАММИРОВАНИЕ PIC-МИКРОКОНТРОЛЛЕРОВ В PROTON+IDE на PicBasic