logo
"Умная штора"

2.3 Код программы контроллера

Необходимо написать программу, которая приводит в движение моторчик в зависимости от того, какая команда была передана по Bluetooth. Для этого создаем класс Blinds, который хранит текущее положение штор/жалюзи и приводит в движение мотор, который изменяет данное положение.

class Blinds

{

private:

/**

* Хранит текущее положение штор, изначально закрыты

* */

boolean stateBlinds;

public:

Blinds(boolean stateBlinds) {

this->stateBlinds = stateBlinds;

}

/**

* Открывает шторы

* */

void blindsUp()

{

stepper.move(2048);

stateBlinds = true;

}

/**

* Закрывает шторы

* */

void blindsDown()

{

stepper.move(-2048);

stateBlinds = false;

}

/**

* Возращает true в случае, если состояние возможно изменить

* */

boolean checkPosition(byte message)

{

if ((stateBlinds == false && message == 0) || (stateBlinds == true && message == 1))

{

return false;

}

return true;

}

};

Для создания объекта blind класса Blinds используется конструктор, который в качестве аргумента принимает текущее положение штор (жалюзи).

Для управления шторам (жалюзи) используются методы blindsUp и blindsDown, которые приводят в движение моторчик и меняют текущее его положение на противоположное.

void blindsUp()

{

stepper.move(2048);

stateBlinds = true;

}

void blindsDown()

{

stepper.move(-2048);

stateBlinds = false;

}

При подключении Arduino к питанию выполняется функция setup. В ней создается новый объект blind для управления положением штор (жалюзи). По умолчанию они закрыты:

void setup() {

blind = new Blinds(false);

Serial.begin(9600);

stepper.setPeriod(5);

}

Далее автоматически выставляется бесконечный цикл, который вызывает не возвращающую значения функцию loop, вызывающую в нашем случае функцию read:

void loop() {

read();

}

Функция read проверяет наличие новых данных от любого приложения с возможностью передачи данных на Bluetooth.

Т.к. у нас команды только «0» и «1», то мы передаем и считываем только 1 символ. Первый if проверяет наличие данных как таковых. Далее, если данные были получены, то в переменную message считывается первый байт полученных данных (наша команда).

Метод checkPosition из класса Blinds проверяет текущее положение моторчика и возвращает true, если это положение можно изменить, после чего выполняет действие, соответствующее переданной команде.

void read() {

if (Serial.available() > 0) {

byte message = Serial.read();

if (blind->checkPosition(message)) {

if (message == 0) {

blind->blindsDown();

}

if (message == 1) {

blind->blindsUp();

}

}

}

}

В нашем случае для проверки работоспособности используется Android-программа Bluetooth Terminal (Рисунок 5).

Рисунок 5