класс титановый велосипед для delay без delay().

Клапауций 322
Offline
Зарегистрирован: 31.12.2015
класс титановый велосипед для delay без delay().
динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями.
Клапауций 322
Offline
Зарегистрирован: 31.12.2015
01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// класс титановый велосипед для delay без delay().
03// динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями.
04 
05class noDELAY {
06 
07public:
08unsigned long previous;
09unsigned long interval;
10boolean s;
11boolean push;
12boolean push_tick;
13 
14noDELAY() {
15previous  = millis();
16s         =        0;
17push      =        0;
18push_tick =        0;
19}
20 
21void start()                        {s = 1;}
22void  stop()                        {s = 0;}
23void  read(unsigned long _interval) {
24              interval = _interval;
25unsigned long current  =  millis();
26push_tick =     0;
27if (s                  ==        0) {previous = current;}
28if (current - previous >  interval) {previous = current;
29push_tick =     1;
30push      = !push;
31}
32}
33 
34};
35//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015
класс является унификацией примера "Мигаем светодиодом без delay()".
 
описание операторов и переменных класса:
*.read(n) - считывание состояния переменных класса с параметром интервала генерации в n миллисекунд.
*.start() - старт генерации событий класса.
*.stop() - стоп генерации событий класса.
*.push_tick - переменная принимает значение TRUE в течении одного цикла программы с периодом времени интервала генерации.
*.push - переменная принимает значение TRUE по окончании интервала времени генерации и изменяет своё значение на противоположное(FALSE) по окончании следующего интервала времени генерации.
 
подключение класса к Дуино ИДЕ:
создать в месте, где у вас расположены библиотеки, папку с именем class_noDELAY, текстовый файл класса сохранить в этой папке с именем class_noDELAY.h
подключение в коде скетча: #include "class_noDELAY.h"
Клапауций 322
Offline
Зарегистрирован: 31.12.2015
01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// пример blink для двух светодиодов с использованием класс титановый велосипед для delay без delay().
03 
04#include "class_noDELAY.h"
05 
06noDELAY nD_01;
07noDELAY nD_02;
08 
09void setup () {
10 
11pinMode(14, OUTPUT); // LED_01
12digitalWrite(14, 1);
13pinMode(15, OUTPUT); // LED_02
14digitalWrite(15, 1);
15 
16nD_01.start();
17nD_02.start();
18 
19}
20 
21void loop() {
22 
23nD_01.read(100);
24nD_02.read(900);
25 
26digitalWrite(14, nD_01.push);
27digitalWrite(15, nD_02.push);
28 
29}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015
01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// спагетти примеров использования класса титановый велосипед для delay без delay().
03 
04#include "class_noDELAY.h"
05 
06noDELAY nD_01; // объявление объекта класса noDELAY с именем nD_01.
07noDELAY nD_02; // объявление объекта класса noDELAY с именем nD_02.
08 
09void setup () {
10 
11pinMode(14, OUTPUT); // LED_01
12digitalWrite(14, 1);
13pinMode(15, OUTPUT); // LED_02
14digitalWrite(15, 1);
15 
16nD_01.start(); // если требуется начать немедленно, можно сразу в setup стартовать.
17nD_02.start(); // если требуется начать немедленно, можно сразу в setup стартовать.
18 
19}
20 
21void loop() {
22//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23// явное указание периода генерации.
24nD_01.read(100);
25nD_02.read(900);
26 
27// неявное указание периода генерации посредством переменной.
28static unsigned long tt = 50;
29static unsigned long nn = 300;
30nD_01.read(tt);
31nD_02.read(nn);
32if (условие) {tt = 800; nn = 200;}
33//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34if (условие) {nD_01.start(); nD_02.start();} // старт по условию.
35if (условие) {nD_01.stop();  nD_02.stop();}  // стоп по условию.
36//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37// реализация blink:
38// по условию срабатывания push_tick == TRUE.
39if (nD_01.push_tick) {digitalWrite(14, !digitalRead(14));}
40if (nD_02.push_tick) {digitalWrite(15, !digitalRead(15));}
41// или
42// согласно логического состояния переменной push.
43digitalWrite(14, nD_01.push);
44digitalWrite(15, nD_02.push);
45//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46if (nD_01.push_tick) {код чего-то;} // что-то делать с частотой интервала генерации.
47if (nD_01.push)      {код чего-то;} // что-то делать в течении интервала и не делать в течении следующего интервала.
48//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49// что-то сделать один раз по условию и по истечении времени интервала - генератор в одновибратор.
50if (условие) {nD_01.start();}
51if (nD_01.push_tick) {nD_01.stop(); код чего-то;}
52//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53}

 

alexvs
Offline
Зарегистрирован: 22.07.2014

Хорошо, но на мой взгляд, не удобно.  Не понятно зачем в цикле каждый раз делать read(100)

Надо бы так: Создаем объект, Указываем периодичность события, В цикле остается только if (nD_01.push_tick) {код чего-то;}

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

alexvs пишет:

Хорошо, но на мой взгляд, не удобно.  Не понятно зачем в цикле каждый раз делать read(100)

кому не удобно?

на самом деле это не read(100) , а read(n) , где n может измениться далее в коде.

т.е. read(100) является частным случаем read(n).

alexvs пишет:

Надо бы так: Создаем объект, Указываем периодичность события, В цикле остается только if (nD_01.push_tick) {код чего-то;}

я не знаю как проверять актуальное значение nD_01.push_tick без read(100).

покажи как - сделаю.

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

выпилил переменную *.push как странную.

теперь класс генерит одно событие TRUE *.tick в течении одного цикла программы.

01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// класс титановый велосипед для delay без delay().
03// динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями.
04 
05#include <Arduino.h>
06 
07class noDELAY {
08 
09public:
10unsigned long previous;
11unsigned long interval;
12boolean s;
13boolean tick;
14 
15noDELAY() {
16previous = millis();
17s        =        0;
18tick     =        0;
19}
20 
21void  read(unsigned long _interval) {
22              interval = _interval;
23unsigned long current  =  millis();
24                                                         tick = 0;
25if (s                  ==        0) {previous = current;          }
26if (current - previous >  interval) {previous = current; tick = 1;}
27}
28 
29void start()                        {s = 1;                       }
30void  stop()                        {s = 0;                       }
31 
32};
33//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

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

brokly пишет:

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

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

*кому не требуется жёсткий real time, тот поймёт почему в строке

if (current - previous >  interval)

написано ">", а не "==" .

alexvs
Offline
Зарегистрирован: 22.07.2014

brokly пишет:

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

Вро де бы и здорово активировать прерывания по таймеру и далее инициировать события в зависимости от установленных интервалов. Но, как известно, обработчик прерывания должен быть максимально коротким и простым, дабы оставалось время на исполнение остальной программы. А если таких событий десяток и работают они то сетью Ethernet, то сетью построенной на nRF24, тогда как быть?

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

народ, все все титановые велосипеды(их будет есчё) являются производными примера Мигаем светодиодом без delay() - вы видите в примере хардкор и реалтайм? я - нет. 

1if(currentMillis - previousMillis > interval) {previousMillis = currentMillis;}

не более.

alexvs
Offline
Зарегистрирован: 22.07.2014

Клапауций 322 пишет:

народ, все все титановые велосипеды(их будет есчё) являются производными примера Мигаем светодиодом без delay() - вы видите в примере хардкор и реалтайм? я - нет. 

1if(currentMillis - previousMillis > interval) {previousMillis = currentMillis;}

не более.

Все таки предложу свою реализацию, ТС - вы не против? Если пртив - удалю.

01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями.
03#include <Arduino.h>
04 
05class noDELAY
06{
07  private:
08    unsigned long previous;
09    unsigned long interval;
10    boolean s;
11   
12  public
13  noDELAY() {s = false;}
14   
15  void start(unsigned long _interval)
16  {
17    interval = _interval;
18    s = true;
19    previous  = millis();
20  }
21  void  stop() {s = false;}
22   
23  boolean tick()
24  {
25    unsigned long current  =  millis();
26    if (!s) { return false; }
27    else if (current - previous >  interval)
28    {
29      previous = current;
30      return true;
31    }
32    else { return false; }
33  }
34};
35//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36noDELAY nD_01;
37 
38void setup()
39{
40  pinMode(13, OUTPUT);
41  nD_01.start(1000);
42}
43 
44void loop()
45{
46  if ( nD_01.tick () ) {digitalWrite(13,!digitalRead(13));}
47}

 

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

alexvs пишет:

Все таки предложу свою реализацию, ТС - вы не против? Если пртив - удалю.

ты точно уверен, что это именно твоя реализация, а не твоя редакция моего кода?

*ну...

boolean tick()  нормальный ход 

а, if (!s) { return false; } сломает current - previous >  interval при старте т.к. current обновляется постоянно, а previous стоит.

ну, не знаю - нужно смотреть ещё возможные тараканы.

alexvs
Offline
Зарегистрирован: 22.07.2014

Я на авторство не претендую. Идея полностью твоя,  но мое виденье реализации :)

Помнишь в начале я написал: Надо бы так: Создаем объект, Указываем периодичность события, В цикле остается только if (nD_01.push_tick) {код чего-то;}

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

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Мне не нужно ! Ни разу :) Если честно, я вообще не понимаю зачем это...

Кстати, а почему именно '>' , а не '>=' ? 

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

brokly пишет:

Мне не нужно ! Ни разу :) Если честно, я вообще не понимаю зачем это...

ок. люди делятся на два типа - те, кто не понимает и те, кто понимает.

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

alexvs пишет:

Помнишь в начале я написал: Надо бы так: Создаем объект, Указываем периодичность события, В цикле остается только if (nD_01.push_tick) {код чего-то;}

помню - я ж не прогрммист, просто не знал, как сделать boolean tick()

Andrey-S
Offline
Зарегистрирован: 02.01.2015

brokly пишет:

Мне не нужно ! Ни разу :) Если честно, я вообще не понимаю зачем это...

Это для таких как я и еще хуже)))... Клапауций 322, благодарен за труд. Вы мне как-то посоветовали библиотеку Metro, а это, как я понимаю, более модифицированная ее версия?

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

Andrey-S пишет:

Вы мне как-то посоветовали библиотеку Metro, а это, как я понимаю, более модифицированная ее версия?

практически то же самое, но для себя.

в Метро зачем-то myname.reset() - что там сбрасывать не знаю.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Клапауций 322 пишет:

в Метро зачем-то myname.reset() - что там сбрасывать не знаю.

Я этой строчкой пользуюсь, к примеру, когда необходимо, чтобы какой то интервал сбросился, если, допустим, нажали кнопку для входа в меню дисплея, а на дисплее перед этим каждые 5 секунд менялась инфа всякая... Подозреваю, что это все можно сделать и другими путями, но я их пока не знаю.

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

Andrey-S пишет:

Я этой строчкой пользуюсь, к примеру, когда необходимо, чтобы какой то интервал сбросился, если, допустим, нажали кнопку для входа в меню дисплея, а на дисплее перед этим каждые 5 секунд менялась инфа всякая... Подозреваю, что это все можно сделать и другими путями, но я их пока не знаю.

у меня это *.stop()

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

Клапауций 322 пишет:

alexvs пишет:

Хорошо, но на мой взгляд, не удобно.  Не понятно зачем в цикле каждый раз делать read(100)

на самом деле это не read(100) , а read(n) , где n может измениться далее в коде.

т.е. read(100) является частным случаем read(n).

возвращаемся к тому, с чего начали - read(n) необходим для динамического изменения интервала.

иначе, придётся вызывать start(n) загромождая код if-фами вместо простого наличия read(n) в коде, плюс n у нас может измениться в то время когда генерация находится в состоянии stop() .

*вердикт - версия #7 считается актуальным релизом.

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

подключение кода класса как библиотеки #186

alexvs
Offline
Зарегистрирован: 22.07.2014

Клапауций 322 пишет:

Клапауций 322 пишет:

alexvs пишет:

Хорошо, но на мой взгляд, не удобно.  Не понятно зачем в цикле каждый раз делать read(100)

на самом деле это не read(100) , а read(n) , где n может измениться далее в коде.

т.е. read(100) является частным случаем read(n).

возвращаемся к тому, с чего начали - read(n) необходим для динамического изменения интервала.

иначе, придётся вызывать start(n) загромождая код if-фами вместо простого наличия read(n) в коде, плюс n у нас может измениться в то время когда генерация находится в состоянии stop() .

*вердикт - версия #7 считается актуальным релизом.

Да я и не настаиваю :)  Просто read(n) нужен далеко не в каждой итерации loop, а только для изменения интервала, что легко реализуется добавлением соответствующего метода, например ChangeInterval(n).

Ладно все, я просто предложил альтернативный вариант, а дальше кто как хочет.

PS для подключения не обязательно использовать h-файл, можно просто код класса в начало скетча поставить.

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

alexvs пишет:

Просто read(n) нужен далеко не в каждой итерации loop, а только для изменения интервала, что легко реализуется добавлением соответствующего метода, например ChangeInterval(n).

ну, я ещё напишу велосипед Change(n) - пусть делает TRUE, если изменилась n.

или, о чём это всё, если так или иначе, что то можно в классе сократить, но это что-то вылазит к код скетча.

*ок. а почему так ужасен вызов read(n) при каждом цикле программы? - мне кажется, что проверка Change(n) грозит большими накладными расходами, чем просто перезапись n.

alexvs пишет:

PS для подключения не обязательно использовать h-файл, можно просто код класса в начало скетча поставить.

можно все библиотеки с код скетча слить.

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

минорное обновление:

01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// класс титановый велосипед для delay без delay().
03// динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями.
04 
05#include <Arduino.h>
06 
07class noDELAY {
08 
09public:
10unsigned long previous;
11unsigned long interval;
12boolean s;
13boolean tick;
14 
15noDELAY() {
16previous = millis();
17s        =        0;
18tick     =        0;
19}
20 
21void  stop()                        {s =  0;                      }
22void start()                        {s =  1;                      }
23 
24void  read(unsigned long _interval) {
25              interval = _interval;
26unsigned long current  =  millis();                      tick = 0;
27if (s                  ==        0) {previous = current;          }
28if (current - previous >  interval) {previous = current; tick = 1;}
29}
30 
31};
32//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

serg-mmm
Offline
Зарегистрирован: 01.04.2016

Извините за глупый вопрос, но...

Почему в примере "blink без delay" проверка астанавливается на строке:

noDELAY nD_01;

пишет: noDELAY does not name a type

sketch_apr01d.ino: In function 'void loop()':
sketch_apr01d:26: error: 'nD_01' was not declared in this scope
sketch_apr01d:28: error: 'nD_02' was not declared in this scope
 
В Arduino класс появился, скетч скопировал, что не так? Ведь это пример?
Обновил до Arduino 1.6.8, теперь ошибка кампиляции.
Клапауций 322
Offline
Зарегистрирован: 31.12.2015

serg-mmm пишет:

Почему в примере "blink без delay" проверка астанавливается на строке:

потому, что нужно внимательно читать тему:

#7 выпилил переменную *.push как странную.

поэтому пример для версии кода класса #26 будет выглядеть так:

01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// пример blink для двух светодиодов с использованием класс титановый велосипед для delay без delay().
03 
04#include "class_noDELAY.h"
05 
06noDELAY nD_01;
07noDELAY nD_02;
08 
09void setup () {
10 
11pinMode(14, OUTPUT); // LED_01
12digitalWrite(14, 1);
13pinMode(15, OUTPUT); // LED_02
14digitalWrite(15, 1);
15 
16nD_01.start();
17nD_02.start();
18 
19}
20 
21void loop() {
22 
23nD_01.read(100);
24nD_02.read(900);
25 
26if (nD_01.tick) {digitalWrite(14, !digitalRead(14));}
27if (nD_02.tick) {digitalWrite(15, !digitalRead(15));}
28 
29}
Скетч использует 1 072 байт (17%) памяти устройства. Всего доступно 6 144 байт.
Глобальные переменные используют 29 байт (1%) динамической памяти, оставляя 2 019 байт для локальных переменных. Максимум: 2 048 байт.

arduino-1.6.8

serg-mmm
Offline
Зарегистрирован: 01.04.2016
Arduino: 1.6.8 (Windows XP), Плата:"Arduino Nano, ATmega328"
 
C:\Program Files\Arduino\arduino-builder -dump-prefs -logger=machine -hardware "C:\Program Files\Arduino\hardware" -tools "C:\Program Files\Arduino\tools-builder" -tools "C:\Program Files\Arduino\hardware\tools\avr" -built-in-libraries "C:\Program Files\Arduino\libraries" -libraries "C:\Documents and Settings\Сергей\Мои документы\Arduino\libraries" -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10608 -build-path "C:\DOCUME~1\F942~1\LOCALS~1\Temp\builda3dd0be7001ea7abcbb747636d2b358e.tmp" -warnings=none -prefs=build.warn_data_percentage=75 -verbose "C:\DOCUME~1\F942~1\LOCALS~1\Temp\arduino_modified_sketch_632992\sketch_apr01a.ino"
C:\Program Files\Arduino\arduino-builder -compile -logger=machine -hardware "C:\Program Files\Arduino\hardware" -tools "C:\Program Files\Arduino\tools-builder" -tools "C:\Program Files\Arduino\hardware\tools\avr" -built-in-libraries "C:\Program Files\Arduino\libraries" -libraries "C:\Documents and Settings\Сергей\Мои документы\Arduino\libraries" -fqbn=arduino:avr:nano:cpu=atmega328 -ide-version=10608 -build-path "C:\DOCUME~1\F942~1\LOCALS~1\Temp\builda3dd0be7001ea7abcbb747636d2b358e.tmp" -warnings=none -prefs=build.warn_data_percentage=75 -verbose "C:\DOCUME~1\F942~1\LOCALS~1\Temp\arduino_modified_sketch_632992\sketch_apr01a.ino"
Изменены опции сборки, пересобираем все
"C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "C:\DOCUME~1\F942~1\LOCALS~1\Temp\builda3dd0be7001ea7abcbb747636d2b358e.tmp\sketch\sketch_apr01a.ino.cpp" -o "nul"
"C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10608 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR   "-IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files\Arduino\hardware\arduino\avr\variants\eightanaloginputs" "C:\DOCUME~1\F942~1\LOCALS~1\Temp\builda3dd0be7001ea7abcbb747636d2b358e.tmp\sketch\sketch_apr01a.ino.cpp" -o "C:\DOCUME~1\F942~1\LOCALS~1\Temp\builda3dd0be7001ea7abcbb747636d2b358e.tmp\preproc\ctags_target_for_gcc_minus_e.cpp"
C:\DOCUME~1\F942~1\LOCALS~1\Temp\arduino_modified_sketch_632992\sketch_apr01a.ino:4:29: fatal error: class_noDELAY.h: No such file or directory
 
   #include "class_noDELAY.h"
 
                             ^
 
compilation terminated.
 
exit status 1
Ошибка компиляции для платы Arduino Nano.
Клапауций 322
Offline
Зарегистрирован: 31.12.2015

serg-mmm пишет:

fatal error: class_noDELAY.h: No such file or directory
 
   #include "class_noDELAY.h"

я буду логи читать и подключать класс как библиотеку?

#2

Клапауций 322 пишет:

подключение класса к Дуино ИДЕ:
создать в месте, где у вас расположены библиотеки, папку с именем class_noDELAY, текстовый файл класса сохранить в этой папке с именем class_noDELAY.h
подключение в коде скетча: #include "class_noDELAY.h"

 

serg-mmm
Offline
Зарегистрирован: 01.04.2016

Так и сделано.

 

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

serg-mmm пишет:

Так и сделано.

не ври.

serg-mmm пишет:

fatal error: class_noDELAY.h: No such file or directory
 
   #include "class_noDELAY.h"

serg-mmm
Offline
Зарегистрирован: 01.04.2016

А я как .txt сохранял.

теперь на этой строчке останавливается:

if (nD_02.tick) {digitalWrite(15, !digitalRead(15));}

и ошибка:

Используем библиотеку class_noDELAY в папке: C:\Program Files\Arduino\libraries\class_noDELAY (legacy)
exit status 1
stray '\240' in program
Клапауций 322
Offline
Зарегистрирован: 31.12.2015

serg-mmm пишет:

А я как .txt сохранял.

ещё один вопрос и ты идёшь нахуй.

Клапауций 322 пишет:

сохранить в этой папке с именем class_noDELAY.h

std
Offline
Зарегистрирован: 05.01.2012

Клапауций 322 пишет:
ещё один вопрос и ты идёшь нахуй

Душевно.... но новобранцы не оценят. надо же любя....

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

std пишет:

Душевно.... но новобранцы не оценят. надо же любя....

а, никто и не набирает тут армию кретинов.

toc
Offline
Зарегистрирован: 09.02.2013

Клапауций 322, по #26
если не затруднит, со следующим обновлением оторматируйте текст программы с нормальными отступами, будь ласка. Так совсем структуру не вижу. спасибо

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

toc пишет:
Клапауций 322, по #26 если не затруднит, со следующим обновлением оторматируйте текст программы с нормальными отступами, будь ласка. Так совсем структуру не вижу. спасибо

ок. по многочисленным просьбам ползателей форума - у кого отсутвует нормальный текстовый редактор и комбинация клавиш Ctrl+C, код будет дублироваться авторским картинко, где структура кода читается построчно.

 

toc
Offline
Зарегистрирован: 09.02.2013

ага , в ipad mini отсутствует кнопка ctrl. Ты изобрёл способ борьбы с начинающими лентяями на форуме. Картинками им выдавать ответы надо. Пусть руками работают. :)

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

минорное обновление:

01//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
02// класс титановый велосипед для delay без delay().
03// динамически управляемая генерация событий с динамически изменяемым интервалом времени между событиями.
04 
05#include <Arduino.h>
06 
07class noDELAY {
08 
09public:
10unsigned long previous;
11unsigned long interval;
12boolean s;
13boolean tick;
14 
15noDELAY() {
16previous = micros();
17// previous = millis();
18s        =        0;
19tick     =        0;
20}
21 
22void  stop()                        {s =  0;                      }
23void start()                        {s =  1;                      }
24 
25void  read(unsigned long _interval) {
26              interval = _interval;
27unsigned long current  =  micros();                      tick = 0;
28// unsigned long current  =  millis();                      tick = 0;
29if (s                  ==        0) {previous = current;          }
30if (current - previous >  interval) {previous = current; tick = 1;}
31}
32 
33};
34//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

Маленькая непонятка по плавному включению с использованием класса.

if (digitalRead(SW) == LOW && prog == 1) {

if (val < spd && timer3.tick ){

val++;

analogWrite(LED, val);

}

}

Работает только при удержании кнопки. Как сделать по однократному нажатию?

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

Megawollt пишет:

Маленькая непонятка по плавному включению с использованием класса.

Работает только при удержании кнопки. Как сделать по однократному нажатию?

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

Megawollt
Offline
Зарегистрирован: 06.12.2015

Я стараюсь, но пока не получается. Надеюсь на твою помощь в ответе

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

Megawollt пишет:

Я стараюсь, но пока не получается. Надеюсь на твою помощь в ответе

заведи переменную типа boolean равную 0, меняй эту переменную на 1 нажатием кнопки и на 0 при условии val == 255. по условию равенства этой переменной 1, запускай процесс увеличения val с использованием класса

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Осталось непонятным зачем требуется именно "класс", когда вполне можно обходится типа таким макросом:

01// ============= wait without delay ============ //
02// Простейший конечный автомат сначала исполняющий действие command и
03// затем ожидающий его повторения через interval тиков таймера по 1 миллисекунде.
04// В качестве команды может быть последовательность команд через ;
05// или прямой вызов функции!
06// интервалы можно задавать константно и переменными (выражениями).
07// Например (исполнение через 1 сек):
08//
09// @param uint32_t       interval; [milliseconds]
10// @param void (*)(void) action;
11//
12#define everyMillis(interval, action) \
13{                                     \
14  static unsigned long t = 0UL;       \
15  if( millis() - t > (interval) )     \
16  {                                   \
17    { action; }                       \
18    t = millis();                     \
19  }                                   \
20}
21 
22// Использование, например прямо так (делать каждую секунду):
23everyMillis(1000,
24{
25   pinOut(pinLed, 1-digitalRead(pinLed));
26   analogWrite(pwm12, analogRead(pin54)>>4);
27});
28 
29// .. или так (вызывать каждую секунду):
30everyMillis(1000, blink() );
31 
32// наборотный макрос "delay()" для выполнения кода ПОКА идет задержка:
33#define delayYield(interval, action)    \
34{                                       \
35  static unsigned long t = millis();    \
36  while( !(millis() - t > (interval)) ) \
37  { action; }                           \
38}
39 
40// использование - аналогично (пока идет секундная пауза, делай это):
41delayYield(1000, {
42  digitalWrite(pinLed, HIGH);
43  uint16_t mySignal = analogRead(Analog1);
44  everyMillis(100, {
45    // тут ишо чего-нить, каждые 100мсек, не чаще, во время паузы .. :)
46  });
47});

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

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

Arhat109-2 пишет:

Осталось непонятным зачем требуется именно "класс", когда вполне можно обходится типа таким макросом:

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Наверное потому, что я неплохо знаю цену всему "классному" подходу и пользую его ровно там, где оно того стоит, не? :)

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

Arhat109-2 пишет:

Наверное потому, что я неплохо знаю цену всему "классному" подходу и пользую его ровно там, где оно того стоит, не? :)

если бы знал, что не генерил бы быдлокод

12 #define everyMillis(interval, action) \
13 {                                     \
14   static unsigned long t = 0UL;       \
15   if( millis() - t > (interval) )     \
16   {                                   \
17     { action; }                       \
18     t = millis();                     \
19   }                                   \
20 }

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А где тут генерится "быдлокод", покажешь? :)