Veilleuse à partir d'une vieille ampoule, basée sur Arduino et WS2812. Tâches pour une solution indépendante

Tout le monde a probablement fait un rêve dans son enfance (et plus d'un). Vous pouvez même essayer de vous souvenir du sentiment qui remplit l'âme d'un enfant lorsque son rêve se réalise, ou de cette étincelle lointaine et familière dans ses yeux... Enfant, je rêvais d'avoir ma propre veilleuse.

Maintenant, je suis étudiant en 4ème année au BSUIR, et quand on nous a dit qu'un projet de cours en conception de circuits pouvait être réalisé non pas sur papier, mais sur un morceau de matériel, j'ai compris : la veilleuse que je désirais tant un enfant peut être fait par moi-même. De plus, créez non seulement un objet qui éclairera la pièce dans l’obscurité, mais un appareil qui peut être facilement contrôlé pour s’adapter à n’importe quelle humeur. Pourquoi pas? J'ai décidé d'ajouter la possibilité de changer de couleur avec mes mains : plus ma main est proche de la veilleuse, plus la couleur (RVB) s'allume. J'aimerais également contrôler la veilleuse à l'aide de la télécommande.

J’avoue tout de suite que j’ai repéré l’idée sur le site cxem.net. En bref, cet exemple utilisait une matrice RVB, contrôlée à l'aide de registres à décalage et de capteurs de distance à ultrasons. Mais je pensais que la matrice n'éclairait que dans un sens mais je voulais que la veilleuse éclaire sur les côtés.

Justification des éléments du circuit


J'ai porté mon attention sur les microcontrôleurs Arduino. UNO est une option tout à fait appropriée pour mon idée, d'une part parce que c'est la plate-forme la plus populaire et que le nombre de broches n'est pas trop grand, contrairement à Mega, et d'autre part, vous pouvez y connecter une source d'alimentation externe, dans mon cas c'est du 12V , contrairement à Nano , troisièmement... eh bien, je pense qu'on peut s'arrêter à ces deux points. La plate-forme est extrêmement populaire dans le monde entier en raison de la commodité et de la simplicité de son langage de programmation, ainsi que de son architecture ouverte et de son code de programme.

Plus des informations détaillées Vous pouvez facilement trouver des informations sur ce forum sur Internet, je ne vais donc pas surcharger l’article.

Donc, les exigences de base du système. Requis:
– des capteurs qui suivront la distance jusqu'à un obstacle pour contrôler le système ;
– capteur pour lire les signaux de la télécommande télécommande;
– des LED, qui assureront la fonctionnalité d’éclairage nécessaire ;
– une unité de contrôle qui contrôlera l’ensemble du système.

Le projet nécessite des télémètres comme capteurs de distance, chacun correspondant à une couleur spécifique : rouge, vert, bleu. Les capteurs de distance surveilleront la distance entre la main et la veilleuse et plus la main est rapprochée d'un certain capteur, plus la couleur correspondant à ce télémètre s'allumera fort. A l’inverse, plus la main est éloignée, moins la tension est appliquée sur la couleur correspondant au capteur.

Les télémètres les plus populaires sur ce moment ce sont les Sharp GP2Y0A21YK et HC-SR04. Sharp GP2Y0A21YK est un télémètre infrarouge. Il est équipé d'un émetteur IR et d'un récepteur IR : le premier sert de source du faisceau dont la réflexion est captée par le second. Dans le même temps, les rayons IR du capteur sont invisibles à l'œil humain et, à une telle intensité, sont inoffensifs.

Comparé au capteur à ultrasons HC-SR04, ce capteur présente à la fois des avantages et des inconvénients. Les avantages incluent la neutralité et l'innocuité. Les inconvénients sont une portée plus courte et une dépendance aux interférences externes, y compris certains types d'éclairage.

Utilisé comme capteurs de distance pour le projet : télémètres à ultrasons HC-SR04.
Le principe de fonctionnement du HC-SR04 repose sur le phénomène bien connu de l'écholocation. Lors de son utilisation, l'émetteur génère un signal acoustique qui, après avoir été réfléchi par l'obstacle, revient au capteur et est enregistré par le récepteur. Connaissant la vitesse de propagation des ultrasons dans l'air (environ 340 m/s) et le temps de retard entre le signal émis et reçu, il est facile de calculer la distance à la barrière acoustique.

L'entrée TRIG se connecte à n'importe quelle broche du microcontrôleur. Une impulsion doit être appliquée à cette broche. signal numérique durée 10 µs. Sur la base du signal à l'entrée TRIG, le capteur envoie un paquet d'impulsions ultrasoniques. Après avoir reçu le signal réfléchi, le capteur génère un signal d'impulsion au niveau de la broche ECHO, dont la durée est proportionnelle à la distance à l'obstacle.

Capteur infrarouge. Bien entendu, le signal nécessaire à la télécommande sera lu et décodé à partir de ce capteur. Les TSOP18 ne diffèrent les uns des autres que par la fréquence. Le capteur VS1838B TSOP1838 a été sélectionné pour le projet.

Le projet était basé sur l'idée d'éclairer la pièce de n'importe quelle couleur, ce qui signifie que vous aurez besoin de 3 couleurs primaires à partir desquelles l'éclairage sera obtenu : rouge, vert, bleu. Par conséquent, le modèle LED SMD 5050RGB a été choisi, qui fera parfaitement face à la tâche.

En fonction de la quantité de tension fournie à chaque LED, elles modifieront l'intensité de cet éclairage. La LED doit être connectée via une résistance, sinon nous risquons de la ruiner non seulement, mais aussi l'Arduino. La résistance est nécessaire pour limiter le courant sur la LED à une valeur acceptable. Le fait est que la résistance interne de la LED est très faible et, si vous n'utilisez pas de résistance, un tel courant traversera la LED qu'il grillera simplement la LED et le contrôleur.

Les bandes LED utilisées dans le projet sont alimentées en 12V.

Étant donné que la tension sur les LED à l'état « éteint » est de 6 V et qu'il est nécessaire de réguler l'alimentation électrique, qui dépasse 5 V, il est nécessaire d'ajouter des transistors au circuit en mode de commutation. Mon choix s'est porté sur le modèle BC547c.

Examinons brièvement, pour ceux qui l'auraient oublié, le principe de fonctionnement transistor npn. Si vous n'appliquez pas de tension du tout, mais court-circuitez simplement les bornes de base et d'émetteur, même si ce n'est pas un court-circuit, mais à travers une résistance de plusieurs ohms, il s'avère que la tension base-émetteur est nulle. Il n’y a donc pas de courant de base. Le transistor est fermé, le courant du collecteur est négligeable, c'est exactement le même courant initial. Dans ce cas, le transistor est dit à l’état coupé. L'état opposé est appelé saturation : lorsque le transistor est complètement ouvert, de sorte qu'il n'y a nulle part où s'ouvrir davantage. Avec ce degré d'ouverture, la résistance de la section collecteur-émetteur est si faible qu'il est tout simplement impossible d'allumer le transistor sans charge dans le circuit collecteur, il grillera instantanément. Dans ce cas, la tension résiduelle sur le collecteur ne peut être que de 0,3...0,5 V.

Ces deux états, saturation et coupure, sont utilisés lorsque le transistor fonctionne en mode commutation, comme un contact de relais ordinaire. La signification principale de ce mode est qu'un petit courant de base contrôle un grand courant de collecteur, qui est plusieurs dizaines de fois supérieur au courant de base. Un courant de collecteur important est obtenu grâce à source externe l'énergie, mais le gain actuel, comme on dit, est évident. Dans notre cas, le microcircuit, dont la tension de fonctionnement est de 5V, comprend 3 bandes avec LED fonctionnant à partir de 12V.

Calculons le mode de fonctionnement de la cascade de clés. Il est nécessaire de calculer la valeur de la résistance dans le circuit de base pour que les LED brûlent à pleine puissance. Une condition nécessaire lors du calcul est que le gain de courant soit supérieur ou égal au quotient de la division du courant de collecteur maximum possible par le courant de base minimum possible :

Par conséquent, les bandes peuvent avoir une tension de fonctionnement de 220 V et le circuit de base peut être contrôlé à partir d'un microcircuit avec une tension de 5 V. Si le transistor est conçu pour fonctionner avec une telle tension au niveau du collecteur, alors les LED s'allumeront sans problème.
La chute de tension aux bornes de la jonction base-émetteur est de 0,77 V, à condition que le courant de base soit de 5 mA et que le courant du collecteur soit de 0,1 A.
La tension aux bornes de la résistance de base sera :

D'après la loi d'Ohm :

Dans la gamme standard de résistances, nous sélectionnons une résistance de 8,2 kOhm. Ceci termine le calcul.

Je voudrais attirer votre attention sur un problème que j'ai rencontré. Lors de l'utilisation de la bibliothèque IRremote, l'Arduino s'est figé lors du réglage de la couleur bleue. Après une recherche longue et approfondie sur Internet, il s'est avéré que cette bibliothèque utilise Timer 2 par défaut pour ce modèle Arduino. Les minuteries sont utilisées pour contrôler les sorties PWM.

Minuterie 0 (heure système, PWM 5 et 6) ;
Minuterie 1 (PWM 9 et 10) ;
Minuterie 2 (PWM 3 et 11).

Au départ, j'utilisais PWM 11 pour réguler la couleur bleue. Par conséquent, soyez prudent lorsque vous travaillez avec PWM, des minuteries et des bibliothèques tierces susceptibles de les utiliser. C'est étrange que page d'accueil Rien n'a été dit sur cette nuance sur Github. Si vous le souhaitez, vous pouvez décommenter la ligne avec le minuteur 1 et commenter 2.

La connexion des éléments sur la maquette ressemble à ceci :

Après les tests sur la maquette, les phases « Placement des éléments sur la carte » et « Travail avec un fer à souder » ont commencé. Après le premier test de la planche finie, une pensée me vient à l'esprit : quelque chose s'est mal passé. Et c’est ici que commence la phase familière à beaucoup : « Un travail minutieux avec le testeur ». Cependant, les problèmes (plusieurs contacts adjacents ont été accidentellement soudés ensemble) ont été rapidement éliminés et voici la lumière malicieuse tant attendue des LED.

Ensuite, ce n’était plus qu’une question de corps. Pour cette raison, du contreplaqué percé de trous pour nos capteurs a été découpé. Quatrième de couverture il a été spécialement amovible pour que vous puissiez profiter de la vue de l'intérieur et, si vous le souhaitez, terminer ou refaire quelque chose. Il dispose également de 2 trous pour reprogrammer la carte et l'alimentation.

La carrosserie a été collée avec de la colle époxy à deux composants. Il convient de noter la particularité de cette colle pour ceux qui ne l'ont jamais rencontrée auparavant. Ce produit est présenté dans deux récipients distincts et lorsque le contenu est mélangé, une réaction chimique instantanée se produit. Après le mélange, il faut agir rapidement, dans les 3-4 minutes. Pour une utilisation ultérieure, vous devez mélanger une nouvelle portion. Donc si vous essayez de répéter cela, mon conseil est de mélanger par petites portions et d'agir très rapidement, vous n'aurez pas beaucoup de temps pour réfléchir. Par conséquent, il vaut la peine de réfléchir à l'avance à comment et où coller le corps. De plus, cela ne peut se faire en une seule fois.

Pour montage de bandes avec LED le couvercle supérieur un tube a été inséré dans lequel tous les fils passaient parfaitement.

Lorsque le problème de l'abat-jour s'est posé, je me suis rappelé comment, étant enfant, je fabriquais des objets artisanaux à partir d'un simple fil, de colle et d'un ballon qui servait de base. Le principe de l'abat-jour est le même, mais enrouler un polyèdre s'est avéré plus difficile qu'une boule. En raison de la pression exercée par les fils sur la structure, celle-ci a commencé à se rétrécir vers le haut et les fils ont commencé à tomber. En urgence, les mains recouvertes de colle, il a été décidé de renforcer la structure par le haut. Et puis le CD est venu à la rescousse. Le résultat final est cette veilleuse :

Que voudriez-vous dire à la fin ?

Que dois-je changer dans le projet ? Pour fournir le signal TRIG aux capteurs de distance, on pourrait utiliser une sortie Arduino au lieu de trois. Je prévoirais également un trou pour le capteur IR (que j'ai oublié), qui, hélas, est toujours caché dans le boîtier à partir duquel il ne peut naturellement pas lire les signaux de la télécommande. Mais qui a dit qu’on ne pouvait rien souder ni percer ?

Je voudrais souligner que ce fut un semestre intéressant et une excellente occasion d'essayer de faire quelque chose qui n'est pas sur papier, grâce à quoi je peux mettre une autre coche à côté de l'élément « rêve d'enfance ». Et si vous pensez qu’il est difficile d’essayer quelque chose de nouveau et que vous ne savez pas quoi faire en premier, ne vous inquiétez pas. Beaucoup de gens ont une pensée qui leur trotte dans la tête : par où commencer et comment y parvenir ? Il y a de nombreuses tâches dans la vie qui peuvent vous dérouter, mais une fois que vous aurez essayé, vous remarquerez qu'avec un scintillement dans les yeux, vous pouvez déplacer des montagnes, même si vous devez essayer un peu pour cela.

Pour une tâche supplémentaire

    1 LED supplémentaire

    1 résistance supplémentaire d'une valeur nominale de 220 Ohms

    2 fils supplémentaires

Diagramme schématique

Schéma sur la planche à pain

note

    Dans cette expérience, nous installons une photorésistance entre l'alimentation et l'entrée analogique, c'est-à-dire pour positionner R1 dans le circuit diviseur de tension. Nous en avons besoin pour que lorsque l'éclairage diminue, nous recevions moins de tension à l'entrée analogique.

    Essayez de placer les composants de manière à ce que la LED n'éclaire pas la photorésistance.

Esquisser

p050_night_light.ino #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT) ; ) void loop() ( // lit le niveau de lumière. Au fait, annoncez // vous pouvez lui affecter une variable et une valeur à la fois int légèreté = analogRead(LDR_PIN) ; // lit la valeur du potentiomètre avec lequel on régule // valeur seuil entre l'obscurité et la lumière conditionnelles int seuil = analogRead(POT_PIN) ; // déclare une variable booléenne et lui attribue une valeur // "C'est sombre maintenant." Variables booléennes, par opposition à // entiers, ne peuvent contenir qu'une seule des deux valeurs : // vrai ou faux. De telles valeurs // aussi appelé booléen. booléen aussiDark = (légèreté< threshold) ; // utilise le branchement du programme : le processeur exécutera l'un des // deux blocs de code en fonction de l'exécution de la condition. // If (anglais "if") est trop sombre... si (trop sombre) ( // ... allume l'éclairage digitalWrite(LED_PIN, HAUT) ; ) autre ( // ...sinon la lumière n'est pas nécessaire - éteignez-la digitalWrite(LED_PIN, FAIBLE) ; ) )

Explications pour le code

    Nous utilisons un nouveau type de variable - booléenne, qui stocke uniquement les valeurs vraies (vrai, 1) ou fausses (faux, 0). Ces valeurs sont le résultat de l'évaluation d'expressions booléennes. Dans cet exemple, l'expression booléenne est légèreté< threshold . На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных lightness и threshold , которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.

    Nous mettons cette expression logique entre parenthèses uniquement pour plus de clarté. Il est toujours préférable d'écrire du code lisible. Dans d’autres cas, les parenthèses peuvent affecter l’ordre des opérations, comme en arithmétique ordinaire.

    Dans notre expérience, l'expression booléenne sera vraie lorsque la valeur de luminosité est inférieure à la valeur seuil car nous avons utilisé l'opérateur< . Мы можем использовать операторы > , <= , >= , == , != , qui signifient respectivement « supérieur à », « inférieur ou égal à », « supérieur ou égal à », « égal à », « non égal à ».

    Soyez particulièrement prudent avec l'opérateur logique == et ne le confondez pas avec l'opérateur d'affectation = . Dans le premier cas, on compare les valeurs des expressions et obtenons une valeur logique (vrai ou faux), et dans le second cas, on attribue la valeur de l'opérande de droite à l'opérande de gauche. Le compilateur ne connaît pas nos intentions et n'émettra pas d'erreur, mais nous pouvons accidentellement modifier la valeur d'une variable et passer ensuite beaucoup de temps à rechercher une erreur.

    L'instruction conditionnelle if est l'une des instructions clés dans la plupart des langages de programmation. Avec son aide, nous pouvons non seulement effectuer une séquence d'actions strictement définie, mais également prendre des décisions sur la branche de l'algorithme à suivre, en fonction de certaines conditions.

    L'expression logique légèreté< threshold есть значение: true или false . Мы вычислили его и поместили в булеву переменную tooDark («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод»

    Avec le même succès, nous pourrions dire « si l'éclairage est inférieur au niveau seuil, alors allumez la LED », c'est-à-dire passez l'expression logique entière à if :

si (légèreté< threshold) { // ... }

    Derrière opérateur conditionnel if suit nécessairement un bloc de code qui est exécuté si l'expression logique est vraie. N'oubliez pas les deux accolades () !

    Si, si l'expression est vraie, il suffit d'exécuter un instruction, elle peut être écrite immédiatement après si (...) sans accolades:

si (légèreté< threshold) digitalWrite(LED_PIN, HIGH) ;

    L'instruction if peut être étendue avec une construction else. Le bloc de code, ou l'instruction unique qui le suit, ne sera exécuté que si l'expression booléenne if est évaluée comme fausse. Les règles concernant les accolades sont les mêmes. Dans notre expérience, nous avons écrit "s'il fait trop sombre, allumez la LED, sinon éteignez la LED".

Les capteurs de lumière (éclairage), construits à base de photorésistances, sont assez souvent utilisés dans les vrais projets Arduino. Ils sont relativement simples, peu chers et faciles à trouver et à acheter dans n’importe quelle boutique en ligne. La photorésistance Arduino vous permet de contrôler le niveau de lumière et de répondre à ses changements. Dans cet article, nous verrons ce qu'est une photorésistance, comment fonctionne un capteur de lumière basé sur celle-ci et comment connecter correctement le capteur aux cartes Arduino.

Une photorésistance, comme son nom l'indique, est directement liée aux résistances, que l'on retrouve souvent dans presque tous les circuits électroniques. La principale caractéristique d’une résistance classique est la valeur de sa résistance. La tension et le courant en dépendent, à l'aide d'une résistance, nous définissons les modes de fonctionnement requis des autres composants. En règle générale, la valeur de résistance d'une résistance ne change pratiquement pas dans les mêmes conditions de fonctionnement.

Contrairement à une résistance classique, photorésistance peut changer sa résistance en fonction du niveau de lumière ambiante. Cela signifie que dans circuit électrique Les paramètres changeront constamment ; tout d’abord, nous nous intéressons à la chute de tension aux bornes de la photorésistance. En enregistrant ces changements de tension sur les broches analogiques de l'Arduino, nous pouvons modifier la logique du circuit, créant ainsi des dispositifs qui s'adaptent aux conditions externes.

Les photorésistances sont très activement utilisées dans une grande variété de systèmes. L'application la plus courante est l'éclairage public. Si la nuit tombe sur la ville ou si le temps devient nuageux, les lumières s'allument automatiquement. Vous pouvez fabriquer une ampoule économique pour la maison à partir d'une photorésistance qui s'allume non pas selon un horaire, mais en fonction de l'éclairage. Vous pouvez même créer un système de sécurité basé sur un capteur de lumière, qui se déclenchera immédiatement après l'ouverture et l'éclairage d'une armoire fermée ou d'un coffre-fort. Comme toujours, le champ d'application de tout capteur Arduino n'est limité que par notre imagination.

Quelles photorésistances peuvent être achetées dans les magasins en ligne

Le plus populaire et option abordable les capteurs sur le marché sont des modèles de production de masse d'entreprises chinoises, des clones de produits du fabricant VT. Il n'est pas toujours possible de savoir qui et quoi produit exactement tel ou tel fournisseur, mais pour se lancer dans les photorésistances, l'option la plus simple est tout à fait appropriée.

Il peut être conseillé à un utilisateur novice d'Arduino d'acheter un module photo prêt à l'emploi qui ressemble à ceci :


Ce module contient déjà tous les éléments nécessaires pour connexion facile photorésistance à la carte Arduino. Certains modules implémentent un circuit comparateur et fournissent une sortie numérique et une résistance d'ajustement pour le contrôle.

Il peut être conseillé à un radioamateur russe de se tourner vers le capteur PA russe. Disponibles à la vente sont FR1-3, FR1-4, etc. - ont été produits à l'époque soviétique. Malgré cela, FR1-3 est un détail plus précis. De là découle la différence de prix : pour FR, ils ne demandent pas plus de 400 roubles. FR1-3 coûtera plus de mille roubles chacun.

Marquage des photorésistances

L'étiquetage moderne des modèles produits en Russie est assez simple. Les deux premières lettres sont PhotoResistor, les chiffres après le tiret indiquent le numéro de développement. FR -765 - photorésistance, développement 765. Généralement marqué directement sur le corps de la pièce

Le capteur VT a une plage de résistance indiquée dans le schéma de marquage. Par exemple:

  • VT83N1 - 12-100kOhm (12K – éclairé, 100K – dans l'obscurité)
  • VT93N2 - 48-500kOhm (48K – éclairé, 100K – dans l'obscurité).

Parfois, pour clarifier les informations sur les modèles, le vendeur fournit un document spécial du fabricant. Outre les paramètres de fonctionnement, la précision de la pièce y est également indiquée. Tous les modèles ont une plage de sensibilité dans la partie visible du spectre. Collecte capteur de lumière Vous devez comprendre que la précision de fonctionnement est un concept relatif. Même pour les modèles du même fabricant, du même lot ou du même achat, cela peut différer de 50 % ou plus.

En usine, les pièces sont réglées sur des longueurs d’onde allant du rouge au vert. La plupart des gens « voient » également le rayonnement infrarouge. Des pièces particulièrement précises peuvent même détecter la lumière ultraviolette.

Avantages et inconvénients du capteur

Le principal inconvénient des photorésistances est la sensibilité spectrale. Selon le type de lumière incidente, la résistance peut varier de plusieurs ordres de grandeur. Les inconvénients incluent également faible vitesse réactions aux changements d’éclairage. Si le voyant clignote, le capteur n'a pas le temps de réagir. Si la fréquence de changement est assez élevée, la résistance cessera généralement de « voir » que l’éclairage change.

Les avantages incluent la simplicité et l’accessibilité. Changer directement la résistance en fonction de la lumière qui tombe dessus permet de simplifier schéma électrique Connexions. La photorésistance elle-même est très bon marché, elle est incluse dans de nombreux kits et constructeurs Arduino et est donc disponible pour presque tous les fabricants Arduino novices.

Connecter une photorésistance à Arduino

Dans les projets arduino La photorésistance est utilisée comme capteur de lumière. En recevant des informations, la carte peut activer ou désactiver les relais, démarrer les moteurs et envoyer des messages. Naturellement, nous devons connecter correctement le capteur.

Le schéma de connexion du capteur de lumière à l'Arduino est assez simple. Si nous utilisons une photorésistance, alors dans le schéma de connexion, le capteur est implémenté comme diviseur de tension. Un bras change en fonction du niveau d'éclairage, le second fournit une tension à l'entrée analogique. Dans la puce du contrôleur, cette tension est convertie en données numériques via un CAN. Parce que Lorsque la résistance du capteur diminue lorsque la lumière le frappe, la valeur de la tension qui le traverse diminue également.

En fonction du bras du diviseur dans lequel nous avons placé la photorésistance, une tension augmentée ou diminuée sera fournie à l'entrée analogique. Si une branche de la photorésistance est connectée à la terre, alors la valeur de tension maximale correspondra à l'obscurité (la résistance de la photorésistance est maximale, presque toute la tension chute à ses bornes), et la valeur minimale correspondra à un bon éclairage (la résistance est proche de zéro, la tension est minime). Si nous connectons le bras de photorésistance à l’alimentation, le comportement sera inverse.

L'installation de la carte elle-même ne devrait poser aucune difficulté. Étant donné que la photorésistance n'a pas de polarité, elle peut être connectée des deux côtés ; elle peut être soudée à la carte, connectée avec des fils à l'aide d'un circuit imprimé ou utilisée avec des clips ordinaires (pinces crocodiles) pour la connexion. La source d'alimentation du circuit est l'Arduino lui-même. Photorésistance une jambe est connectée à la terre, l'autre est connectée à la carte ADC (dans notre exemple - AO). Nous connectons une résistance de 10 kOhm à la même jambe. Naturellement, vous pouvez connecter une photorésistance non seulement à la broche analogique A0, mais également à n'importe quelle autre.

Quelques mots concernant la résistance supplémentaire de 10 K. Elle a deux fonctions dans notre circuit : limiter le courant dans le circuit et former tension requise dans un circuit avec un diviseur. La limitation du courant est nécessaire dans une situation où une photorésistance entièrement éclairée réduit fortement sa résistance. Et la génération de tension concerne des valeurs prévisibles sur le port analogique. En fait pour fonctionnement normal Avec nos photorésistances, une résistance de 1K suffit.

En modifiant la valeur de la résistance, nous pouvons « décaler » le niveau de sensibilité vers les côtés « sombre » et « clair ». Donc, 10 K donneront commutation rapide l'apparition de la lumière. Dans le cas du 1K, le capteur de lumière détectera avec plus de précision les niveaux de lumière élevés.

Si vous utilisez module prêt capteur de lumière, la connexion sera alors encore plus simple. Nous connectons la sortie du module VCC au connecteur 5V de la carte, GND à la masse. Nous connectons les broches restantes aux connecteurs Arduino.

Si la carte a une sortie numérique, nous l'envoyons aux broches numériques. Si c’est analogique, passez à l’analogique. Dans le premier cas, nous recevrons un signal de déclenchement - le niveau d'éclairage a été dépassé (le seuil de déclenchement peut être ajusté à l'aide d'une résistance de réglage). À partir des broches analogiques, nous pourrons obtenir une valeur de tension proportionnelle au niveau d'éclairage réel.

Un exemple de croquis d'un capteur de lumière sur une photorésistance

Nous avons connecté le circuit avec la photorésistance à l'Arduino et nous sommes assurés que tout était fait correctement. Il ne reste plus qu'à programmer le contrôleur.

Écrire un croquis pour un capteur de lumière est assez simple. Il suffit de supprimer la valeur de tension actuelle de la broche analogique à laquelle le capteur est connecté. Cela se fait en utilisant la fonction analogRead() que nous connaissons tous. On peut alors effectuer certaines actions en fonction du niveau de luminosité.

Écrivons un croquis pour un capteur de lumière qui allume ou éteint une LED connectée selon le circuit suivant.

L'algorithme de fonctionnement est le suivant :

  • Déterminez le niveau du signal de la broche analogique.
  • Nous comparons le niveau avec la valeur seuil. La valeur maximale correspondra à l'obscurité, la valeur minimale correspondra à l'éclairage maximum. Choisissons une valeur seuil égale à 300.
  • Si le niveau est inférieur au seuil, il fait sombre, vous devez allumer la LED.
  • Sinon, éteignez la LED.
#define PIN_LED 13 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(val); if ( Val< 300) { digitalWrite(PIN_LED, LOW); } else { digitalWrite(PIN_LED, HIGH); } }

En recouvrant la photorésistance (avec vos mains ou un objet résistant à la lumière), nous pouvons observer la LED s'allumer et s'éteindre. En modifiant le paramètre de seuil dans le code, nous pouvons forcer l'ampoule à s'allumer/s'éteindre à différents niveaux d'éclairage.

Lors de l'installation, essayez de placer la photorésistance et la LED aussi loin que possible l'une de l'autre afin que moins de lumière provenant de la LED lumineuse tombe sur le capteur de lumière.

Capteur de lumière et changement fluide de la luminosité du rétroéclairage

Vous pouvez modifier le projet pour que la luminosité de la LED change en fonction du niveau d'éclairage. Nous ajouterons les modifications suivantes à l'algorithme :

  • Nous modifierons la luminosité de l'ampoule via PWM, en envoyant des valeurs de 0 à 255 à la broche avec la LED en utilisant analogWrite().
  • Pour convertir la valeur numérique du niveau de lumière du capteur de lumière (de 0 à 1023) en plage PWM de luminosité des LED (de 0 à 255), nous utiliserons la fonction map().

Exemple de croquis :

#define PIN_LED 10 #define PIN_PHOTO_SENSOR A0 void setup() ( Serial.begin(9600); pinMode(PIN_LED, OUTPUT); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); Serial.println(val); int ledPower = map(val, 0, 1023, 0, 255); // Convertit la valeur résultante en niveau de signal PWM. Plus la valeur d'éclairage est faible, moins nous devons fournir d'énergie à la LED via PWM. analogWrite(PIN_LED, ledPower) ; // Changer la luminosité)

Dans le cas d'une autre méthode de connexion, dans laquelle le signal du port analogique est proportionnel au degré d'éclairage, vous devrez en plus « inverser » la valeur en la soustrayant du maximum :

Int val = 1023 – analogRead (PIN_PHOTO_RESISTOR) ;

Circuit de capteur de lumière utilisant une photorésistance et un relais

Des exemples de croquis pour travailler avec des relais sont donnés dans l'article sur la programmation des relais dans Arduino. Dans ce cas, nous n'avons pas besoin d'effectuer des mouvements complexes : après avoir déterminé « l'obscurité », nous allumons simplement le relais et appliquons la valeur correspondante à sa broche.

#define PIN_RELAY 10 #define PIN_PHOTO_SENSOR A0 void setup() ( pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); ) void loop() ( int val = analogRead(PIN_PHOTO_SENSOR); if (val< 300) { // Светло, выключаем реле digitalWrite(PIN_RELAY, HIGH); } else { // Темновато, включаем лампочку digitalWrite(PIN_RELAY, LOW); } }

Conclusion

Les projets utilisant un capteur de lumière basé sur une photorésistance sont assez simples et efficaces. Vous pouvez mettre en œuvre de nombreux projets intéressants et le coût de l'équipement ne sera pas élevé. La photorésistance est connectée à l'aide d'un circuit diviseur de tension avec une résistance supplémentaire. Le capteur est connecté à un port analogique pour mesurer différents niveaux de lumière ou à un port numérique si tout ce qui nous intéresse est l'obscurité. Dans le croquis, nous lisons simplement les données d'un port analogique (ou numérique) et décidons comment réagir aux changements. Espérons que des « yeux » aussi simples apparaîtront désormais dans vos projets.

Dans cette expérience, la LED doit s'allumer lorsque le niveau de lumière descend en dessous d'un seuil fixé par un potentiomètre.

LISTE DES PIÈCES POUR L'EXPÉRIENCE

- 1 carte ArduinoUno ;

- 1 breadboard sans soudure ;

- 1 LED ;

- 1 photorésistance ;

- 1 résistance d'une valeur nominale de 220 Ohms, 1 résistance d'une valeur nominale de 10 kOhms ;

- 1 résistance variable (potentiomètre) ;

- 10 fils mâle-mâle.

DÉTAILS POUR UNE TÂCHE SUPPLÉMENTAIRE

1 LED supplémentaire ;

1 autre résistance d'une valeur nominale de 220 Ohms ;

2 fils supplémentaires.

SCHÉMA

SCHÉMA SUR PLANCHE À PAIN

ESQUISSER

télécharger le croquis pour l'IDE Arduino
#define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() ( pinMode(LED_PIN, OUTPUT); ) void loop() ( // lit le niveau de lumière. Au fait, // vous pouvez déclarer une variable et l'attribuer une valeur à la fois int lightness = analogRead(LDR_PIN); // lit la valeur du potentiomètre, que nous utilisons pour ajuster // la valeur seuil entre l'obscurité conditionnelle et la lumière int seuil = analogRead(POT_PIN); // déclare un variable logique et attribuez-lui la valeur // "est-il sombre maintenant". Les variables booléennes, contrairement aux // variables entières, ne peuvent contenir qu'une seule des deux valeurs suivantes : // vrai ou faux. De telles valeurs // sont également appelées booléennes. booléen aussiDark = (légèreté< threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } }

EXPLICATIONS SUR LE CODE

  • Nous utilisons un nouveau type de variables - booléen, qui stocke uniquement les valeurs vrai (vrai, 1) ou FAUX (faux, 0). Ces valeurs sont le résultat de l'évaluation d'expressions booléennes. Dans cet exemple, l'expression booléenne est légèreté< threshold . En langage humain, cela ressemble à : « un éclairement inférieur au niveau seuil ». Une telle affirmation sera vraie lorsque l’éclairage sera inférieur au niveau seuil. Le microcontrôleur peut comparer les valeurs des variables légèreté Et seuil, qui sont à leur tour les résultats de la mesure, et calculent la vérité de l'expression logique.
  • Nous mettons cette expression logique entre parenthèses uniquement pour plus de clarté. Il est toujours préférable d'écrire du code lisible. Dans d’autres cas, les parenthèses peuvent affecter l’ordre des opérations, comme en arithmétique ordinaire.
  • Dans notre expérience, une expression booléenne sera vraie lorsque la valeur légèreté inférieur à la valeur seuil parce que nous avons utilisé l'opérateur < . Nous pouvons utiliser des opérateurs > , <= , >= , = = , != , qui signifie respectivement « supérieur à », « inférieur ou égal à », « supérieur ou égal à », « égal à », « différent de ».
  • Soyez particulièrement prudent avec l'opérateur logique = = et ne le confondez pas avec l'opérateur d'affectation = . Dans le premier cas, on compare les valeurs des expressions et obtenons une valeur logique (vrai ou faux), et dans le second cas, on attribue la valeur de l'opérande de droite à l'opérande de gauche. Le compilateur ne connaît pas nos intentions et n'émettra pas d'erreur, mais nous pouvons accidentellement modifier la valeur d'une variable et passer ensuite beaucoup de temps à rechercher une erreur.
  • Opérateur conditionnel siSi") est l'un des éléments clés dans la plupart des langages de programmation. Avec son aide, nous pouvons non seulement effectuer une séquence d'actions strictement définie, mais également prendre des décisions sur la branche de l'algorithme à suivre, en fonction de certaines conditions.
  • Pour une expression logique légèreté< threshold il y a un sens : vrai ou FAUX. Nous l'avons calculé et mis dans une variable booléenne trop sombre("trop ​​sombre") Ainsi, nous semblons dire « s’il fait trop sombre, alors allumez la LED ».
  • Avec le même succès, nous pourrions dire « si l'éclairage est inférieur au niveau seuil, alors allumez la LED », c'est-à-dire Transférer à si toute expression logique :
si (légèreté< threshold) { // ... }
  • Derrière l'instruction conditionnelle si Il doit y avoir un bloc de code qui est exécuté si l'expression logique est vraie. N'oubliez pas les deux accolades {} !
  • Si, si l'expression est vraie, il suffit d'exécuter un instructions, il peut être écrit immédiatement après si (…) sans accolades :
si (légèreté< threshold) digitalWrite(LED_PIN, HIGH);
  • Opérateur si peut être étendu par conception autre("sinon"). Un bloc de code ou une seule instruction qui le suit ne sera exécuté que si l'expression logique dans si a le sens FAUX , « mensonge" Les règles concernant les accolades sont les mêmes. Dans notre expérience, nous avons écrit "s'il fait trop sombre, allumez la LED, sinon éteignez la LED".

QUESTIONS POUR VOUS TESTER

  1. Si nous installons une photorésistance entre l'entrée analogique et la masse, notre appareil fonctionnera en sens inverse : la LED s'allumera lorsque la quantité de lumière augmentera. Pourquoi?
  2. Quel résultat du fonctionnement de l'appareil obtiendrons-nous si la lumière de la LED tombe sur la photorésistance ?
  3. Si nous installons la photorésistance comme indiqué dans la question précédente, comment devons-nous modifier le programme pour que l'appareil fonctionne correctement ?
  4. Disons que nous avons le code si (condition) (action ;). Dans quels cas cela sera-t-il fait ? action ?
  5. A quelles valeurs oui expression x + y > 0 sera vrai si x > 0 ?
  6. Est-il nécessaire d'indiquer quelles instructions exécuter si la condition est dans l'instruction si FAUX?
  7. Quelle est la différence entre l'opérateur = = de l'opérateur = ?
  8. Si on utilise la construction si (condition) action1 ; sinon action2;, pourrait-il y avoir une situation où aucune des actions n'est exécutée ? Pourquoi?

TÂCHES POUR UNE SOLUTION INDÉPENDANTE

  1. Réécrire le programme sans utiliser la variable trop sombre tout en conservant la fonctionnalité de l'appareil.
  2. Ajoutez une autre LED au circuit. Terminez le programme de sorte que lorsque l'éclairage tombe en dessous de la valeur seuil, une LED s'allume et lorsque l'éclairage tombe en dessous de la moitié de la valeur seuil, les deux LED s'allument.
  3. Changez le circuit et le programme pour que les LED s'allument selon le même principe, mais brillent d'autant plus intensément, moins la photorésistance tombe sur la lumière.




Haut