Go Down

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

bricoleau

extrait commenté :

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

Code: [Select]
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5)
    {
      analogWrite(ledPin, fadeValue);
      delay(15);
    }



infobarquee

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

Code: [Select]

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

infobarquee

a fais quelques bugs, ce code compile et fonctionne
Code: [Select]

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

  }
AUCUNE AIDE PAR MP

derdhih

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:
Code: [Select]
#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
}

Go Up