Итак, приступим. Для начала я расскажу как сделать простую программу, которая может считывать температуру с DS18B20 и показать ее в окне. Отмечу что я не программист и возможно не все написанное будет верным.
Для начала нам понадобится среда программирования. Это такая же программа как и другие, но предназначена она для создания программ. Я выбрал среду PureBasic версии 5.24, для которой имеется библиотека функций для работы с 1-Wire устройствами, к которым принадлежит датчик DS18B20. Описание функций библиотеки можно найти в журнале Радио 2015 № 1.
Скачать PureBasic можно по этой ссылке. http://rghost.net/8mQNDGH8S Это potrable версия не требующая установки. Архив необходимо распаковать в любую папку в которой есть права на чтение и запись. Если не знаете о чем речь, распаковывайте в папку с документами. Нужно найти в распованых файлах "PureBasic Portable.exe" и создать его ярлык на рабочем столе.
Программа русифицирована. Но справка на английском. В сети можно найти русские справки от предыдущих версий. http://purebasic.ucoz.com/PB_rar/PureBasic_rus.rar
Онлайн справка. http://web.archive.org/...104&lng=rus
Запускаем PureBasic кликнув по ярлыку на рабочем столе и видим такую картину.
Перед нами редактор кода с пустым файлом. Сохраняем его под именем "TestTemp 1.0.pb". Теперь создадим окно. В меню "Формы" кликаем по "Новая форма" и перед нами появится макет окна.
Теперь нужно наполнить окно содержимым. Потребуются несколько текстовых надписей (TextGadget), список для портов (ComboBoxGadget) и область где будет отображаться температура (StringGadget). Находим их на вкладке "Инструменты" окна "Формы". Кликаем и перемещаем курсор мышки в область макета окна. Зажимаем левую кнопку мышки в той области где нужно расположить компонент, и не отпуская кнопки перемещаем мышку. Таким образом обозначим координаты и размеры компонента. Для изменения надписей, кликаем по компоненту в макете окна и в окне "Формы" пишем свой текст в поле "Текст". Чтобы добавить имена портов в список, нужно после его размещения в окне, кликнуть по меню правой кнопкой мышки и в меню выбрать "Править элемент". В появившемся окне, добавляем имена портов.
Если все равно непонятно объяснил, смотрите видео.
В конечном итоге должно получиться следующее.
Кликнув по "Код/Дизайнер форм" в меню "Формы" можно увидеть код окна.
Окно готово. Сохраняем его в файл под именем "Окно.pbf" туда же, куда сохранили файл с кодом программы. Теперь начинается самое интересное - будем писать код программы. Нам понадобится файл "OWire_Module.pbi", который нужно скопировать в туже папку где находятся остальные файлы программы. Взять этот файл можно из архива ftp://ftp.radio.ru/pub/2015/01/OWire.zip
Он расположен в папке "\Library\Src".
Теперь пишем код. В начало исходника нужно добавить строки.
XIncludeFile "OWire_Module.pbi" ; Функции для датчиков.
XIncludeFile "Окно.pbf" ; Код окна программы.
UseModule OWire ; Нужно для доступа к функциям файла "OWire_Module.pbi".
Теперь необходимо добавить вызов процедуры создания окна и его обработчик событий.
Строка OpenWindow_0() это вызов процедуры создания окна. На скрине выше где показан код окна можно увидеть эту процедуру. У ее имеется несколько параметров со значениями по умолчанию, т. е. которые не обязательно передавать в параметрах процедуры. Во время вызова, выполняется код между командами Procedure и EndProcedure. В данном случае, там находятся функции создания окна и его компонентов.
Далее по коду находится цикл Repeat – Until, внутри которого будет выполняться код до тех пор пока условие в Until не станет верным, т. е. до тех пор пока в переменной с именем Event не окажется код #PB_Event_CloseWindow. Это произойдет когда закроют окно. При каждом выполнении кода цикла, в переменную Event копируется текущий код события программы. Ее может может быть другим, но обычно ее так называют чтобы понятней было что она хранит события. События это например закрытие окна, клики по гаджетам (компонентам окна) или меню и т. д.
Теперь в коде присутствует все необходимое для работы программы и ее можно запустить кликнув в меню "Компилятор" по "Компиляция/Запуск". Появится окошко программы.
Основа программы готова. Осталось научить программу открыть COM порт выбранный в списке и читать температуру с датчика. Начнем с первого. Как писал выше, клик по компоненту окна – гаджету, которым является список портов, создаст событие программы и его код функция WaitWindowEvent() запишет в переменную Event. Значит необходимо как-то проверить что находится в переменной Event и если там код события гаджета, выполнить кое-какие действия. Для сравнения предназначено ключевое слово If. Если кто-то не знает, оно с английского переводится как "Если". Кроме того необходимо еще проверить в каком именно гаджете произошло события. В окне этой программы их четыре. Кажется что все это сложно, но на деле это не так.
В первом ключевом слове If. Проверяется чтобы в переменной Event был код события #PB_Event_Gadget, не что-то другое. Если там что-то другое, будет пропущен код внутри блока If и выполнение перейдет на парное ему ключевое слово EndIf в строке 15. У него такой же размер отступа. Вообще отступы в коде носят декоративный характер и не влияют на работу программы. Они нужны для нас, разработчиков программ и позволяют быстрее найти парные ключевые слова.
Если же в переменной Event будет именно код #PB_Event_Gadget, тогда выполнится еще одна проверка в строке 12, где проверяется что событие произошло именно в гаджете с идентификатором #Combo_0, а не в каком-то другом. Названия идентификаторов гаджетов видны на скине с кодом окна. Если присмотреться, видно что такой у ComboBoxGadget, т. е. у списка с COM портами. Если в списке выбрали порт, то это условие верно и будет выполнено код из процедуры OW_OpenPort, а параметром ей передается текст из выбранной строки списка портов, т. е. если выбрали COM2, этот текст передается процедуре. Она расположена в файле OWire_Module.pbi (в дальшейшем чтобы я не повторялся, все процедуры имя которых начинается с " OW_" находятся в этом файле) и если говорить о ней кратко, она открывает COM порт, к которому предполагается что подключены датчики температуры. Более подробно о процедурах файла OWire_Module.pbi можно прочитать в Радио 2015 № 1.
Что же, теперь программа умеет открывать COM порт выбранный в списке, осталось научить ее читать температуру с датчиков, а так как считывать ее нужно периодически, необходимо научить программу выполнять код через заданные промежутки времени. Для этого потребуется таймер, который создается функцией AddWindowTimer.
В 7 строку добавил функцию AddWindowTimer. В ее первом (слева) параметре необходимо указать идентификатор окна, к которому привязывается таймер. Узнать его можно в файле "Окно.pbf". Второй параметр это идентификатор таймера, который нужен чтобы можно было как-то отличать таймеры, ведь их может быть много. Я выбрал число 2, но оно может быть любым целым положительным. Третий параметр это промежутки времени в миллисекундах, через которые будут происходить события.
В 18 строку добавил проверку события таймера, а строкой ниже уточняется что событие именно таймера с идентификатором 2, а не какого-то другого. Можно было бы не уточнять, ведь в программе один таймер, вот если бы было больше одного, такая проверка была бы обязательной.
Теперь программа умеет выполнять код через заданные промежутки времени, в нашем случае, через каждую секунду. Но выполняемого кода как такового пока нет (комментарий не считается кодом). Его еще предстоит написать. Но перед этим нужно изучить даташит на датчик DS18B20 чтобы понять как с ним общаться. Его можно скачать на официальном сайте. https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Но мне больше нравится вариант даташита, переведенный на русский. На родном языке намного понятней. https://cdn.homedistil.ru/fs/1510/22/44768.84589.pdf
Откройте даташит и ознакомьтесь с ними. В простейшем случае, для чтения температуры нужно проделать такие действия.
1. Пропустить проверку серийного номера. Команда SKIP ROM. Код CCh.
2. Запустить процедуру измерения температуры. Команда CONVERT T. Код 44h.
3. Подождать не меньше 750 миллисекунд при 12-ти битной разрешающей способности (по умолчанию в DS18B20).
4. Пропустить проверку серийного номера. Команда SKIP ROM. Код CCh.
5. Прочитать данные из датчика. Команда READ SCRATCHPAD. Код BEh.
Код производящие эти действия показан на скриншоте (строки от 41 до 68 ).
Если внимательно присмотреться к коду, видно что действия выполняются в другом порядке. Сначала действия 4 и 5 (чтение данных из датчика), потом 1 и 2 (запуск измерения температуры), а действия 3 (задержка на 750 миллисекунд) вообще не видно. Но на самом деле это не так. Для действия 3 применена не фиксированная задержка в коде, а интервал между событиями таймера, который составляет 1 секунда.
Рассмотрим код подробнее. В строке 41 производится проверка наличия ошибки при выполнении действий 1 и 2, т. е. при предыдущем запуске измерения температуры. Если в переменной ErrCode будет число 0, значит ошибок не было. В противном случае, читать данные из датчика не имеет смысла и код чтения пропускается. Если не было ошибок, выполняется код процедуры OW_SkipROM, отправляющей команду датчику пропустить проверку серийного номера. Если при выполнении этой процедуры не было ошибок, выполнится функция OW_ReadRAM, читающая из датчика данные и помещающая их в экземпляр структуры OW_RAM с именем RAM. Структура это такой контейнер, объединяющий в себе несколько переменных.
Она объявлена в файле "OWire_Module.pbi" и имеет вид.
Structure OW_RAM ; Копия содержимого ОЗУ датчика DS18B20 ($BE).
L_Termo.a ; Младший байт температуры
H_Termo.a ; Старший байт температуры
Max_Termo.a ; Верхний предел температуры
Min_Termo.a ; Нижний предел температуры
Config.a ; Байт конфигурации
x.a[3] ; Резерв 3 байта (в датчике не реализовано)
CRC.a ; Контрольная сумма
EndStructure
Далее, в случае успешного выполнения кода процедуры OW_ReadRAM, производится преобразование температуры и она отображается в окне с точностью до десятых долей градуса.
В строках 62 – 68 выполняются действия 1 и 2, т. е. запускается процесс измерения температуры.
Вот как-то так работает эта программа. Теперь ее можно считать законченной и использовать как термометр. Чтобы она не требовала для работы среду PureBasic, нужно ее скомпилировать. Это просто. В меню "Компилятор" кликаем по "Создать приложение" и выбираем имя файла и место его сохранения. Получаем небольшой исполняемый файл с размером 39 КБ, который работает не только на современных версиях Windows, но и на Windows 95 OSR 2.
Сделал скрин работы проги в ней.
Архив со скомпилированной программой и ее исходниками. https://cdn.homedistil.ru/fs/1510/22/44768.84590.zip