Détections d'entrées

Bonjour,

je travaille en ce moment sur un projet domotique, et je dois gérer juste des … lampes.

En gros, quand on appuie sur un ou deux boutons, une lampe doit pouvoir s'allumer ou s'éteindre.

Jusque la, pas de soucis.

Mais j'aurai aimé trouver un code élégant pour détecter quelle entrée est HIGH sans faire de boucle. de détection.

Donc si par exemple une entrée est HIGH, que l'arduino puisse se dire : AH c'est la numéro 8, et il me la stock en tant que variable par exemple.

J'espère que c'est compréhensible, et que c'est possible ^^

D'avance merci.

Une variable pour stocker l'heure et la date? Savoir combien de temps la lumière était allumée / éteinte? Des trucs comme ça?

Aucun trucs comme ça.

Dans le microcontrôleur avr qui équipe les cartes arduino les I/O sont groupées par 8 (8=valeur max, peut être plus faible) dans ce qu'on appelle des PORTS. Ces PORTS sont gérées par des registres de 8 bits et sont repérés par des lettres.

Un premier registre est le registre DDRX (X = A, B, C, D, etc).
Ce registre permet de mettre une I/O soit en sortie soit en en entrée.

Un autre registre est PORTX (idem pour X) qui permet de fixer un niveau sur une sortie ou d'activer une pullup sur une entrée.

Le troisième registre est le registre PINX qui permet de lire en une seule opération le niveau sur les 8 I/O du port.
Après il faut quand même décortiquer le résultat de la lecture de PINX pour savoir quelle I/O est à 1 ou à 0.

C'est ce que permet la lecture des registres à la mode "ATMEL".
Bien évidement les fonctions Arduino ne permettent pas de le faire, il faut écrire le code qui va bien.

Pour cela tu as la datasheet du micro qui équipe ta carte. Les datasheets Atmel sont très claires par rapport à celles d'autres fournisseurs de micro et il y a toujours des lignes de code exemple en assembleur et plus utile en C.
Tu télécharge la datasheet, tu cherche quels ports tu as sur ton micro, par exemple la carte UNO est équipée avec atmega328p qui possède 3 ports le B, le C et le D.
Un certain nombre d'entrées ne sont pas utilisables, par exemple les 2 I/O pour le quartz ou celle pour le Reset ne sont pas utilisables. C'est pour cela que le nombre d'I/O réellement utilisables est 8 au maximum mais peut faire 4 ou 6 selon les ports.

Tu recherche la correspondance entre les dénominations Atmel et les dénomination Arduino.
Soit tu trouve sur le site Arduino, soit tu les détermine avec le schéma électrique de la carte disponible sur le site arduino.
Tu essaye d'utiliser au maximum des I/O appartenant au même port pour ne pas avoir trop de registres PINX à lire et à traiter.

En partant de zéro cela représente un gros travail de documentation, si c'est juste pour faire beau il ne se justifie peut-être pas.

Si c'est réellement un besoin ou que tu veux connaître comment sont réellement gérées les I/O, cela vaut le coup et tu pourra le réutiliser très facilement.

Effectivement pour ce projet c'est peut être un peu trop tiré par les cheveux surtout si mon pote (c'est pour chez lui que je fais ce projet) doit un jour regarder le code.

Donc si je fais juste du conditionnel pour chacune de mes sorties en fonctions des entrées ça te paraît simple, ou t'as une meilleure idée ?

Merci encore

68tjs, c'est une très bonne réponse et très informative. :wink: Je n'avais pas penser que ça pouvait être ça la question..

Je vais me servir de tes infos pour faire des exercices de bits demain soir. Ça faisais parti de mon plan de la semaine.

L'importance de maitriser les registres est primordiale pour profiter à 100% des capacités d'Arduino.