Étape 10 : Le Code de l’Arduino pour la porte de Coop de poulet automatique
Remarque : pour une vue plus agréable sur les images, les pièces, les diagrammes et les code, veuillez visiter :
http://davenaves.com/blog/Interests-Projects/Chickens/Chicken-Coop/Arduino-Chicken-Door/
Info de l’initié
J’espère que pour vous faire pour économiser quelque temps, je vais vous laisser sur le truc qui a finalement obtenu cette porte pour travailler avec les niveaux de luminosité, debouncing les commutateurs et * le * poulets. (comme vous le verrez dans le code) Vérifier toutes les 10 minutes pour éviter les lectures rebondir en arrière entre les niveaux la lumière crépusculaire/clair/sombre durant ces aube/crépuscule minutes. Alors, quand « sombre » est atteint (pour moi, j’ai choisi > = 0 & & < = 3 fondé lorsque mes poulets en fait s’est passé et est resté dans la cage) activez dir moteur bas > debounce les commutateurs > arrêter. Puis faire l’inverse pour le matin. Je suis sûr qu’il y a différents, peut-être plus efficaces, mais ce code a fonctionné parfaitement pendant un certain temps maintenant et je me sens suffisamment en confiance pour sortir la nuit sans se soucier des prédateurs. Bien que toujours en quelque sorte, j’ai trouver une raison pour vérifier la ChickenCam de temps en temps. (actuellement en attente de mon nouveau servo-moteurs et nuit vision web cam pour arriver par la poste)
< p > les bibliothèques / / bibliothèques < br >< / p >< p > #include < SimpleTimer.h > / / charger la bibliothèque SimpleTimer de faire des minuteries, au lieu de retards & trop de déclarations millis < br > #include < OneWire.h > / / charger la librairie onewire < /p > / * (avant d’exécuter l’esquisse, supprimer les espaces avant et après ce qui précède ">" "<" personnages - l’éditeur d’instructables ne serait pas publier la comprend à moins que j’ai ajouté ces espaces) * / / * * Copyright 2013 , David Naves (http://daveworks.net, < un rel = « nofollow » > http://davenaves.com) < /a > ** ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou * modifier selon les termes de la GNU General Public License * telle que publiée par la Free Software Foundation ; soit la version 3 * de la licence, ou (à votre choix) toute version ultérieure. ** Ce programme est distribué dans l’espoir qu’il sera utile, * mais sans aucune garantie ; sans même la garantie implicite de * qualité marchande ou ADEQUATION a un usage particulier. Voir la * GNU General Public License pour plus de détails. ** Vous devriez avoir reçu une copie de la GNU General Public License * avec ce programme ; Sinon, écrivez à la Free Software * Foundation, Inc., 51 Franklin Street, 5ème étage, Boston, MA * 02110-1301, USA. * / / * * J’espère que si vous utiliser/modifier ce code, vous partagerez votre * projet coop avec moi et le monde (photos, quel que soit) * je suis grand sur le partage. * Cheers, * //D * / //pins const int photocellPin = A0 ; cellule photoélectrique reliée à analogique 0 const int enableCoopDoorMotorB = 7 ; Enable b moteur - broche 7 const int directionCloseCoopDoorMotorB = 8 ; direction ferme b moteur - Broche 8 const int directionOpenCoopDoorMotorB = 9 ; direction ouvrir b moteur - broche 9 const int bottomSwitchPin = 26 ; bas switch est connectée aux broches 26 const int topSwitchPin = 27 ; haut de la page switch est connectée aux broches 27 / / vars / / cellule photoélectrique int photocellReading ; lecture analogique de le photocel int photocellReadingLevel ; photocel lecture des niveaux (sombre, crépusculaire, lumière) / / reed passe en haut et en bas de la porte de la coop / / top interrupteur int topSwitchPinVal ; commutateur haut var pour lire le code pin État int topSwitchPinVal2 ; commutateur haut var pour lire le code pin retard/debounce État int topSwitchState ; haut var de commutateur pour en conserver l’état de l’interrupteur / / fond interrupteur int bottomSwitchPinVal ; bas commutateur var pour lire le code pin État int bottomSwitchPinVal2 ; bas commutateur var pour lire le code pin retard/debounce État int bottomSwitchState ; bas commutateur var pour tenir l’état de l’interrupteur / / suffit 1 SimpleTimer objet SimpleTimer coopTimer ; *** la configuration *** void setup(void) {Serial.begin(9600); / / welcome message Serial.println ("vérification doCoopDoor : toutes les 10 minutes pour les niveaux de lumière à ouverture ou fermeture de porte") ; Serial.println() ; porte de Coop / / coop porte moteur pinMode (enableCoopDoorMotorB, sortie) ; activez le moteur broche = sortie pinMode (directionCloseCoopDoorMotorB, sortie) ; goupille de sens proche du moteur = sortie pinMode (directionOpenCoopDoorMotorB, sortie) ; broche moteur direction open = sortie / / coop porte commutateurs / / bas commutateur pinMode (bottomSwitchPin, entrée) ; Set axe de commutation inférieure comme entrée digitalWrite (bottomSwitchPin, HIGH) ; activer la résistance de commutateur de fond / / top interrupteur pinMode (topSwitchPin, entrée) ; Placez l’interrupteur haut de la page code pin comme entrée digitalWrite (topSwitchPin, HIGH) ; activer l’interrupteur supérieur résistance / / temps de mesures d’installation coopTimer.setInterval (600000, readPhotoCell) ; lire la photocellule toutes les 10 minutes} / / fonctions / / utiliser la porte de la coop / / / photocel lire niveaux d’extérieur lumineuse readPhotoCell() Sub {/ / fonction devant être appelé à plusieurs reprises - par cooptimer dans le programme d’installation photocellReading = analogRead(photocellPin) ; Serial.Print ("lecture analogique Photocel =") ; Serial.println(photocellReading) ; Si la valeur photocel seuils (photocellReading > = 0 & & photocellReading < = 3) {photocellReadingLevel = « 1 » ; Serial.Print ("niveau de lecture de Photocel:") ; Serial.println ("- foncé ») ; } else if (photocellReading > = 4 & & photocellReading < = 120) {photocellReadingLevel = « 2 » ; Serial.Print ("niveau de lecture de Photocel:") ; Serial.println ("-Twilight") ; } else if (photocellReading > = 125) {photocellReadingLevel = « 3 » ; Serial.Print ("niveau de lecture de Photocel:") ; Serial.println ("- Light") ; }} //debounce bas reed commutateur Sub debounceBottomReedSwitch() {//debounce bas reed commutateur bottomSwitchPinVal = digitalRead(bottomSwitchPin); / / lire la valeur d’entrée et stockez-la dans le val delay(10) ; bottomSwitchPinVal2 = digitalRead(bottomSwitchPin); / / lire la valeur d’entrée à nouveau pour vérifier ou rebondir si (bottomSwitchPinVal == bottomSwitchPinVal2) {/ / Veillez à ce que nous avons obtenu 2 lectures cohérente! si (bottomSwitchPinVal! = bottomSwitchState) {/ / l’état de l’interrupteur a changé! bottomSwitchState = bottomSwitchPinVal ; } Serial.print ("valeur de commutateur en bas:") ; afficher "la valeur de commutateur bas:" Serial.println(digitalRead(bottomSwitchPin)) ; afficher la valeur actuelle du commutateur inférieur ; }} / / debounce reed haut commutateur Sub debounceTopReedSwitch() {topSwitchPinVal = digitalRead(topSwitchPin); / / lire la valeur d’entrée et stockez-la dans le val delay(10) ; topSwitchPinVal2 = digitalRead(topSwitchPin); / / lire la valeur d’entrée à nouveau pour vérifier ou rebondir si (topSwitchPinVal == topSwitchPinVal2) {/ / Veillez à ce que nous avons obtenu 2 lectures cohérente! si (topSwitchPinVal! = topSwitchState) {/ / l’état du bouton a changé! topSwitchState = topSwitchPinVal;} Serial.Print (« haut de la page Switch valeur: ") ; afficher "la valeur de commutateur bas:" Serial.println(digitalRead(topSwitchPin)) ; afficher la valeur actuelle du commutateur inférieur ; }} / / stop la coop porte moteur stopCoopDoorMotorB() Sub {digitalWrite (directionCloseCoopDoorMotorB, basse); / / arrêter de sens proche du moteur digitalWrite (directionOpenCoopDoorMotorB, basse); / / mettez le moteur direction open analogWrite (enableCoopDoorMotorB, 0); / / activer le moteur, vitesse 0} / / fermer le moteur de porte de coop (dir moteur proches = vers la droite) void closeCoopDoorMotorB() {digitalWrite (directionCloseCoopDoorMotorB, HIGH); / / mettez le sens étroit du moteur digitalWrite (directionOpenCoopDoorMotorB, basse); / / éteindre moteur direction open analogWrite (enableCoopDoorMotorB, 255); / / activer le moteur , pleine vitesse si (bottomSwitchPinVal == 0) {/ / si le circuit de commutation pour le roseau bas est fermée stopCoopDoorMotorB() ; Serial.Print ("Coop porte fermée - aucun danger") ; }} / / ouvrir la porte de la coop (dir moteur ouvert = dans le sens antihoraire) void openCoopDoorMotorB() {digitalWrite (directionCloseCoopDoorMotorB, basse); / / arrêter de sens proche du moteur digitalWrite (directionOpenCoopDoorMotorB, HIGH); / / mettez le moteur direction open analogWrite (enableCoopDoorMotorB, 255); / / activer la vitesse moteur, complet si (topSwitchPinVal == 0) {/ / si le circuit de commutation haut reed est fermé stopCoopDoorMotorB() ; Serial.Print ("Coop porte ouverte - danger!") ; }} void doCoopDoor() {si (photocellReadingLevel == '1') {/ / si il fait sombre si (photocellReadingLevel! = '2') {/ / si ce n'est pas le crépuscule si (photocellReadingLevel! = '3') {/ / si ce n’est pas clair debounceTopReedSwitch(); / / lire et debounce les commutateurs debounceBottomReedSwitch() ; closeCoopDoorMotorB(); / / fermer la porte}}} si (photocellReadingLevel == '3') {/ / si c’est la lumière si (photocellReadingLevel! = '2') {/ / si ce n'est pas le crépuscule si (photocellReadingLevel! = '1') {/ / si ce n’est pas sombre debounceTopReedSwitch(); / / lire et debounce les commutateurs debounceBottomReedSwitch() ; openCoopDoorMotorB(); / / ouvrir la porte}}}} / / *** la boucle *** void loop() {/ / interrogation produit coopTimer.run() ; doCoopDoor();}
Leçons apprises
Ce que j’ai appris sur la porte, Arduino, lumière et la construction :
- Préférable de vérifier les niveaux de lumière toutes les 10 minutes pour éviter les lectures rebondir en arrière entre twilight/clair/sombre durant ces aube/crépuscule minutes
- Tester votre porte avec vos poules pour voir si aucun d'entre eux aiment s’accrocher à l’extérieur après les heures
- Tester les valeurs réelles de la lumière à l’extérieur est très important (plusieurs variables impliquées : lumière de la maison du voisin, nuages, interne/externe coop lumières etc..)
- Debouncing de vos commutateurs dans le code de l’Arduino est important (porte va sauter partout et échoue comme lectures électroniques varient considérablement de la milliseconde)
- Tendre la main à l’aide sur les Forums Arduino avant de tirer vos cheveux. (soyez gentil, faire vos devoirs et poser des questions très précises)
- J’ai changé de micro-switchs d' interrupteurs reed (aimants) parce que je ne voulais pas la mécanique des micro-switchs d’échouer au fil du temps
Ce que j’ai appris sur les poulets :
- Garder une lumière au sein de la coop peut garder des poulets à l’extérieur de plus de temps (je pense que b/c la lumière ambiante brille à l’extérieur) et c’est important quand on veut automatiser cette porte, afin qu’ils ne s’accidentellement verrouillés.
- Ils peuvent sauter et voler (haut et loin)
- Ils aiment à se percher en toute sécurité pendant la nuit, mais ne veulent rien de plus qu’au sortir dès qu’il est lumière