Skyduino:~#
Articles
arduino, programmation, projet

[Arduino] Bougie « virtuelle » à led

Salut tout le monde 🙂

En se moment il fait froid et on voudrez tous être derrière un bon feu pour ce réchauffer ^^

Mais faute d’avoir une cheminé j’ai une carte arduino UNO.
NON! Je ne vais pas mettre le feu à mon arduino, ni même à ma corbeille à papier ou à un rouleau de pq (hein Jean-François ;)),
je vais vous montrer comme faire une vrai fausse bougie !

Il y a déja quelque temps j’avais fait un programme dans le même style, ce fut une catastrophe, l’effet de bougie était vraiment nulle …
Mais arduimat membre du forum arduino.cc m’as donnez une idée toute bête, lui même a réalisé un bougie électronique (cf forum) avec un point tout simple mais important un delay(random(x)) entre chaque analogWrite.

Mon code d’origine était trés simple, 3 analogWrite(x, random(x)) et un delay(100), seulement voila le delay(100) (fixe) rend l’effet de flamme irréaliste et dégueulasse.
J’ai repris mon programme, modifié les delay, et voici le résultat :

L’effet voulu est celui d’une flamme vacillante, avec par moment de petits courants d’air qui la font presque s’éteindre.
Dans l’ancien programme j’utilisai seulement 3 leds (2 jaune et une rouge), pour cette nouvelle version j’en utilise 6 (3 jaune et 3 rouge) le but étant de rendre l’effet flamme plus important.

Le câblage est très simple :

Et voici le code :

/* Definition of led pin */
#define J1_PIN 3
#define J2_PIN 6
#define J3_PIN 10
#define R1_PIN 5
#define R2_PIN 9
#define R3_PIN 11

void setup()
{
  pinMode(J1_PIN, OUTPUT);
  pinMode(J2_PIN, OUTPUT);
  pinMode(J3_PIN, OUTPUT);
  pinMode(R1_PIN, OUTPUT);
  pinMode(R2_PIN, OUTPUT);
  pinMode(R3_PIN, OUTPUT);
  randomSeed(analogRead(A0));
  effect_takefire();
}

/* Array of fonction effect */
typedef void (*fnct)();
fnct effect[] = {effect_flickering, effect_fire, effect_moving, effect_fire, effect_fade_inout_slow, effect_fire, effect_fade_inout_fast, effect_fire, effect_wind, effect_fire}; // LEN:10

void loop()
{
  effect[random(9)]();
  randomDelay(random(50, 100));
}


void effect_flickering()
{
  for(byte i = 1; i < random(5); i++)
  {
    analogWrite(R1_PIN, random(120) + 135);
    analogWrite(R2_PIN, random(120) + 135);
    analogWrite(R3_PIN, random(120) + 135);
    analogWrite(J1_PIN, random(120) + 135);
    analogWrite(J2_PIN, random(120) + 135);
    analogWrite(J3_PIN, random(120) + 135);
    delay(i);
  }
}


void effect_moving()
{
  for(byte i = 0; i < random(5); i++)
  {
    analogWrite(R1_PIN, random(120 + i));
    analogWrite(R2_PIN, random(120 + i) + 65);
    analogWrite(R3_PIN, random(120 + i) + 135);
    analogWrite(J1_PIN, random(120));
    analogWrite(J2_PIN, random(120) + 65);
    analogWrite(J3_PIN, random(120) + 135);
    delay(random(200));
  }
}


void effect_fade_in_slow()
{
  for(byte i = 0; i < 200; i++)
  {
    analogWrite(R1_PIN, random(i) + 30);
    analogWrite(R2_PIN, random(i) + 30);
    analogWrite(R3_PIN, random(i) + 30);
    analogWrite(J1_PIN, random(i) + 30);
    analogWrite(J2_PIN, random(i) + 30);
    analogWrite(J3_PIN, random(i) + 30);
    delay(random(200));
  }
}

void effect_fade_inout_slow()
{
  for(byte i = 200; i > 0; i--)
  {
    analogWrite(R1_PIN, random(i) + 30);
    analogWrite(R2_PIN, random(i) + 30);
    analogWrite(R3_PIN, random(i) + 30);
    analogWrite(J1_PIN, random(i) + 30);
    analogWrite(J2_PIN, random(i) + 30);
    analogWrite(J3_PIN, random(i) + 30);
    delay(random(100));
  }
  for(byte i = 0; i < 200; i++)
  {
    analogWrite(R1_PIN, random(i) + 30);
    analogWrite(R2_PIN, random(i) + 30);
    analogWrite(R3_PIN, random(i) + 30);
    analogWrite(J1_PIN, random(i) + 30);
    analogWrite(J2_PIN, random(i) + 30);
    analogWrite(J3_PIN, random(i) + 30);
    delay(random(100));
  }
}

void effect_fade_inout_fast()
{
  for(byte i = 200; i > 0; i--)
  {
    analogWrite(R1_PIN, random(i) + 30);
    analogWrite(R2_PIN, random(i) + 30);
    analogWrite(R3_PIN, random(i) + 30);
    analogWrite(J1_PIN, random(i) + 30);
    analogWrite(J2_PIN, random(i) + 30);
    analogWrite(J3_PIN, random(i) + 30);
    delay(random(25));
  }
  for(byte i = 0; i < 200; i++)
  {
    analogWrite(R1_PIN, random(i) + 30);
    analogWrite(R2_PIN, random(i) + 30);
    analogWrite(R3_PIN, random(i) + 30);
    analogWrite(J1_PIN, random(i) + 30);
    analogWrite(J2_PIN, random(i) + 30);
    analogWrite(J3_PIN, random(i) + 30);
    delay(random(25));
  }
}

/*
 * Effect of wind boosting fire
 */
void effect_wind()
{
  for(byte i = 0; i < random(20); i++)
  {
    analogWrite(R1_PIN, random(120 + i));
    analogWrite(R2_PIN, random(120 + i) + 65);
    analogWrite(R3_PIN, random(120 + i) + 135);
    analogWrite(J1_PIN, random(120));
    analogWrite(J2_PIN, random(120) + 65);
    analogWrite(J3_PIN, random(120) + 135);
    delay(random(100));
  }
}

/*
 * Fire Effect
 */
void effect_fire()
{
  analogWrite(R1_PIN, random(120) + 135);
  analogWrite(R2_PIN, random(120) + 135);
  analogWrite(R3_PIN, random(120) + 135);
  analogWrite(J1_PIN, random(120) + 135);
  analogWrite(J2_PIN, random(120) + 135);
  analogWrite(J3_PIN, random(120) + 135);
  delay(random(100));
}

/*
 * Take Fire Effect
 *
 * The fire begin by fading slowly, before moving  little and finally take really fire
 */
void effect_takefire()
{
  effect_fade_in_slow();
  effect_moving();
  effect_fire();
  effect_fire();
}

/*
 * Environement (EMF) affected random delay effect
 * 
 * stablity - level of random stability
 */
void randomDelay(byte stability)
{
  unsigned int seed = analogRead(A0);
  seed = seed * (stability + 1) / random(seed % stability, seed * (stability + 1));
  delay(seed);
}

Vous remarquerai les différents effets visuelle géré à grand coup de random() 😉

Advertisements

Discussion

3 réflexions sur “[Arduino] Bougie « virtuelle » à led

  1. Superbe l’effet obtenu. Exactement ce que je cherchais. Bravo pour « l’ensemble de votre œuvre ».
    Il parait que l’on peut obtenir également une simulation très réaliste en mesurant le courant de fuite d’un transistor.
    Dès que je retrouve les références je vous en ferrai part.
    A bientôt

    Publié par icare petibles | 22 juin 2012, 0 h 26 min
  2. Super ca fonctionne a merveille dans les citrouilles de Halloween 😉

    Publié par JonJon | 24 octobre 2013, 21 h 47 min

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.