Ви не увійшли.
Сторінки 1
Не работает схема
int brightness = 0;
int fadeAmount = 5;
unsigned long currentTime;
unsigned long loopTime ;
void setup(){
pinMode(10, OUTPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop(){
if(currentTime >= (loopTime +20)){
analogWrite(10, brightness);
brightness = brightness + fadeAmount;
if(brightness == 0 || brightness == 255){
fadeAmount = -fadeAmount;
}
loopTime = currentTime;
}
}
Остання редакція Влад4325 (2018-07-09 15:38:07)
Неактивний
currentTime не меняется.
При первом проходе цикла условие оказывается ложным, а дальше ничего не меняется, цикл повторяется заново и заново и не выполняется тело.
Замените if(currentTime >= (loopTime +20)){
на if(milllis() >= (loopTime +20)){
Неактивний
К сожалению яркость светодиода не пропорциональна заполнению ШИМ поданного на него.
Подавайте на него значения от 0 до около 10 (вместо 255). При этом значении светодиод горит почти на полную. Попробуйте разные значения 10, 20, 50....
Неактивний
К сожалению яркость светодиода не пропорциональна заполнению ШИМ поданного на него.
... точнее кривая восприятия глаза далека от линейной. renoshnik верно сказал.
Неактивний
https://m.youtube.com/watch?v=M9hls9FVa3U
PS: Не подключайте много светодиодов напрямую к Arduino и не пытайтесь одновременно их включить, иначе можете сжечь микроконтроллер.
Остання редакція Йожэг (2018-09-16 22:07:42)
Неактивний
Поскольку сайт 123d.circuits.io приказал долго жить, выкладываю код сюда. См. подпрограмму transform_brightness:
#define STEP 3 // шаг изменения яркости
#define STEP_DELAY 20 // задержка (мс) при изменении яркости
#define LED_QTY 6 // количество светодиодов, подключённых к выходам с PWM
#define CYCLES_PER_MODE 7 // сколько волн яркости проходит перед сменой режима свечения
#define CYCLE_MODE_QTY 3 // количество режимов свечения
#define MAX_BRIGHT 255 // максимальная яркость свечения
const byte led_pins[LED_QTY] = {3, 5, 6, 9, 10, 11}; // соответствие выводов с ШИМ номерам светодиодов
byte led_brightness[LED_QTY]; // яркость
int brightness_step[LED_QTY]; // шаг изменения яркости
byte cycle_mode = 0;
int cycle_counter = 0;
bool cycle_state = false;
void setup() {
for (int i = 0; i < LED_QTY; i++) {
pinMode(led_pins[i], OUTPUT); // переключить все PWM выводы на выход
brightness_step[i] = STEP;
led_brightness[i] = (i + 1) * MAX_BRIGHT / LED_QTY;
}
pinMode(13, OUTPUT); // встроенный светодиод
}
byte transform_brightness(byte b) {
long t = (long(b) + 1) * b >> 8; // попытка линеаризовать воспринимаемую яркость
if (cycle_mode == 1 && t == 0) t = 1;
return byte(t);
}
void apply_brightness() {
for (int i = 0; i < LED_QTY; i++) {
analogWrite(led_pins[i], transform_brightness(led_brightness[i]));
}
if (led_brightness[LED_QTY - 1] > MAX_BRIGHT / 2) {
if (!cycle_state) {
cycle_state = true;
on_cycle_change();
}
digitalWrite(13, HIGH); // вкл. встроенный LED
} else {
cycle_state = false;
digitalWrite(13, LOW); // выкл. встроенный LED
}
}
void got_max_brightness(int &brght, int &stp) {
switch (cycle_mode) {
case 0: brght = MAX_BRIGHT; stp = -stp; break;
case 1: brght = 0; stp = STEP; break;
case 2: brght = MAX_BRIGHT; stp = -STEP; break;
}
}
void got_min_brightness(int &brght, int &stp) {
switch (cycle_mode) {
case 0: brght = 0; stp = -stp; break;
case 1: brght = 0; stp = STEP; break;
case 2: brght = MAX_BRIGHT; stp = -STEP; break;
}
}
void calculate_brightness() {
int new_brightness;
for (int i = 0; i < LED_QTY; i++) {
new_brightness = led_brightness[i] + brightness_step[i];
if (new_brightness > MAX_BRIGHT) {
got_max_brightness(new_brightness, brightness_step[i]);
} else if (new_brightness < 0) {
got_min_brightness(new_brightness, brightness_step[i]);
}
led_brightness[i] = (byte) new_brightness;
}
}
void on_cycle_change() {
if (cycle_counter++ > CYCLES_PER_MODE) {
cycle_counter = 0;
cycle_mode++;
if (cycle_mode >= CYCLE_MODE_QTY) {
cycle_mode = 0;
}
}
}
void loop() {
apply_brightness();
calculate_brightness();
delay(STEP_DELAY);
}
Неактивний
Сторінки 1