#1 2016-03-29 18:35:36

Wiper
Учасник
Зареєстрований: 2016-03-29
Повідомлень: 5

Помогите разобраться с кодом

Код рабочий, но не получается добиться нужного эффекта!
А именно имеется 3 канала, которые должны плавно зажигаться
друг за другом и спустя 2 минуты плавно затухать, но вместе.
Зажигаются нормально, а вот затухают почему-то с мерцанием!

В чем может быть проблема?
Я в этом деле новичек, так что сильно не ругайтесь.

Неактивний

#2 2016-03-29 18:45:21

Wiper
Учасник
Зареєстрований: 2016-03-29
Повідомлень: 5

Re: Помогите разобраться с кодом

Вот сам код.

#define LED1 3         // 1 канал светодиода, подключен к 3 пину ARDUINO
#define LED2 5         // 2 канал светодиода, подключен к 5 пину ARDUINO
#define LED3 6         // 3 канал светодиода, подключен к 6 пину ARDUINO
#define LEDon 13       // Светодиодный индикатор на 13 пине, включается когда срабатывает датчик движения
#define DayNight 500   // Парог срабатывания датчика освещенности
#define timeON 3       // Скорость плавного включения светодиодов
#define timeOFF 27     // Скорость плавного выключения светодиодов
#define delayON 120000 // Время задержки на выключение, если нет сигнала с датчика движения
int Move = A0;         // Датчик движения, подключен к пину A0 на ARDUINO
int Foto = A1;         // Датчик освещенности, подключен к пину A1 на ARDUINO
int i = 0;
int on = 0;
int off = 1;
unsigned long timeroff;
int L = 0;
int N = 0;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LEDon, OUTPUT);
  pinMode(Move, INPUT);
  pinMode(Foto, INPUT);
}

void loop() {
  int val1=digitalRead(Move);
  delay(10);
  int val2=analogRead(Foto);

  if (val1==1) {
    digitalWrite(LEDon, HIGH);
  }
  else if (val1==0) {
    digitalWrite(LEDon, LOW);
  }
  if (val1==1&&on==0&&L==1) {
    for (i = i; i < 256; i++) {
      analogWrite(LED1, i);
      analogWrite(LED2, i);
      analogWrite(LED3, i);
      delay(timeON);
    }
    on=1;off=0;
    L=0;
    N=1;
  }
  if (val2<200 && N==0) {
    analogWrite(LED1, 1);
    delay(150);
  }
  if (val2>300 && N==0) {
    analogWrite(LED1, 0);
    delay(150);
  }
  
  if (val1==1&&on==0&&L==0&&val2<800) {
    for (i = 0; i < 256; i++) {
      analogWrite(LED1, i);
      delay(timeON);
      if (i==255) {
        for (i = 0; i < 256; i++) {
          analogWrite(LED2, i);
          delay(timeON);
          if (i==255) {
            for (i = 0; i < 256; i++) {
              analogWrite(LED3, i);
              delay(timeON);}
          }
        }
      }
    }
    on=1;off=0;N=1;}

else if (val1==1&&on==1) {
  off=0;timeroff=0;
}

else if (val1==0&&val2<800&&timeroff==0) {
  timeroff=millis();
}

else if (val1==0&&off==0&&millis()-timeroff>delayON) {
/*  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  delay(10);*/
  for (i = 255; i >= 0; i--) {
    analogWrite(LED1, i);
    analogWrite(LED2, i);
    analogWrite(LED3, i);
    delay(timeOFF);

  int val1=digitalRead(Move);
  int val2=analogRead(Foto);
  N=0;
  if (val1==1) {
    digitalWrite(LEDon, HIGH);
  }
  else if (val1==0) {
    digitalWrite(LEDon, LOW);
  }

    if(digitalRead(Move)==HIGH && val2<800) {
      L=1;
      break;
    }
  }
  off=1;on=0;timeroff=0;
}
}

Остання редакція Wiper (2016-03-29 18:50:58)

Неактивний

#3 2016-04-07 15:48:58

Well
Учасник
Зареєстрований: 2016-04-07
Повідомлень: 1

Re: Помогите разобраться с кодом

Проблема простая,при снижении напряжения светодиод начинает "мерцать" по тому что ему мало напряжения и это особенность полупроводником.Проэксперементируйте саме.Удачи

Неактивний

#4 2016-04-12 12:13:04

Wiper
Учасник
Зареєстрований: 2016-03-29
Повідомлень: 5

Re: Помогите разобраться с кодом

Well пише:

Проблема простая,при снижении напряжения светодиод начинает "мерцать" по тому что ему мало напряжения и это особенность полупроводником.Проэксперементируйте саме.Удачи

Чем это можно компенсировать или как переделать?

Неактивний

#5 2016-04-12 12:56:26

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помогите разобраться с кодом

не думаю  что проблема мерцания в занижении питания 

если верить документации analogWrite это  ШИМ
но если сделаете паузу неравномерную либо щас код посмотрим

else if (val1==0&&off==0&&millis()-timeroff>delayON) {
/*  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  delay(10);*/
  for (i = 255; i >= 0; i--) {
    analogWrite(LED1, i);
    analogWrite(LED2, i);
    analogWrite(LED3, i);
    delay(timeOFF);

  int val1=digitalRead(Move);
  int val2=analogRead(Foto);
  N=0;
  if (val1==1) {
    digitalWrite(LEDon, HIGH);
  }
  else if (val1==0) {
    digitalWrite(LEDon, LOW);
  }

    if(digitalRead(Move)==HIGH && val2<800) {
      L=1;
      break;
    }
  }

это точно нормальный функционал?

выносите выключение светодиодов в таймер,  по сути отдельный поток, и делайте обработку условными семафорами  ( 1 -  нужно включать 1 уровень, и т.д. 4 - выключать плавно, 0 - ничего не делать  ) что ли
задачи плавного управления освещением никогда не должны быть  в основном потоке, неоднозначные задержки, всегда дают эффект вырванных глаз (   
(

Неактивний

#6 2016-04-20 18:11:27

Wiper
Учасник
Зареєстрований: 2016-03-29
Повідомлень: 5

Re: Помогите разобраться с кодом

NoName пише:

выносите выключение светодиодов в таймер,  по сути отдельный поток, и делайте обработку условными семафорами  ( 1 -  нужно включать 1 уровень, и т.д. 4 - выключать плавно, 0 - ничего не делать  )

Я новичок в ардуино! Как это правильно сделать?

Неактивний

#7 2016-04-21 15:20:46

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помогите разобраться с кодом

Wiper, привет, я тоже новичок в ардуино!
посмотрите на свой код, он ведь реально непонятный,
а раз плохо читается то и проблему не увидите

Неактивний

#8 2016-04-22 12:06:12

Wiper
Учасник
Зареєстрований: 2016-03-29
Повідомлень: 5

Re: Помогите разобраться с кодом

NoName пише:

Wiper, привет, я тоже новичок в ардуино!
посмотрите на свой код, он ведь реально непонятный,
а раз плохо читается то и проблему не увидите

Добрый день. Вы имеете ввиду то, как расположены операторы в коде?
Я пытался расставлять так, как предлагает программа.
Если можете покажите пример как удобно и я переделаю.

Спасибо!

Неактивний

#9 2016-04-22 13:09:36

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Помогите разобраться с кодом

https://github.com/jgillick/arduino-LEDFader
можно начать с это библиотеки

умеет  такое :

/*
 * LED.h
 *
 *  Created on: Sep 24, 2013
 *      Author: jeremy
 */

#include "Arduino.h"

#ifndef LEDFader_H_
#define LEDFader_H_

// The minimum time (milliseconds) the program will wait between LED adjustments
// adjust this to modify performance.
#define MIN_INTERVAL 20

class LEDFader {
public:
  // Who likes dealing with function pointers? (Ok, I do, but no one else does)
  typedef uint8_t (*curve_function)(uint8_t);
private:
  uint8_t pin;
  unsigned long last_step_time;
  unsigned int interval;
  uint8_t color;
  uint8_t to_color;
  unsigned int duration;
  float percent_done;
  curve_function curve;

  public:

    // Create a new LED Fader for a pin
    LEDFader(uint8_t pwm_pin=0);

    // Set the PWM pin that the LED is connected to
    void set_pin(uint8_t pwm_pin);
    uint8_t get_pin();

    // Set an LED to an absolute PWM value
    void set_value(int pwm);

    // Get the current LED PWM value
    uint8_t get_value();

    // Get the PWM value we're fading to
    uint8_t get_target_value();
    
    // Set curve to transform output
    void set_curve(curve_function);
    
    // Get the current curve function pointer
    curve_function get_curve();

    // Fade an LED to a PWM value over a duration of time (milliseconds)
    void fade(uint8_t pwm, unsigned int time);


    // Returns TRUE if there is an active fade process
    bool is_fading();

    // Stop the current fade where it's at
    void stop_fade();

    // Update the LEDs along the fade
    // Returns TRUE if a fade is still in process
    bool update();

    // Decrease the current fading speed by a number of milliseconds
    void slower(int by_seconds);

    // Increase the current fading speed by a number of milliseconds
    void faster(int by_seconds);

    // Returns how much of the fade is complete in a percentage between 0 - 100
    uint8_t get_progress();
};

#endif /* LEDFader_H_ */

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму