Не удержался и переделал нашу программу с таймерами на использование классов.
Что такое класс? Класс – описание законченного объекта, имеющего не только внутренние переменные, но и методы обеспечивающие доступ к этим переменным. Давайте опишем наш таймер.
Свойства таймера – время задержки. Время, на которое мы включаем программный таймер, привязанный к внутренним часам контроллера.
Методы таймера:
- Установка времени таймера bool setTimer(unsigned long dT); Функция получает число задающее время включения таймера. Функция возвращает логическое значение. True, если таймер установлен и FALSE, если таймер ещё выполняет другую задачу.
- Запрос состояния таймера bool getTimer(); Функция, обращаясь к внутреннему счетчику контроллера, возвращает TRUE/FALSE в зависимости от состояния таймера.
timer.cpp
#include "Arduino.h"
#include "timer.h"
timer::timer(unsigned long dT){this->ulTimer = dT;}
timer::timer(){this->ulTimer = 0;}
//***********************************************************************
bool timer::setTimer(unsigned long dT){
bool bActive = false;
if(this->ulTimer == 0){ //если таймер не включен
bActive = true;
this->ulTimer = millis() + dT; //задаем значение - сумма текущего времени
} //и заданного времни ожидания
return bActive;
}
//***************************** запрос состояния таймера. Возвращает true, если включен.
bool timer::getTimer(){
if(this->ulTimer <= millis()){ //проверяем состояние таймера
this->ulTimer = 0; //если время истекло, сбрасываем заданное значение, выключаем таймер.
}
return this->ulTimer != 0; //возвращаем логическое состояние таймера, если включен - true
}
Файл описания класса.
timer.h
#ifndef MYLIBRARY_H
#define MYLIBRARY_H
//class timer;
class timer {
private:
unsigned long ulTimer;
public:
timer(unsigned long dT);
timer();
//***************************** установка времени задержки таймера
bool setTimer(unsigned long dT);
//***************************** запрос состояния таймера. Возвращает true, если включен.
bool getTimer();
};
#endif
Класс виртуального индикатора. При инициализации задается номер пина, число включений, длительность мигания.
vLed.cpp
#include "Arduino.h"
#include "vLed.h"
#include "timer.h"
//++++++++++++++++++++++++++++++++++++++++++++++++++++
vLed::vLed(int pin, int nFlash, unsigned long time_x){
this->pin = pin;
this->nFlash = nFlash;
this->time_x = time_x;
}
//****************************************************
bool vLed::setVLed(){ //включение индикатора
if(this->statTimer == 0){ //если индикатор свободен
this->statTimer = this -> nFlash * 2; //переводим в полупериоды
this->vTimer.setTimer(this->time_x);
return true; //индикатор включен
} else return false; //индикатор занят
}
//************************************
bool vLed::cycleVLed(){ //обеспечение работы индикатора
if(this->statTimer > 0 && !vTimer.getTimer()){ //определяем состояние таймера и если выключился,
this->vTimer.setTimer(this->time_x); //запускаем заново
int st = (this->statTimer & 1) == 0; //состояние светодиода определяется младшим разрядом счетчика индикатора
digitalWrite(this->pin, st);
Serial.println(this->pin);
this->statTimer--; //уменьшаем счетчик индикатора
}
return this->statTimer > 0;
}
Файл описания класса.
vLed.h
#ifndef VLED_H
#define VLED_H
#include "timer.h"
class vLed { //аппаратно - виртуальный индикатор
private:
int statTimer; //состояние индикатора, текущий полупериод
timer vTimer; //внутренний таймер виртуального индикатора
public:
int pin; //номер пина, к которому подключен светодиод
int nFlash; //число миганий светодиода этого индикатора
unsigned long time_x; //длительность включения светодиода
bool setVLed(); //включение индикатора
bool cycleVLed(); //обеспечение работы индикатора
//*****************************************************************
vLed(int pin, int nFlash, unsigned long time_x);
};
#endif
#include "timer.h"
#include "vLed.h"
#define BLUE 9
#define GREEN 10
#define RED 11
#define LONG_TIME 2550
timer randEvent; //таймер генерации случайного события для включения индикатора
int randLed = 0; //индекс активного индикатора
//***********************************
vLed arTimers[] = { //массив структур задающий параметры работы индикаторов
vLed(RED, 12, 2000),
vLed(GREEN, 8, 1800),
vLed(BLUE, 4, 220)
};
//************************************
void setup() {
for(int i=0; i < sizeof(arTimers)/sizeof(vLed); i++)
pinMode(arTimers[i].pin, OUTPUT); //инициализация портов индикаторов
Serial.begin(9600);
}
//*******************************
void loop() {
if(!randEvent.getTimer()){ //проверка состояния таймера randEvent, отвечающего за генерацию события включающего индикатор
randLed = random(0, 3); //получение случайного номера индикатора
randEvent.setTimer(LONG_TIME); //запуск таймера randEvent
arTimers[randLed].setVLed(); //включение индикатора
}
arTimers[randLed].cycleVLed(); //вызов функции обрабатывающей состояние активного индикатора
}