Отображение на ЖК-дисплее:
- температуры окружающей среды
- минимальной температуры
- максимальной температуры
Связь с компьютером (через порт RS232C)
- Наблюдение за температурой в раскрывающемся графике
- Сохранение измерений в файле
- Программируемый термостат
- Контроль температуры через интернет на базе данных MySQL
- Контроль температуры через интернет с помощью протокола FTP
1. Ознакомление
Это электронный термометр с выводом температуры на ЖК-дисплей.
Температура окружающей среды измеряется каждые 840 мс при помощи цифрового датчика DS1620, фирмы Dallas Semiconductor.
Одна из кнопок позволяет переключить экран, на котором отображается максимальная и минимальная температура:
Вторая кнопка сбрасывает значения температуры мин./макс.Как вариант, можно подключить устройство к компьютеру (через RS232). Температура передается на компьютер с устройства, управляемого микроконтроллером 16F628A. Приложение, установленное на компьютере, показывает температуру в реальном времени и выводит её на график. С другой стороны, приложение позволяет запрограммировать два предельных значения температуры термостата DS1620.
2. Принципиальная схема:
Версия № 1: без интерфейса RS232;
Версия № 2: с помощью RS232
ПРИМЕЧАНИЕ: Прошивка для микроконтроллера одна и таже для обоих вариантов.
3. Обзор датчика температуры DS1620
4. Принцип работы ЖК-дисплея (параллельный интерфейс)
5. Принцип работы устройства
5-1. Без интерфейса RS232;
После подачи напряжения, микроконтроллер 16F628A опрашивает датчик температуры DS1620 (команда Write Config с CPU = 1 и 1SHOT = 0, затем команда Start Convert T) и настраивает ЖК-дисплей (команда Set Function для использования в режиме интерфейса 4 бита). Модуль Timer1 (16 бит) микроконтроллера 16F628A активируется, что приводит к прерыванию приблизительно каждые 105 мс. При каждом прерывании модуля Timer1, опрашивается состояние кнопки SELECTION ECRAN и кнопки RESET MIN/MAX. Каждые 8 прерываний (около 840 мс) происходит чтение температуры и информация на ЖК-дисплее обновляется:
5-2. Через порт RS232
Относительно работы без интерфейса RS232, добавляются два прерывания:
- Прерывание приема UART (сообщает микроконтроллеру, что он получил данные от компьютера через RS232)
- Прерывание передачи UART (сообщает микроконтроллеру, что UART собирается передать данные на компьютер)
5-2-1. Кабель связи между компьютером и устройством.
Конечно же нужен компьютер, который имеет COM-порт (разъем SUB-D, 9 контактов «папа»). Нужно подключить нуль-модемный кабель (кабель с перекрёстным соединением) между компьютером и устройством. Если у вас его нет, вы можете легко его сделать (нужно 3 провода и 2 разъема SUB-D, 9 контактов «мама»).
5-2-2. Протокол связи между компьютером и устройством.
Компьютер посылает команду. Микроконтроллер отвечает.
Компьютер посылает 3 байта (через RS232):
Команда DS1620 | 1-ый байт (код команды) | 2-ой байт (данные) | 3-ий байт (данные) |
Read Temperature (каждые 1000 мс) | 0хАА | 0х00 (не используется) | 0х00 (не используется) |
Read TH (чтение высокой температуры термостата) | 0хА1 | 0х00 (не используется) | 0х00 (не используется) |
Read TL (чтение низкой температуры термостата) | 0хА2 | 0х00 (не используется) | 0х00 (не используется) |
Write TH (запись высокой температуры термостата) | 0х01 | (0000000 D8) | (D7 … D0) |
Write TL (запись низкой температуры термостата) | 0х02 | (0000000 D8) | (D7 … D0) |
Получив же их, микроконтроллер передает команду датчику DS1620 (через 3-проводной последовательный порт, синхронный). В случае команды чтения (Read Temperature, TH Read, Read TL), термометр DS1620 отправляет данные в микроконтроллер (температура в виде двоичного числа 9 бит, закодированных в дополнение в 2). Это число передается без изменений на компьютер в виде 2-х байт:
1-й байт: (0000000 D8)
2-й байт: (D7 … D0)
D0 = бит
Для других команд, микроконтроллер посылает компьютеру два байта 0x00 (через RS232).
Команда DS1620 |
1-ый байт (данные) |
2-ой байт (данные) |
Read Temperature (каждые 1000 мс) |
(0000000 D8) |
(D7 … D0) |
Read TH (чтение высокой температуры термостата) |
(0000000 D8) |
(D7 … D0) |
Read TL (чтение низкой температуры термостата) |
(0000000 D8) |
(D7 … D0) |
Write TH (запись высокой температуры термостата) | 0х00 (не используется) | 0х00 (не используется) |
Write TL (запись низкой температуры термостата) | 0х00 (не используется) | 0х00 (не используется) |
Пример осциллограммы: команда Read Temperature
Связь между компьютером и PIC (RS232) :
0xAA = код команды Read Temperature
0x00 0x2D = 0 0010 1101 = 45 = +22,5 °C
Связь между PIC и DS1620 (последовательный порт, синхронный) :
10101010 = 0xAA = код команды Read Temperature
0 00101101 = 0x2D = 45 = +22,5 °C
6. Приложение DS1620_104.exe для Windows
Предисловие
Это приложение было написано на C++ Borland Builder 5. Приложение работает на Windows NT4 и Windows XP (на Windows Vista не тестировалось).
Примечание: для управления устройством через порт RS232 требуется установка компонента TComPort (версии 2.64 достаточно):
Скачать
Процедура установки
Учебник
Процедура использования:
- Соединить компьютер и устройство нуль-модемным кабелем (в выключенном состоянии)
- Подключить питание
- Открыть приложение
- Настроить параметры соединения с RS232C :
9600 бит/сек
8 бит данных
бит чётности-нет
1 стопбит
контроль потока-нет - Открыть порт
Должна появиться реальная температура (с обновлением каждые 1000 мс). Имеется возможность сохранения данных в текстовый файл:
Этот файл затем может быть использован с Excel, Matlab …
Скачать приложение DS1620_104.exe для Windows 797 кб
Скачать исходный код приложения DS1620_104.exe 224 кб
7. Приложения для связи RS232 с LabVIEW
Вот два приложения, которые я написал для LabVIEW 5 :
ds1620_011.vi
ds1620_thermostat_004.vi
Обратите внимание, что эти приложения также работают с версией 6 LabVIEW.
Скачать ds1620_011.vi 223 кб
Скачать ds1620_thermostat_004.vi 223 кб
8. Установка соединения RS232 на языке Python
Версия Python: 2.7
Протестировано на Windows XP и Linux/Ubuntu
Этот сценарий требует наличия пакета pyserial (загрузка и процесс установки здесь).
Исходный код:
# (C) Фабрис Сэнсэр
# python 2.7
# соединение RS232 с цифровым термометром на цифровом датчике DS1620
#http://fabrice.sincere.pagespersoorange.fr/cm_электроника/проект_pic/ЖК термометр_DS1620htm/ЖК термометр_DS1620.htm
# тест: OK (linux/ubuntu + winXP)
import time
import serial # внешняя библиотека pyserial
print ‘Связь с COM-портом’
filename = ‘температура.txt’
print ‘\nФайл резервного копирования : ‘+filename
File = open(filename,’a’)
# библиотека pyserial :
# http://pyserial.sourceforge.net/shortintro.html
# http://pyserial.sourceforge.net/pyserial_api.html
Port = serial.Serial()
Port.baudrate = 9600
Port.bytesize=8
Port.parities=0
Port.stopbits=1
Port.xonxoff=0
Port.rtscts=0
Port.timeout=0.1 # в секундах
print «»»
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
«»»
nomport = raw_input(‘Имя COM-порта ? ‘)
try:
int(nomport)
Port.port = int(nomport)
except:
Port.port = nomport
print (‘Port ->’, Port.portstr,’\n’
Port.open()
try:
while True:
# запись
Port.write(‘\xAA\x00\x00’)
# чтение
MSB = Port.read() # старший байт
LSB = Port.read() # младший байт
if (MSB !=» and LSB != «):
temperature = ord(LSB) + 256* ord(MSB)
if temperature >= 256:
temperature = temperature — 512
temperature *= 0.5
affichage = «time».strftime(‘%H:%M:%S’,time.localtime()) + ‘ ‘+ str(temperature) +’ °C’
print affichage
Fichier.write(affichage +’\n’)
# пауза в 1 секунду
time.sleep(1.0)
except KeyboardInterrupt:
# CTRL + C
print «\nCTRL+C\nЗакрытие порта», Port.portstr
Port.close()
Fichier.close()
Выполнение сценария :
>>>
Связь с COM-портом
Файл резервной копии : температура.txt
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
Имя COM-порта ? 0
Порт -> COM1
09:15:28 19.5 °C
09:15:29 19.5 °C
09:15:30 19.5 °C
09:15:31 19.5 °C
09:15:32 19.5 °C
09:15:33 19.5 °C
09:15:34 20.0 °C
09:15:35 20.0 °C
09:15:36 20.0 °C
09:15:37 20.0 °C
09:15:38 20.0 °C
09:15:39 20.0 °C
CTRL+C
Закрытие порта COM1
>>>
Скачать сценарий Python
9. Проверка температуры через интернет с помощью CGI-скрипта на Python
Тестировалось у меня на Linux/Ubuntu на Livebox (автор является клиентом Orange), со следующими настройками сети:
- частный IP-адрес: 192.168.1.10
- публичный: 90.14.148.96
Установка:
Помимо Python 2.7 и пакета pyserial, нужно установить на компьютер Веб-сервер Apache (здесь с XAMPP).Сценарии Python cgi_чтение температуры.py , cgi_сборник установок.py и cgi_обработка сборника установок.py должны быть помещены в каталог /opt/lampp/cgi-bin/
Внимание на установки: Свойства -> Разрешения -> Разрешить выполнение файла как программы
Что касается сценариев CGI в Python:
Первая линия сценариев должна быть:
#! /usr/bin/python
Первый выход должен быть (header) :
print «Content-Type: text/html\n\n»
Настройка Livebox:
Путь — Преобразование сетевых адресов -> Добавить службу http(протокол TCP, порт 80, IP-адрес сервера 192.168.1.10)
Настройка брандмауэра:
разрешить входящие соединения на порт 80 (TCP)