Умный дом

Вторая версия основной программы на языке С++

/****************^

* TOC o "1-3" h z Copyright (С) 2006 by Vladimir Gololobov *

* vgololobov@yandex. ru *

* *

* This program is free software; you can redistribute it and/or modify *

* it under the terms of the GNU General Public License as published by *

* the Free Software Foundation; either version 2 of the License, or *

* (at your option) any later version. *

* *

* This program is distributed in the hope that it will be useful, *

* but WITHOUT ANY WARRANTY; without even the implied warranty of *

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *

* GNU General Public License for more details. *

* *

* You should have received a copy of the GNU General Public License*

* along with this program; if not, write to the *

* Free Software Foundation, Inc., *

* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *

************************************************

#include <qlabel. h>

#include <posix_qextserialport. h>

Iinclude ^qextserialbase. h>

Tinclude "barbywidget. h"

Char command_on[7] = "R14$1N"; char command_of[7] = "R14$1F";

Posix_QextSerialPort comPort("/dev/ttySO"); // Это позволяет использовать готовый класс.

BarbyWidget::barbyWidget(QWidget* parent, const char* name, WFlags fl)

: barbyWidgetBase(parent, name, fl) {

Light->setEnabled(FALSE);//Здесь light - этикетка с

Желтой картинкой. }

BarbyWidget::-barbyWidget() {}

/* $SPECIALIZATION$ */

Void barbyWidget::port_open_clicked() {

ComPort. setName("/dev/ttySO"); // Далее следуют установки порта СОМІ.

ComPort. setDataBits(DATA_8); comPort. setStopBits (STOPJL); comPort. setBaudRate (BAUD2400); comPort. open(0);

If (comPort. іsOpen()) {

Label->setText( "port open" ); // Это переделанная этикетка. void barbyWidget::port_close_clicked() {

ComPort. close();

If (!comPort. isOpen())

Label->setText( "port close" );

}

Void barbyWidget::light_on_clicked() {

ComPort. wrіteBlock(command_on, 6); light->setEnabled(TRUE);

}

Void barbyWidget::light_off_clicked() {

ComPort. writeBlock(command_of, 6) ; light->setEnabled(FALSE);

}

#include "barbywidget. moc"

Файл заголовка barbywidget. h: /***************^

* Copyright (C) 2006 by Vladimir Gololobov *

* vgololobov@yandex. ru *

* *

* This program is free software; you can redistribute it and/or modify *

* it under the terms of the GNU General Public License as published by *

* the Free Software Foundation; either version 2 of the License, or *

* (at your option) any later version. *

* *

* This program is distributed in the hope that it will be useful, *

* but WITHOUT ANY WARRANTY; without even the implied warranty of *

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *

* GNU General Public License for more details. *

* *

* You should have received a copy of the GNU General Public License *

* along with this program; if not, write to the

* Free Software Foundation, Inc., *

* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *

★Л*****************************************»************/

#ifndef _BARBYWIDGET_H_ tdefine _BARBYWIDGET_H_

#include "barbywidgetbase. h" tinclude <posix_qextserialport. h> #include <qextserialbase. h>

Class barbyWidget : public barbyWidgetBase {

Q_OBJECT public:

BarbyWidget (QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); - barbyWidget() ; /*$PUBLIC_FUNCTIONS$*/

Public slots: /* $ PUBLIC_SLOTS $ */

Virtual void port_open_clicked(); // Это бывшая клавиша buttorn.

Virtual void port_close_clicked(); // Далее добавленные клавиши.

Virtual void light_on_clicked(); virtual void light_off__clicked() ; protected:

/* $PROTECTED_FUNCTIONS$ */

Protected slots: Г* $PROTECTED_SLOTS $ */

};

#endif

После запуска программы, щелчка кнопки СОМІ от­крыть и кнопки Свет включить получаем вид программы, показанный на рис. П. 16.

Вторая версия основной программы на языке С++

Рис. П. 16. Вид работающей программы

Первая неожиданность - программа работает, но модуль не реагирует на команды. Ситуация повторяет начало рабо­ты с портом в части проверки конвертера. Первое, что уда­ется проверить с помощью мультиметра, - наличие измене­ний сигналов на входе конвертера. Если поменять порт (то есть /dev/ttySl), напряжение на сигнальном выводе останется неизменным. Это хорошо. Но плохо, что модуль не реагиру­ет на команды. На всякий случай я возвращаюсь к програм­ме на Visual Basic и проверяю работу модуля. Сомнений не Остается - модуль отрабатывает команды.

Пользуясь тем, что модуль работает, проверяю сигналы интерфейса RS485 в программе, работающей с Visual Basic. Затем я перезагружаю операционную систему и запускаю программу из KDevelop. Спустя некоторое время, удается за­метить, что сигнал RTS на S выводе микросхемы МАХ1483 сбрасывается в «О» при открытии порта. Добавление в про­грамму в разделе настроек после открытия порта исправля­ет ситуацию. Модуль выполняет команды.

ComPort. open(0);

ComPort. setRts (FALSE); // Добавленная строка

Теперь остается разобраться с командами запроса статуса реле. Модифицированная программа выглядит следующим образом:

Iinclude <qlabel. h> iinclude <posix__qextserialport. h> #include <qextserialbase. h> iinclude "barbywidget. h"

Char command_on[7] = "R14$1N"; char command_of[7] = "R14$1F"; char command_st[7] = "R14$1S"; char answer_st[19] = " int і = 0;

Posix_QextSerialPort comPort("/dev/ttySO") ;

BarbyWidget::barbyWidget(QWidget* parent, const char* name, WFlags fl)

: barbyWidgetBase(parent, name, f1) {

Light->setEnabled(FALSE); }

BarbyWidget::-barbyWidget() {}

/* $ SPECIALIZATI0N$ */

Void barbyWidget::port_open_clicked() {

ComPort. setName("/dev/ttySO"); comPort. setDataBits(DATA_8); comPort. setStopBits (ST0P_1);

ComPort. setBaudRate (BAUD2400); comPort. open(0); comPort. setRts (FALSE); answer->setText(" ") ;

І f (comPort. і sOpen()) {

Label->setText( "port open" ); }

Void barbyWidget::port_close_clicked() {

ComPort. close();

If (!comPort. іsOpen())

Label->setText( "port close" );

Answer->setText(" ") ;

}

Void barbyWidget::light_on_clicked() {

ComPort. writeBlock(command_on, 6) ; comPort. writeBlock(command_st, 6) ; while (і comPort. atEnd()); for (i=0;i<100000000;++І); comPort. readBlock(answer_st, 18); answer->setText(answer_st); if (answer_st [17] == "N")

Light->setEnabled(TRUE); }

Void barbyWidget::1іght_off„clicked() {

ComPort. writeBlock(command_off 6) ; comPort. writeBlock(command_st, 6) ; while (!comPort. atEnd()); for (i=0;i<100000000;++i); comPort. readBlock(answer_st, 18); answer->setText(answer_st); if (answer_st[17] == "F")

Light->setEnabled(FALSE); }

#include "barbywidget. moc"

В основном, изменения касаются чтения ответа в буфер порта после отправки запроса:

While (!comPort. atEnd()) ; for (i=0;i<100000000;++i); comPort. readBlock(answer_st, 18);

Втр 23 Май, 13:37 Ч

Пустой цикл for добавлен, чтобы ответ был полностью получен. Массив char answer_st [19] служит для чтения бу­фера ввода порта, и сохраняемые им команды содержат все, что было отправлено (рис. П. 17).

I* Пряяожвим* П.*.*, Сист—^в^^Ф1 % і

Вторая версия основной программы на языке С++

DATE

J

. Сеет включмп»

І

Сеет выключить |

Кооэи

- fito-Zr'/ho. Ь fpWum Обе». **> шктт Ово». GI ■»

Рис. П. 17. Прием ответа модуля в программе

В правом нижнем углу формы отображается содержание этого массива. Поэтому в проверке его содержимого я про­веряю только последний символ:

If (answer_st [17] == "N")

Возможно, не лучшим образом, но механизм работает. По команде выключения света свет на картинке выключается.

Ha макете, естественно, по команде включения света загорает­ся индикатор, который гаснет по команде выключения света.

Запланированная часть работы выполнена.

Умный дом

Циклы

Циклы выполняют выражения или блоки выражений до тех пор, пока выражение условия не становится истинным. Наша программа требует двух циклов (один вложен в дру­гой). Пока пользователь желает угадывать последовательно­сти: { …

Две полезные схемы

Первая схема относится к настенному выключателю, работа­ющему по протоколу XI0. Что полезного можно почерпнуть из этой схемы? Например, организацию сканирования сети и управления триаком. Схему я привожу, как она сохранилась …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия
+38 050 512 11 94 — гл. инженер-менеджер (продажи всего оборудования)

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@inbox.ru
msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Оперативная связь

Укажите свой телефон или адрес эл. почты — наш менеджер перезвонит Вам в удобное для Вас время.