dat1=[ 2 , 1 , 8 , 4 , 3 , 5 , 3 , -1 , -3 , -2 , 1 , 4 , -2 , 1 ];
# Server. Master.
# Получаем данные по I2C, преобразуем, расчитываем значения, записываем в файл.
filename = '/var/www/html/meteost.ru/public_html/js/znach.js' # Путь к создаваемому файлу znach.js
filename1 = '/var/www/html/meteost.ru/public_html/Temper_1.txt' # Путь к создаваемому файлу Temper_1.txt
filename2 = '/var/www/html/meteost.ru/public_html/Data.txt' # Путь к создаваемому файлу Data.txt
filename3 = '/var/www/html/meteost.ru/public_html/Pres.txt' # Путь к создаваемому файлу Temper_2.txt
filename4 = '/var/www/html/meteost.ru/public_html/Veter_cr.txt' # Путь к создаваемому файлу Temper_2.txt
filename5 = '/var/www/html/meteost.ru/public_html/Veter_max.txt' # Путь к создаваемому файлу Temper_2.txt
vrem = 0
while True:
from smbus import SMBus # Импортируем модуль SMBus для работы с I2C.
bus = SMBus(1) # Для raspberry pi4 значение SMBus должно быть 1.
from time import * # Импортируем модуль таймера.
from datetime import * # Импортируем модуль системного времени
i = 1
Skorost_1,Skorost_m = 0,0
while i < 50 : # Цикл для расчёта среднего и максимального значения скорости ветра.
# Запрашиваем блок из устройства 8 в колличестве 14 значений данных.
# Полученные данные сохраняем в переменные data(1-13).
data1,data2,data2_1,data3,data4,data5,data6,data7,data8,data9,data10,data11,data12,data13 = bus.read_i2c_block_data(0x8, 0x0C, 14)
# В переменных храняться данные из полуслова, в 2 переменных одно слово.
# Поэтому значение 1 переменной (11111111) смещаем
# на 8 бит влево (1111111100000000) и добавляем знакение 2 переменной
# с помощью логического ИЛИ (1111111111111111).
Temperature = data1 << 8
Temperature = Temperature | data2
znak = data2_1
Pozicion = data3 << 8
Pozicion = Pozicion | data4
Skorost = data5 << 8
Skorost = Skorost | data6
Perimetr = data7
Vlazhnost = data8 << 8
Vlazhnost = Vlazhnost | data9
Press = data10 << 8
Press = Press | data11
# Вычисляем среднюю и максимальную скорость ветра.
Skorost_1 = Skorost_1 + Skorost
if Skorost_m < Skorost :
Skorost_m = Skorost
sleep(1) # Пауза 1 сек.
i+=1
Skorost_sr = int(Skorost_1 / 50)
today = datetime.today()
today1 = today.strftime('%X')
today2 = today.strftime('%x')
hou = today.hour
# Определение направления ветра по азимуту (0-360)
if 0 <= Pozicion and 11 > Pozicion : Azm = 'С'
if 11<= Pozicion and 34> Pozicion : Azm = 'ССВ'
if 34 <= Pozicion and 56 > Pozicion : Azm = 'СВ'
if 56 <= Pozicion and 79 > Pozicion : Azm = 'ВСВ'
if 79 <= Pozicion and 101 > Pozicion : Azm = 'В'
if 101 <= Pozicion and 124 > Pozicion : Azm = 'ВЮВ'
if 124 <= Pozicion and 146 > Pozicion : Azm = 'ЮВ'
if 146 <= Pozicion and 169 > Pozicion : Azm = 'ЮЮВ'
if 169 <= Pozicion and 191 > Pozicion : Azm = 'Ю'
if 191 <= Pozicion and 214 > Pozicion : Azm = 'ЮЮЗ'
if 214 <= Pozicion and 236 > Pozicion : Azm = 'ЮЗ'
if 236 <= Pozicion and 259 > Pozicion : Azm = 'ЗЮЗ'
if 259 <= Pozicion and 281 > Pozicion : Azm = 'З'
if 281 <= Pozicion and 304 > Pozicion : Azm = 'ЗСЗ'
if 304 <= Pozicion and 326 > Pozicion : Azm = 'СЗ'
if 326 <= Pozicion and 349 > Pozicion : Azm = 'ССЗ'
if 349 <= Pozicion and 360 > Pozicion : Azm = 'С'
# Выводим на экран параметры метеомтанции.
#print('\n')
#print('\tПараметры метеостанции.')
#print('\n')
#print('\n\tТемпература = ',Temperature,' C')
#print('\n\tНаправление ветра = ',Azm)
#print('\n\tСкорость ветра максимальная = ',Skorost_m,' м/с')
#print('\n\tСкорость ветра средняя = ',Skorost_sr,' м/с')
#print('\n\tСостояние охранного периметра (0-норма,1-авария) = ',Perimetr)
#print('\n\tВлажность воздуха = ',Vlazhnost,' %')
#print('\n\tДавление воздуха = ',Press,' мм.рт.ст')
#print('\n\tДата и время измерения показаний метеостанции: ',today1,' ',today2)
#print('\n')
# Запись в файл.
if znak == 0:
Temperature = Temperature * -1
Temperature1 = str(Temperature)
Skorost_m1 = str(Skorost_m)
Skorost_sr1 = str(Skorost_sr)
Perimetr1 = str(Perimetr)
Vlazhnost1 = str(Vlazhnost)
Press1 = str(Press)
Pozicion1 = str(Pozicion)
with open(filename, 'w') as f:
f.write("var temper = '" + Temperature1 + "';")
f.write("\nvar napr = '" + Azm + "';")
f.write("\nvar napr1 = '" + Pozicion1 + "';")
f.write("\nvar skor_m = " + Skorost_m1 + "; ")
f.write("\nvar skor_s = " + Skorost_sr1 + "; ")
f.write("\nvar vlash = '" + Vlazhnost1 + "'; ")
f.write("\nvar davl = '" + Press1 + "'; ")
f.write("\nvar vrm = '" + today1 + "'; ")
f.write("\nvar vrm1 = '" + today2 + "'; ")
f.write("\nvar elt = document.getElementById('temper'); ")
f.write("\nelt.textContent = temper;")
f.write("\nvar elv = document.getElementById('vlash');")
f.write("\nelv.textContent = vlash;")
f.write("\nvar eln = document.getElementById('napr'); ")
f.write("\neln.textContent = napr;")
f.write("\nvar eln_n = document.getElementById('napr1'); ")
f.write("\neln_n.textContent = napr1;")
f.write("\nvar els_s = document.getElementById('skor_s'); ")
f.write("\nels_s.textContent = skor_s;")
f.write("\nvar els_m = document.getElementById('skor_m'); ")
f.write("\nels_m.textContent = skor_m;")
f.write("\nvar eld = document.getElementById('davl'); ")
f.write("\neld.textContent = davl; ")
f.write("\nvar eld_t = document.getElementById('vrm'); ")
f.write("\neld_t.textContent = vrm; ")
f.write("\nvar eld_t1 = document.getElementById('vrm1'); ")
f.write("\neld_t1.textContent = vrm1; ")
# Задаём время срабатывания опроса данных для построения графиков
# Опрос в 11 часов и в 23 часа
if 0 < hou and 11 > hou:
vrem = 0
if 12 <= hou and 23 > hou:
vrem = 0
if hou == 11 or hou == 23 :
if vrem == 0:
vrem = 1
# Чтение данных из файла с показаниями температуры
# первое значение не сохраняется все остальные значения
# сохраняем в переменные.
with open(filename1) as f:
lines = f.readlines()
i = 0
for line in lines:
i = i+1
if i == 4: z1 = str(line.rstrip())
if i == 6: z2 = str(line.rstrip())
if i == 8: z3 = str(line.rstrip())
if i == 10: z4 = str(line.rstrip())
if i == 12: z5 = str(line.rstrip())
if i == 14: z6 = str(line.rstrip())
if i == 16: z7 = str(line.rstrip())
if i == 18: z8 = str(line.rstrip())
if i == 20: z9 = str(line.rstrip())
if i == 22: z10 = str(line.rstrip())
if i == 24: z11 = str(line.rstrip())
if i == 26: z12 = str(line.rstrip())
if i == 28: z13 = str(line.rstrip())
z14 = str(Temperature1)
# Пишем значения температуры в файл из которого данные
# используются для построения графика
with open(filename1, 'w') as f:
f.write("dat1=[ \n")
f.write(z1 + " \n")
f.write(",\n")
f.write(z2 + " \n")
f.write(",\n")
f.write(z3 + " \n")
f.write(",\n")
f.write(z4 + " \n")
f.write(",\n")
f.write(z5 + " \n")
f.write(",\n")
f.write(z6 + " \n")
f.write(",\n")
f.write(z7 + " \n")
f.write(",\n")
f.write(z8 + " \n")
f.write(",\n")
f.write(z9 + " \n")
f.write(",\n")
f.write(z10 + " \n")
f.write(",\n")
f.write(z11 + " \n")
f.write(",\n")
f.write(z12 + " \n")
f.write(",\n")
f.write(z13 + " \n")
f.write(",\n")
f.write(z14 + " \n")
f.write("];")
# Чтение данных из файла с датой
# первое значение не сохраняется все остальные значения
# сохраняем в переменные.
with open(filename2) as f:
lines = f.readlines()
i = 0
for line in lines:
i = i+1
if i == 4: u1 = str(line.rstrip())
if i == 6: u2 = str(line.rstrip())
if i == 8: u3 = str(line.rstrip())
if i == 10: u4 = str(line.rstrip())
if i == 12: u5 = str(line.rstrip())
if i == 14: u6 = str(line.rstrip())
if i == 16: u7 = str(line.rstrip())
if i == 18: u8 = str(line.rstrip())
if i == 20: u9 = str(line.rstrip())
if i == 22: u10 = str(line.rstrip())
if i == 24: u11 = str(line.rstrip())
if i == 26: u12 = str(line.rstrip())
if i == 28: u13 = str(line.rstrip())
u14 = str(today2 + ' ' + today1)
# Пишем значения с датой в файл из которого данные
# используются для построения графика
with open(filename2, 'w') as f:
f.write("dat2=[ \n")
f.write(u1 + " \n")
f.write(",\n")
f.write(u2 + " \n")
f.write(",\n")
f.write(u3 + " \n")
f.write(",\n")
f.write(u4 + " \n")
f.write(",\n")
f.write(u5 + " \n")
f.write(",\n")
f.write(u6 + " \n")
f.write(",\n")
f.write(u7 + " \n")
f.write(",\n")
f.write(u8 + " \n")
f.write(",\n")
f.write(u9 + " \n")
f.write(",\n")
f.write(u10 + " \n")
f.write(",\n")
f.write(u11 + " \n")
f.write(",\n")
f.write(u12 + " \n")
f.write(",\n")
f.write(u13 + " \n")
f.write(",\n")
f.write("'" + u14 + "' \n")
f.write("];")
# Чтение данных из файла с показаниями атм. давления
# первое значение не сохраняется все остальные значения
# сохраняем в переменные.
with open(filename3) as f:
lines = f.readlines()
i = 0
for line in lines:
i = i+1
if i == 4: x1 = str(line.rstrip())
if i == 6: x2 = str(line.rstrip())
if i == 8: x3 = str(line.rstrip())
if i == 10: x4 = str(line.rstrip())
if i == 12: x5 = str(line.rstrip())
if i == 14: x6 = str(line.rstrip())
if i == 16: x7 = str(line.rstrip())
if i == 18: x8 = str(line.rstrip())
if i == 20: x9 = str(line.rstrip())
if i == 22: x10 = str(line.rstrip())
if i == 24: x11 = str(line.rstrip())
if i == 26: x12 = str(line.rstrip())
if i == 28: x13 = str(line.rstrip())
x14 = Press1
# Пишем значения атм. давления в файл из которого данные
# используются для построения графика
with open(filename3, 'w') as f:
f.write("dat3=[ \n")
f.write(x1 + " \n")
f.write(",\n")
f.write(x2 + " \n")
f.write(",\n")
f.write(x3 + " \n")
f.write(",\n")
f.write(x4 + " \n")
f.write(",\n")
f.write(x5 + " \n")
f.write(",\n")
f.write(x6 + " \n")
f.write(",\n")
f.write(x7 + " \n")
f.write(",\n")
f.write(x8 + " \n")
f.write(",\n")
f.write(x9 + " \n")
f.write(",\n")
f.write(x10 + " \n")
f.write(",\n")
f.write(x11 + " \n")
f.write(",\n")
f.write(x12 + " \n")
f.write(",\n")
f.write(x13 + " \n")
f.write(",\n")
f.write(x14 + " \n")
f.write("];")
# Чтение данных из файла с показаниями Средней скорости ветра
# первое значение не сохраняется все остальные значения
# сохраняем в переменные.
with open(filename4) as f:
lines = f.readlines()
i = 0
for line in lines:
i = i+1
if i == 4: h1 = str(line.rstrip())
if i == 6: h2 = str(line.rstrip())
if i == 8: h3 = str(line.rstrip())
if i == 10: h4 = str(line.rstrip())
if i == 12: h5 = str(line.rstrip())
if i == 14: h6 = str(line.rstrip())
if i == 16: h7 = str(line.rstrip())
if i == 18: h8 = str(line.rstrip())
if i == 20: h9 = str(line.rstrip())
if i == 22: h10 = str(line.rstrip())
if i == 24: h11 = str(line.rstrip())
if i == 26: h12 = str(line.rstrip())
if i == 28: h13 = str(line.rstrip())
h14 = Skorost_sr1
# Пишем значения Средней скорости ветра в файл из которого
# данные используются для построения графика
with open(filename4, 'w') as f:
f.write("dat4=[ \n")
f.write(h1 + " \n")
f.write(",\n")
f.write(h2 + " \n")
f.write(",\n")
f.write(h3 + " \n")
f.write(",\n")
f.write(h4 + " \n")
f.write(",\n")
f.write(h5 + " \n")
f.write(",\n")
f.write(h6 + " \n")
f.write(",\n")
f.write(h7 + " \n")
f.write(",\n")
f.write(h8 + " \n")
f.write(",\n")
f.write(h9 + " \n")
f.write(",\n")
f.write(h10 + " \n")
f.write(",\n")
f.write(h11 + " \n")
f.write(",\n")
f.write(h12 + " \n")
f.write(",\n")
f.write(h13 + " \n")
f.write(",\n")
f.write(h14 + " \n")
f.write("];")
# Чтение данных из файла с показаниями Максимальной скорости ветра
# первое значение не сохраняется все остальные значения
# сохраняем в переменные.
with open(filename5) as f:
lines = f.readlines()
i = 0
for line in lines:
i = i+1
if i == 4: y1 = str(line.rstrip())
if i == 6: y2 = str(line.rstrip())
if i == 8: y3 = str(line.rstrip())
if i == 10: y4 = str(line.rstrip())
if i == 12: y5 = str(line.rstrip())
if i == 14: y6 = str(line.rstrip())
if i == 16: y7 = str(line.rstrip())
if i == 18: y8 = str(line.rstrip())
if i == 20: y9 = str(line.rstrip())
if i == 22: y10 = str(line.rstrip())
if i == 24: y11 = str(line.rstrip())
if i == 26: y12 = str(line.rstrip())
if i == 28: y13 = str(line.rstrip())
y14 = Skorost_m1
# Пишем значения Максимальной скорости ветра в файл из которого
# данные используются для построения графика
with open(filename5, 'w') as f:
f.write("dat5=[ \n")
f.write(y1 + " \n")
f.write(",\n")
f.write(y2 + " \n")
f.write(",\n")
f.write(y3 + " \n")
f.write(",\n")
f.write(y4 + " \n")
f.write(",\n")
f.write(y5 + " \n")
f.write(",\n")
f.write(y6 + " \n")
f.write(",\n")
f.write(y7 + " \n")
f.write(",\n")
f.write(y8 + " \n")
f.write(",\n")
f.write(y9 + " \n")
f.write(",\n")
f.write(y10 + " \n")
f.write(",\n")
f.write(y11 + " \n")
f.write(",\n")
f.write(y12 + " \n")
f.write(",\n")
f.write(y13 + " \n")
f.write(",\n")
f.write(y14 + " \n")
f.write("];")
bus.close()
sleep(900)
Ну вот, пожалуй всё.
Все упомянутые в статье файлы можно скачать с яндекс диска.
Напишите отзыв.
Данная статья является продолжением статьи «Сервер на Raspberry PI4 для метеостанции». Здесь рассмотрим способ построения графиков параметров метеостанции и отображение графиков в web браузере. В этих стараниях нам поможет утилита «highcharts.js». Данная утилита есть в свободном доступе в интернете. Но, чтобы быть независимым от «дяди», который в любой момент закроет доступ, я решил скачать необходимые утилиты (утилиты расположены в архиве, скачать можно по кнопке в конце статьи). Так же скачал утилиту «jquery.min.js» - данная утилита необходима для корректной работы highcharts.js, это сокращённая версия jquery.
Сначала рассмотрим «отладочную версию». Здесь рассмотрим только построение графиков, далее рассмотрим «оконечную версию» где интегрируем графики в файл, расположенный на сервере.
Для работы графиков в одной папке с файлом «График.html» создаём следующие файлы:
Во всех файлах (кроме утилит) структура файлов одинаковая, разные только значения, в файле «Data.txt» значения даты заключены в одинарные кавычки, в остальных файлах кавычек нет. Это связано с тем, что файл «Data.txt» содержит данные отображаемые на оси абсцисс (ось Х). Остальные файлы содержат данные отображаемые на оси ординат (ось Y) и являются данными значения графиков, в то время как на оси абсцисс значения отображаются автоматически, а затем заменяются надписями, содержащимися в кавычках.
Ниже приведено содержание одного из файлов, остальные файлы создаются по аналогии.
Как видно все данные разнесены на отдельные строки. Данная конфигурация нужна для дальнейшего копирования отдельных строк с данными и записи их в переменные, после чего данный файл будет перезаписан. В новом файле будут отсутствовать первое значение и добавляться последнее. Данную процедуру производит программа, написанная на «Python» - i2c_Data.py. i2c_Data.py будет обновлять вышерассмотренные файлы два раза в сутки в 11 и 23 часа. Таким образом графики будут изменяться два раза в сутки.
В отладочной версии программа i2c_Data.py не используется, но в любом случае файлы должны иметь необходимое заполнение. В архиве имеются данные файлы доступные по кнопке в конце статьи.
Теперь рассмотрим файл «График.html». Данный файл содержит три контейнера в которых будут отображаться графики. Для отображения одного графика используются два файла - один Data.txt, а второй файл со значениями параметра.
Скрипты на «javascript» записывают из файлов данные в массивы dat1, dat2, dat3, dat4, dat5. В каждый контейнер программы на «javascript» выводят построение графиков используя данные массивов.
Ниже приведен html код файла «График.html».
<!DOCTYPE HTML PUBLIC >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>График</title>
<!-- Прописываем пути к библиотекам создания графиков -->
<script src="jquery.min.js" type="text/javascript"></script>
<script src="highcharts.js" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Температуры" -->
<script type="text/javascript">
var dat1=[0];
</script>
<script src="Temper_1.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Даты" -->
<script type="text/javascript">
var dat2=[0];
</script>
<script src="Data.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Атм. Давления" -->
<script type="text/javascript">
var dat3=[0];
</script>
<script src="Pres.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Средней скорости ветра" -->
<script type="text/javascript">
var dat4=[0];
</script>
<script src="Veter_cr.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Максимальной скорости ветра" -->
<script type="text/javascript">
var dat5=[0];
</script>
<script src="Veter_max.txt" type="text/javascript"></script>
<!-- График температуры - данные читаются из двух файлов
(для оси ординат и абсцисс соответственно) -->
<script type="text/javascript">
var chart;
$(document).ready(function(){
chart = new Highcharts.Chart({
chart: {renderTo: 'container'},
series: [{name: 'Температура',data: dat1,
zones: [{value: 0,color: '#00ade9'},{color: '#f6a655'}] }],
title: {text: 'График температуры.'},
xAxis: {categories: dat2,},
yAxis: {title: {text: 'Температура (\xB0C)'}},
plotOptions: {line: {dataLabels: {enabled: true}}}, }); });
</script>
<!-- График Атм. давления - данные читаются из двух файлов (для оси ординат и
абсцисс соответственно) -->
<script type="text/javascript">
var chart1;
$(document).ready(function(){
chart1 = new Highcharts.Chart({
chart: {renderTo: 'container1'},
series: [{name: 'Давление',data: dat3 ,color: '#6a6cb0'}],
title: {text: 'График давления.'},
xAxis: {categories: dat2,},
yAxis: {title: {text: 'Атм. давление (мм.рт.ст.)'}},
plotOptions: {line: {dataLabels: {enabled: true}}},
});
});
</script>
<!-- График Скорости ветра (средняя и максимальная) - данные читаются из трёх файлов
(два для оси ординат и один абсцисс соответственно) -->
<script type="text/javascript">
var chart2;
$(document).ready(function(){
chart1 = new Highcharts.Chart({
chart: {renderTo: 'container2'},
series: [{name: 'Скорость ветра средняя',data: dat4 ,color: '#008180' ,dashStyle: 'longdash'},
{name: 'Скорость ветра максимальная.',data: dat5 ,color: '#00aca5' ,dashStyle: 'shortdot'} ],
title: {text: 'Скорость ветра средняя.'},
xAxis: {categories: dat2,},
yAxis: {title: {text: 'Скорость ветра (м/c)'}},
plotOptions: {line: {dataLabels: {enabled: true}}},
});
});
</script>
<!-- Выводим графики в отдельные контейнеры -->
<body>
<div
id="container" style="width: 700px; height: 400px ">
</div>
<div
id="container1" style="width: 700px; height: 400px ">
</div>
<div
id="container2" style="width: 700px; height: 400px ">
</div>
</body>
</head>
</html>
На этом с построением графиков всё, далее рассмотрим интеграцию данного кода в код метеостанции.
Ну вот и добрались до «оконечной версии». Здесь рассмотрим интеграцию выше рассмотренного кода в код сервера метеостанции рассмотренный в статье «Сервер на Raspberry PI4 для метеостанции».
Выше рассмотренные текстовые файлы (Data.txt, Pres.txt, Temper_1.txt, Veter_cr.txt, Veter_max.txt) остаются без изменения и размещаются на сервере по адресу – /var/www/html/meteost.ru/public_html. По этому-же адресу располагаются файлы «highcharts.js», «jquery.min.js» и «index.html». Папка JS располагается там же, в папке расположен файл «znach.js» - смотрите в «Сервер на Raspberry PI4 для метеостанции».
В файл «index.html» добавляем код вышеупомянутого файла «График.html». В итоге получаем модернизированный файл «index.html», код файла приведён ниже.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Метеостанция</title>
<!-- CSS описание страницы -->
<style type="text/css">
body {
width: 700px;
font-family: Arial, Verdana, sans-serif;
font-size: 110%;
color: #666;
background-color: #f8f8f8;
margin: 10px auto auto auto;}
h1 {margin: 0px auto 0px 230px;}
table {
border-spacing: 0px;
margin: 0px auto 0px auto;}
th, td {
padding: 5px 30px 5px 10px;
border-spacing: 0px;
font-size: 95%;
margin: 0px;}
th, td {
text-align: left;
background-color: #e0e9f0;
border-top: 1px solid #cbd2d8;
border-right: 1px solid #cbd2d8;}
tr.head th {
color: fff;
background-color: #90b4d6;
border-bottom: 2px solid #547ca0;
border-right: 1px solid #749abe;
border-top: 1px solid #90b4d6;
text-align: center;
text-shadow: -1px -1px 1px #666;
letter-spacing: 0.15em;}
td {
text-shadow: 1px 1px 1px #fff;
text-align: center;}
tr.even td, tr.even th {
background-color: #e8eff5;}
tr.head th:first-child {
border-top-left-radius: 5px;}
tr.head th:last-child {
border-top-right-radius: 5px;}
fieldset {
width: 310px;
margin-top: 20px;
border: 1px solid #d6d6d6;
background-color: #ffffff;
line-height: 1.6em;}
legend {
font-style: italic;
color: #666666;}
input[type="text"] {
width: 120px;
border: 1px solid #d6d6d6;
padding: 2px;
outline: none;}
input[type="text"]:focus, input[type="text"]:hover {
background-color: #d0e2f0;
border: 1px solid #999;}
input[type="submit"] {
border: 1px solid #006633;
background-color: #009966;
color: #ffffff;
border-radius: 5px;
padding: 5px;
margin-top: 10px;}
input[type="submit"]:hover {
border: 1px solid #006633;
background-color: #00cc33;
color: #ffffff;
cursor: pointer;}
.title {
float: left;
width: 160px;
clear: left;}
.submit {
width: 310px;
text-align: right;}
td.lef {text-align: left;}
div {margin: 10px auto auto auto;}
</style>
<!-- Прописываем пути к библиотекам создания графиков -->
<script src="jquery.min.js" type="text/javascript"></script>
<script src="highcharts.js" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Температуры" -->
<script type="text/javascript">
var dat1=[0];
</script>
<script src="Temper_1.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Даты" -->
<script type="text/javascript">
var dat2=[0];
</script>
<script src="Data.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Атм. Давления" -->
<script type="text/javascript">
var dat3=[0];
</script>
<script src="Pres.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Средней скорости ветра" -->
<script type="text/javascript">
var dat4=[0];
</script>
<script src="Veter_cr.txt" type="text/javascript"></script>
<!-- Прописываем пути к файлам содержащим массив данных "Максимальной скорости ветра" -->
<script type="text/javascript">
var dat5=[0];
</script>
<script src="Veter_max.txt" type="text/javascript"></script>
<!-- ------------- Создаём таблицу с данными полученными от метеостанции ------------- -->
</head>
<body>
<h1>Метеостанция</h1>
<p>В таблице отображаются параметры переданные с внешнего (уличного) блока метеостанции (с. Троицкое).</p>
<table>
<tr class="head">
<th>Параметр</th>
<th>Значение</th>
<th>Ед. изм.</th>
</tr>
<tr>
<th>Температура на улице</th>
<td id="temper"></td>
<td class="lef">°С</td>
</tr>
<tr class="even">
<th>Влажность на улице</th>
<td id="vlash"></td>
<td class="lef">%</td>
</tr>
<tr>
<th>Направление ветра</th>
<td id="napr"></td>
<td id="napr1" class="lef">
</td>
</tr>
<tr class="even">
<th>Скорость ветра (сред.)</th>
<td id="skor_s"></td>
<td class="lef">м/с</td>
</tr>
<tr class="even">
<th>Скорость ветра (макс.)</th>
<td id="skor_m"></td>
<td class="lef">м/с</td>
</tr>
<tr>
<th>Атм. Давление</th>
<td id="davl"></td>
<td class="lef">мм.рт.ст</td>
</tr>
<tr>
<th></th>
<td></td>
<td></td>
</tr>
<tr>
<th>Дата и время измерения показаний метеостанции</th>
<td id="vrm"></td>
<td id="vrm1"></td>
</tr>
</table>
<script src="js/znach.js"></script>
<p></p>
<!-- ------------------- Построение графиков ---------------------- -->
<!-- График температуры - данные читаются из двух файлов (для оси ординат и абсцисс соответственно) -->
<script type="text/javascript">
var chart;
$(document).ready(function(){
chart = new Highcharts.Chart({
chart: {renderTo: 'container'},
series: [{name: 'Температура',data: dat1,
zones: [{value: 0,color: '#00ade9'},{color: '#f6a655'}] }],
title: {text: 'График температуры.'},
xAxis: {categories: dat2,},
yAxis: {title: {text: 'Температура (\xB0C)'}},
plotOptions: {line: {dataLabels: {enabled: true}}}, }); });
</script>
<!-- График Атм. давления - данные читаются из двух файлов (для оси ординат и абсцисс соответственно) -->
<script type="text/javascript">
var chart1;
$(document).ready(function(){
chart1 = new Highcharts.Chart({
chart: {renderTo: 'container1'},
series: [{name: 'Давление',data: dat3 ,color: '#6a6cb0'}],
title: {text: 'График атмосферного давления.'},
xAxis: {categories: dat2,},
yAxis: {title: {text: 'Атм. давление (мм.рт.ст.)'}},
plotOptions: {line: {dataLabels: {enabled: true}}},
});
});
</script>
<!-- График Скорости ветра (средняя и максимальная) - данные читаются из трёх файлов (два для оси ординат и один абсцисс соответственно) -->
<script type="text/javascript">
var chart2;
$(document).ready(function(){
chart1 = new Highcharts.Chart({
chart: {renderTo: 'container2'},
series: [{name: 'Скорость ветра средняя',data: dat4 ,color: '#008180' ,dashStyle: 'longdash'},
{name: 'Скорость ветра максимальная.',data: dat5 ,color: '#00aca5' ,dashStyle: 'shortdot'} ],
title: {text: 'Скорость ветра средняя и максимальная.'},
xAxis: {categories: dat2,},
yAxis: {title: {text: 'Скорость ветра (м/c)'}},
plotOptions: {line: {dataLabels: {enabled: true}}},
});
});
</script>
<!-- Выводим графики в отдельные контейнеры -->
<div
id="container" style="width: 700px; height: 400px ">
</div>
<div
id="container1" style="width: 700px; height: 400px ">
</div>
<div
id="container2" style="width: 700px; height: 400px ">
</div>
</body>
</html>
В принципе если сейчас запустить файл «index.html», то мы получим готовую Html страницу, просматриваемую через браузер.
Для того чтобы графики обновлялись два раза в сутки (в 11 и 23 часа , в архиве имеется файл в котором время устанавливается 1 и 13 часов), а старые данные недельной давности удалялись, необходимо модернизировать файл «i2c_Data.py». Данный файл расположен на сервере по адресу - /home/ubuntu. Файл «i2c_Data.py» должен быть в автозагрузке при запуске ОС (См. «Сервер на Raspberry PI4 для метеостанции»).
Данная программа будет копировать данные с текстовых файлов, удалять данные недельной давности, добавлять последние измеренные данные и переписывать в те же самые файлы.
Ниже представлен код (написанный на Python) модернизированного файла «i2c_Data.py».
Далее загружаем фал на сервер по вышеуказанному адресу. Настройки сервера смотрите в «Сервер на Raspberry PI4 для метеостанции».
Перезагружаем сервер и заходим на сервер через браузер с внешнего компьютера.
В результате должна появиться подобная картинка.
