Термометр для духовки на pic

Тема в разделе "Глядите, что я сделал", создана пользователем KindMan, 13 мар 2022.

  1. KindMan

    KindMan Гуру

    Запросила жена термометр для духовки. Решил собрать из подручных материалов. В наличии термопара с модулем на MAX6675, микроконтроллер из охранного извещателя Шорох 3 PIC16LF1829 и трёхразрядный семисегментный индикатор. Программу писал в GreatCowBASIC.
    TermoSHsmall.png
    Gotov1.png
    Gotov2.png
    Термопару установил в отверстие родом с штатным термостатом. Подключил к плите - при включение духовки включается и термометр. Питается от зарядки старого мобильника.
    Код (C++):
    'Chip settings
      #chip 16LF1829, 16
      #config Osc = Int

      SPIMode MasterSlow

      DIM Temperature as Word '
    Значение температуры с термопары
      DIM SegmentsBuffer(3) as Byte ' Буфер символов для отображения на индикаторе
      DIM Symbols(13) '
    Значения символов от 0 до 9, пусто, E, r
      Symbols = 111, 40, 31, 62, 120, 118, 119, 44, 127, 126, 0, 87, 17
      #define SymbolE 11 ' Буква E
      #define SymbolR 12 ' Буква r
      #define Clear 10   ' Нет символа
      #define delay 5    ' Время отображения одного символа
      DIM L_byte as Byte
      DIM Timer as Byte

      ' SPI
      #define CS  PortA.5
      #define SCK PortB.6
      #define SO  PortB.4
      Dir SO in
      Dir SCK out
      Dir CS out
      '
    7 Segments
      #define SEG1 PORTA.4
      #define SEG2 PORTA.2
      #define SEG3 PORTB.5
      Dir PORTC out
      Dir SEG1 out
      Dir SEG2 out
      Dir SEG3 out

      Wait 1 s

      Timer = 100

      do Forever

        if Timer = 100 then
          call GetTemperature
          Timer = 0
        end if
        call ShowSegments
        Timer = Timer + 1

      Loop


      Sub GetTemperature

        CS = 0
        SPITransfer 0, Temperature
        Temperature = FnLSL(Temperature, 8)
        SPITransfer 0, L_byte
        Temperature = Temperature or L_byte
        Temperature = FnLSR(Temperature, 5)
        CS = 1

      End Sub

      Sub ShowSegments
        if Temperature = 1023 then
          SegmentsBuffer(1) = SymbolE
          SegmentsBuffer(2) = SymbolR
          SegmentsBuffer(3) = SymbolR
        else if Temperature > 99 then
          SegmentsBuffer(1) = Temperature / 100
          SegmentsBuffer(2) = Temperature % 100
          SegmentsBuffer(2) = SegmentsBuffer(2) / 10
          SegmentsBuffer(3) = Temperature % 10
        else if Temperature > 9 then
          SegmentsBuffer(1) = Clear
          SegmentsBuffer(2) = Temperature / 10
          SegmentsBuffer(3) = Temperature % 10
        else
          SegmentsBuffer(1) = Clear
          SegmentsBuffer(2) = Clear
          SegmentsBuffer(3) = Temperature
        end if
        PORTC = Symbols(SegmentsBuffer(1)+1)
        Set SEG1 Off
        Set SEG3 On
        Wait delay ms
        PORTC = Symbols(SegmentsBuffer(2)+1)
        Set SEG3 Off
        Set SEG2 On
        Wait delay ms
        PORTC = Symbols(SegmentsBuffer(3)+1)
        Set SEG2 Off
        Set SEG1 On
        Wait delay ms

      End Sub
     
     
    Asper Daffy и Airbus нравится это.