Термометр для духовки на микроконтроллере PIC
Под катом небольшой 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.
Вот, что получилось в итоге:
Термопару установил в отверстие, к штатному термостату плиты. Индикатор вынес наружу. При включении духового шкафа, подается напряжение на блок питания от старой зарядки, которая запитывает моё устройство.