Olá pessoal.
Não farei apresentações longas e líricas sobre quão curto e cruel é o destino dos eletrodomésticos. O que foi percebido como a última conquista do progresso ontem, hoje já será uma parte familiar do agregado familiar médio, e amanhã será simplesmente jogado no aterro, apesar de sua capacidade total para o trabalho ou, na melhor das hipóteses, desmontado para peças como doador de peças. Para "existem botões, mas eu quero um sensor" e "o design é pás" e "não existe este chip". Tudo bem, se estamos falando de algum tipo de micro-ondas ou chaleira chinesa, com os quais você realmente não se acostuma, devido ao seu curto ciclo de vida e à falta plástica de espiritualidade.
Mas o que fazer quando se trata de algo que foi lembrado por várias gerações de sua família e desde a infância foi para você a personificação do conforto do lar, dos presentes da avó e de toda a “lâmpada”. Jogar uma mão não se levanta, pois há muitas lembranças com essa coisa e, em geral, isso é blasfêmia. Mas não é de todo possível usá-lo por causa da obsolescência total e da aparência francamente não representável.
O que fazer
Certo! Ressuscitar.
Conheça nossa heroína. Forno elétrico "Kharkov".

Para começar, um breve conhecimento do assunto:
- Ano de lançamento - 1980 (minha idade).
- Potência - 800 watts.
E isso é tudo. Não há cronômetro, controle de temperatura ou potência, nem termômetro. Wai Fai também não é procurado em todos os lugares, honestamente. Bem, não, isso é tudo. Não tem nada Somente o gabinete com elementos de aquecimento e o plugue na tomada, mesmo sem um interruptor. Asse como quiser.
Quando, durante minha antiga vida de solteiro, descobri essa raridade nas entranhas das garagens, limpei uma lágrima nostálgica e tentei cozinhar alguma coisa nela, então comecei a perceber que, com toda a sua doce safra, esse “gerador de torta” é tão amigável quanto o primeiro Bicicleta de madeira 1817 por Carl von Dres Você pode olhar para o museu, maravilhar-se com a safra também, mas após a primeira viagem condicional, você entende que César é de César, e um lugar raro no museu, e ainda vou andar de bicicleta moderna porque não quero bater nos rins.

Então está aqui. Quando ligado, esse demônio-fogão imediatamente assou a 400 graus, lembrando-me de forma convincente que qualquer produto orgânico aquecido é transformado em carvão. E a pizza experimental não foi exceção. Não é por nada nos arquivos da família, as receitas para fazer tortas neste fogão eram mais como uma descrição dos modos de operação tecnológica de um alto-forno. Sugeriu-se aquecer por 10 minutos, depois inserir a assadeira com as fontes, assar X minutos com a porta entreaberta, depois U minutos com completamente aberto, trocando periodicamente as assadeiras. Pois em 1980, a engenharia soviética não poderia oferecer à mulher soviética outra maneira de ajustar a temperatura, exceto abrindo a porta do forno. Yura Gagarin está girando em órbita há 19 anos e nossa bomba nuclear foi a mais nuclear, mas as donas de casa soviéticas continuaram a aquecer o planeta com fornos de Kharkiv.
Ok. A situação foi esclarecida, metas definidas, ferramentas afiadas. Vamos para a parte técnica.
Componente de software
“Creio no Pai Todo-Poderoso, o Criador do céu e da terra, visível a todos e invisível. O nome do meu deus é Arduino. Amém. "
Sendo um paroquiano zeloso da igreja de Arduinova, naturalmente decidi esculpir minha ideia nesta plataforma de caridade. Pois é simples e barato e serve para as pernas. Mas sobre o recheio eletrônico um pouco mais tarde, e agora voltamos nossos olhos para o recheio de software. Esboço, quero dizer.
Somos confrontados com a seguinte tarefa. As seguintes funções devem ser implementadas no controlador do forno:
- timer - definindo a hora do nosso programa;
- termostato - ajuste e manutenção da temperatura em um determinado nível;
- alarme sonoro da primeira saída para a temperatura definida - o momento em que é hora de colocar tortas;
- sinalização sonora do final do programa - o momento em que é hora de pegar as tortas;
- indicação visual dos modos de operação - para entender o que está acontecendo nisso e é simplesmente bonito. Existem dois indicadores - o programa está ativado e os dez estão ativados.
- exibição do tempo restante de operação. Entender quando é hora de secretar suco gástrico.
Depois de pintar os pergaminhos dos sábios nos fóruns do arduino, com a ajuda de Deus, o seguinte govnokod foi criado. Críticas não são aceitas. Quem criticar não receberá tortas.
Esboço #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() {//************************************************************************************* //*************************************************************************************************** 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; } } }
Tudo é mais do que o habitual, essencialmente feito dos exemplos mais básicos de trabalho com uma tela Nokia 5110, um codificador, um termistor e um relé. A escolha a favor desses componentes é justificada na próxima parte de nossa fascinante narrativa.
O menu consiste em 4 itens: “TEMP”, “TIME”, “START” e “INFO”. O que é responsável pelo quê, acho que fica claro na foto. Se necessário, você pode interromper o programa, adicionar ou reduzir o tempo ou a temperatura e continuar novamente.

Naturalmente, nossas configurações são armazenadas na memória não volátil.
Também foram adicionados o controle de superaquecimento do forno e o controle de uma quebra ou dano ao sensor de temperatura. Se a temperatura ultrapassar os 250 graus (um relé fica preso ou se não houver falha) ou a temperatura cai abaixo de zero (um sensor aberto mostra 270 graus em campo aberto), um alarme será acionado.
Componente de hardware
Para implementar a funcionalidade descrita acima, precisamos dos seguintes componentes:
- Fonte de alimentação 220 - 5 volts, arrancada de algum tipo de carregamento. Alimenta todos os eletrônicos.
- Arduino pro mini. Superbrain de silício responsável por gerenciar nossa ideia.
- Tela monocromática Nokia 5110, resolução 84 * 48 pixels, com uma ligeira revisão. Exibe itens de menu, permitindo definir a temperatura, o tempo, habilitar o programa para execução e visualizar os parâmetros atuais no processo.
- Codificador (aka codificador, aka twist). Ele permite gerenciar intuitivamente o menu de configurações e requer apenas um orifício no painel de controle.
- Relé O módulo de relé mais comum é de 10 amperes chineses. Mesmo sem opto-isolamento. Sim, risco é meu nome do meio.
- Termistor como sensor de temperatura. Uma vez, um sensor térmico não identificado em um segmento foi quebrado por algum dispositivo por mim, permaneceu ocioso, agora tornou-se uma demanda. Testes mostraram que dentro de um termistor NTC comum às 10 com. Ou seja, tudo é mais do que simples e o limite de temperatura do passaporte de 250 a 300 graus corresponde às minhas tarefas. Para ter certeza, fiz um banco de testes com um termistor e um sensor digital DS18B20. Até 100 graus mostraram narina na narina e a precisão é mais do que excessiva. Lubo!
- Indicação de luz - um par de LEDs laranja. Indicação sonora - buzina piezo ativa.

Para uma maior atmosfera, é necessário terminar a tela. Por padrão, as telas do Nokia 5110 vêm com LEDs de luz de fundo branca ou azul brilhante. Os LEDs brancos não correspondem ao estilo externo planejado, e os LEDs azuis vyrviglazny parecem provocar ataques de epilepsia entre os usuários e, em geral, há a criação de Satanás, projetado para contribuir para a rápida chegada do anticristo. Nós também os bebemos na fogueira. Pater noster. Amém.
Em seguida, pegamos os LEDs laranja smd, projetados para simular lâmpadas incandescentes da velha escola e soldá-las em vez das lâmpadas padrão, depois de remover o painel metálico da tela e a própria tela LCD embaixo dela. Agora tudo é Feng Shui.
Encontramos uma caixa de plástico adequada com orelhas de montagem. Colocamos nele uma fonte de alimentação, um arduinka, um squeaker e um trustushka. Nós produzimos um par de fios para a fonte de alimentação, um par de fios para o termistor e uma fiação para o painel frontal da tela, LEDs de status e codificador com difusores. O local da unidade de controle está na barriga do forno.

Componente de ferro
Com todo o meu amor pela tecnologia antiga, eu nunca teria tentado restaurar este forno se não fosse uma coisa: tenho uma cozinha no estilo provençal e a caixa redonda e arredondada do vintage se encaixa perfeitamente no interior. Portanto, foi decidido enganar.
Retiramos o painel traseiro dobrando as 4 orelhas de fixação para chegar à parede traseira da cavidade interna do fogão. Tiramos uma camada de armas de destruição em massa chamada "lã de vidro". No meio da parede traseira da cavidade interna, perfuramos um buraco do tamanho da haste do termistor, inserimos o termistor, apertamos a porca, removemos os fios sob o corpo, selecionamos os restos de lã de vidro, empurramos o algodão de basalto e os recolocamos.
Em seguida, preparamos o painel de controle, elementos de canetas e estênceis para decoração. Sem plástico, apenas metal. Como não sei desenhar no AutoCAD, desenho os detalhes necessários no Photoshop e os converto para o formato dwg por meio de algum tipo de serviço em nuvem. Sim, sou um pervertido, eu sei, eu gosto. Nós damos desenhos para corte a laser.

Solde o painel no local planejado. Soldamos os triângulos ausentes nas laterais, betumamos e limpamos o local de solda, maximizando a aparência de uma peça sólida. Existem 4 slots no painel - um local para a tela, um local para um codificador com orifícios para LEDs sob a torção “for beauty” sob a torção, e slots encaracolados para indicadores de operação e aquecimento. O painel é feito de aço com 2 mm de espessura, o que não seria suficiente. "O peso é confiável." Boris Razor.
A venerável idade do forno e muitos anos em condições desumanas não podiam deixar de deixar vestígios em seu corpo. Havia arranhões de tinta, pequenos amassados e focos de corrosão. Colocamos a escova trituradora e limpamos o máximo possível. Putty mossas e defeitos com enchimentos de automóveis. Nós limpamos novamente. Desengordurar.

Mais adiante na pintura. Não encontrei na minha área a oportunidade de colorir o esmalte pentaftálico nas cores de minha escolha, portanto escolhi entre as cores prontas disponíveis. O marfim foi escolhido para a cor principal do estojo e o pistache para elementos da decoração do estojo.
Nós pintamos, cortamos, xingamos, removemos manchas, repintamos, cortamos novamente, juramos nunca mais nos enganar com algo assim, mas apenas para bater pacificamente como todos os homens normais, nos acalmarmos, nos pintarmos novamente e ficarmos satisfeitos. Esperamos uma semana até a tinta secar com certeza.

Enquanto o fogão seca, cozinhamos um monte de elementos de fixação para a maçaneta da porta de bloqueio, desenhamos um esboço das maçanetas de madeira e o entregamos ao torneiro. Nós pintamos as canetas e deixamos secar. Pintamos o botão do codificador e a placa de metal no corpo da tela.


Depois que o revestimento secar completamente, aplicamos estênceis e pintamos com tinta pistache.
Em seguida, juntamos tudo e entendemos que as superfícies laterais do forno estão provocativamente vazias e não podem deixar de aderir a outra coisa. Mas pintar com estênceis de metal é extremamente inconveniente devido ao vazamento de tinta sob o estêncil e à necessidade de um pincel com o solvente para ajustar a imagem. E não consegui encomendar estênceis para encomendar à Orakal devido a uma falta de entendimento com o "gerente" de uma agência de publicidade. Portanto, achei pronto, adequado em tamanho na Internet.
Continue. Nós pintamos. Nós o admiramos.

Em seguida, reunimos tudo - instale a tela, o codificador e o botão do codificador. A partir do plexiglás rachado, fabricamos difusores para indicadores dos modos de operação e colamos na parte inferior do painel. Nós esticamos e soldamos os fios dos módulos e instalamos o conector de energia da rede com o botão liga / desliga. Perfuramos e instalamos suportes para cabos de madeira. Cole o feltro na parte interna do ponteiro de abrir / fechar para que a maçaneta não arranhe a superfície da porta durante a rotação.
Em seguida, chamamos a amante, damos a ela esse criativo, ouvimos o quão inteligente e bonita eu sou e, enquanto esperamos pelas tortas, adicionaremos mais algumas linhas, explicando por que fiz dessa maneira e não de outra maneira.



1. Por que o algoritmo de manutenção da temperatura é tão tolo ao invés de PID?
Porque simplesmente não há necessidade. Para um programa de trabalho padrão, de 30 a 40 minutos, a temperatura do fogão ultrapassa o ponto desejado algumas vezes. O fogão é pequeno, bem isolado, esfria lentamente. Algoritmo PID trivial em nenhum lugar para se virar. Uma pequena inércia de temperatura ocorre apenas uma vez durante o primeiro conjunto de temperaturas e a sobreposição é de cerca de 20 graus, o que não é de todo importante para assar e é convenientemente nivelada abrindo a porta neste momento para colocar a panela. Para isso, o sinal para atingir a temperatura operacional soa. A próxima iteração geralmente ocorre no intervalo da ordem de + - 2 graus.
2. Por que um relé, não um triac, e por que não o PWM?
Tudo a mesma coisa. Eu amo simuladores e sei como cozinhá-los, mas pelo menos você não acha que é necessário trincar para empurrá-los para o dispositivo, no qual o relé clica quatro vezes em meia hora de operação. E com 800 watts de potência, ou seja, três amperes de corrente, mesmo no revezamento chinês, haverá uma margem de segurança suficiente. Mas o PWM não tem nada a ver aqui, nem esse nível do dispositivo. Sim, e o relé é sincero e luminoso, e o triac é arrogância e orgulho. E a anfitriã está mais do que feliz, e esse era um objetivo estratégico. Em suma, isso é tudo.
3. O que mais está planejado?
Assadeiras de aço inoxidável. Pois no original existem assadeiras de amoras e, se já houver esse calor, as assadeiras devem corresponder. Mais tarde vou desenhar e entregá-lo ao laser.

Para sim, deixe-me sair, fui testar as tortas. Privado da Ucrânia.