Ви не увійшли.
Где-то это уже было . только с другими наименованиями. Плагиат?
Нет. Просто своя разработка. Разумеется сейчас я создаю код в другом виде. Но тоже в несколько вычислительных потоков. Так алгоритм и взаимодействие частей программы проще.
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()
}
Где-то это уже было . только с другими наименованиями. Плагиат?
"Начинаем с объявления класса Flasher:....."и т.д.
http://robotosha.ru/arduino/multi-tasking-arduino.html
Конечно это не совсем меню, но построить что то полезное и при этом не запутаться в коде можно.
https://yadi.sk/d/NbavqlJ_tpkgd
Проще говоря там на входы А1-А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);
}
Вы молодцы, но смотрите глубже в процессы которые происходят к контроллере ) Успеха.
Пример релизации Мультивибратора , частота мигания светодиода задается потенциометром на выв А0.
Разумеется на одной Ардуине можно собрать до 6 независимых мультивибраторов.По числу аналоговых входов.
Программа на двух класс-процессах 1 - мигает светодиодом на выв 13 ; а 2 включает 0 / отключает 1 это мигание выв 2
http://yadi.sk/d/pXeze5_XtkRbP
qwone , с какого языка/среды перевелись на ардуино? ) что раньше изучали?
с нетерпением ожидаю Ваших идей насчет динамического текстового меню )
Ну здесь все не так просто. 1) Использование приведеных конструкций. Я называю это класс-процессом. Ну надо же как это называть. Не совмещается с обычным стилем программирования. Так что и основную программу надо писать в виде класс-процесса. 2) программа с меню уже это три класс-процесса: а- основная программа, б- класс-процесс дисплея , в- обработчик команд с клавиатуры, в который входит класс-поток обработки самих клавиш. Так что до меню надо пахать и пахать. И да то меню что сейчас это каменый век. Но пока менять на что-то другое не получится. Ну нет пока рабочего кода.
qwone, покажите плс пример для динамического меню LCD (только текст ), а то, то чем я пользуюсь, из мезозоя решение), хорошо работает и ладно ) но хочется чего-то свеженького.
со всем согласен кроме "работает немного не привычном режиме.", while (1) {...} / for (;;) {...} цикл и в Африке цикл )
Ваш подход к коду можно рекомендовать как основополагающий для разработки в среде Ардуино )
На 3 . Цикл loop() работает немного не привычном режиме. Он последовательно дает управления всем процессам(представителям классам). А вот уже в представителях классов уже решают, пришло время что-то сделать или подождать.
if (millis() < future) return; // вот где решают , что надо переходить к действию
future = span+millis(); // а здесь готовят новую точку времени для выполнения.
Конечно, что очень не привычно. Но воткнуть в Ардуину месколько независимых процессов того стоит. Да и Ардуины будут развиваться по мощности. И язык Си кростплатформенен. Так что такой вариант структуры программы можно сделать в любой другой среде с языком Си.
ПС: Да и насчет выставления времени в процессах. Если процессы важные, то тайминги можно делать маленькие. А вот если процессу хватит и раз в секунду, то можно и сделать в секунду. Например выводить информацию на экран. Человек - устройство медленное, поэтому процессору много времени обслуживать его не займет. Глядишь и производительность процессора рациональнее распределится.
2- объявление представителей классов все же до setup(), так как видимость нужна на всю программу. - это точно, тут согласен ( прогавил )
3 - delay(xxx) там точно не надо. Мало что прерывание накроет, так и производительность съест. не понял (
как работает function go я понял )
Serial.print("I received: "); блокирует поток? или что то типа mutex сделано?
но я что то все равно слабо верю, что arduino среда насущного и будущего разработки )
но что есть, то есть - симпатично получается с этим ООП
--------------------------------------
альтернативные ++ )
https://github.com/opendrone/flymaple/tree/testing/src
--------------------------------------
Вот еще подобная программа. Только без светодиодов.
// ---класс вспышка---
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();
}
Похоже вы все таки не смогли прочитать программу.
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
красиво ) но не читаемо, шрифт размыт
я предпочитаю == 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();
уже не будет давать меандр на выходе
покажите другие проекты ),