Переключение режимов. С программированием очень плохо. Подскажите или поправьте.

rastaman29
Offline
Зарегистрирован: 04.04.2021

Сгорел контроллер на плате. Если в схемотехнике еще разбираюсь, то с программированием контроллеров туговато.

Принцип работы понятен.

1. Замыкается микропереключатель, подается + на ногу контроллера, контроллер видит +, включает один лазер (всего лазеров 3). И загорается сигнальный светодиод(Power ON).

2. Одна кнопка переключает лазеры по кругу, включая их по очереди. Первый, следом второй, потом третий, потом только первый и по кругу.

3. Вторая кнопка включает импульсный режим, для работы с детектором, ШИМ 10кГц со скважностью 50%. Импульсный режим включается сразу на все лазеры, не важно как они включены, он либо включен, либо выключен. Так же включается сигнальный светодиод (Impulse ON).

4. Измерение напряжение на делителе, что бы сигнализировать о разряде. Сигнальный светодиод тот же, что и Power ON, только он начинает мигать.

Вот написал (напихал) строчек. Сейчас прошу помочь в том, как включить импульсный режим и он не выключался кнопкой 1. И лазер при включении не загорается, не пойму почему, так как в Setup выставил ногу в 1.

Сейчас при включении загорается сигнальный светодиод. При нажатии первой кнопки включается/выключается лазер. При нажатии второй загорается сигнальный светодиод и включается импульсный режим, но при нажатии первой кнопки естественно в коде конкретно прописано digitalWrite и он просто включается отключая импульсный режим.

#include <GyverPWM.h> //библиотека с частотой

boolean butt_flag = 0;
boolean butt_flag2 = 0;
boolean led_flag = 0; 
boolean led_flag2 = 0;
boolean butt;
boolean butt2;
unsigned long last_press;



void setup() {
  pinMode (3, OUTPUT);                // светодиод Impulse Mode
  pinMode (4, OUTPUT);                // светодиод Power ON + (мигание о разряде батареи - до этого еще не дошло))))
  pinMode (9, OUTPUT);                // лазер
  pinMode (10, OUTPUT);               // лазер
  digitalWrite(4, LOW);               //по умолчанию свтодиод пин 4 включен Power ON - работает
  digitalWrite(3, HIGH);              //по умолчанию свтодиод пин 3 выключен Impulse Mode - работает
  digitalWrite(10, HIGH);             //по умолчанию на пин 10 высокий уровень, на базу транзистора - почему то не работает!!! Только после нажатия на кнопку срабатывает
  pinMode (2, INPUT_PULLUP);          //1 кнопка
  pinMode (5, INPUT_PULLUP);          //2 кнопка
  Serial.begin(115200);
  Serial.println(led_flag);           //выводит состояние флага
  PWM_frequency(10, 10000, FAST_PWM); //Выставляем 10 пин на частоту 10кГц
 
}

void loop() {
    butt = !digitalRead(2); //читаем текушее положение кнопки 1
  if (butt == 1 && butt_flag == 0 && millis() - last_press > 300) {
    butt_flag = 1;
    led_flag = !led_flag;
    millis();
    digitalWrite(10, led_flag); //Включаем/отключаем лазер laser on/off по флагу
    if (led_flag == 1){
      
    Serial.println("Лазер включен");
    }
    if (led_flag == 0){Serial.println("Лазер выключен");
    }
    Serial.println(led_flag);
    last_press = millis();
    //Serial.println("Нажата кнопка 1"); //вывод в порт
  }
  if (butt == 0 && butt_flag == 1) {
    butt_flag = 0;
    //Serial.println("Отжата кнопка 1"); //вывод в порт
  }

  butt2 = !digitalRead(5);      //читаем текушее положение кнопки 2
  if (butt2 == 1 && butt_flag2 == 0 && millis() - last_press > 300) {
    butt_flag2 = 1;
    led_flag2 = !led_flag2;
    Serial.println(led_flag2);
    last_press = millis();
    //Serial.println("Нажата кнопка 2"); //вывод в порт
    if (led_flag2 == 1 && led_flag == 1 ) //если лазер выключен, то кнопкой 2 его не надо включать
    {
    Serial.println("Импульсный режим включен");
    analogWrite(10, 127);       // включает скважность 50% и заодно включает ШИМ 10кГц (Импульсный режим)
    digitalWrite(3, LOW);       //включаем светодиод сигнализирующий, что Impulse mode on
    }
    if (led_flag2 == 0){Serial.println("Импульсный режим выключен");
    PWM_detach(10);             //Отключение ШИМ
    digitalWrite(3, HIGH);      //включаем светодиод сигнализирующий, что Impulse mode off
    digitalWrite(10, led_flag); //лазер в исходное состояние 
    }
    //PWM_set(10, 255 - analogRead(0) / 2);
    
  }
      
  if (butt2 == 0 && butt_flag2 == 1) {
    butt_flag2 = 0;
    //Serial.println("Отжата кнопка 2"); //вывод в порт
   }
  
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

нужно завести два независимых флага :

 1) Лазер включен/ выключен

2) импульс включен/выключен

и в зависимости от комбинации их значений включать то что нужно:

 Laser ON    and    IMPULSE ON   =>   включаем импульс

 Laser ON    and    IMPULSE OFF   =>   включаем просто лазер

LASER OFF = >  выключаем все

rastaman29
Offline
Зарегистрирован: 04.04.2021

Да вроде есть 2 флага led_flag и led_flag2.

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

rastaman29 пишет:
Да вроде есть 2 флага

Судя по вопросу, два флага это Чарли и Новембер вместе? ;))))

rastaman29
Offline
Зарегистрирован: 04.04.2021

Чет не въехал в шутку)))) или это не шутка

rastaman29
Offline
Зарегистрирован: 04.04.2021

wdrakula пишет:

rastaman29 пишет:
Да вроде есть 2 флага

Судя по вопросу, два флага это Чарли и Новембер вместе? ;))))


Типа сигнал бедствия))) ну в принципе ты прав. Так как в коде я скажем мягко 0. Начитался море статей и вот накидал такую прогу. Ковыряю по вечерам её. И вдруг кто ещё накидает советов.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Предложу такой вариант




[code]
unsigned long time_r;
boolean modulation=true;
boolean vibro=false;
boolean modul_debunc=false;
byte modul_cnt=0;
boolean select_debunc=false;
byte select_cnt=0;
byte clk_cnt=0;
byte selected=0;
int lazer_1=1;
int lazer_2=2;
int lazer_3=3;
int butt_select=4;
int butt_modul=5;
void control (boolean dd)
{
 switch (selected) {
    case 0:
digitalWrite(lazer_1, dd);
      break;
        case 1:
digitalWrite(lazer_2, dd);
      break;
        case 2:
digitalWrite(lazer_3, dd);
      break;
 }
}
void modul()
{
  if(!modul_debunc)
  {
  if(digitalRead(!butt_modul))
  {
    modulation=!modulation;
    modul_debunc=true;
    }
 }
 else
{if(modul_cnt<=3)
{modul_cnt++;
  }
  else
  {modul_cnt=0;
  modul_cnt-false;
    }
   }
 if(!select_debunc)
 {
 if(digitalRead(!butt_select))
 select_debunc=true;
 { if (selected<=2)
 {
 selected++;
 }
 else
 {selected=0;
  }
  }
 }
 else
 {
  if(modul_cnt<=3)
  {modul_cnt++;
    }
    else
    {modul_cnt=0;
     select_debunc=false;
      }
  }
 }
void setup() {
 pinMode(lazer_1,OUTPUT);
 pinMode(lazer_2,OUTPUT);
 pinMode(lazer_3,OUTPUT);
 pinMode(butt_select,INPUT_PULLUP);
 pinMode(butt_modul,INPUT_PULLUP);
}

void loop() 
{
if ((micros()-time_r)>=50)
  {vibro!=vibro;
  time_r=micros();
  control (vibro||modulation);
     if(clk_cnt<=30)
     {clk_cnt++;
      }
      else
      {clk_cnt=0;
      modul();
        }
     
     }
  }
[/code]

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Спасибо огромное. Разобраться бы, что куда вставлять.

Пины выставил, скетч залил, но чет ничего не делается)

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019
Косяк, нужно так
 
  {vibro=!vibro;

 вместо

{vibro!=vibro;

Вообще нужно еще посмотреть на счет косяков. По идее при старте получаем  1 на выходе lazer_1, нажатием кнопки butt_select (на землю!!) последовательно получаем единицы на выходах lazer_2, lazer_3 циклически.

При нажатии кнопки butt_modul (на землю!!) сигнал на выбранном выходе lazer_х должен модулироваться частотой 10 кГц скважностью 50. При втором нажатии модуляция снимается

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Что такое dd

void control (boolean dd)
{
 switch (selected) {
    case 0:
digitalWrite(lazer_1, dd);
      break;
        case 1:
digitalWrite(lazer_2, dd);
      break;
        case 2:
digitalWrite(lazer_3, dd);
      break;
Vibro поправил, но на кнопки не реагирует, просто все включатся.
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rastaman29 пишет:

Спасибо огромное. Разобраться бы, что куда вставлять.

Щас гусары налетят, расскажут )))

rastaman29
Offline
Зарегистрирован: 04.04.2021

Наверное немного не правильно выразился. 

При включении загорается laser 1, при нажатии кнопки вместе с laser 1 загорается laser 2 при следующем нажатии загораются все 3 лазера, а потом опять первый и по кругу.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

dd-параметр, который передается функции, при ее вызове, Функция вызывается 20 к раз в секунду с параметром  1 и следующий вызов с параметром 0( если переменная mdulation=false), если mdulation=false то только с параметром 1 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Вполне возможно мой косяк в функции void control (), сможете сами исправить?

rastaman29
Offline
Зарегистрирован: 04.04.2021

Сомневаюсь. Я в своем то с горем пополам копаюсь))))

Кстати по яркости, как будто ШИМ включен постоянно.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

исправьте в функцию void modul() после 52 строки, должно получиться как-то так

 


 if(digitalRead(!butt_select))
 {
  digitalWrite(lazer_1, LOW);
  digitalWrite(lazer_2, LOW);
  digitalWrite(lazer_3, LOW);


 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Кнопка modul_butt не работает?

b707
Offline
Зарегистрирован: 26.05.2017

rastaman29 - а ШИМ обязательно именно 10 КГц? - 8 КГц не подойдет? - тогда можно использовать ардуино-ШИМ и код станет значительно проще

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Я полагаю что это для приемника лазерного нивелира а там частота регламентируется

rastaman29
Offline
Зарегистрирован: 04.04.2021
1 if(digitalRead(!butt_select))
2 {
3  digitalWrite(lazer_1, LOW);
4  digitalWrite(lazer_2, LOW);
5  digitalWrite(lazer_3, LOW);

остальное удалить?

b707
Offline
Зарегистрирован: 26.05.2017

Alexey_Rem - вставьте код по правилам форума. чтобы можно было обсуждать по номерам строк

rastaman29
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

rastaman29 - а ШИМ обязательно именно 10 КГц? - 8 КГц не подойдет? - тогда можно использовать ардуино-ШИМ и код станет значительно проще

В принципе приемник ловит от 5 до 15 кГц. Но потыкав разные частоты, среднее значение было этим. Хотя на 8 будет тоже работать, только вот какая будет дальность надо экспериментировать.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Нет,  просто вставить, это для выключения всех лазеров в момент перед включением выбранного

rastaman29
Offline
Зарегистрирован: 04.04.2021
[code]
unsigned long time_r;
boolean modulation = true;
boolean vibro = false;
boolean modul_debunc = false;
byte modul_cnt = 0;
boolean select_debunc = false;
byte select_cnt = 0;
byte clk_cnt = 0;
byte selected = 0;
int lazer_1 = 10;
int lazer_2 = 3;
int lazer_3 = 4;
int butt_select = 2;
int butt_modul = 5;
void control (boolean dd)
{
  switch (selected) {
    case 0:
      digitalWrite(lazer_1, dd);
      break;
    case 1:
      digitalWrite(lazer_2, dd);
      break;
    case 2:
      digitalWrite(lazer_3, dd);
      break;
  }
}
void modul()
{
  if (!modul_debunc)
  {
    if (digitalRead(!butt_modul))
    {
      modulation = !modulation;
      modul_debunc = true;
    }
  }
  else
  { if (modul_cnt <= 3)
    { modul_cnt++;
    }
    else
    { modul_cnt = 0;
      modul_cnt - false;
    }
  }
  if (!select_debunc)
  {
    if (digitalRead(!butt_select))
      select_debunc = true;
    { 
      digitalWrite(lazer_1, LOW);
 digitalWrite(lazer_2, LOW);
 digitalWrite(lazer_3, LOW);

      if (selected <= 2)
      {
        selected++;
      }
      else
      { selected = 0;
      }
    }
  }
  else
  {
    if (modul_cnt <= 3)
    { modul_cnt++;
    }
    else
    { modul_cnt = 0;
      select_debunc = false;
    }
  }
}
void setup() {
  pinMode(lazer_1, OUTPUT);
  pinMode(lazer_2, OUTPUT);
  pinMode(lazer_3, OUTPUT);
  pinMode(butt_select, INPUT_PULLUP);
  pinMode(butt_modul, INPUT_PULLUP);
}

void loop()
{
  if ((micros() - time_r) >= 50)
  { vibro = !vibro;
    time_r = micros();
    control (vibro || modulation);
    if (clk_cnt <= 30)
    { clk_cnt++;
    }
    else
    { clk_cnt = 0;
      modul();
    }

  }
}
[/code]

 

b707
Offline
Зарегистрирован: 26.05.2017

rastaman29 пишет:
Номера не копируются)))

потому что они назначаются автоматом. Вставляйте весь код. а не кусками - будут правильные номера.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Работает?

rastaman29
Offline
Зарегистрирован: 04.04.2021

Вставил. Не изменилось поведение.

Кнопки не реагируют. Все диоды светятся.

b707
Offline
Зарегистрирован: 26.05.2017

Вставили - молодцы.

Теперь ответьте - нафига нужны строчки 54-56?  Выключаете лазеры при любом нажатии кнопки? - а нафига?

И еще - что это за операция такая в строке 46?

rastaman29
Offline
Зарегистрирован: 04.04.2021

modul_cnt - false

Исправил на modul_cnt = false; Ничего не изменилось.

Замерил частоту цешкой, показывает 2.2кГц.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

еще косяк, должно быть:



 if(digitalRead(!butt_select))
 {select_debunc=true;
  digitalWrite(lazer_1, LOW);
  digitalWrite(lazer_2, LOW);
  digitalWrite(lazer_3, LOW);


вместо

057  
 if (digitalRead(!butt_select))
052       select_debunc = true;
053     {
054       digitalWrite(lazer_1, LOW);
055  digitalWrite(lazer_2, LOW);
056  digitalWrite(lazer_3, LOW);
057  

 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

rastaman29 пишет:

modul_cnt - false

Исправил на modul_cnt = false; Ничего не изменилось.

Замерил частоту цешкой, показывает 2.2кГц.

правильно так:

modul_debunc=false;

Косяк на косяке :(,

Цешкой - это тесер  Ц-4...?  

rastaman29
Offline
Зарегистрирован: 04.04.2021

Alexey_Rem пишет:

еще косяк, должно быть:



 if(digitalRead(!butt_select))
 {select_debunc=true;
  digitalWrite(lazer_1, LOW);
  digitalWrite(lazer_2, LOW);
  digitalWrite(lazer_3, LOW);

Поправил. Ничего не изменилось))

rastaman29
Offline
Зарегистрирован: 04.04.2021

[/quote]

Цешкой - это тесер  Ц-4...?  

[/quote]

Мультиметр CEM DT-931N

modul_debunc=false; поправил теперь при старте не зажигается лазер и так же не реагирует на кнопки.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Мне к сожалению сейчас не на чем проверить, пересмотрю программку может чего еще найду 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

вот в таком виде работает на МЕГЕ2560:

[code]
unsigned long time_r;
boolean modulation=true;
boolean vibro=false;
boolean modul_debunc=false;
int modul_cnt=0;
boolean select_debunc=false;
int select_cnt=0;
int clk_cnt=0;
int selected=0;
int lazer_1=12;
int lazer_2=9;
int lazer_3=10;
int butt_select=22;
int butt_modul=23;
void control ()
{

switch (selected) {
   case 0:
digitalWrite(lazer_1, vibro||modulation);
  break;
   case 1:
digitalWrite(lazer_2, vibro||modulation);
     break;
       case 2:
digitalWrite(lazer_3, vibro||modulation);
      break;
 }

}
 void lazer_selection()
 {
   digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 
   if(selected<2)
   {
     selected++;
   }
   else
   {
     selected=0;
   }
Serial.println(selected ,DEC);
//control ();

 }
void modul()
{
 if(!modul_debunc)
 {
   if(!digitalRead(butt_modul))
   {
     modul_debunc=true;
     modulation=!modulation;
    Serial.println(modulation ,DEC); 
   }
 } 
 else
 {
   if(modul_cnt<=90)
   {
     modul_cnt++;
   }
   else
   {
     modul_cnt=0;
     modul_debunc=false;
   }
 }
 if(!select_debunc)
 {
   if(!digitalRead(butt_select))
   {
     select_debunc=true;
     lazer_selection();
     
   }
 } 
 else
 {
   if(select_cnt<=90)
   {
     select_cnt++;
   }
   else
   {
     select_cnt=0;
     select_debunc=false;
   }
 }
}

void setup() {
 pinMode(lazer_1,OUTPUT);
 pinMode(lazer_2,OUTPUT);
 pinMode(lazer_3,OUTPUT);
 pinMode(butt_select,INPUT_PULLUP);
 pinMode(butt_modul,INPUT_PULLUP);

digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 



}

void loop() 
{
if ((micros()-time_r)>=50)
  {vibro=!vibro;
  time_r=micros();
  control ();
     if(clk_cnt<=40)
     {clk_cnt++;
      }
      else
      {clk_cnt=0;
      modul();
        }
     }
  }

[/code]

Ноги естественно мои Вам поменять

b707
Offline
Зарегистрирован: 26.05.2017

Alexey_Rem - скажите честно. как художник художнику - вы программировать умеете? - судя по коду - не очень...

В коде опять какия-то бредятина с дебонсом... смотрите - у вас счетчик дебонса, например в строчках 62-70 - считает сам по себе, независимо от кнопки. У вас никакой дребезг не подавляется. это просто курам на смех.

Если не понимаете принципа антидребезга - возьмите готовую библиотеку кнопки, да хоть того же гайвера. Все лучше будет.

А то взялись помогать ТС-у, а вместо этого забросали его каким копрокодом :)

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

На самом деле, если вы посмотрите внимательно  кнопки опрашиваются с частотой ок 250 Гц и антидребезг считает кол-во обращений к кнопке после установки соотв флага при нажатии кнопки и при достижении опр значения сбрасывает этот флаг. А в программировании я действительно не великий спец но у меня работает очень нормально и если хлопцу помогу то буду рад.

b707
Offline
Зарегистрирован: 26.05.2017

Alexey_Rem пишет:

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

ну не совсем так. ТС заказывал частоту ШИМ 10 КГц и ваш код претендует именно на такую частоту - у вас в ЛУПе настроен таймер на исполнение кода каждые 50 мкс

А ваш антидребезг, в принципе, единственное что делает - он опрашивает кнопку не чаще 90 периодов этого таймера - то есть примерно раз 5мс. В некотором смысле это, конечно, "антидребезг" - но очень относительный, кнопки надо нажимать быстро и нежно и не задерживать на них палец дольше 5мс.

Правильная работа с кнопками должна давать строго одно страбатывание на одно нажатие, что несколько отличается от того. что сейчас в коде

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Товарищ, посмотрите внимательно на строки 117-123 там организован счетчик-делитель частоты модуляции на 40 и именно он вызывает функцию модул(), счетчик в самой функции отсчитывает  еще 90 периодов этой частоты, таким образом получаем время антидребезга ок 0.36 сек что мне кажется вполне достаточно.

rastaman29
Offline
Зарегистрирован: 04.04.2021

В принципе работает. Завтра навешаю лазеров(сейчас только один, на остальных диоды посажены). 

При зажатой кнопке переключаются по кругу как говорил b707.

Частоту цешка показывает 8.7 кГц.

rastaman29
Offline
Зарегистрирован: 04.04.2021

Выражаю благодарность Alexey_Rem. 

Сигнальные диоды думаю допилю сам. 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Рад помочь всегда

rastaman29
Offline
Зарегистрирован: 04.04.2021

А можно что бы по кругу не переключались при зажатой кнопке?

И подскажите как регулировать частоту?

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

У меня АНЕНг показал частоту 22 кГц(О), но думаю это не показатель:) Подправить частоту можно здесь:

void loop() 
{
if ((micros()-time_r)>=50)

после>= должно быть пол периода требуемой частоты в микросекундах.

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

rastaman29
Offline
Зарегистрирован: 04.04.2021

Добавил сигнальный светодиод powerOn и включение сигнального светодиода impulseOn.

[code]
unsigned long time_r;
boolean modulation=true;
boolean vibro=false;
boolean modul_debunc=false;
int modul_cnt=0;
boolean select_debunc=false;
int select_cnt=0;
int clk_cnt=0;
int selected=0;
int lazer_1=9;
int lazer_2=10;
int lazer_3=11;
int impulseOn=3;
int powerOn=4;
int butt_select=2;
int butt_modul=5;
void control ()
{

switch (selected) {
   case 0:
digitalWrite(lazer_1, vibro||modulation);
  break;
   case 1:
digitalWrite(lazer_2, vibro||modulation);
     break;
       case 2:
digitalWrite(lazer_3, vibro||modulation);
      break;
 }

}
 void lazer_selection()
 {
   digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 
   if(selected<2)
   {
     selected++;
   }
   else
   {
     selected=0;
   }
Serial.println(selected ,DEC);
//control ();

 }
void modul()
{
 if(!modul_debunc)
 {
   if(!digitalRead(butt_modul))
   {
     modul_debunc=true;
     modulation=!modulation;
     digitalWrite(impulseOn, modulation);
    Serial.println(modulation ,DEC); 
   }
 } 
 else
 {
   if(modul_cnt<=90)
   {
     modul_cnt++;
   }
   else
   {
     modul_cnt=0;
     modul_debunc=false;
   }
 }
 if(!select_debunc)
 {
   if(!digitalRead(butt_select))
   {
     select_debunc=true;
     lazer_selection();
     
   }
 } 
 else
 {
   if(select_cnt<=90)
   {
     select_cnt++;
   }
   else
   {
     select_cnt=0;
     select_debunc=false;
   }
 }
}

void setup() {
 pinMode(lazer_1,OUTPUT);
 pinMode(lazer_2,OUTPUT);
 pinMode(lazer_3,OUTPUT);
 pinMode(impulseOn,OUTPUT);
 pinMode(powerOn,OUTPUT);
 pinMode(butt_select,INPUT_PULLUP);
 pinMode(butt_modul,INPUT_PULLUP);

digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 
   digitalWrite(powerOn, LOW); 
   digitalWrite(impulseOn, HIGH);



}

void loop() 
{
if ((micros()-time_r)>=42)
  {vibro=!vibro;
  time_r=micros();
  control ();
     if(clk_cnt<=40)
     {clk_cnt++;
      }
      else
      {clk_cnt=0;
      modul();
        }
     }
  }
[/code]

 

b707
Offline
Зарегистрирован: 26.05.2017

Alexey_Rem пишет:

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

не нужен таймер - достаточно прописать так, что новое нажатие регистрируется только после отжатия кнопки. И все эти многочисленные делители сначала на 40. а потом на 90 - будут не нужны

Может и частота поднимется. когда из кода кучу лишнего уберете

rastaman29
Offline
Зарегистрирован: 04.04.2021

b707 пишет:

не нужен таймер - достаточно прописать так

Можно пример с данным кодом?)

b707
Offline
Зарегистрирован: 26.05.2017

rastaman29 пишет:

Можно пример с данным кодом?)

с данным "антидребезгом" ничего не выйдет - для этого надо читать кнопку хотя бы раз в 1мс, а в вашем коде ее игнорят аж по 0.4 секунды :)

Схема следующая - учитывать не только нынешнее состояние кнопки, но и состояние при прошлом опросе. Если сейчас кнопка нажата, а в прошлый раз была отпущена - это и только это - нажатие, а все остальные варианты - пропускаем.

rastaman29
Offline
Зарегистрирован: 04.04.2021

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

У меня в коде в шапке примерно так и сделано (вроде как). Но внедрить его в этот у меня точно не получится. Хотя буду все равно думать. Может получится их скрестить. Благо времени на это не лимитировано))).

b707
Offline
Зарегистрирован: 26.05.2017

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

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Тута вродибы кольцевание поборото ;), благодаря камраду b707.

[code]
unsigned long time_r;
boolean modulation=true;
boolean vibro=false;
boolean modul_debunc=false;
int modul_cnt=0;
boolean select_debunc=false;
boolean sel_pressed=false;
boolean mod_pressed=false;
int select_cnt=0;
int clk_cnt=0;
int selected=0;
int lazer_1=12;
int lazer_2=9;
int lazer_3=10;
int butt_select=22;
int butt_modul=23;
void control ()
{

switch (selected) {
   case 0:
digitalWrite(lazer_1, vibro||modulation);
  break;
   case 1:
digitalWrite(lazer_2, vibro||modulation);
     break;
       case 2:
digitalWrite(lazer_3, vibro||modulation);
      break;
 }
}

 void press_chk()
 {
   if(digitalRead(butt_select))
   {
    sel_pressed=false; 
   }
   if(digitalRead(butt_modul))
   {
    mod_pressed=false; 
   }
 }
 void lazer_selection()
 {
   digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 
   if(selected<2)
   {
     selected++;
   }
   else
   {
     selected=0;
   }


 }
void modul()
{
 if(!modul_debunc)
 {
   if(!digitalRead(butt_modul)&&! mod_pressed)
   {
     modul_debunc=true;
      mod_pressed=true;     
     modulation=!modulation;
     }
 } 
 else
 {
   if(modul_cnt<=90)
   {
     modul_cnt++;
   }
   else
   {
     modul_cnt=0;
     modul_debunc=false;
   }
 }
 if(!select_debunc)
 {
   if(!digitalRead(butt_select)&&!sel_pressed)
   {
     select_debunc=true;
     sel_pressed=true;
     lazer_selection();
     
   }
 } 
 else
 {
   if(select_cnt<=90)
   {
     select_cnt++;
   }
   else
   {
     select_cnt=0;
     select_debunc=false;
   }
 }
if(sel_pressed||mod_pressed)
{
 press_chk(); 
}
}

void setup() {
 pinMode(lazer_1,OUTPUT);
 pinMode(lazer_2,OUTPUT);
 pinMode(lazer_3,OUTPUT);
 pinMode(butt_select,INPUT_PULLUP);
 pinMode(butt_modul,INPUT_PULLUP);
 digitalWrite(lazer_1, LOW);
 digitalWrite(lazer_2, LOW);
 digitalWrite(lazer_3, LOW); 



}

void loop() 
{
if ((micros()-time_r)>=50)
  {vibro=!vibro;
  time_r=micros();
  control ();
     if(clk_cnt<=40)
     {clk_cnt++;
      }
      else
      {clk_cnt=0;
      modul();
        }
     }
  }

[/code]

К стати а нет ли смысла повысить скважность при модуляции что бы яркость падала меньше?