Go Down

Topic: simulateur Aube et crépuscule LED (Read 2024 times) previous topic - next topic

derdhih

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.


infobarquee

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
AUCUNE AIDE PAR MP

bricoleau

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

derdhih

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.

Code: [Select]

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);}

}

bricoleau

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 ligne
Code: [Select]
for(unsigned int x = 1; x > 65535; x++)contient une erreur : inversion de l'opérateur de comparaison > au lieu de <

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 :)
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
AUCUNE AIDE PAR MP

derdhih

avec ce code, ca va tourner en boucle tant que le switch est sur on.
incrémentation de 1 toutes les 50 micro secondes :)
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é !!!

derdhih

Code: [Select]
/*
  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);
  }
}}

infobarquee

#8
Nov 24, 2015, 07:54 pm Last Edit: Nov 24, 2015, 07:56 pm by infobarquee
Quote
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.

Code: [Select]

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);
}
}
AUCUNE AIDE PAR MP

derdhih

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

Code: [Select]

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 .
Code: [Select]
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'




dfgh

ton prg pour qu'il compile, mais pas testé
Code: [Select]
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);
    }
  }
}

infobarquee

si tu copie pas comme il faut, évidemment
Code: [Select]
;} else ok=0;};
cherche l'erreur :)
AUCUNE AIDE PAR MP

derdhih

si tu copie pas comme il faut, évidemment
Code: [Select]
;} else ok=0;};
cherche l'erreur :)
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

Code: [Select]
/*
  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.

bricoleau

Une première indication...

Code: [Select]
  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) ?

bricoleau

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

Go Up