
Points clés ou sujet de cet article
Suite d'une série d'articles sur ShIoTiny - un contrôleur programmable visuellement basé sur la puce ESP8266 . Une caractéristique clé de ce contrôleur est la possibilité de le programmer en dessinant un programme dans un navigateur.
Cet article décrit une brève théorie de la conversion analogique-numérique et l'application pratique du contrôleur ShIoTiny ADC.
Articles précédents de la série.
ShIoTiny: petite automatisation, Internet des objets, ou «six mois avant les vacances»
ShIoTiny: nœuds, liens et événements ou caractéristiques des programmes de dessin
ShIoTiny: ventilation de pièce humide (exemple de projet)
ShIoTiny et le monde environnant: connexion de capteurs aux entrées binaires, rebond de contact et autres problèmes
Site du projet
Micrologiciel binaire, circuit de contrôleur et documentation ici
Introduction ou au lieu d'une théorie sérieuse
Dans un article précédent , nous avons examiné la connexion des principaux types de capteurs avec une sortie binaire aux entrées binaires du contrôleur ShIoTiny .
Mais, comme la plupart des gens, ainsi que les écoliers et les étudiants, le savent, la majeure partie des informations sur le monde environnant sont des quantités analogiques de diverses natures physiques: la puissance de la lumière et du son, la vitesse, la pression atmosphérique, le niveau de liquide, etc.
Presque tous les microprocesseurs et microcontrôleurs modernes ne peuvent traiter que des valeurs discrètes en représentation binaire.
Pour ceux qui ne savent pas encore en quoi la valeur analogique diffère de la valeur discrète, j'écrirai de brèves explications. Celui qui sait déjà tout peut les sauter. Je ferai une réservation tout de suite - les analogies et les simplifications ont leur place. Ce n'est pas une dissertation, mais plutôt de brèves explications sur les doigts.
Quantités analogiques et discrètes (vous ne pouvez pas lire aux professeurs, universitaires et geeks)
Tout le monde a étudié les mathématiques à l'école. Par conséquent, nous nous tournons vers elle et établissons des analogies entre les quantités et les nombres analogiques et discrets.
Du point de vue des mathématiques, une grandeur analogique est un nombre réel , défini en tout point sur un segment donné d'une droite numérique.
La valeur discrète du point de vue des mathématiques est un entier . Et il n'est défini qu'en certains points d'un segment donné d'une droite numérique.
La figure ci-dessous montre schématiquement l'emplacement des quantités-nombres analogiques et discrètes sur une droite numérique.

Par exemple, considérons un segment d'une droite numérique de -4 à 3 . Comme vous pouvez le voir, les quantités discrètes indiquées par des points rouges - les entiers dessus ne sont que 8 pièces. Les valeurs analogiques indiquées par la ligne verte sur la figure sont infinies.
Par exemple, nous avons une certaine quantité X , qui a une plage de valeurs de 0 à 127 . Si nous représentons cette quantité comme analogique , alors théoriquement nous pouvons la représenter avec n'importe quelle précision - par exemple, 12.123455454980 ou 126.00000000007 ou en général avec un million de décimales.
Mais dès que le microcontrôleur entre dans l'entreprise et que la valeur de X acquiert une représentation discrète , alors il ne peut être question d'aucune «précision infinie» même théoriquement. La précision est limitée par le nombre de chiffres binaires que nous attribuons à la représentation de la quantité X.
Par exemple, nous prenons 7 bits. Dans ce cas, nous pouvons représenter la valeur de X avec une précision de un. Autrement dit, il sera possible de spécifier X = 1 ou X = 112 . Mais X = 112,5 ne peut pas déjà être indiqué - la profondeur de bits n'est pas suffisante. Si nous prenons pour la représentation de la même valeur de X non pas 7 , mais 10 chiffres, alors la précision de la représentation ne sera pas une, mais 0,125 . Et sous cette forme, vous pouvez imaginer X = 95,125 ou X = 112,5 . Mais plus précisément, par exemple, sous la forme X = 112,13 - cette valeur ne peut pas déjà être représentée.
Si vous êtes confus du fait que j'écris des valeurs fractionnaires et en même temps je les parle comme des entiers, alors rappelez-vous que les "points discrets" peuvent être placés sur une droite numérique non pas en unités, mais par exemple en 0,5 ou 0,125 unités. Mais comme elles l'étaient, la valeur finale restera sur n'importe quel segment. Et toutes les propriétés d'une quantité discrète sont préservées.
La principale différence entre une valeur discrète et une valeur analogique est que sur tout segment fini de la ligne numérique, il y aura un nombre fini de valeurs discrètes (entières) et un nombre infini de valeurs analogiques (réelles). En conséquence, nous obtenons que la représentation discrète des quantités a toujours une précision finie.
À la suite de tout ce qui précède, nous obtenons une conclusion triviale. La plupart des quantités mesurables du monde réel sont analogiques . Les microcontrôleurs ne fonctionnent qu'avec des représentations numériques discrètes de quantités. Par conséquent, avant de traiter toute valeur analogique à l'aide d'un microcontrôleur, cette valeur doit être représentée comme discrète. Oui, et sous forme binaire.
Une telle conversion de l'analogique au numérique est appelée conversion analogique-numérique .
Convertisseur analogique-numérique
Un dispositif de conversion d'un signal analogique en numérique est appelé ADC ( convertisseur analogique-numérique ).
Typiquement, un tel appareil possède une ou plusieurs entrées analogiques, sur lesquelles un signal analogique et une sortie numérique avec une profondeur de bits donnée sont fournis (généralement de 8 à 16 bits).
Les microcontrôleurs modernes, y compris notre ESP8266 , ont des unités ADC intégrées.
Quelles sont les caractéristiques de l'ADC en général et de l' ADC ESP8266 en particulier?
La première caractéristique est le type de valeur analogique d'entrée que l'ADC convertit en un code numérique de sortie. Le plus souvent, cette valeur est la tension à l'entrée analogique de l'ADC. Ce sera donc dans notre cas. Mais dans la nature, il existe des ADC avec entrée de courant.
La deuxième caractéristique de l'ADC, qui est nécessaire dans la pratique, est la plage de valeurs de la valeur d'entrée de l'ADC. Dans notre cas, il s'agit des valeurs de tension minimale et maximale à l'entrée de l'ADC. Ces valeurs seront respectivement 0V et 1V . La plage d'entrée de 1 V semble petite, mais les grandes tensions peuvent toujours être divisées et réduites, et les petites tensions peuvent être amplifiées.
La troisième et peut-être la caractéristique la plus importante de l'ADC est sa capacité. Cette valeur détermine la précision de la transformation ou (par notre analogie) - la fréquence à laquelle les points "discrets" sont placés sur la droite numérique "réelle". Dans notre cas, l'ADC a une résolution de 10 . Qu'est-ce que cela signifie? Et cela signifie que le code numérique de sortie est représenté par 10 chiffres binaires et a 1024 valeurs - de 0 à 1023.
À strictement parler, il convient de rappeler que la précision de la conversion dépend non seulement de la profondeur de bits, mais également d'un certain nombre d'autres paramètres, par exemple, la linéarité de l'ADC. Mais beaucoup a déjà été écrit à ce sujet par des oncles très intelligents dans des livres très intelligents, donc dans cet article, je laisserai le lecteur sans détails.
De plus, le ESP8266 ADC peut détecter un débordement, c'est-à-dire une situation où une tension supérieure à 1 V est appliquée à l'entrée.
Si vous prenez un livre de référence intelligent sur les ADC et regardez-le, il y aura des dizaines d'autres caractéristiques. Tous sont nécessaires et importants, mais nous n'irons pas aussi loin. Par exemple , nous n'aborderons pas les paramètres temporels de l'ADC , car nous pensons que dans notre cas les valeurs mesurées changent assez lentement et l'ADC les convertit en une représentation numérique «instantanément».
Pour résumer le résultat préliminaire.
Le contrôleur ShIoTiny a un ADC intégré à l' ESP8266 .
Une tension comprise entre 0 et 1 V est appliquée à l'entrée de l' ADC ESP8266 .
À la sortie de l' ESP8266 ADC, nous obtenons un nombre proportionnel à la tension d'entrée dans la plage de 0 à 1023 . La tension 0V correspond au code 0 à la sortie ADC, la tension 1V correspond au code 1023 à la sortie ADC.
La lecture des données de l'ADC dans ShIoTiny est effectuée à une vitesse d'environ 10 fois par seconde .
L'entrée matérielle de l'ADC est protégée contre les surtensions, de la même manière que les entrées binaires Input1,2,3 sont protégées ( voir ici ).
C'est tout pour le matériel ShIoTiny ADC .
Voyons maintenant le nœud ADC1 , qui traite les données du ADC matériel ESP8266 .
Cloches ou sifflets logiciels ADC1
Dans le diagramme de programme de l'éditeur ElDraw , l'ensemble convertisseur analogique-numérique est appelé ADC1 .

Comme déjà mentionné, le nœud ADC1 reçoit des données de l' ADC matériel ESP8266 environ 10 fois par seconde . Mais le nœud spécifié ne se calme pas à ce sujet, mais commence à traiter ces données et même à les analyser un peu.
Tout d'abord , il est vérifié - y a-t-il eu un débordement d'ADC? C'est - est-ce que l'entrée ADC n'a pas plus de 1V ? Si une telle situation est détectée, la sortie du nœud ADC1 est définie sur NAN ( pas un nombre ).
Deuxièmement , s'il n'y a pas eu de débordement, la valeur de sortie de l'ADC 0..1023 est convertie en valeur de tension à l'entrée de l'ADC - un nombre à virgule flottante compris entre 0 et 1 .
Troisièmement , cette valeur convertie 0..1 est recalculée selon la formule où - tension à l'entrée de l'ADC (de 0 à 1V ); k est la plage (plage ADC ) et b est le décalage ( décalage ADC ). Et enfin, la valeur obtenue de X est définie sur la sortie du nœud ADC1 .
Et enfin dans le cinquième . Si la valeur de X a changé d'un pourcentage spécifié (de 1 à 100% ), l'unité ADC génère des événements, provoquant une conversion des valeurs des nœuds qui lui sont connectés. Il s'agit essentiellement du paramètre de sensibilité ADC ( changements ADC, plage% ). Après tout, il n'y a généralement aucune raison de réagir «à chaque éternuement», c'est-à-dire à de légers changements dans les bits inférieurs de l'ADC - ils «font souvent du bruit». Par conséquent, le paramètre de sensibilité est d'une grande importance pratique.
La question légitime se pose: comment configurer ces paramètres? Cliquez avec votre souris sur le nœud ADC1 dans le diagramme et là, vous verrez une fenêtre de paramètres.
Vous pouvez y définir tout ce dont vous avez besoin. Pour notre cas, ce sera une telle fenêtre, comme sur la figure.

Dans cette fenêtre, vous pouvez définir tous les paramètres mentionnés ci-dessus - la plage, le décalage et la sensibilité de l'ADC.
Si vous n'avez rien spécifié, la plage sera 1. Le décalage est zéro. Et la sensibilité est de 1%.
Autrement dit, par défaut, la sortie du nœud ADC1 sera la valeur de la tension analogique fournie à l'entrée ADC.
Comme vous pouvez le voir, le nœud ADC1 est assez complexe. Pourquoi tout cela est-il fait? Oui pour vous, mes chers utilisateurs! Je plaisante, bien sûr, en tant qu'égoïste malveillant, j'ai pris en compte l'expérience précédente et j'ai essayé de me faciliter la vie.
En tant qu'ingénieurs simples, nous voulons que les valeurs soient présentées non pas en "perroquets", mais en valeurs normales et compréhensibles - volts, ampères, kilogrammes ou mètres.
De nombreux capteurs donnent la valeur «en perroquets», en espérant qu'un microcontrôleur intelligent les recalculera aux valeurs souhaitées.
Dans ce but, la conversion de la valeur ADC mesurée par la fonction de celle donnée a été introduite.
Mais, comme d'habitude, il vaut mieux voir une fois que d'entendre dix fois. C’est aussi mieux d’essayer une fois que de voir dix fois ... Mais ce n’est pas la question.
Par conséquent, je vais donner quelques exemples non compliqués: un système de contrôle d'alimentation et un système de mesure de température basé sur un capteur avec une sortie de courant 4-20mA .
Surveillance du réseau
La mesure de la tension est une tâche courante. Par exemple, nous voulons mesurer la tension du secteur ~ 220V . Si nous avons une mauvaise alimentation électrique, la tâche est bien réelle. Nous n'avons pas besoin d'un changement très, très précis. Il suffit que lorsque la tension est de 15% supérieure à la norme, le relais 1 est déclenché sur ShIoTiny , et lorsque la tension est réduite de 15% par rapport à la norme, le relais 2 est déclenché .
Bien sûr, nous ne pouvons pas brancher l’ entrée ADC1 du contrôleur ShIoTIny sur une prise. Que faire Premièrement, la tension doit être réduite à un niveau acceptable - 0..1V . Et, deuxièmement, il faut y remédier: notre ADC ne peut pas mesurer la tension alternative.
La tension dans le réseau peut être à la fois inférieure à la norme et supérieure à la norme. Par souci de simplicité, nous supposons que 220 V de la tension secteur correspondra à 0,5 V de la tension à l'entrée de l'ADC.
Ensuite, nous recherchons tout transformateur abaisseur qui à ~ 220 V de la tension d'entrée nous donnera, disons ~ 3 V de la tension de sortie et assemblons un tel circuit comme dans la figure ci-dessous.
Ici, une surprise peut attendre les ignorants de l'électronique. A la sortie du redresseur, pas de tension CC 3V n'apparaît soudainement, mais quelques 4V en plus! En fait, tout est simplement expliqué. Lorsque nous mesurons une tension alternative, le voltmètre nous montre la valeur réelle de la tension. Et lorsque nous rectifions cette tension, à la sortie du redresseur, nous obtenons la valeur de crête de la tension, qui pour le signal sinusoïdal est d'environ 1,41 , et exactement fois plus que l'actuel. D'où le "incompréhensible" 4.23V en sortie du redresseur.
Et enfin, nous devons calculer le diviseur de tension, c'est-à-dire la résistance R1 et R2 . Nous devons obtenir à la sortie du diviseur 0,5 V avec une tension à son entrée 4,23 V. La tension redressée de 4,23 V doit donc être divisée par 8,46 fois. Pour ce faire, réglez la résistance R2 = 100 Ohms et la résistance R1 = 746 Ohms . Mais c'est l'idéal. En fait, les résistances avec une résistance de 746 ohms n'existent pas. Oui, et les transformateurs ne sont pas particulièrement précis. Par conséquent, si quelqu'un ose essayer cette solution, je vous conseille fortement de mettre la résistance R1 = 760 Ohms , et de prendre la résistance R2 trimmer, avec une résistance de 180 Ohms ou 220 Ohms . Ensuite, vous pouvez, armé d'un voltmètre, régler R2 de sorte qu'à ~ 220 V la tension à l'enroulement primaire du transformateur, à la sortie du diviseur (ou, ce qui est le même, à l'entrée de l' ADC1 ) soit = 0,5 V.
Nous mesurons la tension non seulement comme ça, mais pour faire quelque chose en la dépassant ou en la diminuant par rapport à la norme. Par exemple, allumez l'alimentation de secours afin que certains appareils ne s'éteignent pas et ne s'éteignent pas.
Par conséquent, nous allons dessiner le schéma de programme le plus simple qui, lorsque la tension est de 15% supérieure à la norme, fait fonctionner le relais Relais1 , et lorsque la tension diminue de 15% par rapport à la norme, le relais Relais2 fonctionne . De plus, une surtension ou une sous-tension doit être maintenue sur le réseau pendant au moins 1 minute pour déclencher un relais. Cela évitera les fausses alarmes lors de courtes pointes de tension qui se produisent souvent sur le réseau. Le programme de schéma qui met en œuvre notre idée est illustré dans la figure.

Pour que ce circuit fonctionne, il est nécessaire de régler le coefficient k (plage) égal à 440 dans les réglages des paramètres ADC, comme indiqué sur la figure.

Avec un coefficient de 440 et une tension de tension à l'entrée de l'ADC 0,5V, la sortie du nœud ADC1 sera de 220 . C'est la vraie tension du réseau!
C'est très pratique, car cela vous permet de définir les constantes immédiatement en volts: 220V + 15% est 253V et 220V-15% est 187V . Si nécessaire, ces valeurs peuvent être facilement modifiées sans perdre de temps à calculer et à traduire la tension en «perroquets».
Capteur de température 4-20mA
Les capteurs ayant une sortie de courant 4-20mA sont très courants dans l'industrie. Dans la vie de tous les jours, vous ne les rencontrerez pas souvent. Néanmoins, quelqu'un les a et ce quelqu'un veut les adapter à la cause.
L'ADC permet l'utilisation de tels capteurs en conjonction avec le contrôleur ShIoTiny .
Pourquoi le courant de sortie du capteur et précisément 4-20mA ? Je vais vous expliquer.
Les sorties actuelles fonctionnent bien sur de longues lignes. Dis un kilomètre. Ils ne se soucient pas de la résistance des fils: le courant est le même sur toute la longueur du fil, quelle que soit la résistance des conducteurs.
La valeur de courant initiale de 4mA , et pas seulement le manque de courant, facilite la détection d'une rupture de fil. Si le capteur est entier et que le fil n'est pas cassé, alors il y a toujours du courant. Au moins 4mA . Et si le fil se casse, il n'y a pas de courant ( 0mA ).
Supposons que nous ayons un capteur de température avec une sortie de courant de 4-20mA et une plage de température mesurée de -40C à + 125C . Nous voulons le connecter à ShIoTin . La première chose que nous devons faire est de convertir le courant en tension. Un moyen idéal pour une telle conversion est une résistance conventionnelle.
Étant donné que la tension maximale à l'entrée de l'ADC est de 1 V et que le courant maximal dans la ligne est de 20 mA , il est facile de calculer qu'une résistance qui convertit 20 mA en 1 V aura une résistance de 50 Ohms . ( Je ne connais pas la loi d'Ohm - restez à la maison! ).
Nous connecterons notre capteur comme indiqué sur la figure.

Le capteur est un générateur de courant proportionnel à la température mesurée. Avec une résistance de 50 Ohms connectée en parallèle avec l'entrée ADC1 , les valeurs de tension suivantes seront à l'entrée ADC, en fonction du courant généré dans le circuit du capteur:
- courant inférieur à 4mA , tension à l'entrée ADC inférieure à 0,2V - rupture de ligne;
- courant de 4mA à 20mA , tension de 0,2V à 1V - le capteur fonctionne;
- le courant est supérieur à 20mA , la tension d'entrée est supérieure à 1V - le capteur est défectueux. Avec un court-circuit dans le capteur, une résistance de 50 Ohms peut griller si sa puissance est inférieure à 2 W.
Supposons que nous voulons mesurer la température et la publier par MQTT . De plus, nous publierons l'état du capteur (circuit ouvert, court-circuit ou tout est en ordre).
La première chose que nous devons faire est de recalculer la valeur des "perroquets" en degrés. Sachant qu'une température de -40 ° C correspond à un courant de 4 mA et une tension à l'entrée de l'ADC de 0,2 V , et une température de +125 ° C correspond à un courant de 20 mA et une tension à l'entrée de l'ADC de 1 V , on obtient les coefficients: k = 206,25 et b = -81,25 . Entrez ces coefficients dans la fenêtre des paramètres ADC, comme indiqué sur la figure.

Qui veut vérifier l'exactitude du calcul de k et b lui - même - décidez par vous-même du système d'équations le plus simple:
Eh bien, le schéma du programme ne sera pas du tout compliqué et est illustré dans la figure ci-dessous.

Dans le cas où tout va bien et que le capteur de température 4-20mA fonctionne , la température est publiée sur le serveur MQTT sous le nom / t_sens . Les symptômes sont également publiés sous les noms / sens_short et / sens_break . Si tout va bien, alors les signes d'un accident sont nuls.
Si la ligne se rompt , la température sera inférieure à -40 ° C. Dans ce cas, le paramètre / sens_break sur le courtier MQTT sera publié en tant qu'unité.
S'il y a un court-circuit dans la ligne, la température sera supérieure à + 125 ° C. Dans ce cas, nous aurons une tension supérieure à 1 V à l'entrée de l'ADC et l'unité ADC réglera la sortie sur NAN ( non numérique ). /sens_short MQTT .
Relay3 , , , .
«» , , , 200 .
Conclusion
ShIoTiny , . , .
, - «» , - , - .
— . .
Vous pouvez envoyer tout cela comme d'habitude dans un commentaire ou par mail: shiotiny@yandex.ru .
Les références
Étant donné que l'article contient de nombreux éléments tiers qui nécessitent des éclaircissements, aucun lien ne peut être supprimé.
Comment la conversion du signal analogique en numérique
Convertisseur analogique-numérique
Signal analogique et numérique. Types de signaux et fonctionnement
Liste des paramètres de tension et de courant électrique
Interfaces de champ analogique: boucle de courant 4-20 mA - du simple au complexe
CONFIGURATION DE LA GESTION D'ESPOWER CLOUD PAR INTERNET À L'AIDE D'ANDROID