Помогите написать код

Eduards_Rjabojs
Offline
Зарегистрирован: 19.04.2021

Необходимо написать код, который изменяет мерцание LED диода с 0,1 сек до 1,0 сек с шагом в 0,1 сек и в обратную сторону. 

Заранее благодарю за ответы.

andyparker
Offline
Зарегистрирован: 20.12.2020

Если нужно получить готовый код, то пишите в "Ищу исполнителя", а тут мы отвечаем на вопросы, связанные с затруднениями, с которыми сталкиваются новички.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

Eduards_Rjabojs пишет:

Необходимо написать код, который изменяет мерцание LED диода с 0,1 сек до 1,0 сек с шагом в 0,1 сек и в обратную сторону. 

Заранее благодарю за ответы.

1

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://www.arduino.cc/en/Main/Products

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(100);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(200);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(300);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(300);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(400);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(400);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(500);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(600);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(600);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(700);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(700);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(800);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(800);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(900);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(900);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(900);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(900);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(800);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(800);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(700);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(700);


  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(600);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(600);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(500);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(400);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(400);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(300);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(300);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(200);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(200);

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(100);

}

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Индус детектед.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Индус детектед.

работает жеж и задача решена )))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Eduards_Rjabojs пишет:

Не верь этим индусам, учителю покажи мой код, сразу пятёрку получишь.

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

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AndreyD пишет:

Не верь этим индусам, учителю покажи мой код, сразу пятёрку получишь.

Не - это на четвёрку. На пятёрку так:

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

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Ну после такого и учитель может в запой уйти. )))

Ну и не совсем верно. У Вас на каждое включение выключение меняется шаг. А шаг должен меняться только после включения и выключения.

sadman41
Offline
Зарегистрирован: 19.10.2016
...
 ledState = !ledState;
 digitalWrite(ledPin, ledState);
 if (!ledState) { currentValue += deltaValue; }
 if (currentValue >= 1000) { deltaValue = -1; }
 if (currentValue <= 0) { deltaValue = 1; }
...

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

"Понеслась...по кочкам!"

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

На 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() {}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А тут лучше я напьюсь. ))

И кстати, да, в условии как написал ТС один проход туда, сюда. Но я думаю, что это всё-таки в цикле должно быть.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AndreyD пишет:

А тут лучше я напьюсь. ))

И кстати, да, в условии как написал ТС один проход туда, сюда. Но я думаю, что это всё-таки в цикле должно быть.

ты лучше таймера почитай, чем бухать )))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

ua6em пишет:

ты лучше таймера почитай, чем бухать )))

А пробовал скетч Графа залить и посмотреть?

Fenicksnet вариант 2 тоже рабочий, т.е. не плох.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

AndreyD пишет:

ua6em пишет:

ты лучше таймера почитай, чем бухать )))

А пробовал скетч Графа залить и посмотреть?

Fenicksnet вариант 2 тоже рабочий, т.е. не плох.

сорян! Я обратный проход не написал. Ща уже лень ;)) Магия исчезнет, нужно проверять не дошли ли до 15620 и начинать идти обратно... скукота

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Ну и правильно, нечего учителей этих школьников травмировать.

Green
Offline
Зарегистрирован: 01.10.2015

Вот именно. Нужно максимально просто, а не максимально хитро.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AndreyD пишет:

ua6em пишет:

ты лучше таймера почитай, чем бухать )))

А пробовал скетч Графа залить и посмотреть?

Fenicksnet вариант 2 тоже рабочий, т.е. не плох.

тренд правильный, а частности начинающих программистов не интересуют )))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Подправил свой код.

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

Но, всё-таки интересно как там у ТС жизнь то сложилась?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AndreyD пишет:

Но, всё-таки интересно как там у ТС жизнь то сложилась?

обычно так!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

wdrakula пишет:

[сорян! Я обратный проход не написал. Ща уже лень ;)) Магия исчезнет, нужно проверять не дошли ли до 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() {}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

сегодня че, день благодарения? такие люди, такие коды на шару выкатывают:)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

xDriver пишет:

сегодня че, день благодарения? такие люди, такие коды на шару выкатывают:)

Я просто се6бе самокат купил иликтрический, который мою тушу в 135кг выдерживает! Очень прикольно! Особенно после байка - я на Сузуки Интрудере, 1984 года рождения катаюсь.

Fenicksnet
Offline
Зарегистрирован: 25.03.2019

wdrakula пишет:

wdrakula пишет:

[сорян! Я обратный проход не написал. Ща уже лень ;)) Магия исчезнет, нужно проверять не дошли ли до 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%) памяти устройства.

это специально было сделано? пожалуй не буду проверять.

Green
Offline
Зарегистрирован: 01.10.2015

wdrakula пишет:
...если снова в "неправильном коде" разные неучи обвинять не станут.

Магия - специально для начинающего.) А x можно было в ISR спрятать, что бы не повадно.)
 

dayang78
Offline
Зарегистрирован: 21.04.2021
// всем привет, прошу помощи, нужно добавить еще один вход для управления шим.
//первый вход висит на PB3
//второй висит на PB4, но пока что только на плате, в коде его нет, помогите добавить несколько строк, 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

xDriver пишет:

сегодня че, день благодарения? такие люди, такие коды на шару выкатывают:)

вот и я о том )))