История одной идеи

Автор: Раков А.В.
www.andrakov.narod.ru

Дачный сезон на носу. Анализируя прошлый, стараюсь учесть ошибки прошлого года и встретить во всеоружии новый.

                Итак, прошлое лето было аномально жарким. И именно это не позволило мне воплотить мою задумку - газон на практически всем дачном участке. Несмотря на почти ежедневные приезды на дачу, только половина газона смогла получать достаточно влаги, чтобы выжить. Газон - не компактные грядки. Это, прежде всего, огромные площади, которые нужно ежедневно и, желательно, равномерно напитать влагой. Имея возможность приезжать каждый день после работы, максимум, на пару часов на дачу и имея трубу с  водой в 15 мм, даже при хорошем давлении, можно подсчитать объем вылитой воды. Не знаю, как у кого, но мне за 2 часа, что я мог себе позволить, его хватало только на сад и половину газона. И это все равно нужно было ежедневно приезжать поливать! Это отдых? По мне - не совсем. Пробовал и оставлять воду на ночь, но поливался-то только один участок, и даже заливался... Включить несколько поливалок нельзя - сразу падает напор.  А кто будет мне время от времени перекладывать шланг на неполитые места? А если я вдруг вообще не смогу несколько дней  появляться на даче, - командировка или еще что? И это только часть проблем. Садоводы знают, что поливать лучше вечером или вообще ночью, когда палящее солнце не прожигает листья через капли воды-линзы и не испаряет бесполезно значительную часть влаги от полива. И еще, когда никто не поливает (а ночью обычно народ спит), то и давление в трубопроводе на высоте! Но вставать ночью поливать... А ведь еще и разные участки сада могут требовать разного объема полива. В общем, проблем хватает.

                Посмотрим, что предлагают нам через интернет специализированные фирмы для решения задачи автополива. Программируемые пульты на 3 программы за 6 тыс. Это самое доступное. Это может устроить, пожалуй, пещерного жителя из прошлого века. А как же контроль за любимым участком через интернет с морского пляжа из отпуска? Об этом скромно молчат фирмы. Да комп по-любому должен на даче быть! И интернет через 3G теперь повсюду, и фильм с флэшки посмотреть или музыку послушать. А иметь комп, и в к нему в довесок покупать какой то пульт с игрушечными возможностями просто смешно.

                В наше время, когда компьютеры стоят недорого (а б.у. вообще нисколько!), я, разумеется, даже не раздумывал. Компьютер может быть совсем помойным. Я, например, откопал комп на AMD K6-500 с 64 мегабайтами ОЗУ, 3 гигабайтным винтом, 15 дюймовым монитором и этого оказалось вполне достаточно для установки на него Windows XP и нормальной работы системы. Если комп имеет форм-фактор АТ, а на даче моргнет свет, то комп сам заведется и программа из автозапуска поднимется. Но, если будет комп АТХ, то соответствующий пункт нужно будет включить в BIOS.

                Сначала об исполнительной части схемы. Для управления водой я приобрел электромагнитные гидроклапаны. Чтобы такой клапан открылся, к его соленоиду нужно приложить напряжение. Убрали напряжение - клапан снова закрыт. Катушки соленоидов могут быть рассчитаны на разное напряжение, поэтому надо взвесить все за и против. Хотя 220 вольт всегда есть в розетке и не нужен преобразователь, нужно отдавать себе отчет в том, что рядом будет вода. Это небезопасно. Мои гидроклапаны рассчитаны  на работу от 24 вольт переменного тока. Поэтому мне пришлось изготовить блок питания. Торроидальный мощный трансформатор от старого матричного принтера я упаковал в короб от БП древнего АТ-компа и таким образом проблему питания клапанов решил.

                 В этом году я решил построить схему полива всего на четыре участка, наберусь опыта - можно будет и добавить.

                Раздаточный коллектор я собрал, используя крестовину, тройник, бочонок и четыре гидроклапана с переходниками на гибкие шланги.

 

 

                Теперь самое интересное. Как привязать клапаны к компьютеру. Понадобится модуль сопряжения. Я остановился на Ke-USB24R, поскольку он идеально вписался в мою схему.

 

                Недорогой, с четырьмя мощными реле на борту, подключаемый к USB-порту и не требующий дополнительного питания. Установив драйвера, я получил виртуальный COM-порт, программирование которого для специалиста труда особого не составляет.

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

                По мере написания программы, она начала превращаться в нечто большее, чем первоначально задумывалось и конце концов оформилась в универсальный  инструмент для работы с модулем Ke-USB24R, который теперь можно применять для управления всем, что только можно придумать, не затрачивая каких-либо усилий, будь то полив, управление светом или аквариумом и еще многое-многое другое!

                Теперь программа стала неким подобием ОС (под Windows) для Ke-USB24R, имеющей свой собственный язык программирования, который, хоть и несколько примитивен, но, однако, обладает всеми необходимыми конструкциями для реализации любой программы. Здесь и переменные и ветвления и переходы и вызовы подпрограмм и вызовы внешних приложений и работа с файлами. В общем все, о чем я постараюсь вкратце рассказать ниже. Но, все по-порядку.

                Итак, подключаем модуль к USB-порту и устанавливаем драйвера под Windows. Несколько секунд и компьютер подружился с Ke-USB24R. C этого момента компьютер всегда готов  для работы с Kernel2.exe.

                Запускаем Kernel2.exe и программа автоматически найдет модуль и выведет свою панель, приглашая к работе.

 

(Рис.1)

 

                На закладке "Программа" два окна. В левом всегда будет выводится последняя запущенная программа, а вот правое окно имеет переменное назначение. До старта программы там будет список всех написанных нами программ, а после старта там будут отображаться значения переменных, что очень удобно для контроля за исполнением программы. Сменить программу можно двойным щелчком по выбранному названию.

                На примере (рис.1) простейшая программа для полива. Что она делает?

                При запуске программы все реле отключаются (если были включены) и программа ждет часа Ч. В нашем случае это 20:05. Как только наступает назначенное время, программа начнет полив. Сначала включится поливалка номер 1, которая будет поливать 10 минут, 30 секунд. Затем она отключится и на 15 минут включится поливалка номер 4. Потом ее сменит поливалка номер 3, которая будет работать один час. После нее 10 минут отработает поливалка номер 2. Затем вся вышеописанная процедура повторится еще один раз и программа "уснет" до 2-х часов, 10 минут ночи, когда поливалки снова отработают по тому же сценарию, но уже не два, а четыре раза. После этого программа заснет до вечера, чтобы в 20:05 снова начать ту же работу. Это очень простая программа, где нет ни чтения состояния реле, ни опроса АЦП (которых в Ke-USB24R аж 4 штуки!), ни управления через интернет, ни еще многого другого, что может понадобится искушенному пользователю. Но для большинства случаев больше ничего, обычно, и не требуется!

                А ведь еще можно подключить датчики давления, влажности, температуры, расходомер. Можно поставить сигнализацию на дачу, брать прогнозы погоды из интернета и кто его знает, что можно еще придумать!

                Потенциал программы это позволяет реализовать, и чтобы с ним ознакомиться, читаем дальше.

                Для начала опишу идеологию среды. Во главу угла был поставлен принцип разумной достаточности, отсюда и некоторые заложенные ограничения.

                Программа для управления модулем представляет из себя последовательность строк, которые выполняются по-очереди. Выполняемая строка при этом подсвечивается. В каждой строке одна команда, кроме строк с операторами сравнения. Кроме операторов, доступны переменные. Их 100 и начинаются они с символа Х. Соответственно, диапазон переменных от Х0 до Х99. Значения переменных могут быть и строковыми и числовыми. Контроль за этим лежит на программисте. Для присвоения переменной значения служит оператор PUT.

Например:

(рис.2)

 

                Для ветвления программы используется оператор LABEL с номером. Номера также имеют диапазон от 0 до 99. Оператор LABEL - это просто метка. Сам по себе он ничего не делает, а используется совместно с операторами GOTO и CALL.

                Оператор GOTO может иметь 2 операнда. Первый операнд - это метка, на которую будет осуществлен безусловный переход, а второй операнд (если он вообще есть) должен быть переменной с числовым значением, которое будет уменьшаться на единицу каждый раз при выполнении этого оператора. Таким образом можно без труда организовывать циклы. Пример использования GOTO в обоих ипостасях можно видеть на  (рис.1).  Для организации условных действий есть  два оператора IFEQ и IFB. Оператор IFEQ сравнивает два следующих значения и, если они равны, выполняет оператор, стоящий за последним значением. Например строка "IFEQ X1 10 GOTO 1" передаст управление на LABEL 1, если X1 равен 10. Оператор IFB работает аналогично с той лишь разницей, что следующий оператор будет выполняться, если первое значение будет больше второго. Понятно, что этих двух конструкций вполне достаточно для реализации любой логики сравнения. Для вызова подпрограмм служит оператор CALL, а для возврата обратно  RETURN. Можно организовывать и рекурсию, только следует помнить, что глубина стека те же 100 значений. Пример вызова подпрограммы также можно видеть на  (рис.1). Операторы работы со временем: SLEEP и TIME.  Оператор "SLEEP HH:MM:SS" задает задержку в HH часов, MM минут и SS секунд, а оператор TIME HH:MM:SS тормознет программу до наступления реального времени HH часов, MM минут и SS секунд. Причем, когда это время пройдет, он будет ждать наступления этого же времени завтра. С помощью этого оператора и оператора SOUND можно запросто реализовать, например, будильник (для этого даже Ke-USB24R не понадобится!). Но это, конечно, все игрушки. А реально, это один из основных операторов, с которого обычно и будут начинаться все программы для Ke-USB24R.

                Отличительной особенностью Ke-USB24R является его способность читать состояние реле, линий ввода-вывода и АЦП. Это дает нам в руки мощный инструмент для построения систем с обратной связью. Например: команда "$KE,RDR,1" опросит состояние реле 1 и вернет значение, например, "#RDR,3,1", что означает, что реле 3 замкнуто или "#RDR,3,0", что означает, что реле 3 разомкнуто или вообще "ERR", что говорит о том, что значение получить не удалось. Из нашей программы можно получить все ответы модуля с помощью оператора GET. Этот оператор анализирует последний ответ модуля и возвращает его в заданную переменную в виде номера слова из строки ответа. Если последним ответом модуля было "#RDR,3,0", а мы напишем "GET X0 3", то в переменную X0 запишется третье слово ответа (слова в ответах модуля отделены запятыми). Т.е. в X0 будет число 1.

 

(рис.3)

                Вот простенький пример программы, которая непрерывно опрашивает состояние реле №1 и, если оно сменилось, озвучивает это голосом. Тут не совсем все так просто, как может показаться с первого взгляда. Но попробуем разобраться. Команда "$KE,RDR,1" собственно опрашивает реле. А в переменные X1 и X4 помещаются соответственно третье и второе слово ответа. Казалось бы, зачем нам второе, ведь там и так должен быть просто номер реле, который мы знаем? Но! Поскольку порт модуля работает в асинхронном режиме, то между временем опроса реле и получением от него ответа проходит, пусть и незначительное, но время, во время которого (тафталогия однако...) может произойти и другое событие модуля и мы будем анализировать ответ от совершенно другого события. В нашем случае мы будем вручную управлять реле с закладки "Инструменты". А это значит, что во время выполнения нашей программы будут выполняться еще и команды типа "$KE,REL,1,1", на которые модуль будет давать ответ "#REL,OK". Для этого случая мы и берем второе слово ответа модуля и, если оно "ОК", просто повторяем опрос реле. На данном примере видно, что сравнивать можно не только числа, но и строки, а озвучка идет только в том случае, если состояние реле №1 изменилось. Модуль может возвращать и целые строки состояния линий ввода-вывода. Например, оператор "$KE,RD,ALL" может выдать ответ "#RD,xxx10xxx0xxxxxxxxx". Получив строку "xxx10xxx0xxxxxxxxx" в переменную X1, было бы неплохо достать состояние, к примеру, четвертой линии. Это можно сделать так: "PUT X2,X1#4". В переменной X2 будет число 1.

                Важным инструментом среды является возможность запуска внешних программ. Это осуществляется с помощью оператора EXEC, причем программа остановится до момента завершения внешней программы. А связь с внешними файлами реализована с помощью оператора GETFROMFILE. С помощью этих инструментов  сделан следующий пример.

 

(рис.4)

                Запускается внешняя программа, которая лезет в интернет, и со странички погоды моего региона выдирает влажность и записывает ее в файл. Затем это значение помещается в переменную X1 и программа проводит анализ. Если влажность ниже 70, выдается сообщение о начале полива и включается реле №1.

                Пару слов о закладке "Инструменты". Как несложно догадаться, отсюда можно вручную вводить команды модуля и видеть его ответы. Реле можно щелкать прямо мышкой.

 

 

                Я привел лишь несколько простых примеров. Операторов у Ke-USB24R очень много. Например, у меня нет примеров работы с АЦП. Но за минуту я написал цифровой вольтметр, который отлично работает и показывает напряжение до 5 вольт. А еще, к линиям ввода-вывода можно подключить до 18 внешних реле и через Kernel2.exe можно будет без проблем ими управлять!

                Интернет подводится через 3G модем, проблем с приобретением этой штуки нет. Для управления рабочим столом через интернет используем одну из программ типа TeamViewer. Настройка автозапуска и автодозвона проблемы также не представляет. Зато можно и программу полива оперативно поменять при необходимости, да и снимки с WEB-камеры сделать, если ее в окно предварительно выставить. Это вам не какой-то пульт!

                Конечно, программу можно еще развивать и развивать (надо реализовать прерывания, чтобы запускались процедуры во время выполнения TIME и SLEEP да и еще кое что...), но наступает дачный сезон. А значит, пора отодвигать клавиатуру и брать в руки лопату. Главную свою задачу программа выполнять готова. А ее совершенствованием займусь позже. Да, о результатах воплощения этой идеи в жизнь сообщу, конечно. История еще не окончена. До встречи!

Hosted by uCoz
Hosted by uCoz