Помогите плиз решить задачку

Palermo2400
Offline
Зарегистрирован: 28.02.2017

Здравствуйте.

Задача в следующем: есть моргающий с определенной частотой светодиод и есть 2 кнопки... к примеру кнопка2 часть цикла находиться в нажатом состоянии и подает на 7 вход высокий уровень, а вот кнопка1  на входе 8 находится в низком уровне, мне нужно, что бы при разовом нажатии  на кнопку1 светодиод погас (на 13том выходе появился 0 ) до момента пока на кнопке2 не появится низкий уровень и цикл повторялся поновой...

В силу того что на данный момент я полный нуб в вопросе программирования arduino прошу помощи у опытных. Буду очень благодарен.

Пока остановился на этом этапе -


int knopka = 8;
int knopka2 = 7;
int led = 13;


void setup() {
  // put your setup code here, to run once:
  pinMode(knopka, INPUT);
  pinMode(knopka2, INPUT);
  pinMode(led, OUTPUT);
  

  
}

void loop() {
  // put your main code here, to run repeatedly:
     
      if (digitalRead(knopka) == HIGH)
      {
      digitalWrite(led, LOW);
     
    
      }
      else {
                 digitalWrite(led, HIGH);
                 delay(200);
                 digitalWrite(led, LOW);
                 delay(200);
         
         
             
      }
        
  }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мой вариант такой Полный скетч здесь https://yadi.sk/d/Kzqip-WK3Eoc7h

Главный файл такой 

/* class_module_Led.ino  
  #1 светодиод ->13
  #2 кнопка 1 -> 2 вкл светодиод
  #3 кнопка 2 -> 3 светодиод мигает
  #4 кнопка 3 -> 4 выкл светодиод
*/
// #1 светодиод
#include "Cl_module_led.h"
const byte led1_pin = 13;
Cl_module_led Led1(led1_pin); // создать
// #2 кнопка
#include "Cl_module_do_btn.h"
const byte btn1_pin = 2;
Cl_module_do_btn Btm1(btn1_pin); // создать
void Do_Btm1() {
  Led1.ON();
}
// #3 кнопка
const byte btn2_pin = 3;
Cl_module_do_btn Btm2(btn2_pin); // создать
void Do_Btm2() {
  Led1.OFF();
}
// #4 кнопка
const byte btn3_pin = 4;
Cl_module_do_btn Btm3(btn3_pin); // создать
void Do_Btm3() {
  Led1.blink();
}
void setup() {
  //#1 светодиод
  Led1.T_blink = 500; // частота мигания
  Led1.logic = 1;// зажигать светодиод если на выводе 0
  Led1.setup();
  //#2 кнопка 1
  Btm1.setup();
  //#3 кнопка 2
  Btm2.setup();
  //#4 кнопка 3
  Btm3.setup();
}

void loop() {
  // #1 светодиод
  Led1.loop();
  // #2 кнопка 1
  Btm1.loop(& Do_Btm1);
  // #3 кнопка 2
  Btm2.loop(& Do_Btm2);
  // #4 кнопка 3
  Btm3.loop(& Do_Btm3);
}

 

Palermo2400
Offline
Зарегистрирован: 28.02.2017

Диод это я так прилепил для наглядности, что бы было проще разобраться для себя, а вообще там используется делеймикросеконд и задержки в 400 микросекунд. Таким образом я сформировал прямоугольный импульс для управления драйвером шаговика.... Но вот со скетчем, что-то никак... 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Все тоже самое. Замени в классе Cl_module_led  millis micros() и дальше выставляй.

Palermo2400
Offline
Зарегистрирован: 28.02.2017

Спасибо, попробую разобраться в той куче строк...

Palermo2400
Offline
Зарегистрирован: 28.02.2017

Все работает, заменил в Cl_module_led millis на micros и в class_module_Led в строке 

 Led1.T_blink = 800; // частота мигания

ввожу 800 микросекунд, я так понимаю это полный период и соответствует частоте в 1.25 килогерца?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

800 это скорее полупериод . А частота 1000000/(800+800)=625Гц

Palermo2400
Offline
Зарегистрирован: 28.02.2017

Спасибо!