Собственик SS7 Публикувано 1 Януари, 2013 Собственик Доклад Сподели Публикувано 1 Януари, 2013 Отварям темата, за не погубя идеите и написания сорс. Всичко започна с това - http://www.olimex.co...-OLinuXino-WIFI . Готина играчка с Android и линукс (по избор) Дълго мислих какви термодатчици (и не само - т.е. избирах протокол по който да си говорят много неща разхвърляни по къщата) . Спрях се на 1-wire . http://store.comet.b...e/Product/3840/ - 1-wire usb interface http://store.comet.b.../Product/28993/ - 1-wire датчици http://store.comet.b...duct/9220/ - 1-wire 2xswitch http://store.comet.b...Product/4334/ - solid state relay http://owfs.org/ - 1-wire filesystem След малко игра с поялника (особено с DS2413) се получи това : 1- wire FS : root@debian:~/termocon# ls /1-wire 10.45C48F020800 10.6CDE8F020800 3A.EA390D000000 alarm settings statistics system 10.66D18F020800 10.BEDA8F020800 81.C4E931000000 bus.0 simultaneous structure uncached root@debian:~/termocon# root@debian:~/termocon# root@debian:~/termocon# [/CODE] crontab : [CODE] */5 * * * * /usr/lib/cgi-bin/log_temp3 > /var/www/temp.html log_temp3 : #!/usr/bin/perl -w use RRDp; $rrd= "/usr/lib/cgi-bin/digitemp.rrd"; # Diagnostic output $koridor= &getvar("/1-wire/10.6CDE8F020800/temperature"); $bedroom= &getvar("/1-wire/10.66D18F020800/temperature"); $bedroom2= &getvar("/1-wire/10.BEDA8F020800/temperature"); $outdoor= &getvar("/1-wire/10.45C48F020800/temperature"); print "Koridor : ",$koridor,"\n"; print "Bedroom : ",$bedroom,"\n"; print "Bedroom2 : ",$bedroom2,"\n"; print "Outdoor : ", $outdoor,"\n"; #echo "Content-type: text/html" #echo "<br><br>" #echo '<html><body>' #echo 'koridor : ' $koridor #echo '<br>' #echo 'bedroom : ' $bedroom #echo '<br>' #echo 'bedroom2 : ' $bedroom2 #echo '<br>' #echo 'outdoor : ' $outdoor #echo '</body></html>' # Update the database RRDp::start "/usr/bin/rrdtool"; RRDp::cmd "update $rrd N:$koridor:$bedroom:$bedroom2:$outdoor"; #$answer=RRDp::read; RRDp::end; # create pnp $starttime = "-1d"; $endtime = time; $width = "600"; $height = "200"; # $label=""; RRDp::start "/usr/bin/rrdtool"; RRDp::cmd "graphv /var/www/temp.png --imgformat PNG", "--start '$starttime' --end '$endtime'", "--width $width --height $height", "DEF:kor_c=$rrd:koridor:AVERAGE", "DEF:bed_c=$rrd:bedroom:AVERAGE", "DEF:bed2_c=$rrd:bedroom2:AVERAGE", "DEF:outdoor_c=$rrd:outdoor:AVERAGE", "LINE1:kor_c#00FF00:'Koridor\\t'", "GPRINT:kor_c:LAST:'Last %5.1lf'", "GPRINT:kor_c:MIN:'Min %5.1lf'", "GPRINT:kor_c:MAX:'Max %5.1lf\\n'", "LINE1:bed_c#FF0000:'Bedroom\\t'", "GPRINT:bed_c:LAST:'Last %5.1lf'", "GPRINT:bed_c:MIN:'Min %5.1lf'", "GPRINT:bed_c:MAX:'Max %5.1lf%s\\n'", "LINE1:bed2_c#0000FF:'Bedroom2\\t'", "GPRINT:bed2_c:LAST:'Last %5.1lf'", "GPRINT:bed2_c:MIN:'Min %5.1lf'", "GPRINT:bed2_c:MAX:'Max %5.1lf\\n'", "LINE1:outdoor_c#005555:'Outdoor\\t'", "GPRINT:outdoor_c:LAST:'Last %5.1lf'", "GPRINT:outdoor_c:MIN:'Min %5.1lf'", "GPRINT:outdoor_c:MAX:'Max %5.1lf\\n'" ; $answer=RRDp::read; print $answer; $starttime = "-1w"; RRDp::cmd "graphv /var/www/temp_w.png --imgformat PNG", "--start '$starttime' --end '$endtime'", "--width $width --height $height", "DEF:kor_c=$rrd:koridor:AVERAGE", "DEF:attic_c=$rrd:bedroom:AVERAGE", "DEF:desk_c=$rrd:bedroom2:AVERAGE", "DEF:outdoor_c=$rrd:outdoor:AVERAGE", "LINE1:kor_c#00FF00:'Koridor\\t'", "GPRINT:kor_c:LAST:'Last %5.1lf'", "GPRINT:kor_c:MIN:'Min %5.1lf'", "GPRINT:kor_c:MAX:'Max %5.1lf\\n'", "LINE1:attic_c#FF0000:'Bedroom\\t'", "GPRINT:attic_c:LAST:'Last %5.1lf'", "GPRINT:attic_c:MIN:'Min %5.1lf'", "GPRINT:attic_c:MAX:'Max %5.1lf%s\\n'", "LINE1:desk_c#0000FF:'Bedroom2\\t'", "GPRINT:desk_c:LAST:'Last %5.1lf'", "GPRINT:desk_c:MIN:'Min %5.1lf'", "GPRINT:desk_c:MAX:'Max %5.1lf\\n'", "LINE1:outdoor_c#005555:'Outdoor\\t'", "GPRINT:outdoor_c:LAST:'Last %5.1lf'", "GPRINT:outdoor_c:MIN:'Min %5.1lf'", "GPRINT:outdoor_c:MAX:'Max %5.1lf\\n'" ; $answer=RRDp::read; print $answer; $starttime = "-1m"; RRDp::cmd "graphv /var/www/temp_m.png --imgformat PNG", "--start '$starttime' --end '$endtime'", "--width $width --height $height", "DEF:kor_c=$rrd:koridor:AVERAGE", "DEF:attic_c=$rrd:bedroom:AVERAGE", "DEF:desk_c=$rrd:bedroom2:AVERAGE", "DEF:outdoor_c=$rrd:outdoor:AVERAGE", "LINE1:kor_c#00FF00:'Koridor\\t'", "GPRINT:kor_c:LAST:'Last %5.1lf'", "GPRINT:kor_c:MIN:'Min %5.1lf'", "GPRINT:kor_c:MAX:'Max %5.1lf\\n'", "LINE1:attic_c#FF0000:'Bedroom\\t'", "GPRINT:attic_c:LAST:'Last %5.1lf'", "GPRINT:attic_c:MIN:'Min %5.1lf'", "GPRINT:attic_c:MAX:'Max %5.1lf%s\\n'", "LINE1:desk_c#0000FF:'Bedroom2\\t'", "GPRINT:desk_c:LAST:'Last %5.1lf'", "GPRINT:desk_c:MIN:'Min %5.1lf'", "GPRINT:desk_c:MAX:'Max %5.1lf\\n'", "LINE1:outdoor_c#005555:'Outdoor\\t'", "GPRINT:outdoor_c:LAST:'Last %5.1lf'", "GPRINT:outdoor_c:MIN:'Min %5.1lf'", "GPRINT:outdoor_c:MAX:'Max %5.1lf\\n'" ; RRDp::end; #/usr/bin/rrdtool update /usr/lib/cgi-bin/digitemp.rrd N:$koridor:$bedroom:$bedroom2:$outdoor #/usr/lib/cgi-bin/temp-all.cgi2 > /dev/null sub getvar { open(FILE, $_[0]); $filevalue = <FILE>; close(FILE); $filevalue = $filevalue + 0; } [/code] резултат : Тъй като ще управлявам електрически и водни подови отопления (които са безумно интертни) , единствения разумен начин е с PID контолер. Днес драснах набързо PWM регулаторите : [CODE] #include <stdio.h> void pwm (int,int,int,int ); main () { while (1) { pwm (50, 80, 20, 0); } } void pwm (int pw1, int pw2,int pw3,int pw4) { int out1=0; int out2=0; int out3=0; int out4=0; int i = 100 ; FILE *fp; // set all outputs to 0; fp=fopen("/1-wire/3A.EA390D000000/PIO.ALL", "w"); fprintf (fp,"%i,%i",out1,out2); fclose(fp); while (i) { if ( i == pw1) { // set output_1 to 1 out1 =1; fp=fopen("/1-wire/3A.EA390D000000/PIO.A", "w"); fprintf (fp,"%i",out1); fclose(fp); } if ( i == pw2) { out2 =1; fp=fopen("/1-wire/3A.EA390D000000/PIO.B", "w"); fprintf (fp,"%i",out2); fclose(fp); } if ( i == pw3) { out3 =1; } if ( i == pw4) { out4 =1; } printf ("cycle: %i out1: %i out2: %i out3: %i out4: %i\n", i,out1 , out2, out3, out4 ); i--; //wait time sleep (1); } } Адрес на коментара Сподели в други сайтове More sharing options...
Momo Отговорено 1 Януари, 2013 Доклад Сподели Отговорено 1 Януари, 2013 Браво, идеална играчка и аз си мисля за същото ще може ли да пуснеш повече ИНФО или, директно да го направиш за пари 1 Адрес на коментара Сподели в други сайтове More sharing options...
Собственик SS7 Отговорено 1 Януари, 2013 Автор Собственик Доклад Сподели Отговорено 1 Януари, 2013 Ще пиша тук , едва в началото съм. Следва кода на PID контролера (най-елементарния за начало) Навремето работех във фирма, която искаше да се занимава с подобни работи , ама тя фалира поради липса на достатъчно пазар. Удоволствието е скъпичко за съжаление , па ако се сметнат и разходите за висококвалициран труд - става безумно скъпо. Адрес на коментара Сподели в други сайтове More sharing options...
Momo Отговорено 1 Януари, 2013 Доклад Сподели Отговорено 1 Януари, 2013 Ще пиша тук , едва в началото съм. Следва кода на PID контролера (най-елементарния за начало) Навремето работех във фирма, която искаше да се занимава с подобни работи , ама тя фалира поради липса на достатъчно пазар. Удоволствието е скъпичко за съжаление , па ако се сметнат и разходите за висококвалициран труд - става безумно скъпо. Аз ще си го напиша, и отново браво за темата Адрес на коментара Сподели в други сайтове More sharing options...
Собственик SS7 Отговорено 1 Януари, 2013 Автор Собственик Доклад Сподели Отговорено 1 Януари, 2013 Набързо парче код за четене на температурите : struct _pid { float pv; /* process value*/ float sp; /*set point*/ float integral; float pgain; float igain; float dgain; int deadband; int last_error; int output; }; void read_temps( _pid,_pid,_pid,_pid ); void read_temps( struct _pid *a,struct _pid *b,struct _pid *c,struct _pid *d ) { FILE *fp ; int err; fp=fopen("/1-wire/10.66D18F020800/temperature", "r"); ///et2. big one err=fscanf(fp,"%f", &(a->pv) ); //printf ("error: %i , temp_inside: %2.2f\n",err,a->pv); fclose(fp); fp=fopen("/1-wire/10.BEDA8F020800/temperature", "r"); ///et2. big one err=fscanf(fp,"%f", &(b->pv) ); //printf ("error: %i , temp_inside: %2.2f\n",err,b->pv); fclose(fp); } [/CODE] Основния цикъл ще се върти в main () : [CODE] main () { struct _pid room1 , room2 , room3, room4; while (1) { // read set points // read temps read_temps( &room1, &room2, &room3, &room4 ); printf("temp1: %f temp2: %f\n",room1.pv,room2.pv); // calc PID outputs // send to PWM pwm (room1.output, room2.output, 20, 0); } } Адрес на коментара Сподели в други сайтове More sharing options...
koko Отговорено 1 Януари, 2013 Доклад Сподели Отговорено 1 Януари, 2013 и аз напоследък през свободното време автоматизирам разни работи из дома но съм се спрял на ардуино с атмега 328. но и това за тези пари е с пъти повече възможности Адрес на коментара Сподели в други сайтове More sharing options...
mishoboss Отговорено 25 Март, 2013 Доклад Сподели Отговорено 25 Март, 2013 Готина тема. На SS7 съм му следил блога още преди години Аз също се занимавам с домашна автоматизация, засега само като хоби. Бих искал да вметна някои неща, а и да насоча интересуващите се към малко полезно инфо по въпроса. OLinuXino е много готино компютърче, но няма Ethernet, а и лично на мен ми идва малко скъпо вече, при наличието на Raspberry Pi, CubieBoard или пък този 4 ядрен змей - ODROID-U. Освен това, има много готини опън сорс Home Automation софтуери, които абстрактват protocol-related неща от сорта на owfs за 1-wire пирмерно. Аз съм contributor в един такъв софтуер, наречен openHAB. Но има и много други - OpenRemote, Domotiga, smarthome.py, Domogik, ветерана MisterHouse и много други. Успех с начинанието! Адрес на коментара Сподели в други сайтове More sharing options...
Diogen Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 Здравейте, да придвижим темата малко по напред в настоящето. :) Предполагам вече има доста колеги, които има какво да споделят. Търся идеи и "know-how" за датчици свързани с кабели.Идеята за всичко по безжичен път не ми харесва, а на пазара общо взето безжичните решения доминират. Коя платформа би била най универсална и в същото време лесна за конфигурация и работа. Поздрави Адрес на коментара Сподели в други сайтове More sharing options...
h3ll Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 На Неомонтана. Адрес на коментара Сподели в други сайтове More sharing options...
master Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 Готова платформа или ще си правиш сам платка и т.н. ? Analog Audio™ Адрес на коментара Сподели в други сайтове More sharing options...
Ivo Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 Цитат Търся идеи и "know-how" за датчици свързани с кабели.Идеята за всичко по безжичен път не ми харесва, а на пазара общо взето безжичните решения доминират. Коя платформа би била най универсална и в същото време лесна за конфигурация и работа. Работещо DIY решение е: 1. RPi 3 - централен хъб с Hasbian и фронтенд Home Assistant, Domoticz или подобни 2. ESP8266 или ESP32 за отдалечените датчици и управления 3. Датчици дал господ. Ако държиш всичко да е окабелено, можеш да минеш и само с RPi. Има достатъчно входове и изходи да вържеш каквото се сетиш. Ако пък си минималист, може да минеш и само с едно Arduino и Ethernet Shield или едно ESP8266. ESP-то има 11 използваеми пина на които може да закачиш нещо. Да не споменаваме че има и OneWire датчици в изобилие. За визуализация и анализ може да ползваш пакети инсталирани на RPi-то ( Grafana, EmonCMS ) или външни такива ( thingspeak.com ). Адрес на коментара Сподели в други сайтове More sharing options...
master Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 Onewire датчици освен температурни? Analog Audio™ Адрес на коментара Сподели в други сайтове More sharing options...
Ivo Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 преди 24 минути, master написа: Onewire датчици освен температурни? https://www.maximintegrated.com/en/products/digital/one-wire.html Адрес на коментара Сподели в други сайтове More sharing options...
master Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 Да, това го знам но за жалост избора е много малък да не казвам, че няма. Analog Audio™ Адрес на коментара Сподели в други сайтове More sharing options...
Ivo Отговорено 18 Декември, 2018 Доклад Сподели Отговорено 18 Декември, 2018 преди 32 минути, master написа: Да, това го знам но за жалост избора е много малък да не казвам, че няма. Погледни пак в линка. Има PRODUCT TREE. Евтини са обаче основно температурните. Щото китайците масово ги произвеждат. Дори и само те да са пак е предимство на OneWire да си закачиш осем температурни сензора на един пин. В домашната автоматизация температурата е най-често следеният параметър. Адрес на коментара Сподели в други сайтове More sharing options...
Recommended Posts
Създайте нов акаунт или се впишете, за да коментирате
За да коментирате, трябва да имате регистрация
Създайте акаунт
Присъединете се към нашата общност. Регистрацията става бързо!
Регистрация на нов акаунтВход
Имате акаунт? Впишете се оттук.
Вписване