Четверг, 28.10.2021, 13:31
progPROTON
Главная | статьи | Регистрация | Вход
Меню сайта
Категории раздела

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

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

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

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

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

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

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

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

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

фото

код:

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

  
Device = 16F630 


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  ' Включить аппаратную обработку  прерывания  
 
   '-------------------Настройка дисплея-------------------
    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
     
       znak2 = 0 
       T_P11 = 2
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 : Else fl_n = 0 
         EndIf
        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)
Просмотров: 65 | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Друзья сайта

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