NodeMcu és DS18b20 hőmérő szenzor Webesen

Nos, kedves olvasó. Mielőtt még azt gondolnád, hogy bármiféle programozói tudás nélkül az alább olvasott példát meg fogod tudni csinálni, azt kell mondjam hogy nem. Viszont ha már használtál php-t és van telepítve webszervered, akkor minden további nélkül remakelni tudod majd a példafeladatot.

Első lépésben javaslom, hogy ha a nodemcu-n nem egy fullos firmware van. Akkor csináljunk egyet az alábbi képre kattintva.

full_modulesMiután megkaptuk e-mailben az új firmware-t, az előző cikk alapján azt építsük bele a vasba.

Ha ezzel megvagyunk, akkor rakjuk össze a kapcsolást. Ez a DS szenzornál hatalmas bonyolultságot fog igényelni, mert összesen csak 3 lába van.

dsb180_bbEzután a következő fájlokat töltsük fel a nodemcu-ra. (ettől még nem lesz működőképes a dolog).

Első:  “init.lua”  <–Letöltés–>

 
 ip = wifi.sta.getip()
 wifi.setmode(wifi.STATION)
 wifi.sta.config("YOURSSID", "YOURPASSWORD")
 ip = wifi.sta.getip()
 print(ip)
 l= file.list()
  for k,v in pairs (l) do
   print ("name:"..k..",size:"..v)
  end
 tmr.alarm(1, 15*60*1000, 1, function()
                      print("Save temperature to DBase")
                      tmr.delay(100000)
                      dofile("http_get.lua")
                      end
         )

Ez a file lesz az inicializációs file. Minden restart után ez a file fut le. (Feltöltéskor ne parázzunk, ha hibával fordul le, mert ha a “http_get.lua” még nincs feltöltve.)

Második: “ds18b20_init.lua”  <–Letöltés–>

function temperature()
pin = 3
ow.setup(pin)
count = 0
repeat
  count = count + 1
  addr = ow.reset_search(pin)
  addr = ow.search(pin)
  tmr.wdclr()
until((addr ~= nil) or (count > 100))
if (addr == nil) then
  print("No more addresses.")
else
  -- print(addr:byte(1,8))
  crc = ow.crc8(string.sub(addr,1,7))
  if (crc == addr:byte(8)) then
    if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
     -- print("Device is a DS18S20 family device.")
      device = "ok"
      a = 0
        repeat
          ow.reset(pin)
          ow.select(pin, addr)
          ow.write(pin, 0x44, 1)
          tmr.delay(100000)
          present = ow.reset(pin)
          ow.select(pin, addr)
          ow.write(pin,0xBE,1)  
          data = nil
          data = string.char(ow.read(pin))
          for i = 1, 8 do
            data = data .. string.char(ow.read(pin))
          end
          crc = ow.crc8(string.sub(data,1,8))
          if (crc == data:byte(9)) then
             t = (data:byte(1) + data:byte(2) * 256)
             
             if (t > 0x7fff) then
                t = t - 0x10000
             end

             if (addr:byte(1) == 0x28) then
                t = t * 625  
             else
                t = t * 5000 
             end

             local sign = ""
             if (t < 0) then
                 sign = "-"
                 t = -1 * t
             end
             t1 = string.format("%d", t / 10000)
             t2 = string.format("%04u", t % 10000)
             temp = sign .. t1 .. "." .. t2
             -- print("Temperature= " .. temp .. " Celsius")
          end 
          a = a+1             
          tmr.wdclr()
        until (a == 3)
    else
      print("Device family is not recognized.")
      device = "Failure"
    end
  else
    print("CRC is not valid!")
  end
 end
 return temp, device
 end

Ez a file egy függvény, amiben két visszatérő értékünk van. A temp és device. Abban az esetben ha a device nem “OK” értékkel tér vissza, akkor történt valami a szenzorral. Ezt érdemes lekezelni abban a file-ban, amiben meghívjuk a függvényt. (Nálam le se fut a “http_get.lua” ha nem OK értékkel tér vissza a függvény)

Harmadik: “http_get.lua”  <–Letöltés–>

require("ds18b20_init")
temp,sensor = temperature()
if sensor == "ok" then  
  sk = net.createConnection(net.TCP, 0)
  sk:on("receive", function(sck, c) print(c) end )
  sk:on("connection", function(sck,c)
    sck:send("GET /temp.php?temp="..temp.." HTTP/1.1\r\nHost: 192.168.0.120\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")
  end)
  sk:connect(80,"192.168.0.120")
else 
 print ("The sensor is not available!!")
end

Itt láthatjuk, hogy a GET metódussal passzoltuk tovább a hőmérséklet értéket a “temp.php-nak”. A “Host: 192.168.0.120”-at ÉRTELEMSZERŰEN változtassuk meg a mi webszerverünk IP címére vagy hostnevére.
Ez magában a fejlesztőeszközben (ESPlorer) így néz ki:

ds_esplorer

Ha a fájlok feltöltésével végeztünk. Akkor még hiába várjuk a csodát. Az nem fog megtörténni. A következő pakkot töltsük fel az webszerverünk gyökerébe.

<– PAKK–>

A pakkban 3 fájlt találunk.

– temp_see.php

– temp.php

– ccsv.php

Ezek a fájlok között is körbetartozás van mint az építőiparban. A “temp.php” amit a NodeMcu meghív az semmi mást nem csinál csak elmenti a GET-elt értéket az adatbázisba. A “ccsv.php” tartalmaz egy függvényt ami létrehoz egy “temp.csv” nevű fáljt. A “temp_see.php” pedig meghívja a “ccsv.php” fájlban lévő “createcsv()” függvényt és utána a “google chart api”-val megrajzoltatja a függvény által létrehozott “temp.csv” fájl adatai alapján a grafikont.

Itt hívnám fel mindenki figyelmét arra, hogy mindenki értelemszerűen adja meg a szükséges adatbázisváltozókat.

    $host = "localhost";
    $username = "MYNAME";
    $password = "MYPASSWORD";
    $dbname = "MYADATABASENAME";

Ezután pedig a következő táblát hozzuk létre a kivákasztott adatbázisban. (A név mindegy, csak a lekérdezésekben írjuk át, ha nem az általam használt elnevezést akarjuk használni)

ds_tableSQL-ben ez így néz ki:

CREATE TABLE temp_log
(
ID int NOT NULL AUTO_INCREMENT,
date DATE,
time TIME,
temp FLOAT,
PRIMARY KEY (ID)
)

Nos, ha mindennel végeztünk, akkor indítsuk újra a NodeMcu-t hardware-esen, és várjuk a csodát. Mivel 15 perc-re van állítva a logolás intervalluma, így ajánlom hogy a teszteléshez vagy állítsuk kissebre ezt az értéket, vagy futtassuk le párszor és a “http_get.lua” fájlt, és nézzük meg kelezkezik-e adatbázisbejegyzés.  Amennyiben gyarapodik az adatbázis, akkor nyissuk meg a “temp_see.php”-t.

temp_seeVoila!! Láss csodát és logol a cucc. Remélem érthető volt a dolog. Sajnálom hogy nem a teljes célközönségnek szól a leírás, de abban az esetben ha valaki kezdőként nekifeszül, és elakad az írjon nekem Send me Email . Amint ráérek és persze tudok is segíteni, mindenképp válaszolok az e-mailekre.

(Statisztika: 88 megtekintés)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé.