[Из песочницы] Вторая жизнь электродуховки «Харьков»

Всем привет.

Не буду делать долгие и лирические вступления о том как коротка и жестока судьба бытовой техники. То что еще вчера воспринималось как последнее достижение прогресса, сегодня уже будет привычной частью среднестатистического домохозяйства, а завтра будет просто выброшено на свалку, не смотря на полную работоспособность или в лучшем случае — разобрано на запчасти как донор деталей. Ибо «тут кнопки, а хочу сенсор», и «дизайн совковый» и «нет этой фишки». И ладно если речь идет о какой то китайской микроволновке или чайнике, к которым и привыкнуть то толком не успеваешь из-за их короткого жизненного цикла и пластиковой бездуховности.

Но что делать, когда речь идет о вещи, которая помнит несколько поколений твоей семьи и с детства была для тебя воплощением домашнего уюта, бабушкиных вкусностей и всего самого «лампового». Выкинуть рука не поднимется, как с этой вещью уж слишком много воспоминаний и вообще сие есть кощунство. Но и использовать ну уж никак не представляется возможным по причине тотального устаревания и откровенно непрезентабельного вида.

Что делать?

Правильно! Воскрешать.
Встречайте нашу героиню. Духовка электрическая «Харьков».

image

Для начала короткое знакомство с подопытной:

  • Год выпуска — 1980 (моя ровесница).
  • Мощность — 800 ватт.


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

Когда в период моей былой холостяцкой жизни я отрыл в недрах гаражей этот раритет, смахнул ностальгическую слезу и попытался что то в ней приготовить, то до меня стало доходить что при всей своей милой винтажности, этот «генератор пирожков» такой же дружелюбный к пользователю как первый деревянный велосипед 1817 года авторства Карла фон Дреза. В музее посмотреть можно, поумиляться винтажности тоже, но после первой же условной поездки понимаешь что кесарю кесарево, а раритету место в музее, и кататься я буду все таки на современном велике ибо отбивать почки не хочется.

image

Так и тут. При включении этот печко-демон сходу жарил под 400 градусов, убедительно напомнив мне что любая органика при нагревании гарантированно превращается в уголь. И пробная пицца не стала исключением. Не зря в семейных архивах рецепты приготовления пирожков на этой печке более напоминали описание технологических режимов работы доменной печи. Предлагалось разогревать 10 минут, потом вставлять противень с исходниками, далее выпекать Х минут с приоткрытой дверцей, потом У минут с полностью открытой, периодически меняя местами противни. Ибо в 1980 году советская инженерная наука не могла предложить советской женщине иного способа регулировки температуры, кроме как открывая дверцу духовки. Юра Гагарин уже 19 лет как на орбите крутился и наша ядрёная бомба была самая ядрёная, но советские хозяйки все продолжали греть планету духовками «Харьков».

Ладно. Ситуация прояснена, цели поставлены, инструменты наточены. Перейдем к технической части.


Программная составляющая


«Я верю во Единого Отца Вседержителя, Творца неба и земли, видимым же всем и невидимым. Имя богу моему Ардуино. Аминь.»

Будучи ревностным прихожанином церкви Ардуиновой, я естественно решил лепить свое детище на этой богоугодной платформе. Ибо и просто и дешево и по ногам подходит. Но об электронной начинке немного позже, а сейчас обратим наши взоры на программную начинку. Скетч, то бишь.

Перед нами стоит следующая задача. Необходимо реализовать следующие функции в контроллере духовки:

  • таймер — задание времени работы нашей программы;
  • термостат — задание и поддержание температуры на определенном уровне;
  • звуковая сигнализация первого выхода на заданную температуру — момент когда пора пироги ставить;
  • звуковая сигнализация окончания программы — момент когда пора пироги доставать;
  • визуальная индикация режимов работы — что бы понимать что происходит в данный и еще это просто красиво. Индикаторов два — включена программа и включен тэн.
  • отображение оставшегося времени работы. Что бы понимать когда пора выделять желудочный сок.


Пошерстив свитки мудрецов на ардуинофорумах, с божьей помощью был сотворен следующий говнокод. Критика не принимается. Кто будет критиковать, тот не получит пирогов.

Скетч
    /*
    d6 - светодиод режима работы (желтый)
    d7 - реле тэна (желтый) и светодиод режима нагрева (фиолетовый) 
    d8 - пищалка
    d9 - ce (экран) (белый)
    d10 - rst (экран) (коричневый)
    d11 - dc (экран) (черный)
    d12 - din экран (зеленый)
    d13 - clk экран (розовый)
    gnd - bl экран (к gnd)
    a0 - кнопка валкодера (серый)
    a1 - вход валкодера (оранж)
    a2 - вход валкодера (голубой)
    a4 - вход термистора. резистор 10 к между а4 и +5. термистор между - и а4
    vcc - питание (красный)
    gnd - земля (синий)
  */    
    
    #include 
    #include 
    #include 
    #include  


    volatile byte seqA = 0;
    volatile byte seqB = 0;
    volatile byte cnt1 = 0;
    volatile byte cnt2 = 0;
    volatile int Temp = 150; // температура по дефолту
    volatile int Time = 30; // время работы по дефолту
    boolean heat = false;
    boolean work = false;
    boolean first_heat;
    volatile boolean right = false;
    volatile boolean left = false;
    volatile boolean button = false;
    long previousMillis = 0;
    int temp_count;
    long time_ost;
    long time_millis;
    
    byte menuitem = 1; //при включении отобразится пункт меню 1  
    byte page = 1; // и страница 1
        
    unsigned long heatMillis = 0;

    #define RT0 10000   // Ом
    #define B 3950      // K
    #define VCC 5    //Напр-е питания
    #define R 10000  //R=10 КОм
    float RT, VR, ln, TX, T0, VRT, temp_izmer, temp_itog;
    
    Adafruit_PCD8544 display = Adafruit_PCD8544(13, 12, 11, 9, 10);

    //**************************************************************************************************
    void setup() {//*************************************************************************************
    //***************************************************************************************************
    Serial.begin(115200);
         
    pinMode(A0, INPUT); 
    pinMode(A1, INPUT);
    pinMode(A2, INPUT);
    pinMode(A4, INPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(LED_BUILTIN, OUTPUT);

    digitalWrite(A0, HIGH);   //валкодер
    digitalWrite(A1, HIGH);    //валкодер
    digitalWrite(A2, HIGH);    // валкодер
    digitalWrite(6, LOW); //светодиод состояния работы
    digitalWrite(7, HIGH);  //реле тена
    digitalWrite(8, LOW);  //пищалка

    T0 = 25 + 273.15;                 //Температура T0 из даташита, преобразуем из цельсиев в кельвины
     
    PCICR =  0b00000010; // 1. PCIE1: Pin Change Interrupt Enable 1
    PCMSK1 = 0b00000111; // Enable Pin Change Interrupt for A0, A1, A2

    // Initialize LCD
    display.setRotation(2); // Set LDC orientation
    display.begin(60);      // Set LCD contrast
    display.clearDisplay(); // Clear display
    display.display();      // Apply changes

    
    Temp = EEPROM_read_byte(0);
    Time = EEPROM_read_byte(3);
    sei();
    }


    //************************************************************************************************
    void loop() {//**********************************************************************************
    //************************************************************************************************

    //начинаем отсчет времени  
    unsigned long currentMillis = millis();

    // первое главное меню*****************************************************************************
    if (page==1) {
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.drawFastHLine(0,0,83,BLACK);
    display.drawFastHLine(0,47,83,BLACK);
    display.drawFastVLine(0,0,47,BLACK);
    display.drawFastVLine(1,0,47,BLACK);
    display.drawFastVLine(2,0,47,BLACK);
    display.drawFastVLine(3,0,47,BLACK);
    display.drawFastVLine(4,0,47,BLACK);
    display.drawFastVLine(83,0,83,BLACK);
    
    display.setCursor(5, 2);//первый нукт меню
    if (menuitem==1) { 
    display.setTextColor(WHITE, BLACK); //выделяем инверсией активный пункт меню
    display.drawFastHLine(0,1,83,BLACK);  //*************************
    }     
    else {display.setTextColor(BLACK, WHITE); //если не пункт не активный то без инверсии
    }                  
    display.print(" TEMP        ");
    
    display.setCursor(5, 14);
    if (menuitem==2) {
    display.setTextColor(WHITE, BLACK);
    display.drawFastHLine(0,13,83,BLACK);
    }
    else {display.setTextColor(BLACK, WHITE);}    
    display.print(" TIME        ");

    
    if (menuitem == 3) { 
    display.setTextColor(WHITE, BLACK);
    display.drawFastHLine(0,25,83,BLACK);
    }
    else {
    display.setTextColor(BLACK, WHITE);
    }  
    display.setCursor(5, 26);
    display.print(" START:   ");
    if (work) {
    display.print("ON ");
    }
    else {
    display.print("OF ");
    }
    
    display.setCursor(5, 38);
    if (menuitem==4) { 
    display.setTextColor(WHITE, BLACK);
    display.drawFastHLine(0,37,83,BLACK);
    }
    else {display.setTextColor(BLACK, WHITE);}    
    display.print(" INFO        ");
    
    if (left) {
    left = false;
    menuitem--;
    if (menuitem==0) {
    menuitem=1;
    }      
    
    }
    
    if (right) {
    right = false;
    menuitem++;
      
    if (menuitem==5) {
    menuitem = 4;      
    }    
    }
    display.display();
    
    if (button) {
    button = false;
    digitalWrite(8, HIGH);
    delay (50);  // одновременно и антидребезг и продолжительность звуковой индикации
    digitalWrite(8, LOW);
    
        
    if (page == 1 && menuitem==1) {
    page=3;
    }

    else if (page == 1 && menuitem==2) {
    page=4;
    }

    else if (page == 1 && menuitem==4) {
    page=5;
    }

    //включение режима работы********************************************************************************
    else if (menuitem == 3 && page == 1) {
    if (work) { 
    work = false;
    digitalWrite(6, LOW); // выключаем светодиод работы 
    }
    else {
    heatMillis = currentMillis;
    work = true;
    first_heat = true;
    digitalWrite(6, HIGH);  // включаем светодиод работы 
    } 
    }
    
    }
    }
      

    //первый нункт меню (температура)***************************************************
    if (page==3) {
    display.setTextSize(1);
    display.clearDisplay();
    display.drawFastHLine(0,0,83,BLACK);
    display.drawFastHLine(0,1,83,BLACK);
    display.drawFastHLine(0,47,83,BLACK);
    display.drawFastVLine(0,0,47,BLACK);
    display.drawFastVLine(83,0,83,BLACK);
    display.drawFastVLine(82,0,10,BLACK);
    display.drawFastVLine(81,0,10,BLACK);
    display.drawFastVLine(80,0,10,BLACK);
    display.drawFastVLine(79,0,10,BLACK);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(1, 2);
    display.print("     Temp    ");
    display.drawFastHLine(0,10,83,BLACK);
    display.setTextColor(BLACK, WHITE);
    display.setCursor(26, 12);
    display.print("Degree");
    display.setTextSize(3);
    if (Temp >=100) {
    display.setCursor(16, 23);
    }
    else {
    display.setCursor(27, 23); 
    }
    
    display.print(Temp);
    if (left) {
    left = false;
    Temp--;
    }
    if (Temp==49) {
    Temp=50;
    }
      
    if (right) {
    right = false;
    Temp++;
    }
    if (Temp==251) {
    Temp=250;
    }
    if (button) {
    digitalWrite(8, HIGH);
    delay (50);
    digitalWrite(8, LOW);
    button = false;
    page=1;
    EEPROM_write_byte(0, Temp);
    }
    display.display();
    }



    //второй нункт меню (время)***************************************************************************
    else if (page==4) {
    display.setTextSize(1);
    display.clearDisplay();
    display.drawFastHLine(0,0,83,BLACK);
    display.drawFastHLine(0,1,83,BLACK);
    display.drawFastHLine(0,47,83,BLACK);
    display.drawFastVLine(0,0,47,BLACK);
    display.drawFastVLine(83,0,83,BLACK);
    display.drawFastVLine(82,0,10,BLACK);
    display.drawFastVLine(81,0,10,BLACK);
    display.drawFastVLine(80,0,10,BLACK);
    display.drawFastVLine(79,0,10,BLACK);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(1, 2);
    display.print("     Time    ");
    display.drawFastHLine(0,10,83,BLACK);
    display.setTextColor(BLACK, WHITE);
    display.setCursor(22, 12);
    display.print("Minutes");
    display.setTextSize(3);
    if (Time >=10) {
    display.setCursor(27, 23);
    }
    else {
    display.setCursor(38, 23); 
    }
    display.print(Time);
    if (left) {
    left = false;
    Time--;
    }
    if (Time==0) {
    Time=1;
    }
      
    if (right) {
    right = false;
    Time++;
    }
    if (Time==61) {
    Time=60;
    }
    if (button) {
    digitalWrite(8, HIGH);
    delay (50);
    digitalWrite(8, LOW);
    button = false;
    page=1;
    EEPROM_write_byte(3, Time);
    }
    display.display();
    }


     //четвертый нункт меню (панель состояния)***********************************************************
    else if (page==5) {
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setTextSize(1);
    display.drawFastHLine(0,0,83,BLACK);
    display.drawFastHLine(0,47,83,BLACK);
    display.drawFastVLine(0,0,47,BLACK);
    display.drawFastVLine(83,0,83,BLACK);
    display.setCursor(3, 5);
    display.print("TEMP_UST:");
    display.setCursor(64, 5);
    display.print(Temp);
    
    display.setCursor(3, 20);
    display.print("TEMP_TEK:");
    display.setCursor(64, 20);
    display.print(temp_itog, 0);

    display.setCursor(3, 35);
    display.print("TIME_OST:");
    display.setCursor(64, 35);
    display.print(time_ost);

        
    if (button) {
    digitalWrite(8, HIGH);
    delay (50);
    digitalWrite(8, LOW);
    button = false;
    page=1;
    }
    display.setTextSize(2);
    display.display();
    }

    //вычисляем оставшееся время*********************************************
    if (work) {
    time_millis = Time * 1000;
    time_millis = time_millis * 60;
    
    time_ost = ((time_millis) - (currentMillis - heatMillis));
    time_ost = time_ost/1000;
    time_ost = time_ost/60;
    }
    else {
    time_ost = 0;
    }

    //опеределяем время окончания*******************************************
    if (((currentMillis - heatMillis) > time_millis) && (work)) {
    work = false;
    digitalWrite(6, LOW);  // выключаем светодиод работы
    digitalWrite(8, HIGH);// подаем сигнал
    delay (1000);
    digitalWrite(8, LOW);
    delay (500);
    digitalWrite(8, HIGH);
    delay (1000);
    digitalWrite(8, LOW);
    delay (500);
    digitalWrite(8, HIGH);
    delay (1000);
    digitalWrite(8, LOW);
    }
    
    //измерение температуры*************************************************
    if (currentMillis - previousMillis > 500) {
    previousMillis = currentMillis; 
    VRT = analogRead(A4);              //Считываем аналоговое значение VRT
    VRT = (5.00 / 1023.00) * VRT;      //Преобразуем в напряжение
    VR = VCC - VRT;
    RT = VRT / (VR / R);               //Сопротивление RT
    ln = log(RT / RT0);
    TX = (1 / ((ln / B) + (1 / T0))); //Температура с термистора
    TX = TX - 273.15;                 //Преобразуем в цельсии
    temp_count++;
    temp_izmer = temp_izmer + TX;
    }

    if (temp_count == 10) {
    temp_itog = temp_izmer/10;
    temp_count = 0;
    temp_izmer = 0;
    }

     // сравнение текущей и заданной температуры**********************
    if (temp_itog < (Temp - 1)) {   // гистерезис
    heat = true;
    }
    if (temp_itog > (Temp + 1)) {
    heat = false;
    
    if (first_heat) {   // при первом достижении рабочей Т подаем сигнал
    first_heat = false;
    digitalWrite(8, HIGH);// подаем сигнал
    delay (200);
    digitalWrite(8, LOW);
    delay (300);
    digitalWrite(8, HIGH);
    delay (200);
    digitalWrite(8, LOW);
    delay (300);
    digitalWrite(8, HIGH);
    delay (200);
    digitalWrite(8, LOW);
    }
    
    }

    

    //включение тена*****************************************************
    if ((work) && (heat)) {
    digitalWrite(7, LOW);  // включаем тен
    digitalWrite(5, HIGH);  // включаем светодиод тена
    }
    else {
    digitalWrite(7, HIGH);  // выключаем тен
    digitalWrite(5, LOW); // выключаем светодиод тена
    }


    // контроль перегрева или обрыва датчика********************************************
    if ((temp_itog < 0) || (temp_itog > 250)) {
    digitalWrite(8, HIGH);// подаем сигнал
    delay (500);
    digitalWrite(8, LOW);
    delay (500);
    }
    
    }

    // обработка прерываний валкодера ******************************************************************
    ISR (PCINT1_vect) {

    // If interrupt is triggered by the button
    if (!digitalRead(A0)) {
    button = true;
    }
    else {    // Else if interrupt is triggered by encoder signals
    boolean A_val = digitalRead(A1);   // Read A and B signals
    boolean B_val = digitalRead(A2);
    
    // Record the A and B signals in seperate sequences
    seqA <<= 1;
    seqA |= A_val;
    
    seqB <<= 1;
    seqB |= B_val;
    
    // Mask the MSB four bits
    seqA &= 0b00001111;
    seqB &= 0b00001111;
    
    // Compare the recorded sequence with the expected sequence
    if (seqA == 0b00001001 && seqB == 0b00000011) {
    cnt1++;
    left = true;
    }
     
    if (seqA == 0b00000011 && seqB == 0b00001001) {
    cnt2++;
    right = true;
    }
    }
    }



Все более чем обычно, по сути слеплено из самых базовых примеров работы с экраном Нокиа 5110, энкодером, термистором и релюшкой. Свой выбор в пользу этих комплектующих обосную в следующей части нашего увлекательного повествования.

Меню состоит из 4 пунктов: «TEMP», «TIME», «START» и «INFO». Что за что отвечает, думаю ясно из фото. При необходимости можно остановить программу, добавить или убавить время или температуру и вновь продолжить.

image

Естественно, наши настройки сохраняются в энергонезависимой памяти.

Так же была добавлен контроль перегрева духовки и контроль обрыва или порчи термодатчика. При выходе температуры за 250 градусов (залипание реле или какой то неучтенный сбой) или падении температуры ниже нуля (обрыв датчика, в обрыве он показывает — 270 градусов) будет тревога.


Аппаратная составляющая


Для реализации описанного выше функционала нам потребуются следующие компоненты:

  • Блок питания 220 — 5 вольт, выдранный из какой то зарядки. Питает всю электронику.
  • Arduino pro mini. Кремниевый супермозг, отвечающий за управление нашим детищем.
  • Экран монохромный Нокия 5110, разрешением 84×48 точек с небольшой доработкой. Отображает пункты меню, позволяя настраивать температуру, время, включать программу на исполнение и просматривать текущие параметры в процессе работы.
  • Энкодер (он же валкодер, он же крутилка). Позволяет в интуитивной форме управлять меню настроек и требует всего одно отверстие в панели управления.
  • Реле. Самое обычный модуль реле на 10 китайских ампер. Даже без опторазвязки. Да, риск мое второе имя.
  • Термистор в качестве датчика температуры. Когда то мной был выломан из какого то устройства неопознанный термодатчик на резьбе, лежал без дела, теперь стал востребован. Тестирование показало что внутри обычный NTC термистор на 10 ком. То есть все более чем просто и паспортный предел температуры в 250 — 300 градусов соответствует моим задачам. Для уверенности сделал пробный стенд из термистора и цифрового датчика DS18B20. До 100 градусов показывали ноздря в ноздрю и точность более чем избыточная. Любо!
  • Световая индикация — пара оранжевых светодиодов. Звуковая индикация — активная пьезопищалка.


image

Для пущей атмосферности, необходимо допилить экран. По умолчанию, экранчики Нокии 5110 идут или с белыми или с ярко-синими светодиодами подсветки. Белые светодиоды не соответствую запланированному внешнему стилю, а синие вырвиглазные светодиоды будто призваны провоцировать приступы эпилепсии у пользователей и вообще есть творение сатаны, призванные способствовать скорейшему пришествию Антихриста. Выпаиваем и на костер их. Pater noster. Amen.

Далее берем оранжевые smd светододы, призванные имитировать олдскульные лампочки накаливания и впаиваем их вместо штатных, предварительно сняв металлический ободок экрана и сам ЖК экран под ним. Теперь все по фен-шую.

Находим подходящую по размеру пластиковую коробочку с крепежными ушками. В ней размещаем блок питания, ардуинку, пищалку и релюшку. Выводим пару проводов на сетевое питание, пару проводов на термистор и жгут проводов к передней панели к экрану, энкодеру и светодиодам состояния с рассеивателями. Место блока управления — на пузе духовке.

image


Железная составляющая


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

Снимаем заднюю панель, отогнув 4 крепежных ушка, что бы добраться до задней стенки внутренней полости печки. Вынимаем слой оружия массово поражения под названием «стекловата». Посредине задней стенке внутренней полости сверлим отверстие по размеру стержня термистора, вставляем термистор, закручиваем гайку, выводим провода под корпус, выковыриваем остатки стекловаты, вместо нее напихиваем базальтовую вату и собираем обратно.

Далее готовим панель управления, элементы ручек и трафареты для декора. Никакого пластика, только металл. Так как я не умею чертить в Автокаде, то необходимые мне детали рисую в Фотошопе и конвертирую в dwg формат через какой то облачный сервис. Да, я извращенец, я знаю, мне нравится. Отдаем чертежи на лазерную порезку.

image

Привариваем приборную панель на запланированное место. Довариваем по бокам недостающие треугольнички, шпатлюем и зачищаем место сварки, максимально создавая видимость сплошной детали. На приборной панели 4 прорези — место под экран, место под энкодер с отверстиями для светодиодов под крутилкой «для красоты» под крутилкой, и фигурные прорези для индикаторов работы и нагрева. Панель из стали толщиной 2 мм, что бы не мало было. «Вес это надежно». Борис Бритва.

Почтенный возраст духовки и многолетнее нахождение в негуманных условиях не могли не оставить следов на ее корпусе. Имели место царапины краски, мелкие вмятинки и очаги коррозии. Одеваем на болгарку щетку-крацовку и максимально зачищаем. Шпатлюем вмятины и дефекты автомобильной шпатлевкой. Снова зачищаем. Обезжириваем.

image

Далее по покраске. Я не нашел в своей местности возможности заколорировать пентафталевую эмаль в цвета на выбор, посему выбирал из доступных готовых цветов. Была выбрана слоновая кость для основного цвета корпуса и фисташковая для элементов декора корпуса.

Красим, косячим, материмся, убираем потеки, перекрашиваем, опять косячим, клянемся больше никогда не морочиться с подобным, а просто мирно бухать как все нормальные мужики, успокаиваемся, снова красим, остаемся довольны. Ждем неделю пока краска точно высохнет.

image

Пока сохнет печка, варим в кучу крепления для запирающей ручки двери, чертим эскиз деревянных ручек и отдаем токарю. Красим уже сами ручки и оставляем на просушку. Красим ручку энкодера и металлическую накладку на корпусе экрана.

image

image

После полного высыхания корпуса, накладываем трафареты и красим уже фисташковой краской.

Далее приблизительно складываем все в кучу и понимаем что боковые поверхности духовки провокационно пусты и не можем не удержаться что бы не налепить что еще и туда. Но красить через металлические трафареты крайне неудобно из-за подтекания краски под трафарет и необходимости потом кисточкой с сольвентом корректировки рисунка. А трафареты на заказ из оракала не смог заказать из-за отсутствия понимания с «манагером» из рекламного агенства. Посему нашел готовые, подходящие по размеру в инете.

Наклеваем. Красим. Восхищаемся.

image

Далее собираем все в кучу — устанавливаем экран, энкодер и ручку энкодера. Из ошкуренного оргстекла делаем рассеиватели для индикаторов режимов работы и клеим их снизу приборной панели. Протягиваем и паяем провода модулей и устанавливаем сетевой разьем питания с клавишей включения. Сверлим и устанавливаем держатели для деревянных ручек. На изнанку указателя Open-Close клеим фетр, что бы ручка при вращении не царапала поверхность дверцы.

Далее зовем хозяйку, вручаем ей этот креатив, выслушиваем какой я умный и красивый, и пока ожидаем пирогов, дописываем еще пару строк, обьясняя почему я это сделал именно так, а не иначе.

image

image

image

1. Почему алгоритм поддержания температуры такой тупой, а не PID?

Потому что просто нет необходимости. За стандартную программу работы, 30–40 минут, температура печки всего пару раз переходит целевую точку. Печка небольшая, неплохо утеплена, остывает медленно. PID алгоритму банально негде развернуться. Небольшая температурная инерция имеет место всего один раз при первом наборе температуры и перехлест составляет порядка 20 градусов, что совсем не принципиально для выпечки и удобно нивелируется открыванием дверки в этот момент для закладки противня. Для этого и звучит сигнал выхода на рабочую температуру. Следующая итерация вообще происходит в диапазоне порядка ± 2 градуса.

2. Почему реле, а не симистор и почему не ШИМ?

Все потому же. Симисторы люблю и готовить их умею, но хоть ты тресни не считаю необходимым их пихать в девайс, в котором за полчаса работы реле щелкает аж четыре раза. И при 800 ват мощности, то есть трех амперах тока даже в китайском реле будет достаточный запас прочности. А ШИМу тут вообще нечего делать, не тот уровень устройства. Да и реле это душевно и лампово, а симистор то высокомерие и гордыня. Да и хозяйка более чем довольна, а это и была стратегическая цель. Короче, все.

3. Что еще планируется?

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

image

За сим разрешите откланяться, ушел пироги тестировать. Привіт з України.

© Habrahabr.ru