Arduino 2019-4.9: mooc discussion

je vous invite à lire les discussions du Mooc qui apportent énormément en idée innovantes.

Parmi le lot, j’ai relevé:

 

5 leds au lieu de 1 par SwannNerds

Hello, J’ai fait un petit exercice, j’ai utilisé 5 leds qui s’allument progressivement au lieu de 1. Voici le schéma et le code pour ceux que ça intéresserait 🙂

schéma 5 leds

// Initialisation des constantes :
const int analogInPin = A0;   // Numéro de la broche à laquelle est connecté la photorésistance
const int led1 = 9;
const int led2 = 10;
const int led3 = 11;
const int led4 = 12;
const int led5 = 13;

int sensorValue = 0;          // Valeur lue sur la photorésistance
int outputValue = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;

void setup() {
  // Indique les sorties vers les leds
  pinMode(led1, OUTPUT);      
  pinMode(led2, OUTPUT);     
  pinMode(led3, OUTPUT);     
  pinMode(led4, OUTPUT);     
  pinMode(led5, OUTPUT);     
  // Indique que la broche analogInPin est une entrée :
  pinMode(analogInPin, INPUT);     
}

// Fonction qui prend un entier en entré
// et soustrait jusqu'à 255 de ce nombre
// renvoit la valeur sous-traite
// Notez le & dans le type du paramètre qui indique que le
// paramètre est passé par "référence" et non par "valeur"
int get_next_led_val(int& val)
{
  // le paramètre est déjà à zéro
  // on ne peut rien soustraire
  // on renvoit 0
  if (val==0)
    return 0;
  // variable pour conserver la valeur à renvoyer
  int ret_val = 0;
  // le paramètre a une valeur comprise entre 0 et 255
  // on va donc tout enlever, il sera à zéro
  // on renvoit la valeur initial du paramètre
  if (val <= 255)
  {
    ret_val = val;
    val = 0;
  }
  else
  {
    // le paramètre est plus grand que 255
    // on lui enlève donc 255
    // on renvoit 255
    ret_val = 255;
    val = val - 255;
  }
  // renvoit de la valeur
  return ret_val; 
}

void loop() {
  // lit la valeur de la photorésistance et
  // stocke le résultat dans sensorValue :
  sensorValue = analogRead(analogInPin);            
  // change sensorValue vers une intervalle de 0 à 255
  // et stocke le résultat dans outputValue :

  // comme on a 5 leds, la valeur maximum est 5 * 255 = 1275
  outputValue = map(sensorValue, 0, 1023, 0, 1275);  

  // On allume la led 1 en "consommant" jusqu'à 255 de outputValue
  analogWrite(led1, get_next_led_val(outputValue));
  // idem pour la led2...
  analogWrite(led2, get_next_led_val(outputValue)); 
  // la led3..
  analogWrite(led3, get_next_led_val(outputValue));
  // ...
  analogWrite(led4, get_next_led_val(outputValue)); 
  // .
  analogWrite(led5, get_next_led_val(outputValue)); 
}

Une seule commande pour les 2 leds  par jpaul31Nailloux

Bonjour, une astuce pour économiser les sorties.

Comme les deux LEDS fonctionnent en exclusion mutuelle, une seule ligne de commande est nécessaire et cela fonctionne bien.

La sortie tout ou rien de l’arduino tire la broche de la LED à 0V ou +5V enter image description here

Bonjour, lorsque la sortie digitale est à 0v la led rouge se retrouve avec +5V sur l’anode et 0V sur la cathode pendant que la verte à 0V sur chacune des électrodes.
Quand la sortie digitale vaut +5V, la verte à +5V à l’anode et 0V à la cathode pendant que la rouge a +5V sur chaque électrode.
Si la sortie digitale est en l’air alors les 2 diodes s’allument.
Initialement j’avais pensé au schéma suivant mais il tire un peu tout le temps pour fabriquer un point milieu.
L’avantage c’est que les leds ne s’allument pas si la commande de l’arduino est en l’air
enter image description here