{"id":876,"date":"2016-05-29T12:11:58","date_gmt":"2016-05-29T10:11:58","guid":{"rendered":"http:\/\/www.degerdalen.no\/?p=876"},"modified":"2016-05-29T12:11:58","modified_gmt":"2016-05-29T10:11:58","slug":"hjemmelaget-temperaturkontroll-for-gjaeringsskap","status":"publish","type":"post","link":"https:\/\/www.degerdalen.no\/?p=876","title":{"rendered":"Hjemmelaget temperaturkontroll for gj\u00e6ringsskap"},"content":{"rendered":"<p>S\u00e5 &#8211; som nevt i et <a href=\"https:\/\/www.degerdalen.no\/?p=856\">tidligere innlegg<\/a>\u00a0har jeg bygget en provisorisk temperaturkontroll for gj\u00e6ringsskapet mitt.<\/p>\n<p>Den gj\u00f8r vel omtrent havlparten av jobben som en <a href=\"http:\/\/www.ebay.com\/bhp\/stc-1000\">STC-1000<\/a> gj\u00f8r, og koster mer \u00e5 bygge pluss at man m\u00e5 ha en apache\/mysql-server st\u00e5ende, men det har vi vel alle?<\/p>\n<p>Riggen bet\u00e5r av<\/p>\n<p>1 stk\u00a0<a href=\"https:\/\/www.kjell.com\/no\/produkter\/elektro-og-verktoy\/elektronikk\/arduino\/utviklingskort\/nodemcu-med-wifi-utviklingskort-p87949\">NodeMCU<\/a>\u00a0fra Kjell &amp; Co<br \/>\n1 stk\u00a0<a href=\"http:\/\/www.ebay.com\/sch\/i.html?_nkw=DS18B20&amp;ssPageName=GSTL\">ds18b20<\/a> 1-wire temperatursensor<br \/>\n1 stk relekort 10A250V, for eksempel <a href=\"https:\/\/www.kjell.com\/no\/produkter\/elektro-og-verktoy\/elektronikk\/arduino\/moduler\/relemodul-for-arduino-1x-p87878\">dette<\/a>\u00a0&#8211; selv gikk jeg for 2 releer, da det s\u00f8rget for to-fase brudd i\u00a0varmekildens str\u00f8mtilf\u00f8rstel.<\/p>\n<p>NodeMCU m\u00e5 settes opp mot nettverk, dette kan gj\u00f8res p\u00e5 flere m\u00e5ter, men jeg valgte \u00e5 sette den opp som en klient med statisk ip, uten DNS.<\/p>\n<p>Filnavn: networking.lua<\/p>\n<pre>--connect network\r\nwifi.setmode(wifi.STATION)\r\nwifi.sta.config(\"din ssid\",\"ditt wpa2 passord\")\r\nwifi.sta.setip({ip=\"ip-adresse\",netmask=\"subnet-maske\",gateway=\"gateway-adresse\"})<\/pre>\n<p>I tillegg fant jeg et bibliotekskrevet av Peter Scargill som h\u00e5ndterte ett stk ds18b20-sensor uten noe hassle<\/p>\n<p>Filnavn: ds18b20.lua<\/p>\n<pre>--------------------------------------------------------------------------------\r\n-- DS18B20 one wire module for NODEMCU\r\n-- LICENCE: http:\/\/opensource.org\/licenses\/MIT\r\n-- Vowstar &lt;vowstar@nodemcu.com&gt;\r\n-- Dramatic simplification: Peter Scargill\r\n--------------------------------------------------------------------------------\r\n\r\n-- Set module name as parameter of require\r\nlocal modname = ...\r\nlocal M = {}\r\n_G[modname] = M\r\n--------------------------------------------------------------------------------\r\n-- Local used modules\r\n--------------------------------------------------------------------------------\r\n-- Table module\r\nlocal table = table\r\n-- String module\r\nlocal string = string\r\n-- One wire module\r\nlocal ow = ow\r\n-- Timer module\r\nlocal tmr = tmr\r\n-- Limited to local environment\r\nsetfenv(1,M)\r\n--------------------------------------------------------------------------------\r\n-- Implementation \u2013 you don\u2019t get any shorter than this\r\n--------------------------------------------------------------------------------\r\n\r\nfunction readNumber(pin)\r\now.setup(pin)\r\now.reset(pin)\r\now.write(pin, 0xCC, 1)\r\now.write(pin, 0xBE, 1)\r\ndata = nil\r\ndata = \"\"\r\nfor i = 1, 2 do\r\ndata = data .. string.char(ow.read(pin))\r\nend\r\nt = (data:byte(1) + data:byte(2) * 256) \/ 16\r\nif (t&gt;100) then\r\nt=t-4096\r\nend\r\now.reset(pin)\r\now.write(pin,0xcc,1)\r\now.write(pin, 0x44,1)\r\nreturn t\r\nend\r\n\r\n-- Return module table\r\nreturn M<\/pre>\n<p>Serverside laget jeg en php som returnerte &lt;maxtemp&gt; og &lt;mintemp&gt; i en s\u00e6rs forenklet xml &#8211; jeg kalte den for reg.php<\/p>\n<p>reg.php har ogs\u00e5 fuksjonaliteten som poster currentTemp til mySQL-basen beer og tabellen dataLogger<\/p>\n<p>filnavn reg.php<\/p>\n<pre>&lt;?php\r\n\r\n$scurrTemp = $_GET['currTemp'];\r\n$srelayState = $_GET['relayState'];\r\n$sqlServer = \"localhost\";\r\n$sqlUser = \"username\"; \/\/byttes ut med din mysql bruker\r\n$sqlDB = \"beer\";\r\n\r\n\/\/koble til databaseserver\r\n$dbhandle = mysql_connect($sqlServer, $sqlUser,\"mypassword\")\r\n or die(\"Klarte ikke koble til $sqlServer\");\r\n\r\n\/\/ Koble til riktig database\r\n$selected = mysql_select_db($sqlDB, $dbhandle)\r\n or die(\"Klarte ikke \u00e5pne $sqlDB\");\r\n\r\n$sql = \"INSERT INTO datalogger (currTemp, relayState) VALUES(\".$scurrTemp.\",\".$srelayState.\")\";\r\n\r\nmysql_query($sql);\r\necho \"&lt;maxtemp&gt;28&lt;\/maxtemp&gt;\";\r\necho \"&lt;mintemp&gt;26&lt;\/mintemp&gt;\"\r\n\r\n?&gt;\r\n\r\n<\/pre>\n<p>datalogger-tabellen ser slik ut<\/p>\n<pre>mysql&gt; describe datalogger;\r\n+-------------+--------------+------+-----+-------------------+----------------+\r\n| Field       | Type         | Null | Key | Default           |          Extra |\r\n+-------------+--------------+------+-----+-------------------+----------------+\r\n| id          | int(11)      | NO   | PRI | NULL              | auto_increment |\r\n| currTemp    | decimal(7,4) | NO   |     | NULL              |                |\r\n| relayState  | int(1)       | NO   |     | NULL              |                |\r\n| tidsstempel | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |\r\n+-------------+--------------+------+-----+-------------------+----------------+<\/pre>\n<p>Ogs\u00e5 til slutt lua-koden for polling og posting av temperatur.<br \/>\nDet er nok sikkert veldig tydelig at lua ikke er et spr\u00e5k jeg p\u00e5st\u00e5r jeg behersker.<\/p>\n<p>Filnavn; beercontrol13.lua<\/p>\n<pre>--- Beercontroller by tdegerdalen\r\n--- version 0.13\r\n--- uses ds18b20.lua by Peter Scargill \r\n--- uses networking.lua to configure wifi and static ip\r\n---\r\n--- todo: relaybug at startup (see below)\r\n--- todo2: enable more sensors and average between them\r\n---\r\n---\r\n--- note; to avoid memory issues this script should be compiled before run\r\n\r\nmaxTemp = 20\r\nminTemp = 18\r\ncurrTemp = 0\r\nrelayState = 0\r\n\r\n--define pin for one 1-wire dallas tempsensor.\r\nsensorPin = 7\r\n\r\n--define pins to control relay, set them to output\r\n--relay module attached kicks in when pulled low\r\n--bug: relay kicks in a few millisecs at boot - might fix it witch capacitator\r\n\r\nrelay1pin = 3\r\nrelay2pin = 4\r\ngpio.mode(relay1pin,gpio.OUTPUT)\r\ngpio.mode(relay2pin,gpio.OUTPUT)\r\ngpio.write(relay1pin,gpio.HIGH)\r\ngpio.write(relay2pin,gpio.HIGH)\r\n\r\n\r\n--- triggers\r\n--- every 5 seconds, poll tempsensor\r\n--- every 30 seconds, post to net and get temperature thresholds\r\n\r\ntmr.alarm(1, 5000, 1, function() pollTemp() end )\r\ntmr.alarm(2, 30000, 1, function() postData() end )\r\n\r\n--- functions below\r\n\r\nfunction pollTemp()\r\n t=require(\"ds18b20\") \r\n currTemp = t.readNumber(sensorPin)\r\n print(currTemp) \r\n print(\"maxtemp\", maxTemp)\r\n if currTemp &gt; maxTemp and relayState == 1 then\r\n relayOff()\r\n end\r\n if currTemp &lt; minTemp and relayState == 0 and currTemp ~= -0.0625 then\r\n relayOn()\r\n end\r\n if currTemp == -0.0625 then\r\n relayOff()\r\n end\r\n t = nil \r\n ds18b20 = nil \r\n package.loaded[\"ds18b20\"]=nil\r\nend\r\n\r\nfunction postData()\r\n conn=net.createConnection(net.TCP, 0) \r\n conn:on(\"connection\",function(conn, payload)\r\n conn:send(\"GET \/beer\/reg.php?currTemp=\"..currTemp..\"&amp;relayState=\"..relayState..\" HTTP\/1.1\\r\\n\".. \r\n \"Host: 10.0.0.2\\r\\n\"..\r\n \"Accept: *\/*\\r\\n\"..\r\n \"User-Agent: Mozilla\/4.0 (compatible; esp8266 Lua;)\"..\r\n \"\\r\\n\\r\\n\") \r\n end)\r\n \r\n conn:on(\"receive\", function(conn, payload)\r\n tStreng,maxTempStart = string.find(payload,\"&lt;maxtemp&gt;\")\r\n maxTempEnd, tStreing = string.find(payload,\"&lt;\/maxtemp&gt;\")\r\n maxTempStart = maxTempStart + 1\r\n maxTempEnd = maxTempEnd - 1\r\n \r\n maxTempDeg = string.sub(payload, maxTempStart, maxTempEnd)\r\n\r\n tStreng,minTempStart = string.find(payload,\"&lt;mintemp&gt;\")\r\n minTempEnd, tStreing = string.find(payload,\"&lt;\/mintemp&gt;\")\r\n minTempStart = minTempStart + 1\r\n minTempEnd = minTempEnd -1\r\n minTempDeg = string.sub(payload, minTempStart, minTempEnd)\r\n\r\n print(minTempDeg, maxTempDeg)\r\n maxTemp = tonumber(maxTempDeg)\r\n minTemp = tonumber(minTempDeg)\r\n maxTempDeg = nil\r\n minTempDeg = nil\r\n conn:close()\r\n end)\r\n \r\n conn:connect(80,'10.0.0.2') \r\nend\r\n\r\nfunction relayOn()\r\n relayState = 1\r\n print(\"RelayOn\")\r\n gpio.write(relay1pin,gpio.LOW)\r\n gpio.write(relay2pin,gpio.LOW)\r\nend\r\n\r\nfunction relayOff()\r\n relayState=0\r\n print(\"RelayOff\")\r\n gpio.write(relay1pin,gpio.HIGH)\r\n gpio.write(relay2pin,gpio.HIGH)\r\nend<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>S\u00e5 &#8211; som nevt i et tidligere innlegg\u00a0har jeg bygget en provisorisk temperaturkontroll for gj\u00e6ringsskapet mitt. Den gj\u00f8r vel omtrent havlparten av jobben som en STC-1000 gj\u00f8r, og koster mer \u00e5 bygge pluss at man m\u00e5 ha en apache\/mysql-server st\u00e5ende, &hellip; <a href=\"https:\/\/www.degerdalen.no\/?p=876\">Les videre <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[162,11],"tags":[],"_links":{"self":[{"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=\/wp\/v2\/posts\/876"}],"collection":[{"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=876"}],"version-history":[{"count":1,"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=\/wp\/v2\/posts\/876\/revisions"}],"predecessor-version":[{"id":877,"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=\/wp\/v2\/posts\/876\/revisions\/877"}],"wp:attachment":[{"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.degerdalen.no\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}