Étape 7: Programmation de l’Arduino
Joint ci-dessous est l’esquisse de l’Arduino pour ma dernière version de ce projet. Pour votre commodité, il est compressé dans un dossier portant le même nom que le croquis. Cela est nécessaire pour pouvoir l’utiliser avec le logiciel Arduino IDE. *** croquis peuvent être visualisées avec n’importe quel éditeur de texte ***
Soyez prudent avec le placement d’ouverture et de fermeture des accolades {et} parce que pour le code pour utiliser les accolades doivent être équilibrés. Si vous vous perdez en essayant de rattraper les accolades, vous devriez remarquer qu’à l’aide de l’IDE Arduino (j’ai été en utilisant 1.0 IDE sous Linux et précédemment 1.0.5 sur Windows) si vous placez le curseur juste après une accolade d’ouverture ou fermeture, l’IDE va entourer son accolade correspondante dans un rectangle. Vous devrez peut-être faire défiler vers le haut ou vers le bas dans votre code pour Rechercher l’accolade correspondante, comme de grandes parties de votre code peuvent contenir des accolades avec beaucoup d’autres paires d’accolades entre eux. Vous pouvez utiliser cette fonctionnalité de l’IDE pour trouver l’orthèse déséquilibrée ou supplémentaires, ou peut-être doit être mises en correspondance avec une accolade manquante.
Va sur le code à un niveau élevé, principalement, je tiens à souligner la partie du code qui rend la page web. Il commence par client.println("") ; Cela indique l’Arduino pour imprimer une ligne vers le navigateur de web connexion au serveur via la connexion établie. Si vous êtes quelque peu familiers avec le HTML, vous pouvez modifier le contenu de la page et les liens suivant celui correspondant à vos besoins. Suffit de garder à l’esprit a besoin ces déclarations client.print au début de chaque ligne qui contient le contenu de la page web ; soit client.println qui imprime une ligne avec l’effet d’un retour chariot saut de ligne à la fin, ou un client.print qui imprime ce qui suit, mais devra se terminer par le code html
pour le saut de ligne obtenir le même effet. Pour imprimer plusieurs choses sur la même ligne, utilisez quelque chose comme :
client.Print ("I") ;
client.Print ("J’aime") ;
client.Print (« Arduino ») ;
client.println ("projets de domotique") ;
Ce qui précède sera imprimé
J’aime les projets domotique Arduino
à la page web avec un retour chariot-saut de ligne par la suite.
J’ai ajouté une touche à la page web de CDCosma quand j’ai décidé sur l’ajout de PC et MV passer commande, si vous ' ll voir une petite quantité de code entre les parties du code HTML qui est seulement utilisé par l’Arduino pour décider ce que le code HTML s’affiche dans le navigateur. Par exemple :
Si (digitalRead(8) > 0) {}
client.Print ("MV est ON") ;
client.println("") ;
client.println (« arrêt de MV") ;
} else {}
client.Print ("MV est OFF") ;
client.println("") ;
client.println ("allumer MV") ;
}
Cela signifie que l’Arduino lira la broche numérique 8 pour déterminer si elle est haute ou basse. La broche numérique 8 est connectée sur le rail d’alimentation alimentation + 5 v de la MV donc l’Arduino peut détecter l’état de l’alimentation. Si la broche 8 est lu comme une haute numérique, elle effectuera les 3 prochaines lignes de code, impression « Media Vault est ON » (ON sera en texte gras et vert), sauts de ligne 2 si le texte doesn' t se chevauchent le bouton en dessous, ayant la teneur « Shut Media Vault Off » et l’url liée de ce bouton est? mvoff ou http://192.168.1.97/?mvoff. (Voir l’image plus haut de la page web.) Autrement dit, il va envoyer? mvoff comme l’en-tête à l’Arduino, et lorsque l’Arduino lit cette chaîne, il s’acquittera de code vers la fin de l’esquisse à partir de
if(ReadString.IndexOf("?mvoff") > 0) //checks chaîne d’en-tête de requête
Sinon, étant ce qui est effectué si la broche 8 est faible, le code s’impriment à la page web de client « Media Vault est OFF » (arrêt sera en texte gras et rouge), ligne 2 pauses ainsi le texte doesn' t se chevauchent le bouton en dessous, qui lira Media Vault s’allume et l’url liée de ce bouton est? mvon et l’Arduino effectueront le code vers la fin de l’esquisse correspondant à? mvon.
J’ai aimé la façon dont cela a fonctionné assez pour revenir en arrière et modifier la lumière et des parties du contrôle ventilateur au plafond de la page web d’inclure ce comportement conditionnel. La seule chose que je n’aime pas sur l’utilisation de ceci est que la page n’est pas vraiment dynamique, ce qui signifie qu’il ne met pas à jour après avoir cliqué sur un bouton. Je crois que cela exigerait l’ajout d’AJAX ou JSON dont je n’ai pas encore appris. J’ai expérimenter largement avec JavaScript simple et n’était pas en mesure de réussir. J’ai ensuite ajouté les boutons « Refresh » pour chacune des sections qui ne rafraîchir en fait comme le ferait le bouton actualiser, mais ils ont juste un lien vers http://192.168.1.97/ pour l’Arduino renvoyer une page douce sans l’envoi de n’importe quelle chaîne d’en-tête supplémentaire à la fin de l’URL du navigateur. À l’aide de mes boutons de Pseudo-actualisation ne causera pas l’Arduino changer l’état de des broches. Si le navigateur affiche http://192.168.1.97/?pcon, en utilisant le bouton Actualiser du navigateur provoque le navigateur de le renvoyer à qui demander et provoquer mon PC à suspendre. C’est depuis que j’utilise l’interrupteur d’alimentation pour s’interfacer avec l’Arduino et la même action est requise pour l’interrupteur allumer comme éteint. C’est une bonne idée de ne pas utiliser les boutons de navigation du navigateur en pareil cas.
Suite à ce code à la fin de l’esquisse, vous serez en mesure de voir les actions provoquées par chacune des chaînes en-tête, y compris les demandes de tournage légers ou fan sur et en dehors. Ces broches que j’ai connecté à la carte de relais Sainsmart sont initialisés comme élevé dans la fonction de réglage de l’esquisse commençant par void setup() afin que lorsque l’Arduino alimente tout d’abord sur et exécute l’esquisse, ces relais sont désengagent. Ceci doit être pris en compte. Parce que ce qui arrive quand l’Arduino perd de la puissance, puis reprend le pouvoir ? Il démarre et s’exécute l’esquisse dès le début. La fonction de configuration où les broches de l’Arduino sont initialisées exécute une seule fois chaque fois le croquis est exécuté. Vous auriez probablement plutôt être parfois laissés dans l’ignorance pendant quelques secondes si votre électrique du domicile cycles brièvement pendant que vous accueillent, que pour venir du travail ou de vacances pour trouver toutes les lumières sur parce que le pouvoir s’en alla et revint pendant que vous étiez là.
J’ai aussi l’Arduino à écrire sur le port série, quelle action est effectuée. Cela aide lors du dépannage à l’aide du moniteur de série de la Arduino IDE.
Avis que le code dans l’esquisse pour allumer le PC fonctionne un peu différemment pour le MV. C’est en raison des différences dans les types de commutateurs du panneau avant. Le PC a besoin de seulement une courte momentanée de l’interrupteur de sa façade (ou de n’importe quel interrupteur extérieur imitant l’interrupteur du panneau avant). Pour cette raison, broche 9 doit provoquer le relais de fermer momentanément et puis ouvrez à nouveau. Pour ce faire, j’ai mis en broche 9 à bas, ce qui engage le relais Sainsmart (rappel j’utilise la carte de relais au lieu d’un relais reed externe), l’esquisse attend un quart de seconde avant réglage du pin 9 de haut encore une fois, dégageant le relais, tous ce imitant l’effet d’appuyer sur le commutateur d’alimentation brièvement et relâchez-le. La même action exacte de l’esquisse est nécessaire pour provoquer le PC pour se réveiller de son état de veille, comme il le fait pour le suspendre. J’ai écrit également la possibilité de réinitialiser le PC en imitant une pression de 4 secondes de l’interrupteur d’alimentation dans le cas où le PC se bloque sur moi. Je mets t attends jamais besoin d’utiliser celui-ci, mais pensé à ajouter il alors que je traversais les entrées des touches de façade possible dans mon esprit.
Tout en bas de la page web, j’ai ajouté quelques lignes pour me rappeler quel sketch a été chargé, lorsque je l’ai téléchargé et de l’ordinateur sur lequel. J’ai récemment déménagé un ordinateur portable et un PC de Windows à Linux et ne savais pas si j’aurais des différences dans le comportement de mes croquis téléchargés basé sur l’OS, j’ai utilisé pour exécuter l’EDI. La seule chose que j’ai remarqué en raison de mon déménagement d’OS est que sous Linux, lorsque vous ouvrez le moniteur série dans l’IDE, il réinitialise votre croquis. Donc dans mon cas, tous mes relais haute puissance switch off. Il n’y a eu aucune différence dans le comportement de mes croquis concernant mon déménagement d’OS.
Mise à jour août 2014 :
Ajoutant le circuit imprimé avec les commutateurs de tact, j’ai ajouté quelques trucs que j’ai ramassé de plonger plus profondément dans l’Arduino intermédiaires d’amandaghassaei : entrées et sorties. Afin d’imprimer vers le port série de l’état de chaque aiguille quand je veux qu’elle, j’ai ajouté une section sur mon croquis avant le setup() qui déclare une variable d’état de la chaque broche, comme :
int pinState1 = digitalRead(4) ; J’ai fait cela pour chaque broche dans mon projet, broches 4-9, 11 et 22-25, toutes les entrées et les sorties.
et avec son exemple pour debouncing un interrupteur avant de déterminer son état, a déclaré variables booléennes pour currentState, lastState, debouncedState pour chaque bouton (comme currentState1, currentState2), unsigned long timeOfLastButtonEvent pour chaque bouton et une debounceInterval standard à utiliser pour tous comme ceci :
booléen currentState1 = faible ; stockage pour l’actuel état de button1 mesurée,... etc pour 2, 3 et 4
booléen lastState1 = faible ; stockage pour mesuré dernier État button1,... etc pour 2, 3 et 4
booléen debouncedState1 = faible ; debounced état de button1,... etc pour 2, 3 et 4
int debounceInterval = 20 ; attendre 20 ms pour les boutons régler
unsigned long timeOfLastButtonEvent1 = 0; magasin le dernier état de button1 temps changé,... etc pour 2, 3 et 4
À la fin de mon esquisse à l’extérieur de ma boucle setup(), j’ai ajouté la fonction suivante que j’ai nommé "États" :
void States() {}
pinState1 = digitalRead(4) ;
pinState2 = digitalRead(5) ;
pinState3 = digitalRead(6) ;
pinState4 = digitalRead(7) ;
pinState5 = digitalRead(8) ;
pinState6 = digitalRead(9) ;
pinState7 = digitalRead(11) ;
pinState8 = digitalRead(22) ;
pinState9 = digitalRead(23) ;
pinState10 = digitalRead(24) ;
pinState11 = digitalRead(25) ;
Serial.Print ("fan Active lr faible état de la broche de sortie circuit de 4:") ;
Serial.println(pinState1) ;
Serial.Print ("lumière Active br faible état de la broche de sortie circuit de 5:") ;
Serial.println(pinState2) ;
Serial.Print ("fan actif br faible état de la broche de sortie circuit de 6:") ;
Serial.println(pinState3) ;
Serial.Print ("État MV broche de sortie interrupteur 7:") ;
Serial.println(pinState4) ;
Serial.Print ("puissance MV État broche d’entrée de 8 de la situation:") ;
Serial.println(pinState5) ; Serial.Print ("État PC interrupteur sortie pin 9:") ;
Serial.println(pinState6) ;
Serial.Print ("power PC État broche d’entrée de 11 de la situation:") ; Serial.println(pinState7) ;
Serial.Print ("état de la broche d’entrée bouton LR fan de 22:") ;
Serial.println(pinState8) ; Serial.Print ("état de la broche d’entrée BR touche lumineuse de 23:") ;
Serial.println(pinState9) ;
Serial.Print ("état de la broche d’entrée bouton BR fan de 24:") ; Serial.println(pinState10) ;
Serial.Print ("État MV interrupteur bouton entrée pin de 25:") ;
Serial.println(pinState11) ; }
Et j’ai debounce chaque commutateur, déterminer son état, décider si qui a changé et appeler ma fonction States() de chaque section dans mon loop() comme ceci :
Chambre des maîtres de lumière
currentState2 = digitalRead(buttonPin2) ;
unsigned long currentTime2 = millis() ;
Si (currentState2! = lastState2) {}
timeOfLastButtonEvent2 = currentTime2 ;
}
si (currentTime2 - timeOfLastButtonEvent2 > debounceInterval) { //if suffisamment de temps écoulé
si (currentState2! = debouncedState2) { //if l’état actuel est toujours différente de celle de notre dernière stockée debounced État
debouncedState2 = currentState2 ; mise à jour de l’État debounced
déclenchement d’un événement pour la lumière de la Chambre des maîtres
Si (debouncedState2 == HIGH) {}
States() ;
Serial.println ("Button2 pressé") ;
digitalWrite (5,! digitalRead(5)) ; inverser l’état de la broche 5 en première lecture sa valeur numérique, puis écrire le contraire
Serial.println("---") ;
Serial.println() ;
}
else {}
States() ;
Serial.println ("Button2 libéré") ;
Serial.println("---") ;
Serial.println() ;
}
}
}
lastState2 = currentState2 ;
J’ai également appeler States() chaque fois qu’une action est entreprise basée sur la contribution de la page web, permettant une sortie série sérieusement considérable. C’était surtout pour dépanner certains comportement étrange qui s’est avéré être causée par une surface légèrement conductrice (haut de Malle tachée) où mon circuit imprimé Arduino et commutateur pondent, toujours sans un cas de projet. J’ai besoin de corriger ça bientôt, mais pour l’instant, j’ai placé une feuille de papier sous tout. Avant cela, je pourrais mettre ma main sur le dessus de la poitrine et un relais pourrait inverser les États. Résultats pas vraiment souhaitables ! Je vais réduire l’utilisation massive de States() ou de whiddle vers le bas de son contenu bientôt. Aussi près du haut de ma "liste à faire" est à la fin de mon boîtier plexi pour l’Arduino Mega et ethernet bouclier et faire quelque chose de similaire pour la platine de l’interrupteur.
Les trois dernières images ci-dessus sont des captures d’écran de la sortie de la série monitor avec notes.
-Fin de la mise à jour-