Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Máquina de café inteligente con Arduino y Bluetooth

Componentes y suministros

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

Aplicaciones y servicios en línea

Terminal Bluetooth serie creado por Kai Morich
Arduino IDE

Acerca de este proyecto

Introducción

Cafetera automática inteligente con Graph, se puede controlar a través de Bluetooth ... o simplemente cargue agua fresca, ¡y el sistema se iniciará automáticamente!

Cada una de las partes está hecha a mano y todas las funciones son mis propias ideas.

También codifiqué "Modo de prueba", por lo que el controlador se puede utilizar como un medidor de temperatura multipropósito con sensor de temperatura externo.

Desarrollado en Arduino Nano / Uno, utiliza pantalla ST7920 , HC-05 Bluetooth adaptador, sensor de temperatura Dallas DS18B20 , relé para controlar la bobina del calentador, botón con leds, zumbador y un contador de décadas CD4017BE acciona la barra de leds.

Cómo empezar

  • Inicio automático :en modo de espera, el sistema mide cíclicamente la temperatura en segundo plano. La carga de agua dulce provoca un descenso de temperatura y el sistema se iniciará.
    Esta función se puede habilitar / deshabilitar enviando "auto" desde el teléfono inteligente, y la configuración se almacenará en la memoria EEPROM.
  • Presione el botón :para iniciar / interrumpir la preparación del café o salir del modo de prueba.
  • Enviar mensaje de "inicio" desde su teléfono inteligente o " detener ".

Video

Muestra todas las formas de trabajo.

Cómo se hizo, cómo se ve ... ¡simplemente haga clic / toque a continuación!

Análisis único durante la preparación del café

Después de 60 segundos desde el inicio, la MCU compara los valores de temperatura inicial y actual almacenados para sacar conclusiones basadas solo en la temperatura y el tiempo transcurrido, que pueden ser:

  • " Olvidaste el agua. "- (la temperatura subió demasiado)
  • " Café para dos. "- (menos agua, más temperatura)
  • " Café para seis. "- (más agua, menos temperatura)
  • " ¡Error de la bobina de calentamiento! "- (sin aumento significativo de temperatura)

Además, la detección de errores del sensor funciona continuamente mientras la máquina de café esté encendida.

Como puede verse, seis dosis de agua requirieron más tiempo para alcanzar la misma temperatura que la dosis pequeña alcanzó mucho antes.

Comenzar sin agua da como resultado una temperatura muy alta, sin embargo, la línea plana indica que la temperatura no ha cambiado, por lo tanto, un error de la bobina del calentador.

Cambio de la unidad de medida

La unidad de medida se puede cambiar enviando " c "o" f "desde el teléfono inteligente, incluso durante un proceso de preparación de café, y no deja ninguna marca en el gráfico .

Los valores de temperatura iniciales y anteriores almacenados se convertirán mediante una llamada de función de programa que codifiqué, utilizada para estadísticas y análisis. Esta configuración también se almacena en la memoria EEPROM.

Elementos dinámicos de la pantalla

Si la pantalla está llena, el gráfico comienza a desplazarse hacia la izquierda.

Dependiendo del valor medido, algún elemento de la pantalla puede interponerse. Para evitar colisiones, sus lugares son dinámicos.

Estas seis pequeñas imágenes animadas muestra lo que codifiqué:

Bueno, fue un pasatiempo agradable:

Modo de prueba

Cuando creé todos estos, surgió la idea, ¿por qué no usar el gráfico para otros fines?

Así que codifiqué el modo de prueba; simplemente conecte un sensor de temperatura externo y el sistema se puede usar como un medidor de temperatura multipropósito con gráfico.

De esta forma de trabajo, los valores extremos del gráfico son -20 ° C (-4 ° F) y + 128 ° C (+ 262 ° F) .

Envío de números desde el teléfono inteligente entre 1 y 999999 se aceptará como intervalo de medición en segundos, por lo que el ancho del gráfico está entre 128 segundos y 11,57 días .

Comunicación Bluetooth

Acepta comandos y envía informes, detecta si un teléfono inteligente se conecta o desconecta.

Los mensajes enviados son azules y los mensajes de respuesta / informe son verdes enviados por la cafetera.

Control de LED

Un contador de décadas CD4027BE controla la barra LED, recibe CLK de la MCU en cada medición de temperatura y aumenta la posición. Si se inicia un nuevo procedimiento de preparación de café o el modo de prueba, el Atmega 328P envía una señal RST para establecer la posición predeterminada.

El botón tiene un LED bicolor con solo dos pines, por lo que mi solución simple y divertida se puede ver en el código, cómo controlarlo.

  • Verde fijo :espera o el café está listo, la bobina está apagada
  • Rojo fijo :preparación de café en curso, la bobina del calentador está encendida
  • Rojo / verde a su vez :Modo de prueba
  • Rojo intermitente :se produjo un error, que puede ser
    -Error del sensor,
    -Error de la bobina del calentador, o
    -Olvidó el agua, por lo que el proceso de preparación del café fue interrumpido por el sistema

Código

  • Cafetera inteligente - Ősi Gyula
Cafetera inteligente - Ősi Gyula Arduino
 // Código de programa - Smart Coffee Maker. Desarrollado en Arduino Nano, usa pantalla ST7920, adaptador Bluetooth HC-05, // sensor de temperatura Dallas DS18B20, relé, botón, leds, zumbador y un contador de décadas CD4017BE. // // Puede controlarse a través de Bluetooth enviando comandos y parámetros de trabajo o usando el botón ... ¡o simplemente cargue agua dulce! //// Funciones:// -Gráfico:gráfico dinámico de temperatura en la pantalla // -Autoarranque:cargar agua dulce provoca una caída de temperatura y el sistema se iniciará // Esto La función se puede habilitar / deshabilitar enviando "Auto", y la configuración se almacenará en la memoria EEPROM // -Análisis durante la preparación del café:60 segundos después de arrancar el sistema compara los valores de temperatura actual e inicial // y saca conclusiones que pueden be:// 1. Olvidó el agua (la temperatura es demasiado alta) // 2. Café para dos (menos agua - más temperatura elevada) // 3. Café para seis (más agua - menos temperatura elevada) // 4. Error de la bobina de calentamiento (sin elevación de temperatura significativa desde el inicio) // -Detección de error del sensor (obteniendo valores anormales) // -C Elsius o Fahrenheit en funcionamiento:se puede cambiar enviando C de F desde el teléfono inteligente, incluso durante un proceso de preparación de café. // Los valores de temperatura iniciales y anteriores se convertirán para usarlos en estadísticas y análisis .// Esta configuración se almacena en la memoria EEPROM .// -Modo de prueba:conectando un sensor de temperatura externo, el sistema se puede usar como un medidor de temperatura multipropósito .// En este modo, el intervalo del gráfico está entre -20C / -4F y + 128C / + 262F .// Envío de valores numéricos entre 1 y 999999 se aceptará como intervalo de medición en segundos, por lo que // el ancho del gráfico puede estar entre 128 segundos y 11,57 días.// -Comunicación Bluetooth:acepta comandos y envía informes, detecta si un smartphone se conecta o desconecta // - Control de barra LED:la MCU controla un contador de décadas CD4027BE, y la barra LED se moverá en todos los ciclos de medición de temperatura // ------------------------- -------------------------------------------------- -------------------------------------------------- --- // // diseñado, construido t y programado // por Gyula Osi //// Todos los derechos reservados.// ---- Mostrar #include "U8glib.h" // U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE); // Pantalla OLED Bus I2C, SDA (TX) A4, SCL (RX) A5U8GLIB_ST7920_128X64 u8g (11, 10, 9, U8G_PIN_NONE); // constructor de pantalla PIN6-D11, PIN5-D10, PIN4-D9byte frame =0; // puntero del logotipo de inicio // ---- Puertos y periféricos controlados // LED rojo en A0 // LED rojo en A1const int brillante [2] ={0, 500}; buzzer de byte const =3; byte de const cd4017beCLK =4; // controla CD4017BE década contraconst byte cd4017beRST =5; const byte btn =13; const byte relay =12; // ---- Cadenas del sistema # define strSize 3String str [strSize]; // Impresión de informes y eventos del sistema # define reportSize 5const String reportStr [reportSize] ={"Iniciando ...", "En espera pronto ...", "Detenido", "*** MODO DE PRUEBA ***", "Modo normal."}; // # define standbySize 5 // const String standbyStr [standbySize] ={"Pulsar tecla", ">", "o", "enviar", "iniciar"}; const String autostartStr [2 ] ={"Autostart off.", "Autostart on."}; // ---- Estructura de la matriz de indicadores binarios del estado del sistema #define flagElements 6bool binFlags [flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- elementos [i] propósito init / modo de espera val // 0 comprobado 0 // 1 finalizado 1 // 2 en espera 1 // 3 mensaje de espera enviado 0 // 4 error de bobina / sensor 0 // 5 prueba modo 0 // ---- Medición de temperatura y características relacionadas # incluye "OneWire.h" #include "DallasTemperature.h" #define DS18B20 2 // configura el bus OneWire en D2OneWire temprWire (DS18B20); // configurar DS18B20 para que funcione en los sensores de temperatura busDallas de OneWire (&temprWire); float tempr; // valor medidofloat temprInit; // copia del valor medido para una comparación únicafloat temprPrev; // copia del valor medido para la comparación cíclica # define mUnit 2float temprBottomLim [mUnit] ={0, 26}; // inicio automático en tempr de AND análisis único en tempr ofconst char unit [mUnit] ={'F', 'C'}; const String unitStr [mUnit] ={"modo Fahrenheit.", "modo Celsius."}; float trendSens [mUnit] ={0, 0.1}; // +/- rango (F / C) que se evaluará como temperatura constante // *** Los valores de referencia en Fahrenheit se calcularán al inicio! bool trend [2] ={1, 0}; // describe las tendencias de temperatura como se muestra a continuación // ---- elementos [i] propósito // 0 cambio // 1 tendencia #define checkSize 7const String checkStr [checkSize] ={"¡Agua detectada!", "¡Error de la bobina de calentamiento!", "Café para seis", "Café para dos", "¡Olvidaste el agua!", "¡Error de sensor!", "Tu café está listo"}; float temprCheck [mUnit] [checkSize] ={{}, {- 0,15, 5, 17, 28, 60, -127, 110}}; // | <- REL -> | <--CONST--> | // [j] F / C // ---------------------------------------- ----- // ---- elementos [i] utilizados como // 0 valor rel de inicio automático // 1 valor rel de detección de error de bobina // 2 agua para seis valor rel // 3 agua para dos valor rel // 4 no hay detección de agua valor rel // 5 no hay señal en la referencia constante D2 // 6 referencia constante del punto de ebullición // ---- Declaraciones y variables del gráfico # define posYsize 128byte posY [posYsize]; byte pointer =0; #define refrElements 42float temprRefr [refrElements]; # define rangeElements 2 // min / max # define mode 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]; // pasos verticales por temperatura // ---- Temporizadores del sistema, control y análisis # incluye  elapsedMillis timer0; // Temporizador PWM de 8 bits, utilizado por la función elapsedMillis () unsigned long tmrPrev =0; // el transcurrido será el anterior cuando el intervalo sea upbool cyclic =0; const long tmrInt [5] ={500, 2000, 60000, 640000, 800000}; // ---- elementos [i] propósito // 0 intervalo de medición (modo de prueba), led ctrl // 1 intervalo de medición (modo normal) // 2 análisis únicos (modo normal, durante la preparación del café) / análisis cíclicos ( modo de espera) // 3 enviando mensaje de espera (modo normal, después de hacer café) // 4 modo de espera del sistema (modo normal, después de hacer café) long copyof_tmrInt0 =tmrInt [0]; const String tmrInt0Str ="Intervalo cambiado"; // ---- Configuración de comunicación serialconst byte btState =6; bool conn =0; const String connStr [2] ={"Conexión perdida", "Smartphone conectado."}; # Include  const int RX1 =7; const int TX1 =8; SoftwareSerial sUART (RX1, TX1); #define exRXSize 6char exRX [exRXSize]; // variable para recibir datos desde el puerto serie // ---- Gestión de memoria # include  #define occBytes 2const byte addr [occBytes] ={0, 1}; bool sysSettings [occBytes]; // ---- Mapa de memoria addr [i] | datos | descr | valor almacenado // ---------------------------------------------- ------- // 0 | bool | inicio automático | 0:sin inicio automático, 1:inicio automático // 1 | bool | unidad 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, 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, 0xFF, 0xFE, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xF, 0xFF, 0xFF, 0xFF, 0xF, 0x1Fx, 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, 0xF, 0x00x1 , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xFE, 0x1F, 0xFF, 0xF1, 0x00, 0x18, 0xC0, 0x8F, 0xFx0 , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x1E, 0xFF, 0xFF, 0xF8, 0xF , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0x0E, 0x1x3, 0x0F, 0x0E, 0x1x3, 0x1 , 0x00, 0xF8, 0x1F, 0x7C, 0x30, 0xFE, 0x7F, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0xF0x7C, 0x1F, 0xF07C, 0x1F, 0xF07C, , 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x00, 0x7E, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x3, 0x3E, 0x18, 0x1F, 0x3, 0x3 , 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, 0xF0x7C, 0x1F, 0xF0x7C, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x3F, 0x00, 0x7E, 0x00, 0x80, 0x3C, 0x8 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xFF, 0x00, 0x1E 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, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x 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, 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, 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, 0x7E, 0x6, 0x06, 0x00 , 0x06, 0xC6, 0x7F, 0xFE, 0xE7, 0x3F, 0x7E, 0xFE, 0xC7, 0x7F, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x06, 0x30, 0x60, 0x06, 0x30 , 0x00, 0x00, 0x00, 0x30, 0x06, 0x66, 0x60, 0x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x1E, 0x66, 0x60, 0x60, 0x66x06x60 , 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 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, 0x3C, 0x3F, 0xE0, 0x3C, 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0xC3, 0x3F, 0x00, 0x00, 0x3C, 0x0x1DE, 0x70, 0x70, 0xE0, 0x1D, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE7, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x31, 0x1, 0x3C, 0x31 0x00, 0x3C, 0x1E, 0xE6, 0x61, 0x1E, 0x07, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x3C, 0x1E, 0xE6, 0x70, 0x70 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x70, 0xE0, 0x61, 0x7E, 0xFE, 0x3xE7, 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,}; const uint8_t frame1 ={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}; configuración vacía () {u8g .comenzar(); fillArrays (); pinMode (cd4017beCLK, SALIDA); pinMode (cd4017beRST, SALIDA); CD4017BE (0); // enviar RESET al IC del contador de décadas pinMode (btState, INPUT); pinMode (btn, ENTRADA); pinMode (relé, SALIDA); sUART.begin (9600); memo (2); // carga la configuración del sistema desde EEPROM sensors.begin (); // iniciar DS18B20 temprMeas (); temprInit =tempr; gráfico (2); // gráfica de inicio ledHandler (0);} bucle vacío () {sysControl (); checkBtn (); checkConn (); RX (); u8g.firstPage (); hacer {dibujar (); } while (u8g.nextPage ()); si (marco ==0) {retraso (3000); marco =1; scrClr (); }} // ---- Gestión de memoria // llamar param // 2:leer al inicio // 0, 1:escribir en la dirección correcta // anular memo (byte op) {switch (op) {caso 2:para (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); descanso; 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; regreso; } } 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


Proceso de manufactura

  1. Control de acceso con QR, RFID y verificación de temperatura
  2. Registrador de datos de temperatura y humedad
  3. ¡Arduino con Bluetooth para controlar un LED!
  4. Zapatos inteligentes (autoajuste y generación de electricidad)
  5. BME280 Temperatura, humedad y presión en la pantalla Nextion
  6. Control del servomotor con Arduino y MPU6050
  7. Dispositivos Bluetooth controlados por voz con OK Google
  8. Módulo GPS u-blox LEA-6H 02 con Arduino y Python
  9. Cómo leer la temperatura y la humedad en Blynk con DHT11
  10. Brazo robótico simple e inteligente con Arduino
  11. Reconocimiento y síntesis de voz con Arduino