Подскажите как добавить действие к двухпериодный таймер
- Войдите на сайт для отправки комментариев
Пнд, 04/09/2017 - 11:24
// входа
#define potPause A0 // потенциометр на 10 кОм для установки паузы двигателя.
#define potWork A1 // потенциометр на 10 кОм для установки работы движка.
#define WorkDrive 2 // Вывод к котрому подключена нагрузка
#define TIME_ON_NASOS 1000 // Время в течении, которого на выводе 1
#define TIME_OFF_NASOS 5000 // Время в течении, которого на выводе 0
boolean state_nasos = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_nasos = millis(); // Переменная для хранения времени
unsigned int Work = 0; // переменная для потенциометра для продолжительности работы движка
unsigned int Pause = 0; // переменная для потенциометра для продолжительности паузы движка
unsigned int WorkMillis = 0;
unsigned int PauseMillis =0;
#define ImpulsProduvka 3 // Вывод к котрому подключена нагрузка
#define TIME_ON_KLAPAN 1000 // Время в течении, которого на выводе 1
#define TIME_OFF_KLAPAN 5000 // Время в течении, которого на выводе 0
boolean state_klapan = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_klapan = millis(); // Переменная для хранения времени
void setup() {
Serial.begin(9600);
pinMode(potPause, INPUT);
pinMode(potWork, INPUT);
pinMode(ImpulsProduvka, OUTPUT);
pinMode(WorkDrive, OUTPUT);
digitalWrite (ImpulsProduvka, HIGH); // выкл для релейного модуля
digitalWrite (WorkDrive, HIGH); // вкл для релейного модуля
}
void loop(){
// Управление насосом:
uint16_t Work = analogRead(potWork); //читаю потенциометр работы двигателя
uint16_t Pause = analogRead(potPause); //читаю потенциометр паузы двигателя
PauseMillis = map(Pause, 0, 1023, 0, 60000); // конвертирую показания потенциометра от 0 до 60 секунд для паузы
WorkMillis = map(Work, 0, 1023, 0, 60000); // конвертирую показания потенциометра от 0 до 60 секунд для работы двигателя
if(millis() > new_millis_nasos){
state_nasos = !state_nasos;
digitalWrite(WorkDrive, !state_nasos);
if(state_nasos){
new_millis_nasos = millis() + WorkMillis;
}
else{
new_millis_nasos = millis() + PauseMillis;
}
}
// Управление продувкой:
if(millis() > new_millis_klapan && !state_nasos){ //если милисы больше чем прошлый показатель И насос выключен!
state_klapan = !state_klapan; // меняю состояние клапана
digitalWrite(ImpulsProduvka, !state_klapan); // подаю инвертированный сигнал ОТ состояния клапана - на клапан продувки фильтра
if(state_klapan){ // если клапан ВЕРНО то включаю два периода времнеи
new_millis_klapan = millis() + TIME_ON_KLAPAN;
}
else{
new_millis_klapan = millis() + TIME_OFF_KLAPAN;
}
}
if(state_nasos) // принудительно выключаю продувку клапана во время работы насоса.
{
digitalWrite (ImpulsProduvka, HIGH); //высокий сигнал потому что модули реле инвертированные, так она выключена
}
/* ЭТО для отладки:
*
* Serial.print("пауза -");
Serial.println (PauseMillis / 1000);
Serial.print("работа -");
Serial.println(WorkMillis / 1000);
*/
//////// ВЫВОД ИНФОРМАЦИИ НА OLED дисплей:
}
Есть вот такой вот код. Принцип понятен. Но хотел еще добавить и попутные действия на время выполнения того или иного периода. Между каких строчек влезть?
например при паузе движка- мигание светиком.
где то тут на форуме кстати натыкался на заготовку типа" мигалка при определенном действии" там отдельно skj сделано VOID-ом был.
У меня пока нет желания переводить ваш код в мой. Так что пока почитайте это.http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
ПС:
/**/ unsigned int mill; //------Cl_AAA---------------------- // класс вкл-выкл class Cl_AAA { protected: const byte pin; bool led; bool statBlink; unsigned long past; unsigned int timeON, timeOFF; unsigned int *ptimeON, *ptimeOFF; public: Cl_AAA(byte pin_, unsigned int *ptimeON_, unsigned int *ptimeOFF_ ) : pin(pin_), ptimeON(ptimeON_), ptimeOFF(ptimeOFF_ ) {} void setup() { pinMode(pin, OUTPUT); past = mill; digitalWrite(pin, led = 1); if (*ptimeON != 0) timeON = *ptimeON; } void loop() { if (led && mill - past >= timeON) { past = mill; if (*ptimeOFF != 0) timeOFF = *ptimeOFF; digitalWrite(pin, led = 0); } if (!led && mill - past >= timeOFF) { past = mill; digitalWrite(pin, led = 1); if (*ptimeON != 0) timeON = *ptimeON; } } }; //-------------------------------- class Cl_analogRead { protected: byte pin; unsigned int *val, maxim, minim; const char *name; unsigned int past; public: Cl_analogRead(byte pin_, unsigned int *val_, unsigned int maxim_, unsigned int minim_, char* name_): pin(pin_), val(val_), maxim(maxim_), minim(minim_), name(name_) { } void setup() {} void loop() { if (mill - past >= 200) { past = mill; *val = (long)map(analogRead(pin), 0, 1023, maxim, minim); Serial.println(); Serial.print(name); Serial.print(*val); } } }; //---Компоновка----------------------------- unsigned int tPause = 10, tWork = 10; Cl_analogRead Rez1(/*пин*/A0,/*переменная*/&tPause,/*max*/60000,/*min*/0,/*величина*/"t pause="); Cl_analogRead Rez2(/*пин*/A1,/*переменная*/&tWork,/*max*/60000,/*min*/0,/*величина*/"t work="); Cl_AAA AAA(/*пин*/2,/*время вкл*/&tWork,/*время выкл*/&tPause); //---main----------------------------- void setup() { Serial.begin(9600); Rez1.setup(); Rez2.setup(); AAA.setup(); } void loop() { mill = millis(); Rez1.loop(); Rez2.loop(); AAA.loop(); } /*Скетч использует 2694 байт (8%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 245 байт (11%) динамической памяти, оставляя 1803 байт для локальных переменных. Максимум: 2048 байт */