Tutoriel Arduino ENC28J60 [Eng]
Tutoriel Arduino ENC28J60
...
Les serveurs Web Arduino Ethernet économiques sont fiables et attrayants pour une large gamme de surveillance de capteurs: température, tension ou commutateurs. Ethernet est plus ancien que le WiFi mais plus fiable et largement utilisé dans l'industrie. Un tel serveur Web coûte environ 10 euros et sa construction prend un jour. Les thermomètres commerciaux Arduino Ethernet sont disponibles sur Ebay à partir de 50 EUR.
Le serveur Web Arduino est alimenté via un connecteur USB 5V ou avec plus d’efforts, une fonctionnalité POE (Power Over Ethernet) est ajoutée. Arduino Nano peut être reprogrammé à tout moment via le connecteur USB.
Plate-forme ZABBIX IOT gratuite pour le traçage et le suivi des données
ZABBIX est une plate-forme de surveillance du signal IOT développée pour la surveillance de la salle des serveurs et pour l'envoi d'alarmes. Il est similaire à Xively, mais ZABBIX fournit le téléchargement d’installation gratuit et peut également être installé sur Raspberry Pi. Le modèle commercial de la société consiste à envoyer un technicien installer Zabbix dans des salles de serveurs clients industriels. ZABBIX home est Riga la capitale de la Lettonie, l'UE. Zabbix a été activement développé au cours de la dernière décennie:
ZABBIX peut être installé sur un PC Linux ou sur une machine virtuelle. Cela fonctionne avec une base de données SQL. Une image de machine virtuelle peut également être téléchargée. La configuration se fait via une page Web.
Une grande flexibilité est obtenue, les ordinateurs à surveiller doivent simplement générer une page Web et ZABBIX ne récupère que les données d'une page Web d'autres serveurs. Cela permet de surveiller le trafic Web, la charge du serveur et si le serveur est actif.
Ces dernières années, il a été possible de créer des serveurs Web Arduino Ethernet à faible coût pour la surveillance de capteurs électriques: température, tension ou commutateurs. Voici la vision de ZABBIX:
Image imaginée faite par Zabbix pour la conférence DevTernity 12.2016. À Riga, en Lettonie.
ZABBIX à la conférence des développeurs
À l'intérieur de la boîte était emballé avec cela. La version de droite comportait un capteur de température DS18B20.
Power over Ethernet pour alimenter le serveur Web
L'alimentation par Ethernet était une tâche délicate à réaliser. Le connecteur Ethernet du blindage ENC28J60 contient un transformateur qui sépare galvaniquement les entrées des sorties. Pour obtenir le POE, le blindage métallique du connecteur a été coupé avec un disque en diamant permettant d’accéder aux connexions avant le transformateur. Les broches du connecteur ont dû être coupées du circuit imprimé avec un transformateur car la connexion était faible. De fins fils flexibles ont été soudés à des broches POE.
Une solution correcte consisterait à utiliser un connecteur Ethernet sans le transformateur intégré, que l'on trouve dans les routeurs ou un connecteur Ethernet à 10 broches, donnant accès aux broches POE, Farnell environ 8EUR.
En tant que source de routeurs POE, Mikrotik a utilisé 951Ui 2HnD. Il dispose de 5 ports Ethernet. N ° 1 est marqué entrée POE. Il n'y a pas de tension à travers. Le numéro 5 est marqué sortie POE et pour activer la tension de sortie POE, il faut modifier Configuration / Interfaces / POE / ON. Le routeur est alimenté par une alimentation 24 V 2A. Cette tension 24V apparaît comme tension de sortie POE. Il existe d'autres routeurs fournissant plus de sorties POE.
Modification d'un connecteur Ethernet standard pour une utilisation POE
1) Soulevez le cache métallique du connecteur Eth.
2) Coupez avec un couteau le couvercle en plastique.
3) Identifiez les contacts et coupez-les à l'aide d'un broyeur de 1 mm ou de 1,5 mm de diamètre (Dremel). Cela est nécessaire car les broches sont des résistances internes soudées qui bloquent l'activation du POE du côté du routeur.
4) À l’aide d’une fine pointe de fer à souder, souder deux fils aux deux contacts.
5) Mettez du ruban isolant et fermez le couvercle en métal du connecteur. Fixez les nouveaux fils POE avec de la colle.
6) Pour assurer la polarité POE correcte, ajoutez un pont de diodes de redressement avant le régulateur abaisseur.
7) Le module abaisseur LM2596HV peut être utilisé. Les modules POE industriels utilisent un transformateur à isolation galvanique. Il pourrait être possible d’utiliser un chargeur de téléphone de 110V à 5V car il pourrait fonctionner à basse tension.
Dans les spécifications Ethernet POE:
4 5 est + fils orange 7 8 est - fils bleus
La photo à droite montre le serveur Arduino sous POE avec le câble USB débranché.
LCD et boîte avec couvercle transparent
L’indicateur LCD est très utile pour voir l’adresse IP obtenue au démarrage et permet de vérifier facilement le bon fonctionnement du périphérique. L’indicateur LCD à deux lignes est doté d’une carte adaptateur avec I2Cexpander PCF8574 ne nécessitant que 2 fils (données et horloge). Il faut d’abord identifier l’adresse I2C de cette puce, car elle peut différer de différents fournisseurs. L'indicateur à deux lignes est encombrant et la prochaine version comportera un minuscule indicateur graphique OLED, mais les OLED pourraient ne pas survivre à des années de fonctionnement continu.
Le tableau ENC d’Ebay a été utilisé dans le Arduino nano. Il est plus cher, mais a une puce de régulateur de 3,3V. Cela économise du travail sur les fils à souder, mais le connecteur USB se trouve sur un autre côté un peu moche. Il n'y a pas de POE dans cette version.
Cette version possède l'assemblage le plus rapide et le plus facile de tous. Il faut limer les trous pour les câbles et coller l’écran LCD. C'est ça. Mais pour changer le câble Eth ou le câble USB, il faut dévisser le couvercle du boîtier, ce qui est un travail facile. Belle protection contre la poussière.
Boîtier métallique et LCD
Pour un aspect professionnel, une boîte en métal est utilisée comme boîtier, par exemple, une «boîte à pédales de guitare» € d’Ebay. Les trous nécessaires pour Ethernet, USB et LCD sont découpés à l'aide d'une perceuse, d'une fraiseuse et d'un limage. Les circuits imprimés sont fixés dans le boîtier en métal à l'aide de colle chaude. Ce n'est peut-être pas la solution professionnelle, mais c'est bien pour commencer.
IDE Aduino
Le programme a initialement été écrit dans Arduino IDE 1.0.0. Plus tard, il a été décidé de passer à l’un des derniers Arduino IDE 1.6.13. Les différences étaient dans l'utilisation de la bibliothèque OneWire. J'utilise D8 pour le bus à un fil car D9 peut être utile pour la sortie PWM. Un test rapide de fidélité du capteur peut être effectué en mesurant la température du corps humain.
La bibliothèque Ethernet pour ENC28J60 permet de choisir entre des adresses IP statiques ou DHCP, mais les adresses Mac doivent être définies manuellement, uniques pour chaque
nouvelle case sur le même réseau:
ENC SCK -> Arduino pin 13
ENC SO -> Arduino pin 12
ENC SI -> Arduino broche 11
ENC CS -> Arduino pin 10 (certains autres exemples en ligne utilisent la pin 8)
ENC VCC -> 3V3 de l’adaptateur série USB CP2102 ou PL2303 mais pas assez de CH340
ENC GND -> GND
Shopping sur Ebay
Arduino peut venir sans ou avec les connecteurs soudés et le câble USB inclus ou non.
Il existe deux variantes de carte ENC28J60 avec des connexions fil-cavalier.
Faire 3,3V sur 5V pour la carte ENC n’est pas assez de courant de la part de la puce Arduino CH340.
Une autre modification de la carte ENC28J60 est plus chère avec une prise enfichable pour Arduino Nano v3. Il possède un régulateur de 3,3 V sur la carte et également un sélecteur de niveau TTL.
Si vous décidez d’opter pour le POE, vous avez besoin d’un régulateur de tension abaisseur pouvant gérer jusqu’à 57 volts, par exemple la version LM2576 HV.
Certains routeurs et commutateurs peuvent fournir des POE. Si vous n’avez pas un tel modèle, vous pouvez alors injecter des POE.
La pratique industrielle est pour nous des boîtiers métalliques. Simples mais pas plus beau
Les capteurs hermétiques avec câble sont pratiques à utiliser. Il y en a avec prise audio à la fin.
Code Arduino IDE 1.0.1 pour la version avec capteur de température et entrée analogique, pas d’écran LCD:
// serveur Web Arduino avec blindage Ethernet ENC28J60. IP statique ou DHCP.
// La page Web indique la température du capteur DS18B20 et le temps écoulé depuis la réinitialisation.
// Library /jcw/ethercard ethercard-master est renommé en ethercardmaster.
// 2010-05-28 ; /licenses/mit-license.php
// Bibliothèque /milesburton/Arduino-Temperature-Control-Library renommer en DallasTemperature // La bibliothèque de Dallas est défectueuse. Les exemples compilés montrent souvent -127.
// Code adopté par Janis Alnis le 2016.11.30. Compilé avec Arduino IDE version 1.0.0.
// ENC SCK -> Arduino pin 13
// ENC SO -> Arduino pin 12
// ENC SI -> Arduino pin 11
// ENC CS -> Arduino pin 10 (certains autres exemples en ligne utilisent la broche 8)
// ENC VCC -> 3V3 de l'adaptateur série USB CP2102 ou PL2303 mais pas assez de CH340 // ENC GND -> GND
#include
// adresse MAC de l'interface Ethernet, doit être unique sur l'octet statique du réseau local mymac [] = {0x74,0x69,0x69,0x2D, 0x30,0x33};
#define STATIC 0 // DHCP = 0, statique = 1
#if byte statique STATIQUE myip [] = {192,168,1,200}; // Adresse IP statique
#fin si
octet Ethernet :: tampon [500]; BufferFiller bfill;
#include
#include
#define ONE_WIRE_BUS 8
OneWire oneWire (ONE_WIRE_BUS); Sondes de température Dallas (& oneWire); float t1; // temperature int button = 3; état long = 0; longs clics = 0; // pour le bouton d'entrée numérique long AIN;
void setup () {Serial.begin (9600);
Serial.println ("\ nArduino Webserver with ENC28J60 Ethernet"); Serial.println ("Capteur de température DS18B20 sur D9"); pinMode (bouton, INPUT); digitalWrite (bouton, HAUT); // bouton if (ether.begin (sizeof Ethernet :: buffer, mymac) == 0) Serial.println ("Échec d'accès au contrôleur Ethernet");
#if STATIC ether.staticSetup (myip); #autre
si (! ether.dhcpSetup ())
Serial.println ("DHCP échoué");
#endif ether.printIp ("IP:", ether.myip);
}
mot statique homePage () {
long T1 = int (t1); T1 long = t1 * 10-10 * T1; // partie fractionnaire longue t = millis () / 1000;
bfill = ether.tcpOffset (); bfill.emit_p (PSTR (
"HTTP / 1.0 200 OK \ Type de contenu: texte / html \ r \ nPragma: pas de cache \ r \ n \ r \
" Serveur Web Arduino Ethernet ENC28J60 n ° 3
Temperat $ L. $ L
A0 inp% $ L L"
"État D3: $ L
D3 clics $ L
secondes $ L "), T1, T1A, AIN, état, clics, t); retourne bfill.position ();
}
boucle vide () {if (millis ()% 100> 70) {if (digitalRead (button) == BAS) {if (state == 0) {clics = clics + 1; state = 1;}} delay (50); if (digitalRead (bouton) == HAUT) {if (state == 1) {state = 0;}}}
if (millis ()% 1000> 900) {sensors.requestTemperatures (); t1 = sensors.getTempCByIndex (0);}
// Serial.print ("t1 ="); Serial.println (t1);} // t2 = sensors.getTempCByIndex (1);
AIN = analogRead (A0); AIN = AIN * 100/1023; analogWrite (9, AIN);
mot len = ether.packetReceive (); mot pos = ether.packetLoop (len); if (pos) ether.httpServerReply (homePage ()); // si les données TCP valides reçues envoient la page Web
}
Script BASH permettant de lire une page Web html, d’extraire une valeur de température et de l’envoyer au format IOT:
# bash script pour lire la page Web du serveur Web Arduino, extraire la température et le télécharger sur Xively.
# page Web:
serveur Web Arduino
#
T = 19,5
A0 = 25
t = 750669
# un fichier est préparé dans le répertoire RAM / tmp qui est chargé sur le serveur.
cd / tmp rm index * wget 192.168.1.101 a = $ (cat index.html)
# sélectionne dans la page Web l'élément qui est la température définie - $ a t = $ 6 echo $ t
# convert scaling round () {echo $ (printf%. $ 2f $ (echo "scale = $ 2; ((10 ^ $ 2) * $ 1) +0,5) / (10 ^ $ 2)" | bc))
};
tt = $ (arrondi $ t / 1 0) echo $ tt
si [$ tt -ge 10] && [$ tt -lt 50]; ensuite
echo $ t> / tmp / asi
echo "télécharger des données sur Pachube"
a = '{"version": "1.0.0", "datastreams": [{"id": "2", "current_value": "' b = '"}}} "
echo $ a $ t $ b
echo $ a $ t $ b> /tmp/update.json
curl - demande PUT - en-tête "X-PachubeApiKey: qpLG77lHBQVhhJlJ5yAhOAin_CggAaW5tn TVnyGj09k" \
Fi
Code Arduino IDE 1.6.13 pour le boîtier avec LCD I2C, thermomètre, entrée analogique, compteur à bouton-poussoir:
// serveur Web Arduino avec blindage Ethernet ENC28J60. IP statique ou DHCP.
// La page Web indique la température du capteur DS18B20 et le temps écoulé depuis la réinitialisation.
// Bibliothèque /jcw/ethercard ethercard-master
// Exemple de température OneWire DS18S20, DS18B20, DS1822
//
// Écran LCD I2C à 2 lignes PCF8574T Sac à dos I2C LCD
#include
#include
LiquidCrystal_I2C LCD (0x3F, 2,1,0,4,5,6,7); // 0x27 est l'adresse du bus I2C, SDA = A4, SCL = A5
// Les addeurs I2C trouvent:
// Code adopté par Janis Alnis. v5. 2017.01.09. Compilé avec Arduino IDE version 1.6.13.
// ENC SCK -> Arduino pin 13
// ENC SO -> Arduino pin 12
// ENC SI -> Arduino pin 11
// ENC CS -> Arduino pin 10 (certains autres exemples en ligne utilisent la broche 8)
// ENC VCC -> 3V3 de l'adaptateur série USB CP2102 ou PL2303 mais pas assez de CH340
// ENC GND -> GND
#include
// adresse MAC de l'interface Ethernet, doit être unique sur l'octet statique du réseau local mymac [] = {0x74,0x69,0x69,0x2D, 0x30,0x35};
#define STATIC 0 // DHCP = 0, statique = 1
#si STATIQUE
octet statique myip [] = {192,168,1,200}; // Adresse IP statique
#fin si
octet Ethernet :: tampon [500]; BufferFiller bfill;
#include
OneWire ds (8); // sur la broche 8 (une résistance de 4,7 K est nécessaire) float t1; // Température
bouton int = 3; état long = 0; longs clics = 0; // pour le bouton d'entrée numérique long AIN;
void setup () {Serial.begin (9600);
lcd.begin (16,2); lcd.setBacklightPin (3, POSITIVE); lcd.setBacklight (HIGH); lcd.home (); lcd.print ("Arduino ENC28J60");
Serial.println ("\ nArduino Webserver with ENC28J60 Ethernet"); Serial.println ("Capteur de température DS18B20 sur D8"); pinMode (bouton, INPUT); digitalWrite (bouton, HAUT); // bouton
if (ether.begin (sizeof Ethernet :: buffer, mymac) == 0) Serial.println ("Échec d'accès au contrôleur Ethernet");
#if STATIC ether.staticSetup (myip);
#autre
if (! ether.dhcpSetup ()) Serial.println ("DHCP échoué");
#fin si
ether.printIp (ether.myip); lcd.setCursor (0,1);
lcd.print (ether.myip [0]); lcd.print ("."); lcd.print (ether.myip [1]); lcd.print ("."); lcd.print (ether.myip [2]); lcd.print ("."); lcd.print (ether.myip [3]); délai (5000); lcd.clear ();
}
mot statique homePage () {bfill = ether.tcpOffset ();
long T1 = abs (int (t1)); T1A long = abs (t1 * 100) -abs (100 * T1); // partie fractionnaire longue t = millis () / 1000; Serial.println (T1); Serial.println (T1A); si (t1> 0) {bfill.emit_p (PSTR (
"HTTP / 1.0 200 OK \ Type de contenu: texte / html \ r \ nPragma: pas de cache \ r \ n \ r \ n"
" Serveur Web Arduino Ethernet ENC28J60 n ° 3
Temperat $ L. $ L
A0 inp% $ L L"
"État D3: $ L
D3 clics $ L
secondes $ L "), T1, T1A, AIN, état, clics, t); } if (t1
"HTTP / 1.0 200 OK \ Type de contenu: texte / html \ r \ nPragma: pas de cache \ r \ n \ r \ n"
" Serveur Web Arduino Ethernet ENC28J60 n ° 3
Temperat - $ L. $ L
A0 inp% $ L
"
"État D3: $ L
D3 clics $ L
secondes $ L "), T1, T1A, AIN, état, clics, t); }
retourne bfill.position ();
}
boucle vide () {
if (millis ()% 100> 70) {if (digitalRead (button) == FAIBLE) {if (state == 0) {clics = clics + 1; state = 1;}} delay (50); if (digitalRead (bouton) == HAUT) {if (state == 1) {state = 0;}}}
if (millis ()% 1000> 900) {t1 = getTemp (); lcd.setCursor (0,0); lcd.print (t1); lcd.setCursor (7,0); lcd.print (AIN); lcd.setCursor (0,1); lcd.print (état); lcd.setCursor (3,1); lcd.print (clics);
lcd.setCursor (7,1); lcd.print (millis () / 1000);
}
// Serial.print ("t1 ="); Serial.println (t1);} // t2 = sensors.getTempCByIndex (1);
AIN = analogRead (A0); AIN = AIN * 100/1023; analogWrite (9, AIN);
mot len = ether.packetReceive (); mot pos = ether.packetLoop (len);
if (pos) ether.httpServerReply (homePage ()); // si les données TCP valides reçues envoient la page Web
}
float getTemp (void) {octet i; Octet présent = 0; octet type_s; données d'octet [12]; octet addr [8]; float celsius;
si (! ds.search (addr)) {
// Serial.println ("Plus d'adresses.");
// Serial.println ();
// ds.reset_search ();
// delay (250);
// revenir;
}
// Serial.print ("ROM =");
// pour (i = 0; i
// if (OneWire :: crc8 (addr, 7)! = addr [7]) {Serial.println ("Le CRC n'est pas valide!"); return;}
//Serial.println ();
// le premier octet ROM indique quelle puce
commutateur (addr [0]) {cas 0x10:
// Serial.println ("Puce = DS18S20"); // ou ancien DS1820
type_s = 1; Pause; cas 0x28:
// Serial.println ("Puce = DS18B20");
type_s = 0; Pause; cas 0x22:
// Serial.println ("Puce = DS1822");
type_s = 0; Pause; défaut:
// Serial.println ("Le périphérique n'est pas un périphérique de la famille DS18x20."); revenir;
}
ds.reset (); ds.select (addr);
ds.write (0x44, 1); // démarre la conversion, avec une alimentation parasite à la fin
délai (1000); // peut-être que 750 ms suffisent, peut-être pas // nous pourrions faire un ds.depower () ici, mais la réinitialisation va s'en charger.
présent = ds.reset (); ds.select (addr);
ds.write (0xBE); // Lire le Scratchpad
// Serial.print ("Data =");
// Serial.print (present, HEX); // Serial.print ("");
for (i = 0; i
// Serial.print ("");
}
// Serial.print ("CRC =");
// Serial.print (OneWire :: crc8 (data, 8), HEX);
// Serial.println ();
int16_t raw = (data [1]
raw = raw
// "compte restant" donne une résolution complète de 12 bits
raw = (raw & 0xFFF0) + 12 - données [6];
}
} autre {
octet cfg = (données [4] & 0x60);
// en basse résolution, les bits bas ne sont pas définis, aussi mettons-les à zéro si (cfg == 0x00) raw = raw & ~ 7; // Résolution 9 bits, 93,75 ms sinon si (cfg == 0x20) raw = raw & ~ 3; // 10 bits res, 187,5 ms sinon si (cfg == 0x40) raw = raw & ~ 1; // Résolution 11 bits, 375 ms
//// par défaut, résolution 12 bits, temps de conversion de 750 ms
}
Celsius = (float) raw / 16.0; // Serial.print ("Temperature =");
// Serial.print (celsius); // Serial.print ("Celsius,"); retournez Celsius;
}