Étape 5: Programme du Conseil
Il y a des choses importantes de seveal à modifier dans le code ci-dessous. Le premier est l’adresse IP. Chaque carte doit avoir une adresse IP unique sinon que le routeur obtiendra très confus. J’ai commencé à IPAddress ip(192,168,1,178) ; et puis en a ajouté une au dernier numéro. Certains routeurs ont un nombre différent par exemple 192.168.2.x et une vérification rapide sur un PC qui exécute IPCONFIG dans un shell DOS donnera les 3 premiers bons numéros.
L’autre nombre pour changer est la plage d’adresses MAC. La gamme byte mac [] = {}
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE} ; est un numéro par défaut – peut-être changer un à un nombre hexadécimal de différent sur chaque carte, par exemple le dernier d'entre eux, comte en arrière dans hex 0xED, 0xEC.
La dernière chose à changer est de savoir si le jury est un uploader ou downloader. Ce code fait les deux et à mi-chemin vers le bas est la suivante
if(!client.Connected() & & (millis() - lastConnectionTime > postingInterval)) {}
sendData(Analog0,Analog1,Analog2,Analog3,Analog4) ;
soit envoyer en commentaire ou obtenir des données
getData() ;
qui est configuré pour envoyer des données. Pour aller chercher de nouveau ces données, commentez senddata et décommenter getdata.
Il y a des restes de code en commentaire pour des choses comme le dumping sur la chaîne de texte entière de Xively qui est utile pour le débogage pour trouver comment couper vers le haut de la chaîne et extraire les lectures de différents capteurs.
Xively peut faire d’autres choses comme Envoyer un SMS ou autre message lorsque certaines conditions sont remplies.
Amusez-vous!
http://Arduino.cc/en/Tutorial/PachubeClient Ce code se trouve dans le domaine public. * / #include < SPI.h > #include < Ethernet.h > #include < LiquidCrystal.h > #define APIKEY « shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM » / / remplacer votre clé api pachube ici #define ID_FLUX 970253233 / / remplacer votre flux ID #define USERAGENT « Arduino1 » / / agent d’utilisateur est le nom du projet / / assigner une adresse MAC pour l’ethernet controller.// Ethernet nouveaux boucliers ont une adresse MAC, imprimée sur un autocollant sur le bouclier / / Inscrivez votre adresse ici : mac Byte = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE}; / / remplir une adresse IP disponible sur votre réseau ici, / / pour la configuration manuelle : IPAddress ip(192,168,1,178); / / Initialise le client d’instance : EthernetClient bibliothèque; / / initialiser la bibliothèque de lcd avec le nombre de l’interface pinsLiquidCrystal lcd(8,9,4,5,6,7); / / si vous ne voulez pas utiliser DNS (et réduire la taille du croquis) / / utiliser l’adresse IP numérique au lieu du nom de la server(216,52,233,122) server://IPAddress; / / numérique IP pour api.pachube.comchar serveur [] = "api.xively.com"; / / nom adresse pour xively APIunsigned long lastConnectionTime = 0 ; la dernière fois vous connecté au serveur, dans millisecondsboolean lastConnected = false ; État de la connexion, la dernière fois par le biais de la loopconst principale unsigned long postingInterval = 10 * 1000 ; délai entre les mises à jour de Pachube.comint compteur ; Chaîne stringOne, stringTwo ; construit la chaîne lorsque les données proviennent de backboolean stringData = false ; remis à zéro quand un nouveau bloc de données vient backvoid setup() {/ / delay(1000); / / si le port série provoque une latchup / / ouvrir la communication série et attendez de port à ouvrir : Serial.begin(9600) ; while (! Série) {; / / attente pour port série pour se connecter. Besoin pour Leonardo seulement} Serial.println("api.xively.com") ; Si aller plus de? 32 s puis entier calc ne fonctionne pas lcd.begin (16, 2) ; CLS() ; effacer l’écran delay(1000) ; lcd.setCursor(0,1) ; x, y de coin supérieur gauche est 0,0 de lcd.print("api.xively.com") ; lcd.setCursor(0,0) ; LCD.Print ("Start Ethernet") ; Serial.println ("Start Ethernet") ; Delay(1000) ; Lancez la connexion Ethernet : si (Ethernet.begin(mac) == 0) {//Serial.println ("Impossible de configurer Ethernet à l’aide de DHCP"); / / DHCP a échoué, donc utiliser une adresse IP fixe: / / lcd.setCursor(0,1) ; //lcd.print ("Impossible de configurer ») ; Ethernet.Begin (mac, ip) ; } Serial.println("Wait 10s") ; lcd.setCursor(0,1) ; LCD.Print ("attendre 10 s");} void loop() {/ / lire le capteur analogique : int Analog0 = analogRead(A0); / / avec un affichage à cristaux liquides analog0 est tous le boutons int Analog1 = analogRead(A1) ; int Analog2 = analogRead(A2) ; int Analog3 = analogRead(A3) ; int Analog4 = analogRead(A4); / / int sensorReading = analogRead(A2); / / si il y a des données entrantes de la connexion net. / / envoyer sur le port série. Il s’agit pour le débogage / / uniquement à des fins : si (client.available()) {char c = client.read() ; Serial.Print(c) ; Si (stringData == false) {stringData = true; / / quelques données sont venu} si (stringData == true) {stringOne += c; / / construire la chaîne} si ((c>32) et (c < 127)) {lcd.print(c) ; counter += 1;} si (compteur == 16) {lcd.setCursor(0,1); / / lcd.print("") ; lcd.setCursor(0,1) ; compteur = 0 ; Delay(100) ; }} / / Si il n’y a aucune connexion au réseau, mais il y avait une dernière fois / / dans la boucle, puis arrêtez le client : si ()! client.connected() & & lastConnected) {/ / Serial.println(); / / Serial.println("Disconnect") ; client.stop() ; lcd.setCursor(0,0) ; lcd.print ("Disconnect") ; lcd.setCursor(0,1) ; compteur = 0 ; Si (stringData == true) {PrintResults(); / / extraire les valeurs et les imprimer stringData = false; / / réinitialiser l’indicateur stringOne = "" ; effacer la chaîne}} / / si vous n’êtes pas connecté, et dix secondes se sont écoulées depuis / / votre dernière connexion, puis reconnectez-vous et envoyer des données : if(!client.connected() & & (millis() - lastConnectionTime > postingInterval)) {/ / sendData(Analog0,Analog1,Analog2,Analog3,Analog4); / / soit envoyer en commentaire ou obtenir des données getData();} / / stocker l’état de la connexion pour la prochaine fois par / / la boucle : lastConnected = client.connected();} void PrintResults() / / imprimer les résultats de l’EEG de xively {int n = 292; / / commencent au capteur données int i; char lf = 10 ; int v ; CLS() ; lcd.setCursor(0,0) ; stringOne += lf ; Ajouter un caractère de fin de ligne pour (j’ai = 0; j’ai < 5; i ++) {tandis que (stringOne.charAt(n)! = 44) / / trouver la première virgule {n += 1;} n += 1; tout en (stringOne.charAt(n)! = 44) / / trouver la deuxième virgule {n += 1;} n += 1; stringTwo = "" ; tandis que (stringOne.charAt(n) ! = 10) / / trouver l’extrémité de la ligne qui est une ligne de flux ascii 10 {/ / lcd.print(stringOne.charAt(n)) ; stringTwo += stringOne.charAt(n); n += 1;} v=stringTwo.toInt() ; LCD.Print(v) ; LCD.Print("") ; Si l’espace à la fin (j’ai == 1) {lcd.setCursor(0,1);}} } void Cls() / / Effacer écran LCD {lcd.setCursor(0,0) ; lcd.print("") ; Clear lcd écran lcd.setCursor(0,1) ; LCD.Print("");} void PrintValues (int n0, n1 de l’int, int n2, n3 int, int n4) {/ / Serial.print(n0); / / Serial.print("") ; Serial.Print(N1) ; Serial.Print("") ; Serial.Print(N2) ; Serial.Print("") ; Serial.Print(N3) ; Serial.Print("") ; Serial.println(n4) ; CLS() ; lcd.setCursor(0,0) ; LCD.Print(N0) ; LCD.Print("") ; LCD.Print(N1) ; lcd.setCursor(0,1) ; LCD.Print(N2) ; LCD.Print("") ; LCD.Print(N3) ; LCD.Print("") ; LCD.Print(n4) ; Delay(2000);} Cette méthode permet une connexion HTTP pour la serveur : void sendData (data0 int, int data1, data2 int, int data3, int data4) {PrintValues(data0,data1,data2,data3,data4); / / Serial.println("Connecting...") ; lcd.setCursor(0,0) ; LCD.Print ("connexion... "); lcd.setCursor(0,1) ; LCD.Print ("aucune réponse"). s’il y a une réponse ceci obtiendra très rapidement écrasé lcd.setCursor(0,1) ; compteur = 0 ; s’il y a une connexion réussie : si (client.connect (serveur, 80)) {client.print ("PUT /v2/RSS /"); client.print(FEEDID) ; client.println (".csv HTTP/1.1"); client.println ("Host : api.pachube.com"); client.print ("X-PachubeApiKey:") ; client.println(apikey) ; client.Print ("User-Agent:") ; client.println(UserAgent) ; client.Print ("Content-Length:") ; calculer la longueur de la sonde de lecture en octets: / / 8 octets pour "Capteur1", + nombre de chiffres des données : //int thisLength = 8 + getLength(thisData) ; client.println(thisLength) ; 8 est longueur de Capteur1 et 2 autres pour crlf int stringLength = 8 + getLength(data0) + 10 + getLength(data1) + 10 + getLength(data2) + 10 + getLength(data3) + 10 + getLength(data4) ; client.println(stringLength) ; derniers morceaux de la requête HTTP PUT : client.println ("Content-Type : text/csv") ; client.println ("Connection : close") ; client.println() ; Voici le contenu de la requête PUT : client.print("sensor1,") ; client.println(DATA0) ; client.Print("sensor2,") ; client.println(data1) ; client.Print("sensor3,") ; client.println(data2) ; client.Print("sensor4,") ; client.println(data3) ; client.Print("sensor5,") ; client.println(data4) ; Serial.println ("Wait for réponse") ; xively répond par un texte, si rien, il y a une erreur lcd.setCursor(0,1) ; LCD.Print ("Wait for réponse");} else {/ / si vous ne pouvait pas établir une connexion : //Serial.println ("connexion impossible"); / / Serial.println() ; //Serial.println ("donc déconnecter."); client.stop(); / / lcd.setCursor(0,1) ; //lcd.print (« échec de connexion");} / / note le temps que la connexion a été effectuée ou tentée : lastConnectionTime = millis();} Cette méthode permet une connexion HTTP pour le serveur : void GetData {/ / si il y a une connexion réussie : si (client.connect (serveur, 80)) {//Serial.println ("connexion aux données de la demande...") ; lcd.setCursor(0,0) ; LCD.Print ("se connecter") ; client.Print ("GET /v2/RSS /") ; client.Print(FEEDID) ; client.println (".csv HTTP/1.1") ; client.println ("Host : api.pachube.com") ; client.Print (« X-PachubeApiKey: ") ; client.println(apikey) ; client.Print ("User-Agent:") ; client.println(UserAgent) ; client.println ("Content-Type : text/csv") ; client.println ("Connection : close") ; client.println() ; Serial.println (« Finished requérant, attente réponse. ») ; lcd.setCursor(0,1) ; LCD.Print ("requête de finition") ; } else {/ / si vous ne pouvait pas établir une connexion : //Serial.println ("connexion impossible"); / / Serial.println() ; //Serial.println ("donc déconnecter."); client.stop();} / / note le temps que la connexion a été effectuée ou tentée : lastConnectionTime = millis();} Cette méthode calcule le nombre de chiffres dans le / / lecture du capteur. Depuis chaque chiffre après la virgule de ASCII / / représentation est un octet, le nombre de chiffres égal à / / le nombre d’octets int getLength (int someValue) {/ / il n’y a au moins un octet : int chiffres = 1; / / diviser continuellement la valeur de dix, / / en ajoutant un pour le nombre de chiffres pour chacun / / time vous divisez, jusqu'à ce que vous êtes à 0: int dividende = someValue 10 ; while (dividende > 0) {dividende = dividende 10 ; chiffres ++;} / / return le nombre de chiffres : retourner les chiffres;}