assignation sensor pin analogique ?

bonjour,

c’est fou çà, maintenant on peut déclarer

byte sens1pin = 0;
byte sens2pin= 1;
byte sens3pin= 2;

et pour une digitale

byte ledpin= 2;
puis on met le pinMode pour ledpin

avant on devait au moins

byte sens1pin = A0;
byte sens2pin= A1;
byte sens3pin= A2;

ou 14 pour A0, 15 pour A1, etc…
et meme encore avant pour les digitales D2 D3 etc…
çà me fait toujours peur de confondre assignation pin ou variable

a force de trop simplifier…

qu’est-ce que vous racontez?

si vous regardez le code source de analogRead() vous verrez qu’il y a toujours eu adaptation de la broche vers la bonne broche analogique si on passait un “petit” numéro.

int analogRead(uint8_t pin)
{
	uint8_t low, high;

#if defined(analogPinToChannel)
#if defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#endif
	pin = analogPinToChannel(pin);
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)
	if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

ça fonctionne pour pinMode, mais bien sûr si vous voulez utilisez une pin Analogique genre A0 en entrée digitale pour faire un digitalRead() alors le pinMode et le digitalRead devront faire référence à A0 ou à 14…

Bonjour,

Si on utilise les pins comme entrées analogique on peut utiliser la notation 0..5 ou A0..A5
Les deux font la même chose
analogRead(0) ou analogRead(A0)

Si on les utilise comme entrées/sorties logiques il faut utiliser la notation A0..A5 (ou 14..19 pour une carte UNO) sinon il y a confusion avec les pins 0..5
digitalWrite(A0) est différent de digitalWrite(0)

Et pour mettre un peu plus de pagaille sur la Uno les pins A0-A5 en numérique sont aussi accessibles par D14-D19.
C'est le manque de rigueur des premiers développeurs qui étaient des «artistes» et qui développaient pour des artistes.
D'où le nom de sketch pour les programmes et le terme de boucliers pour les cartes d'extension.

autant pour moi...

analogRead(14); = analogRead(0); ?
et analogWrite qui n'a rien à voir avec les entrées analogiques, pwm sur pins capables de pwm

merci

elektrax:
analogRead(14); = analogRead(0); ?

Oui.
Extrait du code de analogRead

#else
if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

kamill:
Oui.
Extrait du code de analogRead

#else

if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

oui j’avais déjà posté le lien et le code en #1

sinon effectivement pour analogWrite(), le code source commence par mettre la pin en OUTPUT puis si la valeur passée est 0 ou 255 fait un simple digitalWrite, sinon la code va chercher le timer associé à cette pin pour piloter le PWM

pinMode(pin, OUTPUT);
if (val == 0) digitalWrite(pin, LOW);
else if (val == 255) digitalWrite(pin, HIGH);
else {
  switch(digitalPinToTimer(pin)) { ...

et s’il ne trouve aucun timer associé (ce n’est pas une pin PWM sur cette plateforme) alors il tombe dans le cas

  case NOT_ON_TIMER:
    default:
      if (val < 128) {
         digitalWrite(pin, LOW);
      } else {
         digitalWrite(pin, HIGH);
      }

qui met la pin à LOW si on demandait moins de la moitié et à HIGH sinon.

→ dans ce code donc il faut utiliser le bon N° de pin

mon propos était plutot de pointer sur les incompréhensions qui peuvent surgir quand on se pose trop de questions sur les croquis glanés sur le net :

byte sensorpin = 0 ou 14 ou A0 ;
int sensorpin = 0 ou 14 ou A0 ;
const int sensorpin = 0 ou 14 ou A0 ;
#define sensorpin 0 ou 14 ou A0

etc..

c'est la meme chose excepté la taille réservée en mémoire (flash ou ram ?) :o

conclusion : je telecharge croquis tout fait : çà fonctionne tant mieux, çà fonctionne pas : je passe à un autre

Merci à la communauté arduino et à tous ceux qui écrivent les biblios opensource

elektrax:
byte sensorpin = 0 ou 14 ou A0 ;
int sensorpin = 0 ou 14 ou A0 ;
const int sensorpin = 0 ou 14 ou A0 ;
#define sensorpin 0 ou 14 ou A0

etc..

c'est la meme chose excepté la taille réservée en mémoire (flash ou ram ?) :o

Dans la plupart des cas le compilateur se rend compte de ce que vous faites des ces constantes ou variables et comme elles tiennent sur un seul octet c’est plus efficace d’insérer la valeur directement dans le code binaire généré. Il n’y a donc aucune SRAM pré allouee pour la variable, elle sera dans le code en mémoire flash comme constante lors de l’appel de la fonction (pinMode, digitalWrite...) et bien sûr donc ça génère un usage de SRAM sur la pile lors de l’appel de la fonction à l’exécution, mémoire libérée au retour de la fonction.

La « bonne » déclaration pour des Pins (semantique et syntaxique) c’est const uint8_t si vous voulez faire du C “natif moderne” ou const unsigned char pour les pros du C “canal historique” et si vous voulez profiter des macros Arduinos vous pouvez utiliser const byte qui revient au même. Avec cette approche vous mettez toutes les chances de votre côté pour que l’optimiseur de code n’alloue pas de memoire, c’est toujours un octet gagné