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

Март 13 2022

Под катом небольшой DIY, как я сделал термометр для духовки, по просьбе супруги.

Жена любит кулинарить, особенно выпечку, а я люблю всё это употреблять :) И вот как-то сказала, что неплохо бы знать реальную температуру в духовке, для достижения лучших результатов. Из готовых термометров нашёл вроде такого:

Отзывы не однозначны, некоторые пишут, что врёт, у многих быстро выходит из строя. Будем делать свой велосипед. В качестве датчика использую термопару с готовым модулем.

Для вывода информации буду использовать обычный семисегментный трёхразрядный индикатор. Микроконтроллер PIC16LF1829 выпаянный из сломанного охранного извещателя Шорох 3.

Собирать всё буду на макетной плате. Для чипа микроконтроллера использую переходник, на больший шаг. Ещё понадобиться три, практически любых NPN транзистора, резисторы, для ограничения тока светодиодов и ещё немного всякого. Принципиальная схема выглядит так:

Платка получилась такой:

Для написания программы использовал свой любимый GreatCowBASIC.

'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

Используем аппаратный SPI для связи с MAX6675 и динамическую индикацию для отображения температуры на семисегментном индикаторе. В случае ошибки чтения или обрыва провода от термопары, на экране отображаются символы Err.

Вот, что получилось в итоге:

Термопару установил в отверстие, к штатному термостату плиты. Индикатор вынес наружу. При включении духового шкафа, подается напряжение на блок питания от старой зарядки, которая запитывает моё устройство.

Раздел: DIY Теги: DIY GreatCowBASIC