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

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

Всем привет.

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

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

Что делать?

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

image

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

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

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

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

image

При включении этот печко-демон сходу жарил под 400 градусов, убедительно напомнив мне что любая органика при нагревании гарантированно превращается в уголь. Так и тут. Не зря в семейных архивах рецепты приготовления пирожков на этой печке более напоминали описание технологических режимов работы доменной печи. И пробная пицца не стала исключением. Ибо в 1980 году советская инженерная наука не могла предложить советской женщине иного способа регулировки температуры, кроме как открывая дверцу духовки. Предлагалось разогревать 10 минут, потом вставлять противень с исходниками, далее выпекать Х минут с приоткрытой дверцей, потом У минут с полностью открытой, периодически меняя местами противни. Юра Гагарин уже 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 <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <EEPROM2.h> #include <SPI.h> 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() //************************************************************************************************ 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 идут или с белыми или с ярко-синими светодиодами подсветки. Для пущей атмосферности, необходимо допилить экран. Выпаиваем и на костер их. Белые светодиоды не соответствую запланированному внешнему стилю, а синие вырвиглазные светодиоды будто призваны провоцировать приступы эпилепсии у пользователей и вообще есть творение сатаны, призванные способствовать скорейшему пришествию Антихриста. Amen. Pater noster.

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

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

image

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

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

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

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

image

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

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

image

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

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

image

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

image

image

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

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

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

image

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

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

image

image

image

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

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

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

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

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

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

image

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


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Получаем музыку Вк через сторонний API

В этот раз дело начиналось после закрытия методов audio в методе execute. Я решил посмотреть, как получают музыку сайты, которые предоставляют возможность ее скачать. Меня заинтересовал сайт vrit.me. Я залез во вкладку network и увидел интересный запрос: То есть, можно ...

Все, что нужно знать о стрессе и сильных эмоциях

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