simulateur Aube et crépuscule LED

Bonjour les Amis,
Premièrement je tien à vous dire que c’est mon premier projet arduino.

je veux réaliser un projet pour simuler l’aube et crépuscule pour mes oiseaux.
j’ai déjà un interrupteur programmable, qui me permet de calculer automatiquement l’heure du lever et du coucher du soleil. mais, connecté directement à une lampe ça crée un stresse important pour mes oiseaux.
Je voudrai crée l’effet du soleil on augmentant graduellement la lumière au lever et la diminuer de la même façon au coucher.
voir ci-joint le schéma de mon projet.
pour simplifier.

  • Quand la switch et à ON la lumière commence à augmenter (pendant 25 minute ±) jusqu’à atteindre la pleine puissance.
  • resté allumé jusqu’à ce que la switch revient à OFF.

bonjour,
et donc?
il faudrait un programme pour dire s'il est bon ou non.
ce n'est pas compliqué a faire en utilisant le pwm de la broche.
il y a un exemple dians l'ide de mémoire pour dimmer une led.
c'est le même principe, en utilisant en plus la fonction millis().

mais pourquoi utiliser un switch?
un module rtc, une comparaison des heures et hop.
voir utiliser la lib timer.h

Bonjour

Donc... quelle est ta demande ?
Comment est-ce qu'on programme un signal PWM ?

NB : avec un arduino, point n'est besoin de dispositif externe pour calculer l'heure de lever et de coucher du soleil.
Voir ICI

Bonjour à vous,
Merci pour vos repenses.
pour l'heure vos comprendrait que j'ai besoin que le programme me calcule l'heure du lever et coucher du soleil. ce qui m'est impossible à faire avec mes compétences actuelles. mais je suis prôneur bien-sure .
voici le code que j'ai pu faire.

int inPin = 2;         // the number of the input pin
int outPin = 13;       // the number of the output pin
int reading;           // the current reading from the input pin

void setup()
{
cli();                                // Disable all interrupts
TCCR1A = 0;                           // Clear all flags in control register A
TCCR1B = 0;                           // Clear all flags in control register B
TCNT1 = 0;                            // Zero timer 1 count

OCR1A = 32768;                        // Preload compare match register (50% duty cycle)

// No prescaler   
//TCCR1B |= _BV(CS12);   
//TCCR1B |= _BV(CS11);   
TCCR1B |= _BV(CS10);   

TIMSK1 |= _BV(OCIE1A);                // Enable timer compare interrupt
TIMSK1 |= _BV(TOIE1);                 // Enable timer overflow interrupt

sei();                                // enable all interrupts

pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
}

void loop()
{
reading = digitalRead(inPin);
if (reading == HIGH ) {
  for(unsigned int x = 65535; x > 1; x--)
//cli();
OCR1A = x;
//sei();
delayMicroseconds(50);}
else 
for(unsigned int x = 1; x > 65535; x++){
//cli();
OCR1A = x;
//sei();
delayMicroseconds(50);}

}

Bonjour

Manipuler directement les registres n’est pas du tout ce que je conseillerais pour débuter sur arduino.

Tu devrais écrire et tester quelques programmes simples pour générer un signal PWM.

Au passage, la lignefor(unsigned int x = 1; x > 65535; x++)contient une erreur : inversion de l’opérateur de comparaison > au lieu de <

avec ce code, ca va tourner en boucle tant que le switch est sur on.
incrémentation de 1 toutes les 50 micro secondes :slight_smile:
surtout que le pwm ne va que jusqu’à 255

je serais toi en reprenant ton switch ca ferait un truc comme ca très simple

on lit switch
si switch ON =>> ok =1
si switch OFF =>> ok = 0

si ok = 1 ET LUM < 255
on augmente la lumière toutes les minutes de 10 (fonction millis() ) LUM = 0 au départ

si LUM >= 255 ET ok = 1 =>>>> LUM = 255

si ok = 0 ET LUM = 255
on diminue la lumière toutes les minutes de 10 (fonction millis() ) LUM = 255 au départ

si ok = 0 ET LUM =0 =>>>> LUM = 0

infobarquee:
avec ce code, ca va tourner en boucle tant que le switch est sur on.
incrémentation de 1 toutes les 50 micro secondes :slight_smile:
surtout que le pwm ne va que jusqu’à 255

je serais toi en reprenant ton switch ca ferait un truc comme ca très simple

on lit switch
si switch ON =>> ok =1
si switch OFF =>> ok = 0

si ok = 1 ET LUM < 255
on augmente la lumière toutes les minutes de 10 (fonction millis() ) LUM = 0 au départ

si LUM >= 255 ET ok = 1 =>>>> LUM = 255

si ok = 0 ET LUM = 255
on diminue la lumière toutes les minutes de 10 (fonction millis() ) LUM = 255 au départ

si ok = 0 ET LUM =0 =>>>> LUM = 0

Bonjour, et merci pour votre reponse .
je viens de d’essayer de faire ça mais je ne sais pas comment demander au programme de laisser la LED allumé !!!

/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == LOW) {
   // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
 } } else {
   // fade out from max to min in increments of 5 points:
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 10) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }
}}

Bonjour, et merci pour votre reponse .
je viens de d’essayer de faire ça mais je ne sais pas comment demander au programme de laisser la LED allumé !!!

il suffit de retranscrire ce que je t’ai mis en code.

int compteur;
int ok ;

void setup........

void loop(){
if (buttonState == LOW) {
 ok=1;
}else[
 ok = 0;
}

if(ok ==1 && compteur != 255){
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10) {
    analogWrite(ledPin, fadeValue);
    delay(30);
 compteur = 255;
 }

if(ok ==1 && compteur == 255){
    analogWrite(ledPin, compteur);
}

if(ok ==0 && compteur != 0){
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 10) {
analogWrite(ledPin, fadeValue);
delay'30);
compteur = 0;
}
if(ok ==0 && compteur == 0){
analogWrite(ledPin, compteur);
}
}

infobarquee:
il suffit de retranscrire ce que je t’ai mis en code.

int compteur;

int ok ;

void setup…

void loop(){
if (buttonState == LOW) {
ok=1;
}else[
ok = 0;
}

if(ok ==1 && compteur != 255){
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10) {
    analogWrite(ledPin, fadeValue);
    delay(30);
compteur = 255;
}

if(ok ==1 && compteur == 255){
    analogWrite(ledPin, compteur);
}

if(ok ==0 && compteur != 0){
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 10) {
analogWrite(ledPin, fadeValue);
delay’30);
compteur = 0;
}
if(ok ==0 && compteur == 0){
analogWrite(ledPin, compteur);
}
}

MErci, mais j’ai une erreur en compilant le programme voici mon code et voir l’erreur apres .

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
int compteur;
int ok ;
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop(){
if (buttonPin == LOW) {
 ok=1 
 ;} else ok=0;};
      if(ok ==1 && compteur != 255){
        for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10) {
         analogWrite(ledPin, fadeValue);
         delay(30);
       compteur = 255;
 }

if(ok ==1 && compteur == 255){
    analogWrite(ledPin, compteur);
}

if(ok ==0 && compteur != 0){
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 10)
analogWrite(ledPin, fadeValue);
delay (30);
compteur = 0;
}
if(ok ==0 && compteur == 0){
analogWrite(ledPin, compteur);
}

Arduino:1.6.6 (Windows 7), Carte : “Arduino Nano, ATmega328”

Button_modifi_:47: error: expected unqualified-id before ‘if’

if(ok ==1 && compteur != 255){

^

exit status 1
expected unqualified-id before ‘if’

ton prg pour qu’il compile, mais pas testé

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
int compteur;
int ok ;
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup()
{
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop()
{
  if (buttonPin == LOW)
  {
    ok = 1;
  } else
  {
    ok = 0;
  }

  if (ok == 1 && compteur != 255)
  {
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10)
    {
      analogWrite(ledPin, fadeValue);
      delay(30);
      compteur = 255;
    }

    if (ok == 1 && compteur == 255)
    {
      analogWrite(ledPin, compteur);
    }

    if (ok == 0 && compteur != 0)
    {
      for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 10)
        analogWrite(ledPin, fadeValue);
      delay (30);
      compteur = 0;
    }
    if (ok == 0 && compteur == 0)
    {
      analogWrite(ledPin, compteur);
    }
  }
}

si tu copie pas comme il faut, évidemment

 ;} else ok=0;};

cherche l'erreur :slight_smile:

infobarquee:
si tu copie pas comme il faut, évidemment

 ;} else ok=0;};

cherche l’erreur :slight_smile:

Bonjour,
voici le programme que j’ai fait.
Résultat !!! rein ne se passe la led ne s’allume même pas switch ON ou OFF

 /*
  Conditionals - If statement

 This example demonstrates the use of if() statements.
 It reads the state of a potentiometer (an analog input) and turns on an LED
 only if the potentiometer goes above a certain threshold level. It prints the analog value
 regardless of the level.

 The circuit:
 * potentiometer connected to analog pin 0.
 Center pin of the potentiometer goes to the analog pin.
 side pins of the potentiometer go to +5V and ground
 * LED connected from digital pin 13 to ground

 * Note: On most Arduino boards, there is already an LED on the board
 connected to pin 13, so you don't need any extra components for this example.

 created 17 Jan 2009
 modified 9 Apr 2012
 by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/IfStatement

 */

// These constants won't change:
// pin that the sensor is attached to
const int ledPin = 13;  
int switch1 = 12;
int brightness = 0;    
int fadeValue ;  
int compteur;
int ok ;
int buttonState = 0; 
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  pinMode (switch1,INPUT_PULLUP);
  // initialize serial communications:
  Serial.begin(9600);
}

void loop() {
 {
  if (switch1 == LOW)
  {
    ok = 1;  }
    else
  {
    ok = 0;
  }

  if (ok == 1 && compteur != 255)
  {
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10)
    {
      analogWrite(ledPin, fadeValue);
      delay(30);
      compteur = 255;
    }

    if (ok == 1 && compteur == 255)
    {
      analogWrite(ledPin, compteur);
    }

    if (ok == 0 && compteur != 0)
    {
      for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 10)
        analogWrite(ledPin, fadeValue);
      delay (30);
      compteur = 0;
    }
    if (ok == 0 && compteur == 0)
    {
      analogWrite(ledPin, compteur);
    }
  }
}}

Merci pour votre aide tres apperciée.

Une première indication...

  if (switch1 == LOW)
  {
    ok = 1;  }
    else
  {
    ok = 0;
  }

Qu'est-ce que switch1 ?
C'est une variable de type entier, initialisée à 12 et jamais modifiée.

Ne manquerait-il pas un petit digitalRead(switch1) ?

if (ok == 1 && compteur != 255)
{
  ...
  if (ok == 0 && ...) //voici un if dans lequel on n'entrera jamais
  {
  }
}

extrait commenté :

    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 10)
    {
      analogWrite(ledPin, fadeValue);
      delay(30);
      compteur = 255;  // nb : cette instruction n'a rien à faire dans la boucle for
    }

    if (ok == 1 && compteur == 255) // nb: le test ok == 1 est inutile puisque déjà fait au niveau supérieur
    {
      analogWrite(ledPin, compteur);
    }

Je comprends l’utilité du deuxième analogWrite, pour atteindre la valeur max.
Mais pourquoi ne pas tout simplement réduire le pas de la boucle for, en divisant également de moitié le delay de manière à rester sur la même durée globale ?

    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5)
    {
      analogWrite(ledPin, fadeValue);
      delay(15);
    }

déjà il faudrait tester le résultat du digitalRead(switch1) dans la console.
LOW HIGH, on ne sait pas comment s’est cablé.

si on reprend ton cahier des chartges

si switch sur ON
on augmente pendant 25mn la lumière pour arriver au maxi (255)
on laisse au maxi jusqu’à switch OFF
on diminue la lumière jusqu’à zéro pendant durant X minutes

pour moi, ca donnerait ceci, en supposant que switch est en HIGH si actif

int compteur;
const int ledPin = 13;  

void setup.....
Serial.begin(9600);

void loop(){
Serial.print("Etat switch"); // verification de l etat
Serail.println(digitalRead(switch)); // du switch

if ( digitalRead(switch) == HIGH && compteur != 255){
for (int fade = 0; fade <= 255; fade +=10){
analogWrite (ledPin, fade);
compteur = 255;
delay(10000);
Serial.println("boucle 1 "); 
}
if ( digitalRead(switch) == HIGH && compteur == 255){
analogWrite (ledPin, compteur);
Serial.println("boucle 2 "); 
}

if ( digitalRead(switch) == LOW){
for (int fade = 255; fade > 0 fade -=10){
analogWrite (ledPin, fade);
delay(10000);
compteur = 0;
Serial.println("boucle 3 "); 
}

a fais quelques bugs, ce code compile et fonctionne

int compteur;
const int ledPin = 13;
const int switch1 = 12;

void setup() {
  Serial.begin(9600);
  pinMode(switch1, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}


void loop() {
  Serial.print("Etat switch"); // verification de l etat
  Serial.println(digitalRead(switch1)); // du switch

  if ( digitalRead(switch1) == LOW && compteur != 255) {
    for (int fade = 0; fade <= 255; fade += 10) {
      analogWrite (ledPin, fade);
      compteur = 255;
      delay(500);
      Serial.println("boucle 1 ");
    }
  }
    if ( digitalRead(switch1) == LOW && compteur == 255) {
      analogWrite (ledPin, compteur);
      Serial.println("boucle 2 ");
    }

    if ( digitalRead(switch1) == HIGH && compteur == 255) {
      for (int fade1 = 255; fade1 > 0 ;fade1 -= 10) {
        analogWrite (ledPin, fade1);
        delay(500);
        compteur = 0;
        Serial.println("boucle 3 ");
      }
    }

  }

Bonjour les Amis,
j’ai posté sur le forum en Anglais. et j’ai pu avoir un Code qui Fonctionne avec une résolution de 65535 (16 bits) .
pour avoir un long effet on a qu’a jouer avec le délais ‘’ delayMicroseconds(10)’’ par delay(18) pour avoir un effet crépuscule et lever de 20 minute.
voici le code:

#define cutoff 15

const byte inPin = 8;                   // the number of the input pin
const byte outPin = 13;                 // the number of the output pin
uint16_t reading = 20;               // the current PWM

void setup()
{
  pinMode(inPin, INPUT_PULLUP);         // The button pin
  pinMode(outPin, OUTPUT);              // The LED pin
  
  cli();                                // Disable all interrupts
  TCCR1A = 0;                           // Clear all flags in control register A
  TCCR1B = 0;                           // Clear all flags in control register B
  TCNT1 = 0;                            // Zero timer 1 count
  OCR1A = reading;                      // Preload compare match register
  TCCR1B |= _BV(CS10);                  // No pre-scaling on clock source
  TIMSK1 |= _BV(OCIE1A);                // Enable timer compare interrupt
  TIMSK1 |= _BV(TOIE1);                 // Enable timer overflow interrupt
  sei();                                // enable all interrupts
}

void loop()
{
  if (digitalRead(inPin) == LOW ){
    if (reading > cutoff) reading--;
  }
  else{
    if (reading < 65535) reading++;
  }
  OCR1A = reading;
  if (reading == cutoff){
    TIMSK1 &= ~_BV(CS10);               // Disable timer clock
  }
  else{
    TIMSK1 |= _BV(CS10);                // Enable timer clock
  }
  delayMicroseconds(10);
  //if (reading < (cutoff * 2) || (reading > (65536 - (cutoff * 2)))) delay(500);
}

ISR(TIMER1_OVF_vect){                   // Timer1 overflow interrupt service routine
  PORTB |= _BV(PORTB5);                 // Turn LED (pin 13) on
}

ISR(TIMER1_COMPA_vect){                 // Timer1 compare interrupt service routine
  PORTB &= ~_BV(PORTB5);                // Turn LED off
}