Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#16: 2018-12-08 12:34:58 ЛС | профиль | цитата
(с) Я балдею, зеленый, как ты в тину ныряешь.
RT9U писал(а):
Задача
с ком-порта каждые 15 мин будут прилетать значения температуры в помещении. Хочется, что бы строился месячный график температуры в помещении.
RT9U писал(а):
для суток нужно 86400 отчётов

Если писал(а):
с ком-порта каждые 15 мин
то:
Для суток - 96 отчётов
Для месяца - 2880-2976
Для года - 35040 +96

Редактировалось 2 раз(а), последний 2018-12-08 12:42:13
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 85
Рейтинг: 0
#17: 2018-12-10 12:18:23 ЛС | профиль | цитата
Tad, с количеством отчётов -я в курсе. Раз в секунду сделано для отладки программы.

Заклинело опять. Не могу записать в файл строки из strList Может там определенное расширение файла???? можно пример использования данного элемента имеено для записи в файл.....
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#18: 2018-12-10 12:23:43 ЛС | профиль | цитата
Да нормально всё вроде
Я пишу в БД SQLite, а после записи вывожу на экран.

Редактировалось 1 раз(а), последний 2018-12-10 12:28:11
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#19: 2018-12-10 13:01:46 ЛС | профиль | цитата
RT9U писал(а):
Заклинело опять. Не могу записать в файл строки из strList Может там определенное расширение файла???? можно пример использования данного элемента имеено для записи в файл.....

А не лучше ли использовать Append вместо Save, чтобы не засорять память?
Схема

Add(MainForm,2953706,133,105)
{
}
Add(Button,9858647,133,154)
{
Left=145
Top=20
TabOrder=-1
Caption="Append"
link(onClick,1324176:doEvent1,[])
}
Add(StrList,13434261,364,147)
{
Point(doAppend)
link(FileName,7603423:Text,[])
}
Add(Hub,7975096,308,175)
{
link(onEvent1,13434261:doAppend,[])
link(onEvent2,13434261:doClear,[(333,188)(333,160)])
}
Add(VisualStrings,11788037,252,98)
{
Lines=#5:test1|
Width=46
Point(doText)
Point(onText)
link(onText,610283:doWork1,[(354,104)])
}
Add(Hub,1324176,203,154)
{
OutCount=4
link(onEvent1,11788037:doText,[(228,160)(228,104)])
link(onEvent2,1126043:doText,[(235,167)(235,125)])
link(onEvent3,9300085:doText,[(242,174)(242,146)])
link(onEvent4,7975096:doEvent1,[])
}
Add(VisualStrings,1126043,252,119)
{
Lines=#5:test2|
Width=46
Point(doText)
Point(onText)
link(onText,610283:doWork2,[])
}
Add(VisualStrings,9300085,252,140)
{
Lines=#5:test3|
Width=46
Point(doText)
Point(onText)
link(onText,8389691:doWork2,[])
}
Add(HubEx,610283,350,119)
{
Angle=1
link(onEvent,8389691:doWork1,[])
}
Add(HubEx,8389691,350,140)
{
Angle=1
link(onEvent,13434261:doAdd,[(354,153)])
}
Add(VisualStrings,7603423,371,98)
{
Lines=#8:test.txt|
Width=53
}


Редактировалось 2 раз(а), последний 2018-12-10 13:03:01
карма: 22

0
Ответов: 85
Рейтинг: 0
#20: 2018-12-10 14:18:24 ЛС | профиль | цитата
Tad, Я знаю, что Вы любитель SQLite . А это надо в этом проекте??? Если только для тренировки. Если будет время то попробую. Скажите, какие преимущества? Вообще в этом проекте я хотел бы научиться работать с графиками, остальное вторично. А температуру у нас надо мерить 2 раза в году, обычно весь ноябрь и весь март, когда плохо отапливают.
nesco, спасибо за Append. я честно этой точкой и не пользовался никогда. Сейчас попробую.
карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#21: 2018-12-10 14:38:52 ЛС | профиль | цитата
RT9U писал(а):
Append. я честно этой точкой и не пользовался никогда

Эту точку хорошо использовать там, где очень много данных пишется в память. И что бы их там не хранить, лучше скидывать порциями на диск через какое-то время, те StrList использовать как временный буфер.

Редактировалось 1 раз(а), последний 2018-12-10 14:40:20
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#22: 2018-12-10 19:19:53 ЛС | профиль | цитата
RT9U писал(а):
А это надо в этом проекте?
Применение БД, а не текстового файла, избавляет от геморроя, если надо узнать:
Минимальную температуру за отопительный сезон : SELECT min(t) from Room_temperature;
Среднюю температуру за отопительный сезон : SELECT avg(t) from Room_temperature;
Максимальную температуру за отопительный сезон : SELECT max(t) from Room_temperature;
То же за любой месяц или день.
А попробуй создать график с линиями максимальных, средних и минимальных температур за весь отопительный сезон из текстового файла.
Я не позавидую.
А из БД - два пальца об асфальт.
А надо тебе это или нет - решать тебе.
Схема пишущая данные температуры в БД

Add(MainForm,15663453,245,182)
{
Width=289
Height=134
Color=15780518
Caption="Температура в помещении"
BorderStyle=1
Position=1
Point(onClose)
Point(Close)
link(onCreate,7098561:doEvent1,[])
link(Close,11914673:Left,[(251,170)(229,170)(229,312)(251,312)])
}
Add(Hub,7098561,294,196)
{
OutCount=3
link(onEvent1,7935657:doOpen,[])
link(onEvent3,4937493:doEnumPorts,[])
}
Add(DS_SQLite,7935657,539,196)
{
Name="rt"
FileName="Room_temperature.db"
link(onOpen,1699441:doExec,[])
}
Add(DSC_Exec,1699441,581,196)
{
SQL="CREATE TABLE IF NOT EXISTS data(\r\n data REAL,\r\n t REAL);\r\n "
DSManager="rt"
}
Add(Label,7480715,497,210)
{
Left=60
Top=14
Width=83
Height=42
Color=15780518
Font=[MS Sans Serif,8,1,16711680,1]
WinStyle=4
Caption="COM-порт №°\r\n\r\nСкорость"
AutoSize=1
}
Add(If_else,2513173,455,287)
{
Type=5
Op2=String()
link(onTrue,1696897:doSearch,[])
}
Add(ComboBox,7690426,455,210)
{
Left=125
Top=39
Width=75
Height=21
Color=15780518
Font=[MS Sans Serif,8,1,0,1]
WinStyle=4
Strings=#3:300|3:600|4:1200|4:2400|4:4800|4:9600|5:14400|5:19200|5:28800|5:38400|5:57600|6:115200|
Text="19200"
Point(EditText)
}
Add(ComboBox,8658105,392,210)
{
Left=150
Top=13
Width=50
Height=21
Color=15780518
Font=[MS Sans Serif,8,1,0,1]
WinStyle=4
Text=""
DataType=1
ReadOnly=0
DropDownCount=15
Point(EditText)
}
Add(Switch,7986566,336,266)
{
DataOn=String(255,СТОП)
DataOff=String(0,ПУСК)
Point(State)
Point(onOff)
Point(onOn)
link(onSwitch,11914673:doSplit,[(376,272)(376,260)(239,260)(239,272)])
link(onOff,6263210:doClose,[(387,279)(387,293)])
link(onOn,6263210:doOpen,[])
}
Add(COM,6263210,406,280)
{
link(onWrite,6263210:doRead,[(445,286)(445,326)(395,326)(395,314)])
link(onRead,2513173:doCompare,[])
link(Port,8658105:EditText,[])
link(BaudRate,7690426:EditText,[(419,268)(475,268)])
}
Add(EnumCOM,4937493,336,210)
{
OutType=0
link(onEnumPorts,8658105:doAdd,[])
}
Add(BlockFind,1696897,497,287)
{
IncludeBlock=1
StartBlock="T="
EndBlock="C"
link(onSearch,9240330:doData,[])
}
Add(BitBtn,12852987,287,266)
{
Left=70
Top=66
Width=125
Color=0
Font=[MS Sans Serif,8,1,16777215,1]
Caption="Пуск"
Point(doColor)
link(onClick,7986566:doSwitch,[])
}
Add(StrPart,11914673,245,266)
{
Char=","
Point(Left)
link(onSplit,12852987:doCaption,[])
link(onPart,12852987:doColor,[])
}
Add(ChangeMon,9240330,539,287)
{
link(onData,3396857:doString,[])
}
Add(DSC_Exec,6082265,623,287)
{
DSManager="rt"
link(onExec,6263210:doRXClear,[(665,293)(665,332)(386,332)(386,300)])
link(onError,15663453:doCaption,[(674,300)(674,158)(222,158)(222,188)])
}
Add(FormatStr,3396857,581,287)
{
DataCount=1
Mask="INSERT INTO data values(julianday('now', 'localtime'),%1);"
link(onFString,6082265:doExec,[])
}

Данные записываются только если они изменились.

Редактировалось 3 раз(а), последний 2018-12-11 00:09:14
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 85
Рейтинг: 0
#23: 2018-12-11 07:14:10 ЛС | профиль | цитата
Tad, Вот опять меня в SQLite затянули . Я один проект сделал с использованием БД. Но для меня это было настоящим потрясением моей головы
Кстати,Tad, сом-порт в вашей конфигурации не работает, мне пришлось добавить Timer и DoDate. Не могу сделать запрос в SQLite на извлечение из базы данных для точек. Выдает синтаксическую ошибку. Ругается на характеристику REAL. Просьба указать на ошибку....

Add(MainForm,15663453,238,91)
{
Width=1224
Height=732
Color=15780518
Caption="Температура в помещении"
BorderStyle=1
ClientSize=0
Position=1
Point(onClose)
Point(Close)
link(onCreate,7098561:doEvent1,[])
link(Close,11914673:Left,[(244,79)(222,79)(222,221)(244,221)])
}
Add(Hub,7098561,287,105)
{
OutCount=4
link(onEvent1,7935657:doOpen,[])
link(onEvent2,4937493:doEnumPorts,[(315,118)(315,125)])
link(onEvent3,4404277:doTimer,[(313,125)(313,202)(233,202)(233,237)])
}
Add(DS_SQLite,7935657,532,105)
{
Name="rt"
FileName="C:\\Room_temperature.db"
link(onOpen,1699441:doExec,[])
}
Add(DSC_Exec,1699441,574,105)
{
SQL="CREATE Table1 IF NOT EXISTS data(\r\n data REAL,\r\n t REAL);\r\n \r\n\r\n "
DSManager="rt"
}
Add(Label,7480715,490,119)
{
Left=60
Top=14
Width=83
Height=42
Color=15780518
Font=[MS Sans Serif,8,1,16711680,1]
WinStyle=4
Caption="COM-порт №°\r\n\r\nСкорость"
AutoSize=1
}
Add(If_else,2513173,448,196)
{
Type=5
Op2=String()
link(onTrue,1696897:doSearch,[])
}
Add(ComboBox,7690426,448,119)
{
Left=125
Top=39
Width=75
Height=21
Color=15780518
Font=[MS Sans Serif,8,1,0,1]
WinStyle=4
Strings=#3:300|3:600|4:1200|4:2400|4:4800|4:9600|5:14400|5:19200|5:28800|5:38400|5:57600|6:115200|
Text="19200"
Point(EditText)
}
Add(ComboBox,8658105,385,119)
{
Left=150
Top=13
Width=50
Height=21
Color=15780518
Font=[MS Sans Serif,8,1,0,1]
WinStyle=4
Text=""
DataType=1
ReadOnly=0
DropDownCount=15
Point(EditText)
}
Add(Switch,7986566,329,175)
{
DataOn=String(255,СТОП)
DataOff=String(0,ПУСК)
Point(State)
Point(onOff)
Point(onOn)
link(onSwitch,11914673:doSplit,[(369,181)(369,169)(232,169)(232,181)])
link(onOff,6263210:doClose,[(380,188)(380,202)])
link(onOn,6263210:doOpen,[])
}
Add(COM,6263210,399,189)
{
BaudRate=15
link(onRead,2513173:doCompare,[])
link(Port,8658105:EditText,[])
link(BaudRate,7690426:EditText,[(412,177)(468,177)])
}
Add(EnumCOM,4937493,329,119)
{
OutType=0
link(onEnumPorts,8658105:doAdd,[])
}
Add(BlockFind,1696897,490,196)
{
IncludeBlock=1
StartBlock="T="
EndBlock="C"
link(onSearch,9240330:doData,[])
link(onEndSearch,15847114:doQuery,[(534,209)(534,328)])
}
Add(BitBtn,12852987,280,175)
{
Left=70
Top=66
Width=125
Color=0
Font=[MS Sans Serif,8,1,16777215,1]
Caption="Пуск"
Point(doColor)
link(onClick,7986566:doSwitch,[])
}
Add(StrPart,11914673,238,175)
{
Char=","
Point(Left)
link(onSplit,12852987:doCaption,[])
link(onPart,12852987:doColor,[])
}
Add(ChangeMon,9240330,539,196)
{
link(onData,11937578:doEvent1,[(579,202)(579,195)])
}
Add(DSC_Exec,6082265,665,189)
{
DSManager="rt"
link(onExec,6263210:doRXClear,[(709,195)(709,290)(373,290)(373,209)])
link(onError,15663453:doCaption,[(709,202)(709,150)(226,150)(226,97)])
}
Add(FormatStr,3396857,623,189)
{
Mask="INSERT INTO data values (julianday('now', 'localtime'), %1);"
link(onFString,6082265:doExec,[])
}
Add(PlotPoints,15672558,1092,455)
{
Grapher="Gamma"
Shape=2
}
Add(Plotter,12597280,1092,378)
{
Left=10
Top=100
Width=1200
Height=600
Name="Gamma"
GridX=24
GridY=25
MinH=-10
MaxH=40
MaxW=24
}
Add(PlotAxis,16137541,777,35)
{
Grapher="Gamma"
Name="ноль"
Color=16711680
}
Add(PlotAxis,4916857,833,35)
{
Grapher="Gamma"
Name="19"
Color=32768
Style=1
Y=19
}
Add(PlotAxis,5954945,889,35)
{
Grapher="Gamma"
Name="24"
Color=128
Style=1
Y=24
}
Add(Label,7506625,973,42)
{
Left=55
Top=280
Width=165
Caption="Верхняя температурная норма"
}
Add(Label,5273543,973,84)
{
Left=55
Top=355
Width=160
Caption="Нижняя температурная норма"
}
Add(Hub,11937578,588,189)
{
link(onEvent1,3396857:doString,[])
link(onEvent2,12848750:doAdd,[(614,202)(614,279)(513,279)(513,356)])
}
Add(Memo,12848750,525,350)
{
Left=550
Top=10
Width=215
AddType=1
ScrollBars=2
}
Add(Timer,4404277,245,231)
{
Interval=200
link(onTimer,13091773:doData,[])
}
Add(DoData,13091773,301,231)
{
Data=Integer(128)
link(onEventData,6263210:doRead,[(366,237)(366,223)])
}
Add(DSC_Query,15847114,665,322)
{
SQL="SELECT * FROM Table1 WHERE "data REAL" ='%1', "t REAL" ='%2';"
DSManager="rt"
link(onError,2027084:doAdd,[])
}
Add(Button,4246772,399,364)
{
Left=785
Top=30
}
Add(Memo,2027084,714,336)
{
Left=860
Top=5
Width=290
AddType=1
ScrollBars=2
}


--- Добавлено в 2018-12-11 07:52:57

запрос надо было делать не из TABLE а из data. Теперь нет ошибки но все равно нифига по запросу не выдает.

Редактировалось 1 раз(а), последний 2018-12-11 07:52:57
карма: 0

0
Ответов: 85
Рейтинг: 0
#24: 2018-12-11 10:02:53 ЛС | профиль | цитата
Tad, Julianday - с какой целью применено???

--- Добавлено в 2018-12-11 10:25:06

последний вопрос снимаю. ошибка.

Редактировалось 1 раз(а), последний 2018-12-11 10:25:06
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#25: 2018-12-11 11:06:15 ЛС | профиль | цитата
Простая читалка

Add(MainForm,15663453,77,182)
{
Width=685
Height=523
Color=15780518
Caption="Температура в помещении"
BorderStyle=1
Position=1
Point(onClose)
Point(Close)
link(onCreate,7935657:doOpen,[])
}
Add(Plotter,6761042,266,238)
{
Left=5
Top=5
Width=670
Height=485
Color=16777215
Enabled=1
Name="tp"
GridX=24
GridY=25
MinH=-10
MaxH=40
MaxW=24
}
Add(Label,7506625,56,238)
{
Left=50
Top=150
Width=165
Color=12639424
Transparent=0
Caption="Верхняя температурная норма"
}
Add(Label,5273543,98,238)
{
Left=50
Top=215
Width=160
Color=12639424
Transparent=0
Caption="Нижняя температурная норма"
}
Add(PlotAxis,16137541,224,238)
{
Grapher="tp"
Name="ноль"
Color=0
Size=2
}
Add(PlotAxis,4916857,182,238)
{
Grapher="tp"
Name="19"
Color=65280
Style=1
Y=19
}
Add(PlotAxis,5954945,140,238)
{
Grapher="tp"
Name="24"
Color=8421631
Style=1
Y=24
}
Add(DS_SQLite,7935657,140,196)
{
Name="chrt"
FileName="C:\\Room_temperature.db"
link(onOpen,14820311:doEvent1,[])
}
Add(PlotLines,14221590,336,245)
{
Grapher="tp"
Size=2
link(ValueY,12918382:Value1,[])
link(ValueX,12918382:Value2,[])
}
Add(DSC_Query,2261516,266,203)
{
SQL="select t,strftime('%H',data)+cast(strftime('%M',data) as Real)/60 AS tm from data ORDER BY tm;"
DSManager="chrt"
link(onQuery,12918382:doValue,[])
link(onColumns,14221590:doClear,[(313,216)(313,258)])
}
Add(MT_MultiMem,12918382,336,203)
{
link(onData,14221590:doAdd,[(380,209)(380,284)(324,284)(324,251)])
}
Add(Label,6604675,266,161)
{
Left=170
Top=5
Width=197
Height=21
Color=15780518
Font=[Courier New,10,5,255,204]
Transparent=0
Caption="Температура в помещении "
}
Add(DSC_Query,2330491,217,161)
{
SQL="select "Температура в помещении за "||date(data) from data;"
DSManager="chrt"
link(onQuery,6604675:doText,[])
}
Add(Hub,14820311,182,196)
{
link(onEvent1,2330491:doQuery,[(206,202)(206,167)])
link(onEvent2,2261516:doQuery,[])
}

Схему пишущую данные температуры в БД запусти,сверни в трей и забудь про неё. Пусть пишет.
Нужно посмотреть - запускаешь эту.
Нужно посмотреть - запускаешь эту.

Редактировалось 3 раз(а), последний 2018-12-11 12:28:02
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 85
Рейтинг: 0
#26: 2018-12-12 07:17:45 ЛС | профиль | цитата
Tad, интересно девки пляшут. думал это неправильно, разбивка на 2 программы. На самом деле оказалось удобно. Только не понятно, отчеты какие делать раз в минуту или раз в 15 минут??? Сделал раз в 15 минут. Пока тестирую....
Запросы в БД для меня оказались сложны. Посоветуйте литературу. Читал Мартина Грубера. Там только основы.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#27: 2018-12-12 08:25:19 ЛС | профиль | цитата
RT9U писал(а):
раз в минуту или раз в 15 минут?
Совершенно по-барабану.Я бы поставил 1 сек. В БД записывается только момент изменения температуры.
Если в течении суток темп. была 21.5°С то в БД должны быть только две записи за 00:00:00 (сумма=0 или в SQLite=0.5) и 23:59:59 (сумма=141 или в SQLite=0.49998843).
Эти записи нужно делать обязательно !
RT9U писал(а):
Julianday - с какой целью применено?
Вот и я думаю - нахрена?
Видно сработала старая привычка - экономить память и дисковое пространство.
(Дата, записанная как текст ХХХХ-ХХ-ХХ ЧЧ:ММ:СС занимает в ~2.5 раза больше места )

Неплохой сайт на все случаи жизни https://www.techonthenet.com/sqlite/index.php

Редактировалось 2 раз(а), последний 2018-12-12 08:31:49
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 85
Рейтинг: 0
#28: 2018-12-12 10:23:14 ЛС | профиль | цитата
Если кому нужны готовые ПО для ардуино в личку обращайтесь, конечно кто сам не может написать или не хочет
Tad, у меня по оси Y, часы правильно отображаются, а вот дробная часть и 03 и 68 и 77, т.е. минутами там и не пахнет... Это как я понял, что не с начала суток начаты измерения.. Я правильно понял???
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#29: 2018-12-12 11:11:40 ЛС | профиль | цитата
Tad писал(а):
в БД должны быть только две записи за 00:00:00 (сумма=0 или в SQLite=0.5) и 23:59:59 (сумма=141 или в SQLite=0.49998843).
Эти записи нужно делать обязательно !
RT9U писал(а):
у меня по оси Y, часы правильно отображаются
По оси Y отображается температура.
RT9U писал(а):
Это как я понял, что не с начала суток начаты измерения.. Я правильно понял???
Правильно.
запись с временем 00:00:00 (сумма=0 или в SQLite=0.5)
должна быть обязательно


ПОСЛЕ УСОВЕРШЕНСТВОВАНИЯ САЙТА
НЕ РАБОТАЮТ "Размер текста", "Цвет текста" и "Смайлики"
ЭТО ТОЛЬКО У МЕНЯ ?


Редактировалось 1 раз(а), последний 2018-12-12 11:23:43
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26061
Рейтинг: 2120
#30: 2018-12-12 12:06:51 ЛС | профиль | цитата
Tad писал(а):
НЕ РАБОТАЮТ "Размер текста", "Цвет текста" и "Смайлики"

Интересно, сейчас проверим

размер -- Привет!
цвет -- Привет!
смайлики --
общая кртина -- Привет!

--- Добавлено в 2018-12-12 12:07:18

Вроде работает все (если что, то у меня Chrome)

Редактировалось 2 раз(а), последний 2018-12-12 12:08:26
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)