#1 2016-07-25 21:11:10

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Ну собственно скеч.

// ---класс вспышка---
class qw_blink {
  public:
    qw_blink(int pin,unsigned long span);
    void go();// драйвер blink
  private:
    unsigned long span;// интервал гашения или включения
    unsigned long future;// время сменить состояние гашения или включения    
    int            pin;// номер вывода
    boolean      state;// состояние светодиода
};
qw_blink::qw_blink(int pin,unsigned long span){
  this->pin  =  pin;
  pinMode(pin, OUTPUT);
  this->span = span;
  future       = span+millis();
  state      = 0;
  digitalWrite(pin, state);
}
void qw_blink::go(){
  if (millis() < future) return;
  future       = span+millis();
  state  = ! state ;
  digitalWrite(pin, state);
}
// ====== Программа ======  
qw_blink VD1(13,1200); // светодиод нв 13 мигает 1.2+1.2 сек
qw_blink VD2(12,1100); // светодиод нв 12 мигает 1.1+1.1 сек
qw_blink VD3(11,1000); // светодиод нв 11 мигает 1.0+1.0 сек
qw_blink VD4(10, 900); // светодиод нв 10 мигает 0.9+0.9 сек
qw_blink VD5(9,  800); // светодиод нв 9 мигает 0.8+0.8 сек
qw_blink VD6(8,  700); // светодиод нв 8 мигает 0.7+0.7 сек
qw_blink VD7(7,  600); // светодиод нв 7 мигает 0.6+0.6 сек
qw_blink VD8(6,  500); // светодиод нв 6 мигает 0.5+0.5 сек
qw_blink VD9(5,  400); // светодиод нв 5 мигает 0.4+0.4 сек
qw_blink VD10(4, 300); // светодиод нв 4 мигает 0.3+0.3 сек
qw_blink VD11(3, 200); // светодиод нв 3 мигает 0.2+0.2 сек
qw_blink VD12(2, 100); // светодиод нв 2 мигает 0.1+0.1 сек
void setup() {
 
}

void loop() {
VD1.go();  
VD2.go();
VD3.go();  
VD4.go();
VD5.go();  
VD6.go();
VD7.go();  
VD8.go();
VD9.go();  
VD10.go();
VD11.go();  
VD12.go();
}

Неактивний

#2 2016-07-25 22:27:49

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

А теперь на Бис. Все тоже самое , а еще в Serial отправлять сообщение каждые 2 сек.

// ---класс вспышка---
class qw_blink {
  public:
    qw_blink(int pin,unsigned long span);
    void go();// драйвер blink
  private:
    unsigned long span;// интервал гашения или включения
    unsigned long future;// время сменить состояние гашения или включения    
    int            pin;// номер вывода
    boolean      state;// состояние светодиода
};
qw_blink::qw_blink(int pin,unsigned long span){
  this->pin  =  pin;
  pinMode(pin, OUTPUT);
  this->span = span;
  future       = span+millis();
  state      = 0;
  digitalWrite(pin, state);
}
void qw_blink::go(){
  if (millis() < future) return;
  future       = span+millis();
  state  = ! state ;
  digitalWrite(pin, state);
}
// ---- класс ослик -----
// отправляет сообщение в Serial через определеное время
class qw_neddy{
public:
    qw_neddy(unsigned long span);
    void go();// драйвер blink
  private:
    unsigned long span;// интервал сообщения
    unsigned long future;// время следующего сообщения  
};
qw_neddy::qw_neddy(unsigned long span){
  this->span = span;
  future       = span+millis();
}
void qw_neddy::go(){
  if (millis() < future) return;
  future       = span+millis();
   Serial.println("neddy");  
}

// ====== Программа ======  
qw_blink VD1(13,1200); // светодиод нв 13 мигает 1.2+1.2 сек
qw_blink VD2(12,1100); // светодиод нв 12 мигает 1.1+1.1 сек
qw_blink VD3(11,1000); // светодиод нв 11 мигает 1.0+1.0 сек
qw_blink VD4(10, 900); // светодиод нв 10 мигает 0.9+0.9 сек
qw_blink VD5(9,  800); // светодиод нв 9 мигает 0.8+0.8 сек
qw_blink VD6(8,  700); // светодиод нв 8 мигает 0.7+0.7 сек
qw_blink VD7(7,  600); // светодиод нв 7 мигает 0.6+0.6 сек
qw_blink VD8(6,  500); // светодиод нв 6 мигает 0.5+0.5 сек
qw_blink VD9(5,  400); // светодиод нв 5 мигает 0.4+0.4 сек
qw_blink VD10(4, 300); // светодиод нв 4 мигает 0.3+0.3 сек
qw_blink VD11(3, 200); // светодиод нв 3 мигает 0.2+0.2 сек
qw_blink VD12(2, 100); // светодиод нв 2 мигает 0.1+0.1 сек
qw_neddy    neddy(2000);// отпавка в Serial каждые 2 сек
void setup() {
  Serial.begin(9600); //устанавливаем последовательное соединение
}

void loop() {
VD1.go();  
VD2.go();
VD3.go();  
VD4.go();
VD5.go();  
VD6.go();
VD7.go();  
VD8.go();
VD9.go();  
VD10.go();
VD11.go();  
VD12.go();
neddy.go();
}

Неактивний

#3 2016-07-26 09:15:38

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

красиво ) но не читаемо, шрифт размыт
я предпочитаю == C++ ==
пример оформления Вашего кода

// ---класс вспышка---
class qw_blink {
  public:
    qw_blink(int pin,unsigned long span);
    void go();// драйвер blink
  private:
    unsigned long span;// интервал гашения или включения
    unsigned long future;// время сменить состояние гашения или включения    
    int            pin;// номер вывода
    boolean      state;// состояние светодиода
};
qw_blink::qw_blink(int pin,unsigned long span){
  this->pin  =  pin;
  pinMode(pin, OUTPUT);
  this->span = span;
  future       = span+millis();
  state      = 0;
  digitalWrite(pin, state);
}
void qw_blink::go(){
  if (millis() < future) return;
  future       = span+millis();
  state  = ! state ;
  digitalWrite(pin, state);
}
// ====== Программа ======  
qw_blink VD1(13,1200); // светодиод нв 13 мигает 1.2+1.2 сек
qw_blink VD2(12,1100); // светодиод нв 12 мигает 1.1+1.1 сек
qw_blink VD3(11,1000); // светодиод нв 11 мигает 1.0+1.0 сек
qw_blink VD4(10, 900); // светодиод нв 10 мигает 0.9+0.9 сек
qw_blink VD5(9,  800); // светодиод нв 9 мигает 0.8+0.8 сек
qw_blink VD6(8,  700); // светодиод нв 8 мигает 0.7+0.7 сек
qw_blink VD7(7,  600); // светодиод нв 7 мигает 0.6+0.6 сек
qw_blink VD8(6,  500); // светодиод нв 6 мигает 0.5+0.5 сек
qw_blink VD9(5,  400); // светодиод нв 5 мигает 0.4+0.4 сек
qw_blink VD10(4, 300); // светодиод нв 4 мигает 0.3+0.3 сек
qw_blink VD11(3, 200); // светодиод нв 3 мигает 0.2+0.2 сек
qw_blink VD12(2, 100); // светодиод нв 2 мигает 0.1+0.1 сек
void setup() {
 
}

void loop() {
VD1.go();  
VD2.go();
VD3.go();  
VD4.go();
VD5.go();  
VD6.go();
VD7.go();  
VD8.go();
VD9.go();  
VD10.go();
VD11.go();  
VD12.go();
}

[add strike-through]
qwone,  небольшое дополнение

// ====== Программа ====== 
qw_blink VD1(13,1200); // светодиод нв 13 мигает 1.2+1.2 сек
qw_blink VD2(12,1100); // светодиод нв 12 мигает 1.1+1.1 сек
перенести в
void setup() {

}

а то будут ругаться  что "совсем" Ваша программа не работает, и Вы сбиваете людей с толку )
и так же не забывает что пауза  между
VD5.go(); 
delay(xxx)
VD6.go();
уже не будет давать меандр на выходе

покажите другие проекты ),

Остання редакція NoName (2016-07-26 22:31:25)

Неактивний

#4 2016-07-26 17:43:19

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Похоже вы все таки не смогли прочитать программу.
1-черный, потому что я так и не смог поменять цвет в панеле кода.
2- объявление представителей классов все же до setup(), так как видимость нужна на всю программу.
3 - delay(xxx) там точно не надо. Мало что прерывание накроет, так и производительность съест.
4 - Это в некотором смысле ОС с независимыми потоками и необычной архитектурой, которую можно наращивать. Но модулями построеными по данной идеалогии. Вот только с привычными не работает.
И да в среде Ардуино прекрасно компилируется и работает. Сырую программу я предпочитаю не выкладывать.

ПС:
Вот вам пример из здешнего Тутора
#include <Morse.h>

Morse morse(13);

void setup()
{
}

void loop()
{
  morse.dot(); morse.dot(); morse.dot();
  morse.dash(); morse.dash(); morse.dash();
  morse.dot(); morse.dot(); morse.dot();
  delay(3000);
}
http://arduino.ua/ru/prog/LibraryTutorial

Остання редакція qwone (2016-07-26 18:01:21)

Неактивний

#5 2016-07-26 21:37:04

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Вот еще подобная программа. Только без светодиодов.

// ---класс вспышка---
class qw_blink {
  public:
    qw_blink(int pin,unsigned long span);
    void go();// драйвер blink
  private:
    unsigned long span;// интервал гашения или включения
    unsigned long future;// время сменить состояние гашения или включения   
    int            pin;// номер вывода
    boolean      state;// состояние светодиода
};
qw_blink::qw_blink(int pin,unsigned long span){
  this->pin  =  pin;
  pinMode(pin, OUTPUT);
  this->span = span/2;
  future       = span+millis();
  state      = 0;
  digitalWrite(pin, state);
}
void qw_blink::go(){
  if (millis() < future) return;
  future       = span+millis();
  state  = ! state ;
  digitalWrite(pin, state);
}
// ---- класс ослик -----
// отправляет сообщение в Serial через определеное время
class qw_neddy{
  public:
    qw_neddy(unsigned long span,char* message);
    void go();// драйвер neddy
    char* message;
  private:
    unsigned long span;// интервал сообщения
    unsigned long future;// время следующего сообщения 
};
qw_neddy::qw_neddy(unsigned long span,char* message){
  this->message = message;
  this->span = span;
  future       = span+millis();
}
void qw_neddy::go(){
  if (millis() < future) return;
  future       = span+millis();
   Serial.print(message); 
   Serial.println(millis()); 
}
// ---- класс корова -----
// построен на основе этого http://arduino.ua/ru/prog/Serial/Read
class qw_kine{
  public: 
    qw_kine(unsigned long span);// конструктор
    void go();// драйвер kine
  private:
    unsigned long span;// интервал сообщения
    unsigned long future;// время следующего сообщения
    int incomingByte;// входящий байт
};
qw_kine::qw_kine(unsigned long span){
  this->span = span;
  future     = span+millis(); 
}
void qw_kine::go(){
    if (millis() < future) return;
    future = span+millis();
    if (Serial.available() == 0) return;   //если есть доступные данные
    incomingByte = Serial.read();
    Serial.print("I received: ");
    Serial.println(incomingByte);
}

// ====== Программа ====== 
qw_blink VD1(13,1200); // светодиод нв 13 мигает 1.2 сек
qw_neddy  neddy0(1000,"neddy0  ");// отпавка в Serial каждые 1 сек
qw_neddy  neddy1(1300,"neddy1  ");// отпавка в Serial каждые 1,3 сек
qw_neddy  neddy2(900,"neddy2  ");// отпавка в Serial каждые 0,9 сек
qw_kine   kine(100);

void setup() {
  Serial.begin(9600); //устанавливаем последовательное соединение
}

void loop() {
// подключение драйверов
VD1.go(); 
neddy0.go();neddy1.go();neddy2.go();
kine.go();
}

Неактивний

#6 2016-07-26 22:17:50

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

2- объявление представителей классов все же до setup(), так как видимость нужна на всю программу. - это точно, тут согласен (  прогавил )
3 - delay(xxx) там точно не надо. Мало что прерывание накроет, так и производительность съест.   не понял (

как работает function go я понял )

Serial.print("I received: ");  блокирует поток? или что то типа mutex  сделано?
но я что то все равно слабо верю, что  arduino  среда насущного и будущего  разработки )
но что есть, то есть  - симпатично получается с этим ООП
--------------------------------------
альтернативные ++ )
https://github.com/opendrone/flymaple/tree/testing/src
--------------------------------------

Остання редакція NoName (2016-07-26 22:33:01)

Неактивний

#7 2016-07-27 06:42:20

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

На 3 . Цикл loop() работает немного не привычном режиме. Он последовательно дает управления всем процессам(представителям классам). А вот уже в представителях классов уже решают, пришло время что-то сделать или подождать.
    if (millis() < future) return; // вот где решают , что надо переходить к действию
    future = span+millis(); // а здесь готовят новую точку времени для выполнения.

Конечно, что очень не привычно. Но воткнуть в Ардуину месколько независимых процессов того стоит. Да и Ардуины будут развиваться по мощности. И язык Си кростплатформенен. Так что такой вариант структуры программы можно сделать в любой другой среде с языком Си.

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

Остання редакція qwone (2016-07-27 06:51:39)

Неактивний

#8 2016-07-27 09:19:49

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

со всем согласен кроме "работает немного не привычном режиме.", while  (1) {...} / for (;;) {...}  цикл и в Африке цикл )
Ваш подход  к коду можно рекомендовать как основополагающий для разработки в среде Ардуино )

Неактивний

#9 2016-07-28 12:48:10

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

qwone, покажите плс пример для динамического меню LCD (только текст ),   а то, то чем я пользуюсь, из мезозоя  решение), хорошо работает и ладно  ) но хочется чего-то  свеженького.

Неактивний

#10 2016-07-28 17:48:48

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Ну здесь все не так просто. 1) Использование приведеных конструкций. Я называю это класс-процессом. smile  Ну надо же как это называть. Не совмещается с обычным стилем программирования. Так что и основную программу надо писать в виде класс-процесса. 2) программа с меню уже это три класс-процесса: а- основная программа, б- класс-процесс дисплея , в- обработчик команд с клавиатуры, в который входит класс-поток обработки самих клавиш.  Так что до меню надо пахать и пахать. И да то меню что сейчас это каменый век. Но пока менять на что-то другое не получится. Ну нет пока рабочего кода.

Неактивний

#11 2016-07-29 13:23:57

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

qwone , с какого языка/среды перевелись на ардуино? )  что раньше изучали?

с нетерпением ожидаю Ваших идей насчет динамического текстового меню )

Неактивний

#12 2016-07-29 21:38:24

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Программа на двух класс-процессах  1 - мигает светодиодом на выв 13 ; а 2 включает 0 / отключает 1 это мигание выв 2
http://yadi.sk/d/pXeze5_XtkRbP

Неактивний

#13 2016-07-30 06:43:40

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Пример релизации Мультивибратора , частота мигания светодиода задается потенциометром на выв А0.

Разумеется на одной Ардуине можно собрать до 6 независимых мультивибраторов.По числу аналоговых входов.

http://yadi.sk/d/mS_0LnSJtkh97

Неактивний

#14 2016-08-01 11:21:14

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

qwone,  небольшое пожелание  по "Пример релизации Мультивибратора"
вынести переключение в таймер  1ms  или 10ms   
чтение  входных данных  (  span = 1+analogRead(FreacPin)*2 ;// шаг мигания 1+(0..1023)*2 ) вынести в отдельный  процесс, с фильтрацией например скользящее среднее на 8 ) будет "ляля" , сейчас красиво, но не функционально,
работать будет, но опрос тут (go)  не в тему )

void qw_blink2::go(){
    // общая часть
  if (millis() < future) return;
  span = 1+analogRead(FreacPin)*2 ;// шаг мигания 1+(0..1023)*2
  future       = span+millis();
   // индивидуальная часть 
  state  = ! state ;
  digitalWrite(BlinkPin, state);
}

Вы молодцы, но смотрите глубже  в процессы  которые происходят к контроллере ) Успеха.

Неактивний

#15 2016-08-01 22:24:52

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Конечно это не совсем меню, но построить что то полезное и при этом не запутаться в коде можно.
https://yadi.sk/d/NbavqlJ_tpkgd
Проще говоря там на входы А1-А5 подкючены потонциометры, а на выходе можно подключить реле . И потом последовательно с Сериал кидаюся переменые.

Неактивний

#16 2016-08-26 02:14:48

БЕЗ ИМЕНИ
Гість

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

Где-то это уже было . только с другими наименованиями. Плагиат?
"Начинаем с объявления класса Flasher:....."и т.д.
http://robotosha.ru/arduino/multi-tasking-arduino.html

#17 2016-08-31 22:44:23

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: 1,2,3,4,5 : Начинаем асинхронно светодиодами на Ардуине мигать!

БЕЗ ИМЕНИ пише:

Где-то это уже было . только с другими наименованиями. Плагиат?

Нет. Просто своя разработка. Разумеется сейчас я создаю код в другом виде. Но тоже в несколько вычислительных потоков. Так алгоритм и взаимодействие частей программы проще.

const int Led_Pin = 13; // нога светодиода

void flashing_non_stop_program(uint16_t time_0,uint16_t time_1 ) {
  static bool state = 0;
  static uint32_t timing = 0;
  if (millis()<timing) return;
  state = !state;
  timing += state ? time_0 : time_1 ;
  digitalWrite(Led_Pin, state);
}
void setup() {
pinMode(Led_Pin, OUTPUT);
}
void loop() {
   flashing_non_stop_program(100,900);// 0.1 сек горит 0.9 сек нет
   // идет продолжение программы без задержки на millis()
}

Остання редакція qwone (2016-08-31 22:48:45)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму