Запуск Веб-сервера :
В Linux набрать команду :
sudo /opt/lampp/lampp start
Если сценарий cgi_ чтение температуры.py выдаёт ошибку типа:
Permission denied: ‘/dev/ttyS0’
тогда в Linux введите команду:
sudo chmod 666 /dev/ttyS0
Эти сценарии также работают в Windows (тестировалось на XP и Wampserver).
#! /usr/bin/python
#-*- coding:utf-8 -*-
# сценарий cgi_чтение температуры.py
# (C) Фабрис Сэнсэр
# python 2.7
# сценарий cgi
# соединение RS232 с цифровым термометром на цифровом датчике DS1620
# http://fabrice.sincere.pagesperso orange.fr/cm_электроника/проект_pic/ЖК термометр_DS1620htm/ЖК термометр_DS1620.htm
# тест: ОК (linux/ubuntu 11.10 + xampp 1.7.7)
import cgitb # отладка программы cgi
cgitb.enable()
import serial # внешняя библиотека pyserial
# Библиотека pyserial :
# http://pyserial.sourceforge.net/shortintro.html
# http://pyserial.sourceforge.net/pyserial_api.html
import time
print «Content-Type: text/html\n\n»
print «»»<!DOCTYPE html
PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»
«http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»ru» lang=»fr»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Mesure de température</title>
<meta http-equiv=»Refresh» content=»10″/>
<meta name=»Author» content=»Фабрис Sincère»/>
</head>
<body>»»»
print ‘<p>Соединение с COM-портом</p>’
# предварительно, нужно создать реестр /opt/lampp/htdocs/температура
filename = ‘/opt/lampp/htdocs/ температура / температура.txt’
filename0 = ‘../ температура температура.txt’
print «<p><a href='»+filename0+»‘>Файл резервной копии</a></p>»
Fichier = open(filename,’a’)
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 # в секундах
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# внимание : разрешение 666
# > sudo chmod 666 /dev/ttyS0
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
nomport = 0
try:
int(nomport)
Port.port = int(nomport)
exept:
Port.port = nomport
print ‘<p>Открытие порта», Port.portstr,'</p>’
Port.open()
# чтение температуры
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 ‘<p>’+ affichage +'</p>’
Fichier.write(affichage +’\n’)
else:
print ‘<div style=»color:red;»>Устройство не понимает!</p>’
# чтение низкой температуры термостата
Port.write(‘\xA2\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 = str(temperature) +’ °C’
print ‘<p>’+’Thermostat : TLow —>’+ affichage +'</p>’
# воспроизведение высокой температуры термостата
Port.write(‘\xA1\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 = str(temperature) +’ °C’
print ‘<p>’+’ Thermostat : Thigh —>’+ affichage +'</p>’
print «<p>Закрытие порта, Port.portstr,'</p>’
Port.close()
Fichier.close()
print «</body></html>»
Чтение температуры (обновляется каждые 10 секунд):
Файл резервной копии:
#! /usr/bin/python
# -*- coding: utf-8 -*-
# сценарий cgi_сборник установок.py
# Просмотр HTML-формы
print «Content-Type: text/html\n\n»
print «»»<!DOCTYPE html
PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»
«http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»ru» lang=»ru»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Измерение температуры</title>
<meta name=».Автор» content=»Фабрис Сэнсэр»/>
</head>
<body>
<p>Установка температуры (в °C) термостата:</p>
<p>например: 54.5</p>
<form action=»cgi_обработка сборника установок.py» method=»post»>
<p>
Tlow : <input type=»text» name=»tlow» /><br/><br/>
Thigh : <input type=»text» name=»thigh» /><br/><br/>
<input value=»СОХРАНИТЬ» type=»submit» name=»отправить»/>
</p>
</form>
</body>
</html>»»»
#! /usr/bin/python
# -*- coding: utf-8 -*-
# (C) Фабрис Сэнсэр
# сценарий cgi_обработка сборника установок.py
# Обработка данных, переданных через HTML-форму
import serial
import cgi
form = «cgi».FieldStorage()
def байт(температура):
temperature =int(temperature*2)
if temperature < 0:
температура += 256
MSB = 1
LSB = temperature
else:
MSB = 0
LSB = temperature
return [MSB,LSB]
print «Content-Type: text/html\n\n»
print «»»<!DOCTYPE html
PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN»
«http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»>
<html xmlns=»http://www.w3.org/1999/xhtml» xml:lang=»ru» lang=»ru»>
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
<title>Измерение температуры</title>
<meta name=»Автор» content=»Фабрис Сэнсэр»/>
</head>
<body>»»»
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 # в секунду
# Под Windows :
# COM1 -> 0 (или COM1)
# COM2 -> 1 (или COM2)
# Под Linux :
# внимание : разрешение 666
# > chmod 666 /dev/ttyS0
# COM1 -> 0 (или /dev/ttyS0)
# COM2 -> 1 (или /dev/ttyS1)
nomport = 0
try:
int(nomport)
Port.port = int(nomport)
except:
Port.port = nomport
print ‘<p>Открытие порта, ‘Port.portstr,'</p>’
Port.open()
if form.has_key(«tlow»):
Tlow = form[«tlow»].value
try:
Tlow = float(Tlow)
Port.write(‘\x02’+chr(байт(Tlow)[0])+chr(байт(Tlow)[1]))
Port.read()
Port read()
print ‘<p>Tlow : сохранённое значение</p>’
except:
print ‘<p>Tlow : недопустимое Значение</p>’
if form.has_key(«thigh»):
Thigh = form[«thigh»].value
try:
Thigh = float(Thigh)
Port.write(‘\x01’+chr(байт(Thigh)[0])+chr(байт(Thigh)[1]))
Port.read()
Port.read()
print ‘<p>Thigh : сохраненное значение</p>’
except:
print ‘<p>Thigh : недопустимое Значение</p>’
print «<p>Закрытие порта, Port.portstr,'</p>’
Port.close()
print «</body></html>»
10. Приложения для связи RS232 с LINUX
Связь между платой с микроконтроллером и компьютером (оснащенного операционной системой Linux) может установиться просто с консоли команд (командный процессор Linux).Для этого мы будем использовать два сценария bash :
- DS1620_reception.sh (выполняется первым)
- DS1620_emission.sh
Эти сценарии были успешно протестированы на многих системах Linux : Ubuntu, Mandriva и Puppy.
Эти сценарии являются базовыми: можно сделать гораздо более мощные!
1 bash-сценарий (файл DS1620_reception.sh) :
#!/bin/bash
# bash-сценарий для Linux
# (C) Фабрис Сэнсэр ; Версия 1.0.1
# Связь RS232 (COM-порт) между компьютером и микроконтроллером PIC
clear
# обнаружение COM-портов компьютера
message=’Команда : dmesg | grep tty’
echo-e «$message\n»
dmesg | grep tty
# настройка порта COM1 :
# 9600 бит/с
# 8 битов данных
# бит четности-нет
# 1 стоп-бит
# управление потоком-нет
message=’Commande: stty-F /dev/ttyS0 9600 cs8-parenb-parodd-cstopb-ixon cread clocal-crtscts-icanon’
echo-e «\n$message\n»
stty-F /dev/ttyS0 9600 cs8-parenb-parodd-cstopb-ixon cread clocal-crtscts-icanon
# отображает все параметры порта COM1
message=’ Commande: stty-a-F /dev/ttyS0′
echo-e «$message\n»
stty-a-F /dev/ttyS0
message=’Во второй консоли, запустить сценарий DS1620_emission.sh’
echo-e «\n*****************************************************************»
echo-e «$message»
echo-e»*****************************************************************\n»
# данные, полученные с компьютера, сохраняются в режиме реального времени в файл
message=’ Commande: cat /dev/ttyS0 > temperature.dat’
echo-e «$message\n»
cat /dev/ttyS0 > temperature.dat
В консоли, выполнение этого сценария bash даёт:
fabrice@imedia2089:~$ ./DS1620_reception.sh
Commande: dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 0.573305] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 0.573406] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 0.573739] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 0.573872] 00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
Commande: stty-F /dev/ttyS0 9600 cs8-parenb-parodd-cstopb-ixon кред помощью clocal-crtscts-icanon
Commande: stty-a-F /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; флеш = ^O; min = 1; time = 0;
-parenb-parodd cs8-hupcl-cstopb cread clocal-crtscts
-ignbrk-brkint-ignpar-parmrk-inpck-istrip-inlcr-igncr-icrnl-ixon-ixoff
-iuclc-ixany-imaxbel-iutf8
-opost-olcuc-ocrnl-onlcr-onocr-onlret-ofill-ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig-icanon iexten echo-echoe-echok-echonl-noflsh-xcase-tostop-echoprt
echoctl echoke
*****************************************************************
Во второй консоли, выполняется сценарий DS1620_emission.sh
*****************************************************************
Commande: cat /dev/ttyS0 > temperature.dat
2 bash-сценарий (файл DS1620_emission.sh) :
#!/bin/bash
# bash-сценарий для Linux
# (C) Фабрис Сэнсэр; Версия 1.0.1
# Связь RS232 (COM-порт) между компьютером и микроконтроллером PIC
clear
message=’В другой консоли, запуск первого сценария DS1620_reception.sh’
echo-e «\n**************************************************************************»
echo-e «$message»
echo-e»**************************************************************************\n»
# бесконечный цикл
# посылает 3 байта (0xAA 0x00 0x00) = ПИК
# повторяет операцию каждые 5 секунд
while [ 1 ]
do
message=’Emission : echo-e-n «\xAA\x00\x00» > /dev/ttyS0′
echo «$message»
echo-e-n «\xAA\x00\x00» > /dev/ttyS0
sleep 5s
# вывод содержимого файла данных, полученного с помощью компьютера (в шестнадцатеричном формате)
echo-e «Прием»
od-t x1 temperature.dat
done
В консоли, выполнение этого сценария bash дает :
fabrice@imedia2089:~$ ./DS1620_emission.sh
**************************************************************************
В другой консоли, исполнение первого сценария DS1620_reception.sh
**************************************************************************
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32
0000002
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32 00 32
0000004
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32 00 32 00 32
0000006
Посылка: echo-e-n «\xAA\x00\x00» > /dev/ttyS0
Приём
0000000 00 32 00 32 00 32 00 33
0000010
…
…
…
Два последних полученных байта — 0x33 0x00, соответствующих температуре +25,5 °C.
11. Проверка температуры через интернет с MySQL
Вам нужен Интернет-хостинг с PHP и базой данных MySQL.У автора статьи хостинг Olympe Network (бесплатный и без рекламы).
11-1. Локальная установка web_temperature.exe
Это приложение запускается на локальном компьютере, куда подключено устройство для сбора данных о температуре (через порт RS232).
Оно позволяет :
- просматривать температуру (обновление: 1 секунда)
- каждые 5 минут, температура сохраняется во внешней базе данных MySQL (через сеть интернет). Для этого используются 3 запроса SQL:
- CREATE TABLE IF NOT EXISTS web_temperature1 (ID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,date date NOT NULL,time time NOT NULL,temperature varchar(20) collate latin1_general_ci NOT NULL) ENGINE = MYISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
- INSERT INTO web_temperature1(ID,date,time,temperature) VALUES (NULL,CURDATE(), CURTIME(), ‘21,5’)
- SELECT date,time,temperature FROM web_temperature1 ORDER BY ID DESC LIMIT 0,1
Приложение состоит из двух файлов :
- web_temperature.exe
- libmysql.dll
Скачать web_temperature.exe (263 кб)
Скачать libmysql.dll (1,0 Мб)
Исходный код приложения
Это приложение было написано на C++ Borland Builder 5.
Примечание: Для связи с COM-портом (RS232), необходимо установить компонент TComPort (о котором я уже говорил выше).Для связи с базой данных MySQL необходима библиотека C libmysql, которую вы можете свободно скачать с официального сайта www.mysql.com:
Раздел: Downloads
-> mysql-connector-c-noinstall-6.0.2-win32.zip
Чтобы использовать эту библиотеку в C++ Borland Builder 5, вот внешняя ссылка:
Учебник: Использование API MySQL в Borland C++ Builder
Небольшое упущение в этом учебнике: нужно добавить libmysql.lib в проект (Проект -> Добавить в проект -> libmysql.lib)
Полезная ссылка: http://fabrice.sincere.pagesperso-orange.fr/application_builder5/client_mysql/mysql_client_builder.html
11-2. Чтение температуры через интернет: сценарий PHP
В вашем любимом веб-браузере, температура доступна в режиме реального времени на веб-странице в php. Сценарий PHP подключается к базе данных MySQL (через сеть интернет).Он считывает и отображает информацию, ранее записанную локальным приложением (обновление каждые 5 минут).
Скачать исходный код сценария PHP
12. Проверка температуры через интернет с FTP
Вам нужен интернет-хостинг .
12-1. Локальная установка web_temperature_ftp.exe
Это приложение запускается на локальном компьютере, куда подключается устройство для сбора данных о температуре (через порт RS232).
Оно позволяет :
- просматривать температуру (обновление: 1 секунда)
- каждые 5 минут, локальный файл (который содержит информацию о дате, времени и температуре), передаётся на веб-сайт по FTP-протоколу (File Transfer Protocol).
Скачать web_temperature_ftp.exe (292 кб)
Это приложение было написано на C++ Borland Builder 5.
12-2. Чтение температуры через интернет
В вашем любимом веб-браузере, температура доступна в реальном времени в URL:
http://fabrice.sincere.pagesperso-orange.fr/web_temperature.txt
13. Список оборудования и деталей
- программатор для прошивки микроконтроллера PIC 16F628A
Без интерфейса RS232 :
- 1 буквенно-цифровой ЖК дисплей 2 × 16 с параллельным интерфейсом
- 3 резистора 10 кОм
- 1 подстроечный резистор 2,2 кОм ( для регулировки контраста дисплея)
- 1 цифровой датчик температуры DS1620 (Dallas Semiconductor)
Примечание : Вы можете заказать бесплатные образцы у фирмы Dallas - 1 микроконтроллер PIC 16F628A (корпус PDIP)
Примечание: Вы можете заказать бесплатные образцы у компании Microchip - 1 кварц на 20 МГц (20 МГц обязательно)
- 1 электролитический конденсатор 100 мкФ (фильтр)
- 1 электролитический конденсатор 10 мкФ (фильтр)
- 5 конденсаторов 100 нФ (фильтр)
- 2 конденсатора по 22 пФ
- 1 источник непрерывного питания +12 в (или батарейки 9 В)
- 1 микросхема регулятора напряжения 7805 (корпус ТО220)
- 2 кнопки (действующих на замыкание)
С интерфейсом RS232: дополнительные компоненты
- 1 инегральная микросхема MAX233A (интерфейс RS232C <-> TTL/CMOS)
Примечание: Вы можете заказать бесплатные образцы у компании Maxim - 1 разъем SubD, 9 контактов «папа»
- 1 электролитический конденсатор 1 мкф (фильтр)
- 1 нуль-модемный кабель («мама» / «мама»)
- 1 компьютер с COM-портом
14. Печатная плата
Размеры: 62 x 100 мм
Односторонняя.
web_temperature_ftp_code_source
Скачать фотошаблон
Примечание: Не забудьте 9–контактный разъём (припаяйте в первую очередь).
15. Прошивка для PIC 16F628A
Исходный код был написан на ассемблере в бесплатной среде MPLAB IDE от Microchip.
Скачать прошивку (.hex) исходный код на ассемблере (.asm)
Перевод Павла Блинкова (grayling3000) по заказу сайта Меандр