Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Máquina de café inteligente com Arduino e Bluetooth

Componentes e suprimentos

Arduino Nano R3
× 1
Módulo Bluetooth HC-05
× 1
Sensor de temperatura HARDWARIO DS18B20 1m
× 1

Aplicativos e serviços online

Terminal serial Bluetooth criado por Kai Morich
Arduino IDE

Sobre este projeto





Introdução


Máquina de café automática inteligente com gráfico, pode ser controlada via Bluetooth ... ou apenas carregue água fresca, e o sistema iniciará automaticamente!

Cada peça é feita à mão e todas as funções são minhas próprias ideias.

Codifiquei "Modo de Teste" também, então o controlador pode ser usado como um medidor de temperatura multiuso com sensor de temperatura externo.

Desenvolvido em Arduino Nano / Uno, usa tela ST7920 , HC-05 Bluetooth adaptador, Dallas DS18B20 sensor de temperatura , relé para controle da bobina do aquecedor, botão com leds, campainha e contador de décadas CD4017BE aciona a barra de LED.





Como começar

  • Autostart :em modo de espera, o sistema mede ciclicamente a temperatura de fundo. Carregar água doce provoca queda de temperatura , e o sistema será iniciado.
    Esta função pode ser habilitada / desabilitada enviando "auto" do Smartphone, e a configuração será armazenada na memória EEPROM.
  • Pressione o botão :para iniciar / interromper a preparação do café ou sair do modo de teste.
  • Enviar mensagem "iniciar" de seu smartphone ou " pare ".





Vídeo


Mostra todas as formas de trabalho.

Como foi feito, como ficou ... basta clicar / tocar abaixo!





Análise única durante a preparação do café


Após 60 segundos desde o início, o MCU compara os valores de temperatura inicial armazenados e atuais para tirar conclusões com base apenas na temperatura e no tempo decorrido, que pode ser:
  • " Você esqueceu a água. "- (a temperatura subiu muito)
  • " Café para dois. "- (menos água - mais elevação tempr)
  • " Café para seis. "- (mais água - menos elevação tempr)
  • " Erro na bobina de aquecimento! "- (sem elevação significativa de temperatura)

Além disso, a detecção de erro do sensor funciona continuamente enquanto a máquina de café estiver ligada.

Como pode ser visto, seis doses de água demandaram mais tempo para atingir a mesma temperatura que a pequena dose alcançou muito antes.

Começar sem água resulta em temperatura muito alta, no entanto, a linha plana indica a temperatura inalterada, portanto, um erro da bobina do aquecedor.





Alteração da unidade de medição


A unidade de medida pode ser alterada enviando " c "ou" f "do Smartphone, mesmo durante a preparação do café, e não deixa marcas no gráfico .

Os valores de temperatura iniciais e anteriores armazenados serão convertidos por uma chamada de função de programa que codifiquei - usada para estatísticas e análises. Esta configuração também é armazenada na memória EEPROM.





Elementos dinâmicos da tela


Se a tela estiver cheia, o gráfico começa a rolar para a esquerda.

Depende do valor medido, algum elemento da tela pode estar em seu caminho. Para evitar colisões, seus locais são dinâmicos.

Estas seis pequenas imagens animadas mostra o que codifiquei:

Bem, foi um passatempo agradável:





Modo de teste


Quando criei tudo isso, surgiu a ideia, por que não usar o gráfico para outros fins?

Então codifiquei o modo de teste; basta conectar um sensor de temperatura externo e o sistema pode ser usado como um medidor de temperatura multiuso com gráfico.

Desta forma, os valores extremos do gráfico são -20 ° C (-4 ° F) e + 128 ° C (+ 262 ° F) .

Enviando números do Smartphone entre 1 e 999999 será aceito como intervalo de medição em segundos, então a largura do gráfico está entre 128 segundos e 11,57 dias .





Comunicação Bluetooth


Aceita comandos e envia relatórios, detecta se um smartphone se conecta ou desconecta.

As mensagens enviadas são azuis e as mensagens de resposta / relatório são verdes enviadas pela cafeteira.





Controle de Led


Um contador de décadas CD4027BE aciona a barra de LED, recebe CLK do MCU a cada medição de temperatura e aumenta a posição. Se um novo procedimento de preparação de café ou o Modo de Teste iniciar, o Atmega 328P envia um sinal RST para definir a posição padrão.

O botão tem um LED bicolor com apenas dois pinos, então minha solução simples e divertida pode ser vista no código, como controlá-lo.
  • Verde sólido :espera ou o café está pronto, a bobina está desligada
  • Vermelho sólido :a preparação do café está em andamento, a bobina do aquecedor está ligada
  • Vermelho / Verde alternadamente :Modo de teste
  • Vermelho intermitente :ocorreu um erro, que pode ser
    -Erro do sensor,
    -Erro da bobina do aquecedor, ou
    -Você esqueceu a água, então o processo de preparação do café foi interrompido pelo sistema

Código

  • Máquina de café inteligente - Ősi Gyula
Máquina de café inteligente - Ősi Gyula Arduino
 // Código do programa - Máquina de café inteligente. Desenvolvido em Arduino Nano, usa display ST7920, adaptador HC-05 Bluetooth, // sensor de temperatura Dallas DS18B20, relé, botão, leds, campainha e um contador de década CD4017BE.// // Pode ser controlado via Bluetooth enviando comandos e parâmetros de trabalho ou usando o botão ... ou apenas carregar água doce! //// Funções:// -Graph:gráfico dinâmico de temperatura na tela // -Autostart:carregar água doce causa queda de temperatura e o sistema iniciará // Isso a função pode ser habilitada / desabilitada enviando "Auto", e a configuração será armazenada na memória EEPROM // -Análise durante a preparação do café:60 segundos após iniciar o sistema compara os valores de temperatura atuais e iniciais // e tira conclusões que podem be:// 1. Você esqueceu a água (a temperatura está muito alta) // 2. Coffee for Two (menos água - mais elevação da temperatura) // 3. Coffee for Six (mais água - menos elevação da temperatura) // 4. Erro da bobina de aquecimento (sem elevação significativa da temperatura desde o início) // -Detecção de erro do sensor (obtendo valores anormais) // -C elsius ou Fahrenheit funcionando:pode ser alternado enviando C ou F do Smartphone, mesmo durante o procedimento de preparação do café.// Os valores de temperatura iniciais e anteriores serão convertidos para estatísticas e análises.// Esta configuração é armazenada na memória EEPROM .// -Modo de teste:anexando um sensor de temperatura externo, o sistema pode ser usado como um medidor de temperatura multiuso.// Neste modo, o intervalo do gráfico está entre -20C / -4F e + 128C / + 262F .// Enviando valores numéricos entre 1 e 999999 será aceito como intervalo de medição em segundos, então // a largura do gráfico pode ser entre 128 segundos e 11,57 dias.// -Comunicação Bluetooth:aceita comandos e envia relatórios, detecta se um smartphone se conecta ou desconecta // - Controle de barra de LED:o MCU controla um contador de década CD4027BE, e a barra de LED pisará em todos os ciclos de medição de temperatura // ------------------------- -------------------------------------------------- -------------------------------------------------- --- // // projetado, construído te programado // por Gyula Osi //// Todos os direitos reservados.// ---- Display #include "U8glib.h" // U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE); // display OLED I2C Bus, SDA (TX) A4, SCL (RX) A5U8GLIB_ST7920_128X64 u8g (11, 10, 9, U8G_PIN_NONE); // exibe construtor PIN6-D11, PIN5-D10, PIN4-D9byte frame =0; // inicia o ponteiro do logotipo // ---- Portas e periféricos controlados // led vermelho em A0 // led grn em A1const int bright [2] ={0, 500}; const byte buzzer =3; const byte cd4017beCLK =4; // controlar byte de contraconstante de década CD4017BE cd4017beRST =5; const byte btn =13; const byte relay =12; // ---- Strings do sistema # define strSize 3String str [strSize]; // impressão de eventos e relatórios do sistema # define reportSize 5const String reportStr [reportSize] ={"Iniciando ...", "Em espera em breve ...", "Parado.", "*** MODO DE TESTE ***", "Modo normal."}; // # define standbySize 5 // const String standbyStr [standbySize] ={"Pressione a tecla", ">", "ou", "send", "start"}; const String autostartStr [2 ] ={"Autostart off.", "Autostart on."}; // ---- Estrutura da Matriz de Sinalização Binária do Estado do Sistema #define flagElements 6bool binFlags [flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- elementos [i] propósito init / modo de espera val // 0 verificado 0 // 1 concluído 1 // 2 em espera 1 // 3 mensagem em espera enviada 0 // 4 erro de bobina / sensor 0 // 5 teste modo 0 // ---- Medição de temperatura e recursos relacionados # include "OneWire.h" #include "DallasTemperature.h" #define DS18B20 2 // configurar o barramento OneWire no D2OneWire temprWire (DS18B20); // configurar o DS18B20 para funcionar nos sensores OneWire busDallasTemperature (&temprWire); float tempr; // valor medidofloat temprInit; // cópia do valor medido para uma comparação de tempofloat temprPrev; // cópia do valor medido para comparação cíclica # define mUnit 2float temprBottomLim [mUnit] ={0, 26}; // início automático sob o tempo de análise única E sob o tempo de unidade de caractere de tempo [mUnit] ={'F', 'C'}; const String unitStr [mUnit] ={"Modo Fahrenheit.", "Modo Celsius."}; float trendSens [mUnit] ={0, 0,1}; // +/- intervalo (F / C) que será avaliado como temperatura constante // *** Os valores de referência Fahrenheit serão calculados na inicialização! bool trend [2] ={1, 0}; // descreve as tendências de temperatura como abaixo // ---- elementos [i] propósito // 0 mudando // 1 tendência #define checkSize 7const String checkStr [checkSize] ={"Água detectada!", "Erro da bobina de aquecimento!", "Café para seis", "Café para dois", "Você esqueceu a água!", "Erro do sensor!", "Seu café está pronto."}; Float temprCheck [mUnit] [checkSize] ={{}, {- 0,15, 5, 17, 28, 60, -127, 110}}; // | <- REL -> | <--CONST--> | // [j] F / C // ---------------------------------------- ----- // ---- elementos [i] propósito usado como // 0 valor rel de inicialização automática // 1 valor rel de detecção de erro da bobina // 2 água para seis valores rel // 3 água para dois valores rel // 4 sem detecção de água valor rel // 5 sem sinal na referência const D2 // 6 ponto de ebulição referência const // ---- Gráfico de declarações e variáveis ​​# define posYsize 128byte posY [posYsize]; byte pointer =0; #define refrElements 42float temprRefr [refrElements]; # define rangeElements 2 // min / max # define modo 2 // normal / test modefloat graphRange [mUnit] [mode] [rangeElements] ={{{}, {}}, {{24, 127.938889 + 2}, {-20, graphRange [1] [0] [1]}}}; // [k] 0 1 0 1 // [j] | 0 | 1 // ---- elementos [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff [mUnit] [mode]; // etapas verticais por temperatura // ---- Temporizadores do sistema, controle e análise # include  elapsedMillis timer0; // Timer PWM de 8 bits, usado pela função elapsedMillis () unsigned long tmrPrev =0; // o decorrido será o anterior quando o intervalo for upbool cyclic =0; const long tmrInt [5] ={500, 2000, 60000, 640000, 800000}; // ---- elementos [i] propósito // 0 intervalo de medição (modo de teste), led ctrl // 1 intervalo de medição (modo normal) // 2 análises únicas (modo normal, durante a preparação do café) / análise cíclica ( modo de espera) // 3 enviando mensagem de espera (modo normal, após fazer café) // 4 sistema de espera (modo normal, depois de fazer café) long copyof_tmrInt0 =tmrInt [0]; const String tmrInt0Str ="Intervalo alterado."; // ---- Configuração da comunicação serialconst byte btState =6; bool conn =0; const String connStr [2] ={"Conexão perdida.", "Smartphone conectado."}; # Include  const int RX1 =7; Const int TX1 =8; SoftwareSerial sUART (RX1, TX1); # define exRXSize 6char exRX [exRXSize]; // variável para receber dados da porta serial // ---- Gerenciamento de memória # include  #define occBytes 2const byte addr [occBytes] ={0, 1}; bool sysSettings [occBytes]; // ---- Mapa de memória addr [i] | dados | descr | val armazenado // ---------------------------------------------- ------- // 0 | bool | início automático | 0:sem inicialização automática, 1:inicialização automática // 1 | bool | unidade de medida | 0:Fahrenheit, 1:Celsius // ---- Terminators &The Cleanup Crewconst char termCharSpc =''; const String termStr; const byte termByte =0; const bool termBool =0; const uint8_t frame0 [] U8G_PROGMEM ={0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1 , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8 , 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x FF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x06, 0xE6, 0x3F , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60 , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x66, 0x60, 0x06, 0x66 , 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3E, 0x66, 0x60, 0 x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0xDE, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE, 0xE7, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,}; const uint8_t frame1 [] PROGMEM ={0xF8, // 11111000 00 0x21, // 00100001 01 0x22, // 00100010 02 0x24, // 00100100 03 0x08, // 00001000 04 0x10, // 00010000 05 0x24, // 00100100 06 0x44, // 01000100 07 0x0F, // 00001111 08 0x04, // 00000100 09 0x04, // 00000100 10 0x03, // 00000011 11}; const uint8_t frame2 [] PROGMEM ={0x08, // 00001000 00 0x1C, // 00011100 01 0x3E, // 00111110 02 0x7F, // 01111111 03}; const uint8_t frame3 [] PROGMEM ={0x7F, // 01111111 00 0x3E, // 00111110 01 0x1C, // 00011100 02 0x08, // 00001000 03}; configuração vazia () {u8g .começar(); fillArrays (); pinMode (cd4017beCLK, OUTPUT); pinMode (cd4017beRST, OUTPUT); CD4017BE (0); // envia RESET para o contador de decadas IC pinMode (btState, INPUT); pinMode (btn, INPUT); pinMode (relé, SAÍDA); sUART.begin (9600); memorando (2); // carrega as configurações do sistema de sensores EEPROM.begin (); // inicia DS18B20 temprMeas (); temprInit =tempr; gráfico (2); // gráfico de inicialização ledHandler (0);} void loop () {sysControl (); checkBtn (); checkConn (); RX (); u8g.firstPage (); fazer {desenhar (); } while (u8g.nextPage ()); if (frame ==0) {delay (3000); frame =1; scrClr (); }} // ---- Gerenciamento de memória // chamar parâmetro // 2:ler na inicialização // 0, 1:escrever no endereço apropriado // void memo (byte op) {switch (op) {case 2:for (byte i =0; i  tmrInt [2]) &&(! binFlags [5])) {if (binFlags [2]) {temprMeas (); if ((tempr - temprInit <=temprCheck [sysSettings [1]] [0]) &&(tempr =temprCheck[sysSettings[1]][6]) &&(!binFlags[1])) { // check boiling point coil(0); strSelector(0, 6); } if ((timer0> tmrInt[3]) &&(!binFlags[2]) &&(!binFlags[3])) { // going standby msg AND a second security check strSelector(1, 1); binFlags[3] =1; if (!binFlags[1]) { // for case if the coil went broken after the One Time Analysis coil(0); // and therefore there was no boiling point strSelector(0, 1); } } if (timer0> tmrInt[4]) { // the system goes standby binFlags[2] =1; strSelector(6, 0); } }void temprMeas() { temprPrev =tempr; sensors.requestTemperatures(); // update sensor readings if (sysSettings[1]) { tempr =sensors.getTempCByIndex(0); // read remperature } else { tempr =sensors.getTempFByIndex(0); } if (tempr>=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =1; } if (tempr <=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =0; } if ((tempr  temprPrev - trendSens[sysSettings[1]])) { trend[0] =1; }} // ---- Coil Control // 0:power off // 1:power onvoid coil(byte op) { switch (op) { case 0:digitalWrite(relay, 0); binFlags[1] =1; strSelector(1, 2); ledHandler(0); pausa; case 1:digitalWrite(relay, 1); strSelector(6, 0); CD4017BE(0); graph(1); for (byte i =0; i  0; i--) { str[i] =termStr; } return; } TX(); for (byte i =(strSize - 1); i> 0; i--) { // roll for printout str[i] =str[i - 1]; } buzz(4, 1); }void draw(void) { if (frame ==0) { u8g.drawXBMP( 0, 0, 128, 64, frame0); } else { if (frame ==1) { scr(); } }}void scr(void) { if (binFlags[2]) { #define standbySize 4 const String standbyStr[standbySize] ={"Press key>>>>", "or", "send", "start"}; u8g.setFont(u8g_font_courB10); u8g.setPrintPos(2, 12); u8g.print(standbyStr[0]); u8g.setPrintPos(14, 26); u8g.print(standbyStr[1]); u8g.setPrintPos(30, 40); u8g.print(standbyStr[2]); u8g.setColorIndex(!cyclic); u8g.drawBox(74, 28, 50, 14); u8g.setColorIndex(cyclic); u8g.setPrintPos(76, 40); u8g.print(standbyStr[3]); u8g.setColorIndex (1); } else { if ((posY[0]>=20) || (posY[13]>=20)) { u8g.drawBitmapP( 5, 0, 1, 12, frame1); } else { u8g.drawBitmapP( 5, 25, 1, 12, frame1); } if ((posY[54]>=30) || (posY[112]>=30)) { u8g.drawHLine(69, 40, 53); scrTempr(72, 12); } else { scrTempr(72, 44); } for (byte i =0; i  0) { u8g.drawVLine(i, posY[i], 2); } } } u8g.setFont(u8g_font_6x12); byte y =53; for (byte i =(strSize - 1); i> 0; i--) { u8g.setPrintPos(0, y); y =y + 9; u8g.print(str[i]); } }void scrTempr (byte tX, byte tY) { u8g.drawVLine(2, 4, 39); u8g.drawHLine(0, 40, 69); u8g.drawHLine(0, posY[pointer - 1], 5); byte tXrel =2; byte tYrel =11; if ((tempr <100) &&(tempr> -10)) { u8g.drawFrame(tX - tXrel, tY - tYrel, 45, 13); u8g.drawHLine(116, 40, 12); } else { u8g.drawFrame(tX - tXrel, tY - tYrel, 51, 13); u8g.drawHLine(122, 40, 6); } u8g.setFont(u8g_font_6x12); u8g.setPrintPos(tX, tY); u8g.print(tempr); u8g.print(char(176)); u8g.print(unit[sysSettings[1]]); if (trend[0]) { return; } tXrel =12; if (trend[1]) { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame2); } else { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame3); }}void scrClr(){ u8g.firstPage(); do { } while(u8g.nextPage());} // ---- Maintenance of Graph Arrays // call param // 0:step &fill // 1:clr // 2:initvoid graph(byte op) { switch (op) { case 0:if (pointer ==posYsize) { for (byte i =0; i <(posYsize - 1); i++) { posY[i] =posY[i + 1]; posY[i + 1] =termByte; } pointer =posYsize - 1; } for (byte i =0; i =temprRefr[i + 1])) { posY[pointer] =i; Retorna; } } break; case 1:for (byte i =0; i  0) &&(atof(exRX)>=1) &&(atof(exRX) <=999999)) { copyof_tmrInt0 =(atof(exRX) * 1000); strSelector(5, 0); } for (byte i =0; i  

Esquemas


Processo de manufatura

  1. Controle de acesso com QR, RFID e verificação de temperatura
  2. Registrador de dados de temperatura e umidade
  3. Arduino com Bluetooth para controlar um LED!
  4. Sapatos inteligentes (com laço automático e geração de eletricidade)
  5. BME280 Temperatura, Umidade e Pressão na Tela Nextion
  6. Controle do Servo Motor com Arduino e MPU6050
  7. Dispositivos Bluetooth controlados por voz com OK Google
  8. u-blox LEA-6H 02 Módulo GPS com Arduino e Python
  9. Como ler a temperatura e umidade em Blynk com DHT11
  10. Braço robótico simples e inteligente usando Arduino