Помогите написать код
- Войдите на сайт для отправки комментариев
Пнд, 19/04/2021 - 02:39
Необходимо написать код, который изменяет мерцание LED диода с 0,1 сек до 1,0 сек с шагом в 0,1 сек и в обратную сторону.
Заранее благодарю за ответы.
Если нужно получить готовый код, то пишите в "Ищу исполнителя", а тут мы отвечаем на вопросы, связанные с затруднениями, с которыми сталкиваются новички.
Необходимо написать код, который изменяет мерцание LED диода с 0,1 сек до 1,0 сек с шагом в 0,1 сек и в обратную сторону.
Заранее благодарю за ответы.
1
2
int led = 13 ; // пин диода int delaychik = 100; // шаг мигания(мс) bool flag = true; void setup() { pinMode( led, OUTPUT); } void loop() { if ( flag == true ) { digitalWrite( led, HIGH); delay(delaychik); digitalWrite( led, LOW); delay(delaychik); delaychik = delaychik + 100; if (delaychik == 1000) { flag = false; } } else { digitalWrite( led, HIGH); delay(delaychik); digitalWrite( led, LOW); delay(delaychik); delaychik = delaychik - 100; if (delaychik == 0) { flag = true; } } }Индус детектед.
Индус детектед.
работает жеж и задача решена )))
Не верь этим индусам, учителю покажи мой код, сразу пятёрку получишь.
const uint8_t ledPin = 13; const uint32_t step = 100; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); } void loop() { static uint32_t Ms = 0; static uint32_t goStep = 100; static bool stepTrend = 1; uint32_t newMs = millis(); if ((newMs - Ms) >= goStep) { Ms = newMs; if (digitalRead(ledPin)) { digitalWrite(ledPin, LOW);} else { digitalWrite(ledPin, HIGH); if (stepTrend) goStep += step; else goStep -= step; if (goStep == 1000) stepTrend = 0; if (goStep == 0) stepTrend = 1; } } }Не верь этим индусам, учителю покажи мой код, сразу пятёрку получишь.
Не - это на четвёрку. На пятёрку так:
const uint8_t ledPin = 13; const uint32_t step = 100; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); } void loop() { static uint32_t Ms = 0; static uint32_t goStep = 100; static bool stepTrend = 1; uint32_t newMs = millis(); if ((newMs - Ms) >= goStep) { Ms = newMs; digitalWrite(ledPin, !digitalRead(ledPin)); if (stepTrend) goStep += step; else goStep -= step; if (goStep == 1000) stepTrend = 0; if (goStep == 0) stepTrend = 1; } } }Ну после такого и учитель может в запой уйти. )))
Ну и не совсем верно. У Вас на каждое включение выключение меняется шаг. А шаг должен меняться только после включения и выключения.
... ledState = !ledState; digitalWrite(ledPin, ledState); if (!ledState) { currentValue += deltaValue; } if (currentValue >= 1000) { deltaValue = -1; } if (currentValue <= 0) { deltaValue = 1; } ..."Понеслась...по кочкам!"
На 5++, или на : ;)) Я правда не понял 0,1 сек это период или полпериода? я написал, как период, если полпериода, то 1562 нужно на 2 умножить ;)))
ISR(TIMER1_COMPA_vect) {PORTB |= 0b00100000;} ISR(TIMER1_OVF_vect) {PORTB&=0b11011111;ICR1 +=1562;OCR1A+=1562/2;} void setup() { DDRB|=0b00100000; TCCR1A = 0b00000010; TCCR1B = 0b00011101; ICR1 = 1562; OCR1A = 1562 / 2; TCNT1 = 0; TIMSK1 = 0b00000011; } void loop() {}А тут лучше я напьюсь. ))
И кстати, да, в условии как написал ТС один проход туда, сюда. Но я думаю, что это всё-таки в цикле должно быть.
А тут лучше я напьюсь. ))
И кстати, да, в условии как написал ТС один проход туда, сюда. Но я думаю, что это всё-таки в цикле должно быть.
ты лучше таймера почитай, чем бухать )))
ты лучше таймера почитай, чем бухать )))
А пробовал скетч Графа залить и посмотреть?
Fenicksnet вариант 2 тоже рабочий, т.е. не плох.
ты лучше таймера почитай, чем бухать )))
А пробовал скетч Графа залить и посмотреть?
Fenicksnet вариант 2 тоже рабочий, т.е. не плох.
сорян! Я обратный проход не написал. Ща уже лень ;)) Магия исчезнет, нужно проверять не дошли ли до 15620 и начинать идти обратно... скукота
Ну и правильно, нечего учителей этих школьников травмировать.
Вот именно. Нужно максимально просто, а не максимально хитро.)
ты лучше таймера почитай, чем бухать )))
А пробовал скетч Графа залить и посмотреть?
Fenicksnet вариант 2 тоже рабочий, т.е. не плох.
тренд правильный, а частности начинающих программистов не интересуют )))
Подправил свой код.
const uint8_t ledPin = 13; const uint32_t step = 100, minValue = 100, maxValue = 1000; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); } void loop() { static uint32_t ms = 0, goStep = minValue; static bool stepTrend = 1; uint32_t newMs = millis(); if ((newMs - ms) >= goStep) { ms = newMs; if (digitalRead(ledPin)) digitalWrite(ledPin, LOW); else { digitalWrite(ledPin, HIGH); if (stepTrend) goStep += step; else goStep -= step; if (goStep >= maxValue) stepTrend = 0; if (goStep <= minValue) stepTrend = 1; } } }Но, всё-таки интересно как там у ТС жизнь то сложилась?
Но, всё-таки интересно как там у ТС жизнь то сложилась?
обычно так!
[сорян! Я обратный проход не написал. Ща уже лень ;)) Магия исчезнет, нужно проверять не дошли ли до 15620 и начинать идти обратно... скукота
поправил, туда-обратно и в цикле, и 0.1 сек - поставил как полпериода.
Убрал "пижонство", и отформатировал для читаемости ;))))))))))))))) Гы. На форуме есть меньше десятка человек, которые могут это прочитать! ;)))
Но работает идеально (Нано, олд бутлоадер, IDE 1.8.13). Видео снимать не буду, если снова в "неправильном коде" разные неучи обвинять не станут.
byte x = 1; const int16_t stp = 3125; ISR(TIMER1_COMPA_vect) { PORTB |= 0b00100000; } ISR(TIMER1_OVF_vect) { PORTB &= 0b11011111; ICR1 += (x < 11) ? stp : (-stp); OCR1A += (x < 11) ? (stp / 2) : (-stp / 2); x = (x < 20) ? x + 1 : 1; } void setup() { DDRB |= 0b00100000; TCCR1A = 0b00000010; TCCR1B = 0b00011101; ICR1 = stp; OCR1A = stp / 2; TCNT1 = 0; TIMSK1 = 0b00000011; } void loop() {}сегодня че, день благодарения? такие люди, такие коды на шару выкатывают:)
сегодня че, день благодарения? такие люди, такие коды на шару выкатывают:)
Я просто се6бе самокат купил иликтрический, который мою тушу в 135кг выдерживает! Очень прикольно! Особенно после байка - я на Сузуки Интрудере, 1984 года рождения катаюсь.
[сорян! Я обратный проход не написал. Ща уже лень ;)) Магия исчезнет, нужно проверять не дошли ли до 15620 и начинать идти обратно... скукота
поправил, туда-обратно и в цикле, и 0.1 сек - поставил как полпериода.
Убрал "пижонство", и отформатировал для читаемости ;))))))))))))))) Гы. На форуме есть меньше десятка человек, которые могут это прочитать! ;)))
Но работает идеально (Нано, олд бутлоадер, IDE 1.8.13). Видео снимать не буду, если снова в "неправильном коде" разные неучи обвинять не станут.
byte x = 1; const int16_t stp = 3125; ISR(TIMER1_COMPA_vect) { PORTB |= 0b00100000; } ISR(TIMER1_OVF_vect) { PORTB &= 0b11011111; ICR1 += (x < 11) ? stp : (-stp); OCR1A += (x < 11) ? (stp / 2) : (-stp / 2); x = (x < 20) ? x + 1 : 1; } void setup() { DDRB |= 0b00100000; TCCR1A = 0b00000010; TCCR1B = 0b00011101; ICR1 = stp; OCR1A = stp / 2; TCNT1 = 0; TIMSK1 = 0b00000011; } void loop() {}Скетч использует 666 байт (2%) памяти устройства.
это специально было сделано? пожалуй не буду проверять.
Магия - специально для начинающего.) А x можно было в ISR спрятать, что бы не повадно.)
сегодня че, день благодарения? такие люди, такие коды на шару выкатывают:)
вот и я о том )))