Ви не увійшли.
Сторінки 1
Код рабочий, но не получается добиться нужного эффекта!
А именно имеется 3 канала, которые должны плавно зажигаться
друг за другом и спустя 2 минуты плавно затухать, но вместе.
Зажигаются нормально, а вот затухают почему-то с мерцанием!
В чем может быть проблема?
Я в этом деле новичек, так что сильно не ругайтесь.
Неактивний
Вот сам код.
#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)
Неактивний
Проблема простая,при снижении напряжения светодиод начинает "мерцать" по тому что ему мало напряжения и это особенность полупроводником.Проэксперементируйте саме.Удачи
Чем это можно компенсировать или как переделать?
Неактивний
не думаю что проблема мерцания в занижении питания
если верить документации 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 - ничего не делать ) что ли
задачи плавного управления освещением никогда не должны быть в основном потоке, неоднозначные задержки, всегда дают эффект вырванных глаз (
(
Неактивний
выносите выключение светодиодов в таймер, по сути отдельный поток, и делайте обработку условными семафорами ( 1 - нужно включать 1 уровень, и т.д. 4 - выключать плавно, 0 - ничего не делать )
Я новичок в ардуино! Как это правильно сделать?
Неактивний
Wiper, привет, я тоже новичок в ардуино!
посмотрите на свой код, он ведь реально непонятный,
а раз плохо читается то и проблему не увидите
Добрый день. Вы имеете ввиду то, как расположены операторы в коде?
Я пытался расставлять так, как предлагает программа.
Если можете покажите пример как удобно и я переделаю.
Спасибо!
Неактивний
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_ */
Неактивний
Сторінки 1