
Puntos clave o de qué trata este artículo
Continuación de una serie de artículos sobre ShIoTiny , un controlador visualmente programable basado en el chip ESP8266 . Una característica clave de este controlador es la capacidad de programarlo dibujando un programa en un navegador.
Este artículo describe una breve teoría de la conversión de analógico a digital y la aplicación práctica del controlador ShIoTiny ADC.
Artículos anteriores de la serie.
ShIoTiny: pequeña automatización, Internet de las cosas o "seis meses antes de las vacaciones"
ShIoTiny: nodos, enlaces y eventos o características de programas de dibujo
ShIoTiny: ventilación de habitación húmeda (proyecto de ejemplo)
ShIoTiny y el mundo circundante: conectar sensores a entradas binarias, rebote de contactos y otros problemas
Sitio del proyecto
Firmware binario, circuito controlador y documentación aquí
Introducción o en lugar de teoría seria
En un artículo anterior , examinamos la conexión de los principales tipos de sensores con una salida binaria a las entradas binarias del controlador ShIoTiny .
Pero, como la mayoría de las personas, así como los escolares y estudiantes, saben, la mayor parte de la información sobre el mundo circundante son cantidades análogas de diversa naturaleza física: el poder de la luz y el sonido, la velocidad, la presión del aire, el nivel de líquido, etc.
Casi todos los microprocesadores y microcontroladores modernos pueden procesar solo valores discretos en representación binaria.
Para aquellos que aún no saben cómo el valor analógico difiere del discreto, escribiré explicaciones breves. Quien ya lo sabe todo puede saltearlos. Haré una reserva de inmediato: las analogías y las simplificaciones tienen un lugar para estar. Esto no es una disertación, sino explicaciones breves con los dedos.
Cantidades análogas y discretas (no se puede leer a profesores, académicos y geeks)
Todos estudiaron matemáticas en la escuela. Por lo tanto, recurrimos a él y dibujamos analogías entre cantidades y números analógicos y discretos.
Desde el punto de vista de las matemáticas, una cantidad analógica es un número real , definido en cualquier punto de un segmento dado de una recta numérica.
El valor discreto desde el punto de vista de las matemáticas es un número entero . Y se define solo en ciertos puntos de un segmento dado de una recta numérica.
La siguiente figura muestra esquemáticamente la ubicación de cantidades análogas y discretas en una recta numérica.

Por ejemplo, considere un segmento de una recta numérica de -4 a 3 . Como puede ver, las cantidades discretas indicadas por puntos rojos - los enteros en él son solo 8 piezas. Los valores analógicos mostrados por la línea verde en la figura son infinitos.
Por ejemplo, tenemos una cierta cantidad X , que tiene un rango de valores de 0 a 127 . Si representamos esta cantidad como analógica , entonces teóricamente podemos representarla con cualquier precisión, por ejemplo, 12.123455454980 o 126.00000000007 o en general con un millón de decimales.
Pero tan pronto como el microcontrolador ingresa al negocio y el valor de X adquiere una representación discreta , entonces no se puede hablar de ninguna "precisión infinita", incluso teóricamente. La precisión está limitada por el número de dígitos binarios, que asignamos a la representación de la cantidad X.
Por ejemplo, tomamos 7 bits. En este caso, podemos representar el valor de X con una precisión de uno. Es decir, será posible especificar X = 1 o X = 112 . Pero X = 112.5 no se puede indicar ya, no hay suficiente profundidad de bits. Si tomamos para la representación del mismo valor de X no 7 , sino 10 dígitos, entonces la precisión de la representación no será uno, sino 0.125 . Y de esta forma, puedes imaginar X = 95.125 o X = 112.5 . Pero más precisamente, por ejemplo, en la forma X = 112.13 : este valor ya no se puede representar.
Si está confundido por el hecho de que escribo valores fraccionarios y al mismo tiempo hablo de ellos como enteros, recuerde que los "puntos discretos" se pueden colocar en una recta numérica no en unidades, sino, por ejemplo, en 0.5 o 0.125 unidades. Pero como estaban, el valor final permanecerá en cualquier segmento. Y se conservan todas las propiedades de una cantidad discreta.
La diferencia clave entre un valor discreto y uno analógico es que en cualquier segmento finito de una línea numérica habrá un número finito de valores discretos (enteros) y un número infinito de valores analógicos (reales). En consecuencia, obtenemos que la representación discreta de cantidades siempre tiene una precisión finita.
Como resultado de todo lo anterior, obtenemos una conclusión trivial. La mayoría de las cantidades medibles del mundo real son analógicas . Los microcontroladores funcionan solo con representaciones numéricas discretas de cantidades. Por lo tanto, antes de procesar cualquier valor analógico utilizando un microcontrolador, este valor debe representarse como uno discreto. Sí, y en forma binaria.
Tal conversión de analógico a digital se llama conversión de analógico a digital .
Convertidor analógico a digital
Un dispositivo para convertir una señal analógica a digital se denomina ADC ( convertidor analógico a digital ).
Típicamente, dicho dispositivo tiene una o más entradas analógicas, a las que se suministra una señal analógica y una salida digital con una profundidad de bits dada (generalmente de 8 a 16 bits).
Los microcontroladores modernos, incluido nuestro ESP8266 , tienen unidades ADC incorporadas.
¿Qué características tienen el ADC en general y el ESP8266 ADC en particular?
La primera característica es qué tipo de valor analógico de entrada convierte el ADC en un código digital de salida. Muy a menudo, este valor es el voltaje en la entrada analógica del ADC. Así será en nuestro caso. Pero en la naturaleza, hay ADC con entrada actual.
La segunda característica del ADC, que se necesita en la práctica, es el rango de valores del valor de entrada del ADC. En nuestro caso, estos son los valores de voltaje mínimo y máximo en la entrada del ADC. Estos valores serán 0V y 1V, respectivamente. El rango de entrada de 1V parece pequeño, pero los voltajes grandes siempre se pueden dividir y reducir, y los voltajes pequeños se pueden amplificar.
La tercera y quizás la característica más importante del ADC es su capacidad. Este valor determina la precisión de la transformación o (por nuestra analogía): con qué frecuencia los puntos "discretos" se colocan en la recta numérica "real". En nuestro caso, el ADC tiene una resolución de 10 . ¿Qué significa esto? Y esto significa que el código digital de salida está representado por 10 dígitos binarios y tiene 1024 valores, de 0 a 1023.
Estrictamente hablando, vale la pena recordar que la precisión de la conversión depende no solo de la profundidad de bits, sino también de una serie de otros parámetros, por ejemplo, la linealidad del ADC. Pero ya se ha escrito mucho sobre esto por tíos muy inteligentes en libros muy inteligentes, por lo que en este artículo dejaré al lector sin detalles.
Además, el ESP8266 ADC puede detectar el desbordamiento, es decir, una situación en la que se aplica un voltaje mayor a 1V a la entrada.
Si toma un libro de referencia inteligente sobre ADC y mira allí, habrá docenas de otras características. Todos son necesarios e importantes, pero no iremos tan lejos. Por ejemplo , no tocaremos los parámetros de tiempo del ADC , ya que creemos que en nuestro caso los valores medidos cambian bastante lentamente y el ADC los convierte en una representación digital "instantáneamente".
Para resumir el resultado preliminar.
El controlador ShIoTiny tiene un ADC integrado en el ESP8266 .
Se aplica un voltaje en el rango de 0 a 1V a la entrada del ADC ESP8266 .
En la salida del ESP8266 ADC, obtenemos un número proporcional al voltaje de entrada en el rango de 0 a 1023 . El voltaje 0V corresponde al código 0 en la salida ADC, el voltaje 1V corresponde al código 1023 en la salida ADC.
La lectura de datos del ADC en ShIoTiny se realiza a una velocidad de aproximadamente 10 veces por segundo .
La entrada de hardware del ADC está protegida contra sobretensiones, de forma similar a cómo están protegidas las entradas binarias Input1,2,3 ( ver aquí ).
Eso es todo por el hardware ShIoTiny ADC .
Ahora tratemos con el nodo ADC1 , que procesa datos del ADC de hardware ESP8266 .
Software de campanas o silbatos ADC1
En el diagrama del programa en el editor de ElDraw , el ensamblaje del convertidor de analógico a digital se llama ADC1 .

Como ya se mencionó, el nodo ADC1 recibe datos del ADC de hardware ESP8266 aproximadamente 10 veces por segundo . Pero el nodo especificado no se calma con esto, sino que comienza a procesar estos datos e incluso a analizarlos un poco.
En primer lugar , se verifica: ¿hubo un desbordamiento de ADC? Es decir, ¿el ADC no ingresó más de 1V ? Si se detecta tal situación, la salida del nodo ADC1 se establece en NAN ( no un número ).
En segundo lugar , si no hubo desbordamiento, el valor de salida del ADC 0..1023 se convierte al valor de voltaje en la entrada del ADC - un número de coma flotante en el rango 0..1 .
En tercer lugar , este valor convertido 0..1 se recalcula de acuerdo con la fórmula donde - tensión en la entrada del ADC (de 0 a 1V ); k es el rango (rango ADC ) yb es el desplazamiento ( desplazamiento ADC ). Y finalmente, el valor obtenido de X se establece en la salida del nodo ADC1 .
Y finalmente en el quinto . Si el valor de X ha cambiado en un porcentaje específico (del 1 al 100% ), la unidad ADC genera eventos, lo que provoca una conversión de los valores de los nodos conectados a ella. Este es esencialmente el parámetro de sensibilidad ADC ( cambios ADC, rango% ). Después de todo, generalmente no hay razón para reaccionar "a cada estornudo", es decir, a los escasos cambios en los bits inferiores del ADC, a menudo "hacen ruido". Por lo tanto, el parámetro de sensibilidad es de gran importancia práctica.
Surge la pregunta legítima: ¿cómo configuramos estos ajustes? Haga clic con el mouse en el nodo ADC1 en el diagrama y allí verá una ventana de configuración.
En él puedes configurar todo lo que necesitas. Para nuestro caso, será una ventana como la de la figura.

En esta ventana, puede establecer todos los parámetros mencionados anteriormente: el rango, el desplazamiento y la sensibilidad del ADC.
Si no especificó nada, el rango será 1. El desplazamiento es cero. Y la sensibilidad es del 1%.
Es decir, de manera predeterminada, de hecho, la salida del nodo ADC1 será el valor del voltaje analógico suministrado a la entrada ADC.
Como puede ver, el nodo ADC1 es bastante complejo. ¿Por qué se hace todo esto? ¡Sí para ustedes, mis queridos usuarios! Es broma, por supuesto, como un egoísta malicioso tomé en cuenta la experiencia previa y traté de hacerme la vida más fácil.
Nosotros, como simples ingenieros, queremos que los valores se presenten no en "loros", sino en valores normales y comprensibles: voltios, amperios, kilogramos o metros.
Muchos sensores dan el valor "en loros", esperando que un microcontrolador inteligente los recalcule a los valores deseados.
Para este propósito, se introdujo la conversión del valor de ADC medido por la función del dado.
Pero, como siempre, es mejor ver una vez que escuchar diez veces. También es mejor intentarlo una vez que ver diez veces ... Pero ese no es el punto.
Por lo tanto, daré un par de ejemplos no complicados: un sistema de control de la fuente de alimentación y un sistema de medición de temperatura basado en un sensor con una salida de corriente de 4-20 mA .
Monitoreo de la red
La medición de voltaje es una tarea común. Por ejemplo, queremos medir el voltaje de la red eléctrica ~ 220V . Si tenemos un mal suministro de electricidad, la tarea es muy real. No necesitamos un cambio muy, muy preciso. Es suficiente que cuando el voltaje esté un 15% por encima de la norma, el Relé1 se active en ShIoTiny , y cuando el voltaje se reduzca en un 15% de la norma, el Relé2 se active .
Por supuesto, no podemos conectar la entrada ADC1 del controlador ShIoTIny a un zócalo. Que hacer En primer lugar, el voltaje debe reducirse a un nivel aceptable: 0..1V . Y, en segundo lugar, debe rectificarse: nuestro ADC no puede medir el voltaje alterno.
El voltaje en la red puede estar tanto por debajo de la norma como por encima de la norma. Para simplificar, suponemos que 220V del voltaje de la red corresponderá a 0.5V del voltaje en la entrada del ADC.
Luego, buscamos cualquier transformador reductor que a ~ 220V del voltaje de entrada nos dé, digamos ~ 3V del voltaje de salida y ensamblemos un circuito como en la figura a continuación.
Aquí una sorpresa puede esperar a los ignorantes en electrónica. En la salida del rectificador, no aparece repentinamente un voltaje de CC de 3 V , ¡sino más de 4 V ! De hecho, todo se explica simplemente. Cuando medimos un voltaje alterno, el voltímetro nos muestra el valor de voltaje real . Y cuando rectificamos este voltaje, entonces a la salida del rectificador obtenemos el valor pico del voltaje, que para la señal sinusoidal es aproximadamente 1,41 , y exactamente veces más que el actual. De ahí el "incomprensible" 4.23V en la salida del rectificador.
Y finalmente, necesitamos calcular el divisor de voltaje, es decir, la resistencia R1 y R2 . Necesitamos llegar a la salida del divisor 0.5V con un voltaje en su entrada 4.23V . Por lo tanto, el voltaje rectificado de 4,23 V debe dividirse entre 8,46 veces. Para hacer esto, configure la resistencia R2 = 100 Ohms , y la resistencia R1 = 746 Ohms . Pero esto es ideal. En realidad, no existen resistencias con una resistencia de 746 ohmios . Sí, y los transformadores no son particularmente precisos. Por lo tanto, si alguien se atreve a probar esta solución, le recomiendo encarecidamente que coloque la resistencia R1 = 760 ohmios y que tome la resistencia de la recortadora R2 , con una resistencia de 180 ohmios o 220 ohmios . Luego puede, armado con un voltímetro, ajustar R2 para que a ~ 220V el voltaje en el devanado primario del transformador, en la salida del divisor (o, lo que es lo mismo, en la entrada de ADC1 ) sea = 0.5V .
Medimos el voltaje no solo así, sino que hacemos algo excediéndolo o disminuyéndolo de la norma. Por ejemplo, encienda la alimentación de respaldo para que algunos dispositivos no se quemen y no se apaguen.
Por lo tanto, dibujaremos el esquema de programa más simple, que, cuando el voltaje está un 15% por encima de la norma, hace que el relé Relay1 funcione , y cuando el voltaje disminuye en un 15% de la norma, el relé Relay2 funciona . Además, la sobretensión o la subtensión deben mantenerse en la red durante al menos 1 minuto para activar un relé. Esto evitará falsas alarmas durante picos de voltaje cortos que a menudo ocurren en la red. El programa de esquema que implementa nuestra idea se muestra en la figura.

Para que este circuito funcione, es necesario establecer el coeficiente k (rango) igual a 440 en la configuración de los parámetros ADC, como se muestra en la figura.

Con un coeficiente de 440 y un voltaje de voltaje en la entrada del ADC 0.5V, la salida del nodo ADC1 será 220 . ¡Esa es la tensión de red real!
Esto es muy conveniente, ya que le permite configurar las constantes inmediatamente en voltios: 220V + 15% es 253V y 220V-15% es 187V . Si es necesario, estos valores se pueden cambiar fácilmente sin perder el tiempo calculando y traduciendo el voltaje a "loros".
Sensor de temperatura 4-20mA
Los sensores que tienen una salida de corriente de 4-20 mA son muy comunes en la industria. En la vida cotidiana no los encontrarás a menudo. Sin embargo, alguien los tiene y este alguien quiere adaptarlos a la causa.
El ADC permite el uso de tales sensores junto con el controlador ShIoTiny .
¿Por qué la corriente de salida del sensor es exactamente de 4-20 mA ? Te lo explicaré.
Las salidas de corriente funcionan bien en líneas largas. Digamos un kilómetro. No les importa la resistencia de los cables: la corriente es la misma en toda la longitud del cable, independientemente de la resistencia de los conductores.
El valor de corriente inicial de 4 mA , y no solo la falta de corriente, hace que sea fácil detectar una rotura de cable. Si el sensor está completo y el cable no está roto, siempre hay corriente. Al menos 4 mA . Y si el cable se rompe, no hay corriente ( 0 mA ).
Supongamos que tenemos un sensor de temperatura con una salida de corriente de 4-20 mA y un rango de temperatura medida de -40 ° C a +125 ° C. Queremos conectarlo a ShIoTin . Lo primero que debemos hacer es convertir la corriente a voltaje. Un medio ideal para tal conversión es una resistencia convencional.
Dado que el voltaje máximo en la entrada del ADC es de 1V , y la corriente máxima en la línea es de 20mA , es fácil calcular que una resistencia que convierte 20mA a 1V tendrá una resistencia de 50 Ohms . ( No conozco la ley de Ohm, ¡quédate en casa! ).
Conectaremos nuestro sensor como se muestra en la figura.

El sensor es un generador de corriente proporcional a la temperatura medida. Con una resistencia de 50 ohmios conectada en paralelo con la entrada ADC1 , los siguientes valores de voltaje estarán en la entrada ADC, dependiendo de la corriente generada en el circuito del sensor:
- corriente menor de 4 mA , voltaje en la entrada del ADC menor que 0.2 V - corte de línea;
- corriente de 4mA a 20mA , voltaje de 0.2V a 1V - el sensor está funcionando;
- la corriente es mayor que 20 mA , el voltaje de entrada es mayor que 1 V : el sensor está defectuoso. Con un cortocircuito en el sensor, una resistencia de 50 ohmios puede quemarse si tiene menos de 2W de potencia.
Supongamos que queremos medir la temperatura y publicarla por MQTT . Además, publicaremos el estado del sensor (circuito abierto, cortocircuito o todo está en orden).
Lo primero que debemos hacer es volver a calcular el valor de los "loros" en grados. Sabiendo que una temperatura de -40 ° C corresponde a una corriente de 4 mA y un voltaje a la entrada del ADC de 0.2 V , y una temperatura de +125 ° C corresponde a una corriente de 20 mA y un voltaje a la entrada del ADC de 1 V , obtenemos los coeficientes: k = 206.25 yb = -81.25 . Ingrese estos coeficientes en la ventana de configuración de ADC, como se muestra en la figura.

¿Quién quiere verificar la exactitud del cálculo de k y b ? Decide por ti mismo el sistema de ecuaciones más simple:
Bueno, el esquema del programa no será complicado en absoluto y se muestra en la figura a continuación.

En el caso de que todo esté bien y el sensor de temperatura de 4-20 mA esté funcionando , la temperatura se publica en el servidor MQTT con el nombre / t_sens . Los síntomas también se publican bajo los nombres / sens_short y / sens_break . Si todo está bien, los signos de un accidente son cero.
Si la línea se rompe , la temperatura será inferior a -40 ° C. En este caso, el parámetro / sens_break en el agente MQTT se publicará como una unidad.
Si hay un cortocircuito en la línea, la temperatura será superior a + 125C . En este caso, tendremos un voltaje superior a 1V en la entrada del ADC y la unidad ADC configurará la salida en NAN ( sin número ). /sens_short MQTT .
Relay3 , , , .
«» , , , 200 .
Conclusión
ShIoTiny , . , .
, - «» , - , - .
— . .
Puede enviar todo esto como de costumbre en un comentario o por correo electrónico: shiotiny@yandex.ru .
Referencias
Dado que el artículo tiene una gran cantidad de material de terceros que requiere aclaración, no se puede prescindir de los enlaces.
¿Cómo funciona la conversión de la señal analógica a digital?
Convertidor analógico a digital
Señal analógica y digital. Tipos de señales y cómo funciona.
Lista de parámetros de tensión y corriente eléctrica.
Interfaces de campo analógico: lazo de corriente de 4-20 mA, de simple a complejo
CONFIGURAR LA GESTIÓN DE LA NUBE DE ESPPOWER A TRAVÉS DE INTERNET MEDIANTE ANDROID