не просто мигать а определенные сигналы.

maxvalin
Offline
Зарегистрирован: 22.02.2016


// Массив режимов работы светодиода
byte modes[] = {
   0B00000000, //Светодиод выключен
   0B11111111, //Горит постоянно
   0B00001111, //Мигание по 0.5 сек
   0B00000001, //Короткая вспышка раз в секунду
   0B00000101, //Две короткие вспышки раз в секунду
   0B00010101, //Три короткие вспышки раз в секунду
   0B01010101  //Частые короткие вспышки (4 раза в секунду)
};

uint32_t ms, ms1 = 0, ms2 = 0;
uint8_t  blink_loop = 0;
uint8_t  blink_mode = 0;
uint8_t  modes_count = 0; 

void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW); 
  modes_count = 1;
  blink_mode = modes[modes_count];
}

void loop() {
   ms = millis();
// Событие срабатывающее каждые 125 мс   
   if( ( ms - ms1 ) > 125|| ms < ms1 ){
       ms1 = ms;
// Режим светодиода ищем по битовой маске       
       if(  blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(13, HIGH); 
       else  digitalWrite(13, LOW);
       blink_loop++;    
    }
    
// Этот код служит для демонстрации переключения режимов    
// Один раз в 5 секунд меняем эффект   
   if( ( ms - ms2 ) > 5000|| ms < ms2 ){
       ms2 = ms;
       blink_mode = modes[modes_count++];
       if( modes_count >= 7 )modes_count = 1;
   }
}

Добрый день!

что-то началал копать на форуме по этому вопросу а оказывается всех в основном устраивает просто мигать светодиодом. Сейчас вот начинаю набрасывать управление частью чпу и хотелось бы задействовать свет как индикацию о ошибке. Тоисть мигать определенные сигналы. В принципе задача понятна для самого и выполнима, но я уже знаю какими это сложностями попахивает. Ведь моей грамотности сейчас хватит на то чтоб нагромоздить каждый аварийный сигнал в виде многорежимных millis-ов. "Сколько гореть, сколько негореть"

Сверху в принципе очень удачный код для того чтоб это дело организовать намного короче, останется добавить флаги . НО !  там упор в одну секунду все. Мне для визуального различия нужно скваженность и 2 и 4 секунды между вспышками, тоисть по разному.

P.S естественно о delay речи нет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

мои таймеры не предлагать?

https://github.com/DetSimen/Arduino-

kalapanga
Offline
Зарегистрирован: 23.10.2016

maxvalin пишет:

Сверху в принципе очень удачный код для того чтоб это дело организовать намного короче, останется добавить флаги . НО !  там упор в одну секунду все. Мне для визуального различия нужно скваженность и 2 и 4 секунды между вспышками, тоисть по разному.

Ну не такой уж он и упор. Автор взял на 8 бит (8 возможных состояний) одну секунду и получил свою константу 125 мс на одно состояние. Что мешает взять 2 или 4 или сколько Вам надо секунд?

maxvalin
Offline
Зарегистрирован: 22.02.2016

Да с удовольствием!, если там только делаев нет.

ну и переменные в стиле unsigned long )))

inspiritus
Offline
Зарегистрирован: 17.12.2012

maxvalin пишет:



P.S естественно о delay речи нет.

а собственно почему ? у Вас что то еще одновременно должно выполняться ?

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

DetSimen - красиво, только в чем отличия по функционалу от библитеки TimerOne?

maxvalin
Offline
Зарегистрирован: 22.02.2016

kalapanga пишет:

maxvalin пишет:

Сверху в принципе очень удачный код для того чтоб это дело организовать намного короче, останется добавить флаги . НО !  там упор в одну секунду все. Мне для визуального различия нужно скваженность и 2 и 4 секунды между вспышками, тоисть по разному.

Ну не такой уж он и упор. Автор взял на 8 бит (8 возможных состояний) одну секунду и получил свою константу 125 мс на одно состояние. Что мешает взять 2 или 4 или сколько Вам надо секунд?

этот момент разжуйте пожалуйста. не сталкивался "Автор взял на 8 бит (8 возможных состояний) одну секунду и получил свою константу 125 мс на одно состояние." Пишу для меги там памяти хватит.

Да, мне действительно в 4 секунды возможно хватит а если бы на 6-8 секунд, было бы здорово.  

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

maxvalin пишет:

оказывается всех в основном устраивает просто мигать светодиодом.

Это точно! А для чего ещё всё это создавалось?

maxvalin пишет:

мигать определенные сигналы

Типа такого: −− −−− •−• −•• •− •−•−•−   −− −−− •−• −•• •− •−•−•−   •−•−   −•− •• •−• •−−• •• −−−• •−•−•−   •• −•• ••−   −• •−   ••• −••• •−•• •• •••− • −• •• • •−•−•−   •−−• •−• •• • −− ?

 

maxvalin пишет:

там упор в одну секунду все. Мне для визуального различия нужно скваженность и 2 и 4 секунды между вспышками, тоисть по разному.

Дык добавьте к сигналу, ещё и длительность и будет Вам счастье.

maxvalin пишет:

естественно о delay речи нет.

delay - самый естественный способ организации задержки. Естественнее не бывает. А у Вас он "естественно" отбрасывается. Странно как-то.

maxvalin
Offline
Зарегистрирован: 22.02.2016

inspiritus пишет:

maxvalin пишет:



P.S естественно о delay речи нет.

а собственно почему ? у Вас что то еще одновременно должно выполняться ?

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

DetSimen - красиво, только в чем отличия по функционалу от библитеки TimerOne?

Уважаемый))

Давайте не будем на тему "а почему бы и нет?" Ну действительно делаи не нужны. Я конечно нуб против вас но поставленные задачи уже понимаю и естественно понимаю что делай мне зараза будет вредить.  Да , там еще висит много чего_ управление механизмами поворота отражателей, трансформаторы для UV ламп и.т.д

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

inspiritus пишет:

DetSimen - красиво, только в чем отличия по функционалу от библитеки TimerOne?

 

Не занимает 16 разрядный таймер. 

Можно настроить 16 независимых таймеров из одного (может и больше, но не пробовал) мне в самом сложном случае хватало 11 таймеров

Интервалы меняются на лету

можно выборочно останавливать/запускать таймеры

kalapanga
Offline
Зарегистрирован: 23.10.2016

maxvalin пишет:

этот момент разжуйте пожалуйста. не сталкивался "Автор взял на 8 бит (8 возможных состояний) одну секунду и получил свою константу 125 мс на одно состояние." Пишу для меги там памяти хватит.

В коде "магическую константу" 125 мс видите? Откуда она? У автора одна последовательность кодируется в 8 битах. Секунду разделить на 8 получится 125 мс. Это минимальное время на одно состояние светодиода. Соответственно если есть у него последовательность 00001111, то 4х0.125=0.5 полсекунды он не горит, и полсекунды горит. Сделайте его больше и всё.

maxvalin
Offline
Зарегистрирован: 22.02.2016

ЕвгенийП пишет:

 

Типа такого: −− −−− •−• −•• •− •−•−•−   −− −−− •−• −•• •− •−•−•−   •−•−   −•− •• •−• •−−• •• −−−• •−•−•−   •• −•• ••−   −• •−   ••• −••• •−•• •• •••− • −• •• • •−•−•−   •−−• •−• •• • −− ?

 

Именно, именно уважаемый!

взял DetSimen библиотеку, даже если и не пойдет сюда то все равно отложу - применение найдется!

В пиринципе хороший вариант с биттовым вариантом. Сейчас "переварю" попробую для себя . Хорош простотой.

Спасибо за объяснение! 

maxvalin
Offline
Зарегистрирован: 22.02.2016

kalapanga пишет:

В коде "магическую константу" 125 мс видите? Откуда она? У автора одна последовательность кодируется в 8 битах. Секунду разделить на 8 получится 125 мс. Это минимальное время на одно состояние светодиода. Соответственно если есть у него последовательность 00001111, то 4х0.125=0.5 полсекунды он не горит, и полсекунды горит. Сделайте его больше и всё.

думаю каким образом больше сделать... 

использовать uint32_t ? блин.. нету практики

b707
Онлайн
Зарегистрирован: 26.05.2017

Вот тут еще 2 варианта мигания диодом по разным алгоритмам

http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-ch...

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я конечно извиняюсь со своими глупым советами, но можно реализовать индикацию по другому, на пример 3-х цветный диод дает нам 6 вполне различимых цветов для разных ошибок, если нужно больше можно 7 сегментный дисплей там по мимо 10 цифр еще и буковки можно рисовать...

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

maxvalin пишет:

В пиринципе хороший вариант с биттовым вариантом. 

"Вариант с битовым вариантом" требует фиксированной длительности сигнала целиком. Т.е. любой сигнал суммарно длится одно и тоже время.

Вариант же в котором явно задаются длительности этого ограничения лишен и делается на библиотекте от DetSimen.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Mr.Privet пишет:
Я конечно извиняюсь со своими глупым советами, но можно реализовать индикацию по другому, на пример 3-х цветный диод дает нам 6 вполне различимых цветов для разных ошибок, если нужно больше можно 7 сегментный дисплей там по мимо 10 цифр еще и буковки можно рисовать...

да выражения "светик" не имелось ввиду светодиодик на ноге который лежит на столе и вот захотелось помигать им)))

Светик это 5 каналов сигнализации системы "маяк" свет+звук. Ну естественно через реле.  А насчет дисплея это легче чем делать сигнал морзе на светодиодах. Затык только в длинне кабеля от камня до дисплея, но суть не в этом все же. Вот конкретно цель в тз.  сижу курю как проще будет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Сегодня я пас, завтра помогу разобраться, если решишь моими таймерами пользоваца

maxvalin
Offline
Зарегистрирован: 22.02.2016

да вот как раз таки залез в uTimerList.cpp ))

там правда было и на гитхабе хорошо описано.

 

Дело в том что посмотрев на "битовый" вариант, немного не нравится простыня, код то у меня и без этого будет не маленький, там только переменных с входами-выходами  около 60ти. Хотелось естественно отдельной функцией вызывать. как-то под флаг сделать ибо по пяти каналам надо будет в разные ситуации выводить а не на все сразу..

 

почитав описание:

воткнул в папку. скопировал пример от туда же блинк.

не компилирует.

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

Тогда прокомпилируйте это. Да там частоту мигания светодиода можно задавать.

//**/
unsigned long mill;
//------Cl_Led----------------------
// класс светодиод
class Cl_Led {
  protected:
    const byte pin;
    bool led;
    bool statBlink;
    unsigned long past, time;
  public:
    Cl_Led(byte pin_): pin(pin_) {}
    void setup() {
      pinMode(pin, OUTPUT);
      OFF();
    }
    void loop() {
      if (statBlink && mill - past >= time) {
        past = mill;
        digitalWrite(pin, led = !led);
      }
    }
    void ON() {
      digitalWrite(pin, led = HIGH);
      statBlink = 0;
    }
    void OFF() {
      digitalWrite(pin, led = LOW);
      statBlink = 0;
    }
    void blink(unsigned long time_ = 200) {
      statBlink = 1;
      time = time_;
      past = mill;
      digitalWrite(pin, led = !led);
    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    void (*Do)();
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    Cl_Btn(byte pin_, void (*Do_)()): pin(pin_), Do(Do_) {}
    void setup() {
      pinMode(pin, INPUT_PULLUP);
    }
    void loop() {
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) (*Do)();
      }
    }
};
//-----компоновка----------------------
Cl_Led Led(/*пин*/13);
void DoBtn1() {
  Led.ON();
  Serial.println("DoBtn1");
}
void DoBtn2() {
  Led.OFF();
  Serial.println("DoBtn2");
}
void DoBtn3() {
  Led.blink();
  Serial.println("DoBtn3");
}
Cl_Btn Btn1(/*пин*/2,/*обработчик*/DoBtn1);
Cl_Btn Btn2(/*пин*/3,/*обработчик*/DoBtn2);
Cl_Btn Btn3(/*пин*/4,/*обработчик*/DoBtn3);
//-----main-----------------------
int main() {
  init();
  // setup()
  Serial.begin(9600);
  Led.setup();
  Btn1.setup();
  Btn2.setup();
  Btn3.setup();
  for (;;) {
    // loop()
    mill = millis();
    Led.loop();
    Btn1.loop();
    Btn2.loop();
    Btn3.loop();
  }
  return 0;
}
/*Скетч использует 2488 байт (7%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 251 байт (12%) динамической памяти, оставляя 1797 байт для локальных переменных. Максимум: 2048 байт.
*/

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

этот нормально пошел. Надо только разобраться как на нем "сыграть" 

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

А что там раздумывать нажимать на кнопки и смотреть.

//**/
unsigned long mill;
//------Cl_Led----------------------
// класс светодиод
class Cl_Led {
  protected:
    const byte pin;
    bool led;
    bool statBlink;
    unsigned long past, time;
  public:
    Cl_Led(byte pin_): pin(pin_) {}
    void setup() {
      pinMode(pin, OUTPUT);
      OFF();
    }
    void loop() {
      if (statBlink && mill - past >= time) {
        past = mill;
        digitalWrite(pin, led = !led);
      }
    }
    void ON() {
      digitalWrite(pin, led = HIGH);
      statBlink = 0;
    }
    void OFF() {
      digitalWrite(pin, led = LOW);
      statBlink = 0;
    }
    void blink(unsigned long time_ = 200) {
      statBlink = 1;
      time = time_;
      past = mill;
      digitalWrite(pin, led = !led);
    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    void (*Do)();
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    Cl_Btn(byte pin_, void (*Do_)()): pin(pin_), Do(Do_) {}
    void setup() {
      pinMode(pin, INPUT_PULLUP);
    }
    void loop() {
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) (*Do)();
      }
    }
};
//-----компоновка----------------------
Cl_Led Led(/*пин*/13);
void DoBtn1() {
  Led.blink(200);
  Serial.println("DoBtn1");
}
void DoBtn2() {
  Led.blink(500);
  Serial.println("DoBtn2");
}
void DoBtn3() {
  Led.blink(1000);
  Serial.println("DoBtn3");
}
Cl_Btn Btn1(/*пин*/2,/*обработчик*/DoBtn1);
Cl_Btn Btn2(/*пин*/3,/*обработчик*/DoBtn2);
Cl_Btn Btn3(/*пин*/4,/*обработчик*/DoBtn3);
//-----main-----------------------
int main() {
  init();
  // setup()
  Serial.begin(9600);
  Led.setup();
  Btn1.setup();
  Btn2.setup();
  Btn3.setup();
  for (;;) {
    // loop()
    mill = millis();
    Led.loop();
    Btn1.loop();
    Btn2.loop();
    Btn3.loop();
  }
  return 0;
}
/*Скетч использует 2466 байт (8%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 251 байт (12%) динамической памяти, оставляя 1797 байт для локальных переменных. Максимум: 2048 байт.
*/

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

maxvalin пишет:

думаю каким образом больше сделать... 

использовать uint32_t ? блин.. нету практики

Я что ли так косноязычен стал... Какие uint32? Вместо 125 в вашем примере напишите 500 хотя бы. Всё. Посмотрите, что изменилось.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

maxvalin пишет:

да вот как раз таки залез в uTimerList.cpp ))

не компилирует.

Поправил с утра.  Должно компилироваться. 

Я, блин, в Visual Studio работаю, не знаю, как в Ардубино ИДЕ добавить в проект файл uTimepList.cpp. Заголовочный среда видит, а тельце класса (*.cpp) - нет.  Может подскажет хто?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

DetSimen пишет:

как в Ардубино ИДЕ добавить в проект файл uTimepList.cpp. Заголовочный среда видит, а тельце класса (*.cpp) - нет.  Может подскажет хто?

ну, так должно подхватиться всё:

в файле Click.cpp #include <Click.h> - бросить файлы в одну папку.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Спасибо.  Пусть ТС пропробует. Почему-то же ведь не компилилось у него. 

 У мня в VS все нормально подхватывается, если файлы в той же папке с проектом лежат. 

maxvalin
Offline
Зарегистрирован: 22.02.2016

DetSimen пишет:

Спасибо.  Пусть ТС пропробует. Почему-то же ведь не компилилось у него. 

 У мня в VS все нормально подхватывается, если файлы в той же папке с проектом лежат. 

Доброе утро!

-перезаливали на гитхабе?

скачал по-новой и от туда же блинк. вот что выдает 

migalka:9: error: expected ',' or ';' before 'byte'

 byte    errorLedPin = 10;   // сюда подключим красный светодиод, сигнализирующий, например, об ошибке

 ^

C:\migalka\migalka.ino: In function 'void setup()':

migalka:13: error: 'errorLedPin' was not declared in this scope

  pinMode(errorLedPin,OUTPUT);

          ^

C:\migalka\migalka.ino: In function 'void ErrorBlink()':

migalka:31: error: 'errorLedPin' was not declared in this scope

  digitalWrite(errorLedPin, state);

               ^

exit status 1
expected ',' or ';' before 'byte'

ОУ!!!!!!!!

прошу прощения!

сам написал.сам прочитал.сам нашел....

; неустановлена была. 

все ок!  компилирует! 

поправьте пожалуйста в примере. 

byte    normalLedPin = 13;   // сюда подключим зеленый светодиод, который будет просто моргать

Теперь можно и дальше разбираться. на свежую голову проще лезет)))

И вчера по -видимому было нормально. Но голова была забита((  неразгледел

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нет.  вчера ошибка была посущественней

readme тоже сейчас поправил 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Так а теперь осталось за малым. как сложить "свою" морзянку которая будет выстреливать при определенных if.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

В месте, где ошибка, запускать таймер, мигать, потом останавливать (ну или мигать сначала)

maxvalin
Offline
Зарегистрирован: 22.02.2016

надеюсь разберусь)))

DetSimen и последнее:

таймеры не зацепляют "жизненно-важные органы"? 

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin пишет:

Так а теперь осталось за малым. как сложить "свою" морзянку которая будет выстреливать при определенных if.

И вот тут ты увидишь, что битовый вариант не так плох. Ничего не имею против таймеров DedSimen, но, имхо, как раз для мигания диодами по сложной последовательности это не лучший вариант, ибо придется взводить отдельный таймер для каждого включения и каждого выключения мигалки по каждому каналу... Код будет обьемный и "не прозрачный", кмк

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

самый неоптимальный вариант


#include "D:\ArduLib\Useful\uTimerList.h"

THandle hsosTimer;

const int sosArray[] = { 250,250,250,500,500,500,250,250,250 };  //длительности горения, три точки, ттри тире,три точки, паузы - 250 мс

void setup()
{
	pinMode(13, OUTPUT);
	hsosTimer = TimerList.Add(sosBlink,1000);
}

void sosBlink()
{
	static byte idx = 0;
	static bool state = true;

	digitalWrite(13,state);

	TimerList.TimerNewInterval(hsosTimer,state ? sosArray[idx++] : 250);

	state = !state;

	if (idx<10) return;
	idx = 0;
	state = !state;
	digitalWrite(13, LOW);
	TimerList.TimerNewInterval(hsosTimer,3000);
}

void loop()
{

}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

maxvalin пишет:

DetSimen и последнее:

таймеры не зацепляют "жизненно-важные органы"? 

millis() вреть на 3-4 процента. Точнее, на 6/255;

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

maxvalin пишет:

Так а теперь осталось за малым. как сложить "свою" морзянку которая будет выстреливать при определенных if.

И вот тут ты увидишь, что битовый вариант не так плох. Ничего не имею против таймеров DedSimen, но, имхо, как раз для мигания диодами по сложной последовательности это не лучший вариант, ибо придется взводить отдельный таймер для каждого включения и каждого выключения мигалки по каждому каналу... Код будет обьемный и "не прозрачный", кмк

кстати, да.  Если надо отобразить код, в виде морзянки, например, то битовый вариант - СУЩЕСТВЕННО лучше. 

maxvalin
Offline
Зарегистрирован: 22.02.2016

b707 пишет:

И вот тут ты увидишь, что битовый вариант не так плох. Ничего не имею против таймеров DedSimen, но, имхо, как раз для мигания диодами по сложной последовательности это не лучший вариант, ибо придется взводить отдельный таймер для каждого включения и каждого выключения мигалки по каждому каналу... Код будет обьемный и "не прозрачный", кмк

дошел до этого)))

составил флаги и условия на бумаге(это еще не конец), выходит пока-что 21 запуск маяков) как -то тяжело представить "простыньку" 

только что поиграл с кодом, в принципе хорош! Но надо глубже изучить возможности. Коментирован хорошо но для меня тяжело пока сгенерировать оптимальный вариант под свои нужды((  В мелких задачах привык "millis-ами паузить" а в подобной как сейчас - уж слишком громоздко выйдет. Разве-что продумать лучше систему флагов. Выходов всего-то 5. а аварий 4 вида. ну и одна общаяя- на выхода сразу. Изначально на общую аварию бегущий огонь предполагал но теперь понимаю что это вообще "запредельно"))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у меня код из #32 заработал. Исправно мигаеть. 

maxvalin
Offline
Зарегистрирован: 22.02.2016

DetSimen пишет:

у меня код из #32 заработал. Исправно мигаеть. 

дак я же за него и заговорил)

мигает!, и переменные можно сменить под свою дудку.

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

да, в твоем случае битовый предпочтительней.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Все же спасибо за проделанную работу! (я уже вижу куда их можно применить!- многофункциональное реле времени и.т.д) 

Добавьте примеры без цикличности, например где функция будет отрабатывать один раз и тоже неплохо для "новичков-среднячков" когда функция выполнится только от какого-то условия.

ссори за наглость)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

дак а чотам делать то

THandle hOnceTimer;

void setup()

{

hOnceTimer=TimerList.Add(tmrOnceTimer,1000); // создаем таймер

TimerList.TimerStop(hOnceTimer);   // и сразу пока останавливаем его

}

void tmrOnceTimer(void)

{

Делаем штото

TimerList.TimerStop(hOnceTimer);  //как только сделали штото - останавливаем таймер, он пока не нужен

}



void loop()

{

if (условие) TimerList.TimerStart(hOnceTimer);   // если условие истинно, через секунду вызовется tmrOnceTimer(), сделает штото и остановится

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у меня индикатор ошибки так был сделан в каком-то проекте: если состояния ошибки нет, то раз в 5 секунд RGB светодиод мигал зеленым на 50миллисекунд (Heartbit, что всё пока живое и работает). А если ошибка - тот же RGB мигал красным 250/250мс привлекая внимание.  На одном таймере.

maxvalin
Offline
Зарегистрирован: 22.02.2016

вот примерчик и надо такой: один таймер на несколько выходов(грубо говоря)

(только по правилам код вставляйте ато сейчас 911 тут-как тут)

возможно тогда и не плохой вариант с таймерами выйдет

то что дали выше для вас просто, но не для нас, когда уже суть понимаешь, но варианты манипуляций надо только видеть, сам к ним еще не в состоянии дойти.  Для пятиклашек одним словом! ))

maxvalin
Offline
Зарегистрирован: 22.02.2016

Люди добрые объясните на пальцах 30-ю строку из первого сообщения

вот разъяснения:

(blink_loop&0x07) это равносильно нахождению остатка от деления на 7, нам нужны только цифры от 0 до 7
1<<(blink_loop&0x07) сдвигаем влево 1-цу на остаток от деления - таким образом выбираем нужный бит в маске
( blink_mode & 1<<(blink_loop&0x07) ) из маски выбираем нужный бит и делаем выбор оператором if, если он не равен 0*/   

 

попробовал по-бодаться с маской... мдя... и тут не фонтан тоже. Набрал 2 набора(тоисть еще все так эже, только наименовал 2-кой) и флаг в условие добавил чтоб переключаться между режимами, первый набор работает на втором постоянно светится. ХЗ(( пока что опять в ступоре. возможно сам и найду ответ но голова в таком же состоянии уже как и вчера вечером(

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

maxvalin пишет:

(blink_loop&0x07) это равносильно нахождению остатка от деления на 7, нам нужны только цифры от 0 до 7

На 8 на самом деле

maxvalin
Offline
Зарегистрирован: 22.02.2016

почему? почему на 8? Насколько я понял это для того чтоб в остатке всегда была единица получается? Ведь маска 8-битная.

Пожалуйста разжуйте момент с масивом!

Или я себе опухоль заработаю(((

принцип скетча немного разобрал:

в лупе  2 интервала, один для того чтоб переходить между вот этими 0 и1  а второй интервал между всей групкой (наверное правильно маской из масива) и все это крутится блин по-кругу. я уже голову сломал чтоб как-то под свои условия выставить. Понимаю что просто так не получится мигать маской, для этого и созданы два интервала. Но моменты хотя бы обьясните

 

не думаю чтоб набрать 4 вида мигалок надо воротить четыре раза всю эту простынь. Возможно увеличить сам масив и считывать разные диапазоны масок, например alarm1= с 1 по 10 alarm2 = c11 по 16 и.т.д 

maxvalin
Offline
Зарегистрирован: 22.02.2016

добавил

Serial.println(blink_loop&0x07);

теперь наверное понимаю почему на 8

// Массив режимов работы светодиода
byte modes[] = 
  {
   0B11111111,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000,0B00000000, //масив для 1:10, авария 1
  };

uint32_t ms, ms1 = 0, ms2 = 0;  // большая переменная для милисекунд ms и 1 и 2
uint8_t  blink_loop = 0;  //
uint8_t  blink_mode = 0;
uint8_t  modes_count = 0; //маска из масива

void setup() {
  pinMode(13, OUTPUT);  // 
  digitalWrite(13, LOW); //выключить светодиод на всякий случай
  modes_count = 0; // маска из масива
  blink_mode = modes[modes_count];  // маска из масива 
  Serial.begin(9600);
}

void loop() {
   ms = millis();
// Событие срабатывающее каждые 125 мс тоисть длительность  
   if( ( ms - ms1 ) > 125|| ms < ms1 ){
       ms1 = ms;
// Режим светодиода ищем по битовой маске       
       if(  blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(13, HIGH);//сдвигаем влево 1-цу на остаток от деления blink_loop на 7 
       else  digitalWrite(13, LOW);
       blink_loop++; 
       Serial.println(blink_loop&0x07);   
    }
      
  if( ( ms - ms2 ) > 100|| ms < ms2 ) /// итервал между масками из масива
     {
       ms2 = ms;
       blink_mode = modes[modes_count++];
       //Serial.println(modes_count);
       if( modes_count >= 10 )
        {
          
          modes_count = 0;
        }
     }
 }

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

maxvalin пишет:

теперь наверное понимаю почему на 8

Ну, и слава Богу.

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin пишет:

в лупе  2 интервала, один для того чтоб переходить между вот этими 0 и1  а второй интервал между всей групкой (наверное правильно маской из масива) и все это крутится блин по-кругу. я уже голову сломал чтоб как-то под свои условия выставить. Понимаю что просто так не получится мигать маской, для этого и созданы два интервала. Но моменты хотя бы обьясните

давай по порядку.

Для мигания маской нужен только один интервал - тот который в скетче первый,  125мс. Второй интервал в том скетче использован, чтобы раз в 5сек менять последовательность морзянки - ну как в китайских елочных гирляндах - чтобы не мигать все время одинаково.  Как я понимаю, у тебя схема морзянки зависит от контекста - сл-но, тебе второй интервал не нужен.

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

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin пишет:

теперь наверное понимаю почему на 8

А зачем автор это делает - понял?

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Ключевое слово наверное.
Когда в сериал посмотрел то увидел что при делении на 7 переход осуществляется через 0. Тоисть всего 8 что соответствует одной маске.
Если не так. Обьясните тоже.

Насчет перебора гирлянды: тоисть переход между масками. Но ведь я на этом думал строится алгоритм работы.
Вот сейчас примерно, после ваших слов начал немного понимать. Сделать одну маску а не 10 и увеличить интервал выполнения каждого (регистра- наверное так называется)
А если 8ми состояний мало?

b707
Онлайн
Зарегистрирован: 26.05.2017

maxvalin, не надо все в одну маску. С какой стати?

может я не верно понимаю, что ты пытаешься сделать? Зачем тебе вообще маски "перебирать"? Я думал. что у тебя через маски делается сигнализация - то есть каждая маска для конкретного случая. Для одного состояния системы - маска1, для второго - маска2, в случае ошибок - маска3 и тд. И если у тебя система, скажем, сутки находится в состоянии2 - значит все эти сутки у тебя должна мигать маска2 и ничего "перебирать" не нужно.