Умный дом

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

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

* 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 макете, естественно, по команде включения света загорает­ся индикатор, который гаснет по команде выключения света.

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

Умный дом

Практическое применение триака в модулях системы

Хотя на протяжении всей книги я старался подчеркнуть, что все модули системы, как и сама система, предназначены для проведения экспериментов за компьютером или за столом, думаю, среди читателей найдутся желающие …

Оператор предшествования

Есть одна «заморочка» в использовании встроенных опера­торов - при комбинации нескольких операторов в одном выражении порядок выполнения операций определяется предустановленным уровнем приоритетности для каждого. Например, результат выражения 5 + 2*10 …

Дополнительные замечания по ИК-управлению

Программа WinLIRC позволяет не только считывать ИК- коды, но и воспроизводить прочитанные команды. Воспро­изведение - чисто программное, возможно, по этой причи­не оно показалось мне не слишком уверенным. Но оно работает, …

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

Украина:
г.Александрия
тел. +38 05235 7 41 13 Завод
тел./факс +38 05235  77193 Бухгалтерия
+38 067 561 22 71 — гл. менеджер (продажи всего оборудования)
+38 067 2650755 - продажа всего оборудования
+38 050 457 13 30 — Рашид - продажи всего оборудования
e-mail: msd@inbox.ru
msd@msd.com.ua
Скайп: msd-alexandriya

Схема проезда к производственному офису:
Схема проезда к МСД

Представительство МСД в Киеве: 044 228 67 86
Дистрибьютор в Турции
и странам Закавказья
линий по производству ПСВ,
термоблоков и легких бетонов
ооо "Компания Интер Кор" Тбилиси
+995 32 230 87 83
Теймураз Микадзе
+90 536 322 1424 Турция
info@intercor.co
+995(570) 10 87 83

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

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