Étape 2: Programmation de l’Arduino
connecter la carte au pc et télécharger le code pour avoir accès à l’internet#include < EEPROM.h >
#include < Servo.h >
#include < Wire.h >
#include < SERVER328.h >
#include < SPI.h >
#include < Ethernet.h >
Variables configurables par l’utilisateur
octet useDhcp = true ;
useDns octets = true ;
la mac de Byte [] = {0xXX 0xXX, 0xXX, 0xXX, 0xXX, 0xXX} ;
Char [NomServeur] = "us01.proxy.SERVER.org" ; Que si useDns est vrai
unsigned int serverPort = 5353 ; Peut être définie soit 53 ou 5353
statusLedPin octets = 8 ;
Configurable par l’utilisateur clés, cela est utilisé pour s’authentifier auprès du serveur proxy
Ceci est vérifié contre l’EEPROM au démarrage et écrit si nécessaire
Le proxy server récupère la clé de l’EEPROM
Byte [clé] = {0xXX 0xXX, 0xXX, 0xXX,
0xXX, 0xXX, 0xXX 0xXX,
0xXX, 0xXX, 0xXX 0xXX,
0xXX 0xXX, 0xXX, 0xXX} ;
Autres variables requises
données d’octets [257] ;
dataLength octets ;
hexStage octet ;
unsigned longue lastInstruction = 0 ;
unsigned long lastRefresh = 0 ;
stade de l’octet = 0 ;
Déclarer l’objet client
EthernetClient Client ;
void setup()
{
Charger les préréglages
SERVER.loadPresets() ;
La valeur de goupille de LED de statut
SERVER.setStatusLedPin(statusLedPin) ;
SERVER.setStatusLed(1) ; Entrée en vigueur
Vérifier l’en-tête de l’EEPROM et vérifiez si la clé est correcte
Il s’agit de s’assurer que la clé n’est pas effacée de la mémoire EEPROM
if(EEPROM.Read(0)! = "#")
{
EEPROM.write (0, "#") ;
}
if(EEPROM.Read(1)! = 0)
{
EEPROM.write (1, 0) ;
}
if(EEPROM.Read(2)! = "#")
{
EEPROM.write (2, "#") ;
}
if(EEPROM.Read(160)! = "#")
{
EEPROM.write (160, ' #') ;
}
pour (octet i = 0; i < 16; i ++)
{
Si (EEPROM.read(161 + i)! = key[i])
{
EEPROM.write (161 + i, key[i]) ;
}
}
if(EEPROM.Read(177)! = "#")
{
EEPROM.write (177, "#") ;
}
Démarrage réseau et tentez de vous connecter au serveur proxy
SERVER.setStatusLed(2) ; Configuration du réseau
if(useDhcp)
{
if (!. Ethernet.Begin(Mac))
{
SERVER.setStatusLed (2, faux, 10000) ;
SERVER.reset() ;
}
}
Delay(1000) ;
SERVER.setStatusLed(3) ; Se connecter au serveur
Si (useDns & & ! Client.Connect (serverName, serverPort))
{
SERVER.setStatusLed (3, faux, 10000) ;
SERVER.reset() ;
}
lastInstruction = millis() ;
}
void loop()
{
if(client.Connected())
{
Ce que nous devons faire dépend sur quel « stade », nous sommes à
Switch(stage)
{
case 0: / / attendre début octets
if(client.available())
{
char c = Client.read() ;
Si (c == '?')
{
stade ++ ;
}
}
rupture ;
cas 1: / / Reset variables
dataLength = 0 ;
hexStage = 0 ;
stade ++ ;
rupture ;
case 2: / / octets d’instructions
if(client.available())
{
char c = Client.read() ;
Si (c == '?')
{
stade = 1 ;
rupture ;
}
else if (c == « \r » || c == « \n » || c == '.')
{
stade = 0 ;
rupture ;
}
if(!hexStage)
{
Data [0] = SERVER.hexDecode(c) * 16 ;
}
d’autre
{
Data [0] += SERVER.hexDecode(c) ;
}
hexStage =! hexStage ;
if(!hexStage)
{
stade ++ ;
}
}
rupture ;
case 3: / / octets de longueur de données
if(client.available())
{
char c = Client.read() ;
Si (c == '?')
{
stade = 1 ;
rupture ;
}
else if (c == « \r » || c == « \n » || c == '.')
{
stade = 0 ;
rupture ;
}
if(!hexStage)
{
données [1] = SERVER.hexDecode(c) * 16 ;
}
d’autre
{
données [1] += SERVER.hexDecode(c) ;
}
hexStage =! hexStage ;
if(!hexStage)
{
stade ++ ;
}
}
rupture ;
case 4: / / données
if(client.available())
{
char c = Client.read() ;
Si (c == '?')
{
stade = 1 ;
rupture ;
}
else if (c == « \r » || c == « \n » || c == '.')
{
if(dataLength == Data[1])
{
stade ++ ;
rupture ;
}
d’autre
{
stade = 0 ;
rupture ;
}
}
if(!hexStage)
{
données [2 + dataLength] = SERVER.hexDecode(c) * 16 ;
}
d’autre
{
données [2 + dataLength] += SERVER.hexDecode(c) ;
}
hexStage =! hexStage ;
if(!hexStage)
{
dataLength ++ ;
}
}
rupture ;
cas 5: / / exécuter l’instruction et renvoyer le résultat
SERVER.instruction(data) ;
Client.Write('!') ;
pour (int i = 0; i < données [1] + 2; i ++)
{
Client.Write (SERVER.hexEncode (données [i] / 16)) ;
Client.Write (SERVER.hexEncode (données [i] % 16)) ;
}
Client.Write('\n') ;
lastInstruction = millis() ;
stade = 0 ;
rupture ;
}
}
d’autre
{
SERVER.setStatusLed(10) ;
SERVER.reset() ;
}
Le délai d’attente de l’instruction a été atteint ?
if(Millis() - lastInstruction > 30000)
{
Client.Flush() ;
Client.Stop() ;
SERVER.setStatusLed(9) ;
SERVER.reset() ;
}
Processus actualise chaque 50ms
if(Millis() - lastRefresh > = 50)
{
SERVER.pinTimers() ;
SERVER.shiftRegisterTimers() ;
SERVER.shiftRegisters() ;
lastRefresh = millis() ;
}
Vérifiez si la réinitialisation a été demandée
SERVER.checkReset() ;
}