
Pontos principais ou sobre o que é este artigo
Continuação de uma série de artigos sobre o ShIoTiny - um controlador visualmente programável baseado no chip ESP8266 . Um recurso importante desse controlador é a capacidade de programá-lo desenhando um programa em um navegador.
Este artigo descreve uma breve teoria da conversão analógico-digital e a aplicação prática do controlador ShIoTiny ADC.
Artigos anteriores da série.
ShIoTiny: pequena automação, a Internet das coisas ou "seis meses antes das férias"
ShIoTiny: nós, links e eventos ou recursos de programas de desenho
ShIoTiny: ventilação em salas úmidas (exemplo de projeto)
ShIoTiny e o mundo ao redor: conectando sensores a entradas binárias, rejeição de contato e outros problemas
Site do projeto
Firmware binário, circuito do controlador e documentação aqui
Introdução ou em vez de teoria séria
Em um artigo anterior , examinamos a conexão dos principais tipos de sensores com uma saída binária às entradas binárias do controlador ShIoTiny .
Mas, como muitas pessoas, assim como alunos e alunos, sabem, a maior parte das informações sobre o mundo circundante são quantidades analógicas de várias naturezas físicas: o poder da luz e do som, a velocidade, a pressão do ar, o nível do líquido e assim por diante.
Quase todos os microprocessadores e microcontroladores modernos são capazes de processar apenas valores discretos na representação binária.
Para aqueles que ainda não sabem como o valor analógico difere do valor discreto, escreverei breves explicações. Quem já sabe tudo pode pular. Farei uma reserva imediatamente - analogias e simplificações têm um lugar para estar. Esta não é uma dissertação, mas explicações breves nos dedos.
Quantidades analógicas e discretas (você não pode ler para professores, acadêmicos e geeks)
Todo mundo estudou matemática na escola. Portanto, nos voltamos para ele e traçamos analogias entre quantidades e números analógicos e discretos.
Do ponto de vista da matemática, uma quantidade analógica é um número real , definido em qualquer ponto de um determinado segmento de uma linha numérica.
O valor discreto do ponto de vista da matemática é um número inteiro . E é definido apenas em determinados pontos de um determinado segmento de uma linha numérica.
A figura abaixo mostra esquematicamente a localização dos números-quantidades analógicas e discretas em uma linha numérica.

Por exemplo, considere um segmento de uma linha numérica de -4 a 3 . Como você pode ver, quantidades discretas indicadas por pontos vermelhos - números inteiros são apenas 8 peças. Os valores analógicos mostrados pela linha verde na figura são infinitos.
Por exemplo, temos uma certa quantidade X , que possui um intervalo de valores de 0 a 127 . Se representarmos essa quantidade como analógica , teoricamente, podemos representá-la com qualquer precisão - por exemplo, 12.123455454980 ou 126.00000000007 ou, em geral, com um milhão de casas decimais.
Mas assim que o microcontrolador entra no negócio e o valor de X adquire uma representação discreta , não se pode falar em nenhuma "precisão infinita", mesmo teoricamente. A precisão é limitada pelo número de dígitos binários, que atribuímos à representação da quantidade X.
Por exemplo, pegamos 7 bits. Nesse caso, podemos representar o valor de X com uma precisão de um. Ou seja, será possível especificar X = 1 ou X = 112 . Mas X = 112,5 já não pode ser indicado - não há profundidade de bits suficiente. Se considerarmos que a representação do mesmo valor de X não é 7 , mas 10 dígitos, a precisão da representação não será uma, mas 0,125 . E nesta forma, você pode imaginar X = 95.125 ou X = 112.5 . Mas, mais precisamente, por exemplo, na forma X = 112.13 - esse valor já não pode ser representado.
Se você está confuso com o fato de eu escrever valores fracionários e ao mesmo tempo falar deles como números inteiros, lembre-se de que "pontos discretos" podem ser colocados em uma linha numérica, não em unidades, mas, por exemplo, em 0,5 ou 0,125 unidades. Mas, como eram, o valor final permanecerá em qualquer segmento. E todas as propriedades de uma quantidade discreta são preservadas.
A principal diferença entre um valor discreto e um analógico é que, em qualquer segmento finito de uma linha numérica, haverá um número finito de valores discretos (inteiros) e um número infinito de valores analógicos (reais). Consequentemente, obtemos que a representação discreta de quantidades sempre tem precisão finita.
Como resultado de tudo isso, obtemos uma conclusão trivial. A maioria das quantidades mensuráveis do mundo real é analógica . Os microcontroladores funcionam apenas com representações numéricas discretas de quantidades. Portanto, antes de processar qualquer valor analógico usando um microcontrolador, esse valor deve ser representado como um valor discreto. Sim, e em formato binário.
Essa conversão de analógico para digital é denominada conversão de analógico para digital .
Conversor analógico para digital
Um dispositivo para converter um sinal analógico em digital é chamado ADC ( conversor analógico-digital ).
Normalmente, esse dispositivo possui uma ou mais entradas analógicas, às quais são fornecidos um sinal analógico e uma saída digital com uma profundidade de bits especificada (geralmente de 8 a 16 bits).
Microcontroladores modernos, incluindo o ESP8266 , possuem unidades ADC integradas.
Quais características o ADC em geral e o ESP8266 ADC em particular?
A primeira característica é que tipo de valor analógico de entrada o ADC converte em um código digital de saída. Na maioria das vezes, esse valor é a tensão na entrada analógica do ADC. Assim será no nosso caso. Mas, na natureza, existem ADCs com entrada atual.
A segunda característica do ADC, necessária na prática, é a faixa de valores do valor de entrada do ADC. No nosso caso, esses são os valores mínimo e máximo de tensão na entrada do ADC. Esses valores serão 0V e 1V, respectivamente. A faixa de entrada de 1V parece pequena, mas grandes tensões sempre podem ser divididas e reduzidas, e pequenas tensões podem ser amplificadas.
A terceira e talvez a característica mais importante do ADC é sua capacidade. Este valor determina a precisão da transformação ou (por nossa analogia) - com que freqüência os pontos "discretos" são colocados na linha numérica "real". No nosso caso, o ADC tem uma resolução de 10 . O que isso significa? E isso significa que o código digital de saída é representado por 10 dígitos binários e possui 1024 valores - de 0 a 1023.
A rigor, vale lembrar que a precisão da conversão depende não apenas da profundidade do bit, mas também de vários outros parâmetros, por exemplo, a linearidade do ADC. Mas muito já foi escrito sobre isso por tios muito espertos em livros muito espertos; portanto, neste artigo deixarei o leitor sem detalhes.
Além disso, o ESP8266 ADC pode detectar transbordamento, ou seja, uma situação em que uma tensão maior que 1V é aplicada à entrada.
Se você pegar um livro de referência inteligente sobre ADCs e olhar para lá, haverá dezenas de outras características. Todos eles são necessários e importantes, mas não iremos tão longe. Por exemplo , não tocaremos nos parâmetros de tempo do ADC , pois acreditamos que, no nosso caso, os valores medidos mudam bastante lentamente e o ADC os converte em uma representação digital "instantaneamente".
Resumir o resultado preliminar.
O controlador ShIoTiny possui um ADC embutido no ESP8266 .
Uma tensão na faixa de 0 a 1V é aplicada à entrada do ADC ESP8266 .
Na saída do ESP8266 ADC, obtemos um número proporcional à tensão de entrada no intervalo de 0 a 1023 . A tensão 0V corresponde ao código 0 na saída ADC, a tensão 1V corresponde ao código 1023 na saída ADC.
A leitura dos dados do ADC no ShIoTiny é realizada a uma velocidade de aproximadamente 10 vezes por segundo .
A entrada de hardware do ADC é protegida contra sobretensão, semelhante à maneira como as entradas binárias Input1,2,3 são protegidas ( veja aqui ).
É isso para o hardware ShIoTiny ADC .
Agora vamos lidar com o nó ADC1 , que processa dados do ADC de hardware do ESP8266 .
Software sinos ou assobios ADC1
No diagrama do programa no editor ElDraw , o conjunto do conversor analógico-digital é chamado ADC1 .

Como já mencionado, o nó ADC1 recebe dados do ADC de hardware ESP8266 aproximadamente 10 vezes por segundo . Mas o nó especificado não se acalma com isso, mas começa a processar esses dados e até analisá-los um pouco.
Em primeiro lugar , é verificado - houve um estouro de ADC? Ou seja - o ADC não entrou mais do que 1V ? Se tal situação for detectada, a saída do nó ADC1 será configurada para NAN ( não um número ).
Em segundo lugar , se não houver transbordamento, o valor de saída do ADC 0..1023 é convertido no valor de tensão na entrada do ADC - um número de ponto flutuante no intervalo 0..1 .
Em terceiro lugar , esse valor convertido 0..1 é recalculado de acordo com a fórmula onde - tensão na entrada do ADC (de 0 a 1V ); k é o intervalo (intervalo ADC ) eb é o deslocamento ( deslocamento ADC ). E, finalmente, o valor obtido de X é definido para a saída do nó ADC1 .
E finalmente no quinto . Se o valor de X tiver sido alterado em uma porcentagem especificada (de 1 a 100% ), a unidade ADC gerará eventos, causando uma conversão dos valores dos nós conectados a ela. Este é essencialmente o parâmetro de sensibilidade do ADC ( alterações do ADC, intervalo% ). Afinal, geralmente não há razão para reagir “a todos os espirros”, ou seja, às escassas mudanças nos bits inferiores do ADC - eles geralmente “fazem barulho”. Portanto, o parâmetro de sensibilidade é de grande importância prática.
Surge a pergunta legítima - como configuramos essas configurações? Clique com o mouse no nó ADC1 no diagrama e você verá uma janela de configurações.
Nele você pode definir tudo o que precisa. Para o nosso caso, será uma janela, como na figura.

Nesta janela, você pode definir todos os parâmetros mencionados acima - a faixa, o deslocamento e a sensibilidade do ADC.
Se você não especificou nada, o intervalo será 1. O deslocamento é zero. E a sensibilidade é de 1%.
Ou seja, por padrão, de fato, a saída do nó ADC1 será o valor da tensão analógica fornecida à entrada ADC.
Como você pode ver, o nó ADC1 é bastante complexo. Por que tudo isso é feito? Sim para você, meus queridos usuários! Brincadeirinha, é claro, como um egoísta malicioso, levei em conta a experiência anterior e tentei facilitar minha vida.
Nós, como engenheiros simples, queremos que os valores sejam apresentados não em "papagaios", mas em valores normais e compreensíveis - volts, amperes, quilogramas ou metros.
Muitos sensores fornecem o valor "em papagaios", esperando que um microcontrolador inteligente os recalcule para os valores desejados.
Para esse fim, foi introduzida a conversão do valor ADC medido pela função de um dado.
Mas, como sempre, é melhor ver uma vez do que ouvir dez vezes. Também é melhor tentar uma vez do que ver dez vezes ... Mas esse não é o ponto.
Portanto, darei alguns exemplos não complicados: um sistema de controle de fonte de alimentação e um sistema de medição de temperatura baseado em um sensor com uma saída de corrente de 4-20mA .
Monitoramento de rede
Medir a tensão é uma tarefa comum. Por exemplo, queremos medir a tensão da rede elétrica ~ 220V . Se temos um fornecimento ruim de eletricidade, a tarefa é muito real. Não precisamos de uma mudança muito, muito precisa. Basta que, quando a tensão estiver 15% acima da norma, o relé1 for acionado no ShIoTiny e, quando a tensão for reduzida em 15% da norma, o relé2 for acionado .
Obviamente, não podemos conectar a entrada ADC1 do controlador ShIoTIny em um soquete. O que fazer Em primeiro lugar, a tensão deve ser reduzida para um nível aceitável - 0..1V . E, em segundo lugar, deve ser retificado: nosso ADC não pode medir a tensão alternada.
A voltagem na rede pode estar abaixo da norma e acima dela. Por uma questão de simplicidade, assumimos que 220V da tensão da rede corresponderá a 0,5V da tensão na entrada do ADC.
Em seguida, procuramos por qualquer transformador de abaixamento que a ~ 220V da tensão de entrada nos forneça, digamos ~ 3V da tensão de saída e monte um circuito como na figura abaixo.
Aqui, uma surpresa pode aguardar os ignorantes em eletrônica. Na saída do retificador, não a tensão de 3V DC aparece repentinamente, mas mais de 4V ! De fato, tudo é simplesmente explicado. Quando medimos uma tensão alternada, o voltímetro mostra o valor real da tensão. E quando retificamos essa tensão, na saída do retificador obtemos o valor de pico da tensão, que para o sinal sinusoidal é de cerca de 1,41 , e exatamente vezes mais que o atual. Daí o "incompreensível" 4,23V na saída do retificador.
E, finalmente, precisamos calcular o divisor de tensão, ou seja, a resistência R1 e R2 . Precisamos obter a saída do divisor 0,5V com uma tensão na entrada 4,23V . Portanto, a tensão retificada de 4,23V deve ser dividida por 8,46 vezes. Para fazer isso, defina o resistor R2 = 100 Ohms e o resistor R1 = 746 Ohms . Mas isso é ideal. Na verdade, resistores com uma resistência de 746 ohms não existem. Sim, e os transformadores não são particularmente precisos. Portanto, se alguém se atreve a tentar esta solução, recomendo fortemente que você coloque o resistor R1 = 760 Ohms e leve o aparador R2 do resistor, com uma resistência de 180 Ohms ou 220 Ohms . Em seguida, você pode, armado com um voltímetro, ajustar R2 para que a ~ 220V a tensão no enrolamento primário do transformador, na saída do divisor (ou, que é o mesmo, na entrada do ADC1 ) seja = 0,5V .
Medimos a tensão não apenas dessa maneira, mas para fazer algo excedendo ou diminuindo a norma. Por exemplo, ligue a energia de backup para que algum dispositivo não queime e não desligue.
Portanto, desenharemos o esquema de programa mais simples, que, quando a tensão está 15% acima da norma, faz com que o relé Relé1 funcione e quando a tensão diminui 15% da norma, o relé Relé2 funciona . Além disso, a sobretensão ou subtensão deve ser mantida na rede por pelo menos 1 minuto para acionar um relé. Isso evitará alarmes falsos durante picos curtos de tensão que geralmente ocorrem na rede. O programa do esquema que implementa nossa ideia é mostrado na figura.

Para que este circuito funcione, é necessário definir o coeficiente k (faixa) igual a 440 nas configurações dos parâmetros ADC, conforme mostrado na figura.

Com um coeficiente de 440 e uma tensão de tensão na entrada do ADC 0,5V, a saída do nó ADC1 será 220 . Essa é a verdadeira tensão da rede!
Isso é muito conveniente, pois permite definir as constantes imediatamente em volts: 220V + 15% é 253V e 220V-15% é 187V . Se necessário, esses valores podem ser facilmente alterados sem perder tempo calculando e convertendo a tensão em "papagaios".
Sensor de temperatura 4-20mA
Sensores com uma saída de corrente de 4-20mA são muito comuns na indústria. Na vida cotidiana, você não os encontrará com frequência. No entanto, alguém os tem e esse alguém quer adaptá-los à causa.
O ADC permite o uso de tais sensores em conjunto com o controlador ShIoTiny .
Por que a corrente de saída do sensor é precisamente 4-20mA ? Eu vou explicar
As saídas atuais funcionam bem em longas filas. Diga um quilômetro. Eles não se importam com a resistência dos fios: a corrente é a mesma ao longo de todo o comprimento do fio, independentemente da resistência dos condutores.
O valor inicial atual de 4mA , e não apenas a falta de corrente, facilita a detecção de uma quebra de fio. Se o sensor estiver inteiro e o fio não estiver quebrado, sempre haverá corrente. Pelo menos 4mA . E se o fio quebrar, não há corrente ( 0mA ).
Suponha que tenhamos um sensor de temperatura com uma saída de corrente de 4-20mA e uma faixa de temperatura medida de -40C a + 125C . Queremos conectá-lo ao ShIoTin . A primeira coisa que precisamos fazer é converter a corrente em tensão. Um meio ideal para essa conversão é um resistor convencional.
Como a tensão máxima na entrada do ADC é 1V e a corrente máxima na linha é 20mA , é fácil calcular que um resistor que converte 20mA em 1V terá uma resistência de 50 Ohms . ( Não conheça a lei de Ohm - fique em casa! ).
Vamos conectar nosso sensor conforme mostrado na figura.

O sensor é um gerador de corrente proporcional à temperatura medida. Com uma resistência de 50 Ohms conectada em paralelo à entrada ADC1 , os seguintes valores de tensão estarão na entrada ADC, dependendo da corrente gerada no circuito do sensor:
- corrente menor que 4mA , tensão na entrada ADC menor que 0,2V - quebra de linha;
- corrente de 4mA a 20mA , tensão de 0,2V a 1V - o sensor está funcionando;
- a corrente é superior a 20mA , a tensão de entrada é superior a 1V - o sensor está com defeito. Com um curto-circuito no sensor, um resistor de 50 Ohm pode queimar se tiver menos de 2W de potência.
Suponha que desejemos medir a temperatura e publicá-la pelo MQTT . Além disso, publicaremos o status do sensor (circuito aberto, curto-circuito ou tudo está em ordem).
A primeira coisa que precisamos fazer é recalcular o valor dos "papagaios" para graus. Sabendo que uma temperatura de -40 ° C corresponde a uma corrente de 4 mA e uma tensão na entrada do ADC de 0,2 V , e uma temperatura de +125 ° C corresponde a uma corrente de 20 mA e uma tensão na entrada do ADC de 1 V , obtemos os coeficientes: k = 206,25 eb = -81,25 . Digite esses coeficientes na janela de configurações do ADC, conforme mostrado na figura.

Quem deseja verificar a exatidão do cálculo de keb - decide por si mesmo o sistema mais simples de equações:
Bem, o esquema do programa não será nada complicado e é mostrado na figura abaixo.

No caso em que tudo esteja bem e o sensor de temperatura de 4-20mA estiver funcionando , a temperatura será publicada no servidor MQTT sob o nome / t_sens . Os sintomas também são publicados sob os nomes / sens_short e / sens_break . Se tudo estiver bem, os sinais de um acidente são zero.
Se a linha quebrar , a temperatura será menor que -40 ° C. Nesse caso, o parâmetro / sens_break no broker do MQTT será publicado como uma unidade.
Se houver um curto-circuito na linha, a temperatura será superior a + 125 ° C. 1 NAN ( - ). /sens_short MQTT .
Relay3 , , , .
«» , , , 200 .
Conclusão
ShIoTiny , . , .
, - «» , - , - .
— . .
: shiotiny@yandex.ru .
Referências
, , .
-
.
: 4-20 –
ESPPOWER ANDROID