Minggu, 20 November 2016

Tutorial NodeMCU + AppInventor: Mengendalikan LED-BUILTIN pada WeMos D1 mini dengan Android (ESP8266, WeMos, Lua)

Tulisan ini dibuat untuk bagaimana mengintegrasikan antara teknologi IOT dengan mobile sehingga dimungkinkan untuk mengendalikan board WeMos via smartphone Android. Agar pembahasan pada tulisan ini dapat lebih sederhana, kita akan menggunakan pemrograman bahasa Lua pada sisi board WeMos, dan App Inventor pada sisi Android.

Agar dapat melakukan pemrograman Lua, maka pada board WeMos anda perlu diinstalasi firmware NodeMCU. Sedangkan App Inventor dapat diakses pada alamat http://appinventor.mit.edu/explore/.

App Inventor merupakan suatu IDE berbasis cloud yang dapat diakses dengan menggunakan web browser yang mendukung HTML5, sehingga dalam hal ini anda tidak perlu menginstalasi software tambahan pada komputer anda, cukup web browser saja.

Pada tulisan ini saya asumsikan anda telah mengerti pembuatan aplikasi pada board WeMos dengan menggunakan software Esplore.

Koding pada sisi WeMos:


appconfig.lua
cfg={}
cfg.ssid="myssid"
cfg.pwd="mypassword"
cfg.auth=wifi.WPA_WPA2_PSK

dhcp_config ={}
dhcp_config.start = "192.168.4.100"
init.lua
-- aplikasi ini berfungsi menghindarkan module anda terjebak
-- pada kondisi restart tak terhingga jika terjadi bugs pada
-- init.lua.

-- aplikasi ini dapat mengaktifkan board anda sebagai access
-- point, jika anda menginginkan hal ini, maka anda perlu
-- menyediakan file apconfig.lua.

-- aplikasi dapat berjalan pada dua modus, yaitu standalone
-- atau terkoneksi ke wifi.

-- agar dapat terkoneksi ke wifi, maka username dan password
-- didefinisikan pada file credentials.lua

-- aplikasi akan menunggu selama 3 detik sebelum file app.lua
-- dieksekusi, jika terjadi bugs pada app.lua, maka anda
-- dapat menjalankan file.remove("app.lua") sehingga tidak
-- terjebak pada kondisi restart tak terhingga.

function startup()
    print("Running")
    -- aplikasi autoexec anda  sekarang adalah 'app.lua'
    if file.open("app.lua") == nil then
        print("app.lua tidak ditemukan, silakan buat app.lua sebagai auto executable.")
    else
        file.close("app.lua")
        dofile("app.lua")
    end
end

if file.open("apconfig.lua") ~= nil then
    print("activate as access point")
    dofile("apconfig.lua")
    -- set mode as stationAP 
    wifi.setmode(wifi.STATIONAP)
    wifi.ap.config(cfg)
    print("AP IP Address:" .. wifi.ap.getip())  
    pool_ipstart, pool_ipend = wifi.ap.dhcp.config(dhcp_config)
    if wifi.ap.dhcp.start() then
        print("DHCP server started, pool addr from " .. pool_ipstart .. " to " .. pool_ipend .. "!")
    else
        print("DHCP server failed!")
    end
else
    -- default mode as station
    wifi.setmode(wifi.STATION)  
end

-- periksa keberadaan file credentials.lua yang mendefinisikan
-- 'SSID' and 'PASSWORD' wifi
if file.open("credentials.lua") == nil then
    -- bagian module standalone
    print("Boot sebagai module standalone")
    print("You have 3 seconds to abort")
    print("Waiting...")
    -- jalankan fungsi startup setelah 3 detik     
    tmr.alarm(0, 3000, 0, startup)
else  
    -- bagian module koneksi wifi
    file.close("credentials.lua")
    -- muat variable SSID dan PASSWORD
    dofile("credentials.lua")
    print("Koneksi ke " .. SSID)
    wifi.sta.config(SSID, PASSWORD)
    -- wifi.sta.connect() not necessary because config() uses auto-connect=true by default

    -- mencoba koneksi setiap detik sampai tmr.stop(1)
    trycount = 1
    tmr.alarm(1, 1000, 1, function()
        if wifi.sta.getip() == nil then
            print("trying " .. trycount .. " second(s)")
            trycount = trycount + 1
        else
            -- berhasil koneksi dan mendapatkan IP Address
            tmr.stop(1)
            print("WiFi connected")
            print("Client IP Address:" .. wifi.sta.getip())
            print("You have 3 seconds to abort")
            print("Waiting...")
            -- jalankan fungsi startup setelah 3 detik     
            tmr.alarm(0, 3000, 0, startup)
        end      
    end)
end
app.lua
-- aplikasi ini membentuk web server pada board anda
-- dengan kemampuan mengaktifkan LED BUILTIN.
-- untuk mengaktifkan LED BUILTIN maka pin D4 diset ke LOW,
-- dan sebaliknya adalah diset ke ON.

-- web server akan memberikan respon status dari LED BUILTIN
-- untuk mengaktifkan LED BUILTIN maka dilakukan call
-- http://ipaddress?led=on
-- untuk mematikan LED BUILTIN maka dilakukan call
-- http://ipaddress?led=off

position = "off"

function led_builtin(position)
    gpio.mode(4, gpio.OUTPUT)
    if (position == "on") then
        gpio.write(4, gpio.LOW) -- LED BUILTIN ON
    else
        gpio.write(4, gpio.HIGH) -- LED BUILTIN ON
    end
end

function receive(conn, payload)
    --debug
    print(payload)

    -- extra path and variables
    local _,_,method,path,vars = string.find(payload,"([A-Z]+) (.+)?(.+) HTTP")
    if(method==nil) then
       _, _, method, path = string.find(payload,"([A-Z]+) (.+) HTTP")
    end

    -- extract the variables passed in the url
    local _GET = {}
    if (vars~=nil) then
       for k,v in string.gmatch(vars,"(%w+)=(%w+)&*") do
           _GET[k] = v
           --debug
           print(k .. ":" .. v)
       end

       if (_GET['led'] ~= nil) then
            position = _GET['led']      
       end    
    end

    -- turn led ON/OFF
    led_builtin(position)

    local content="LED BUILTIN is " .. position .. "!"
       
    local contentLength=string.len(content)

    conn:on("sent", function(sck) sck:close() collectgarbage() end)
    conn:send("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:" .. contentLength .. "\r\n\r\n" .. content)
end

function connection(conn)
    conn:on("receive", receive)
end

-- check whether server is already started
if srv~=nil then
    print("stop existing server...")
    srv:close()
    print("OK")
end

-- start a new server
print("start a new server ...")
led_builtin(position)
srv=net.createServer(net.TCP, 1)
srv:listen(80, connection)
print("OK")

 Koding pada sisi App Inventor

1. Aktifkan ke http://appinventor.mit.edu/explore/
2. Klik pada Create Apps!\
3. Login dengan Google Account Anda
4. Klik pada Project, dan pilih New Project
5. Pada Project Name isikan IOT
6. Pada layar Screen1 tambahkan komponen berikut ini

 Gambar 1. Screen1 pada modus Designer

7. Ubah nama dan text masing-masing komponen sesuai dengan tampilan pada layar Designer dan Component.

Gambar 2. Setting pada Component

8. Buatlah koding berikut ini pada layar Block (Bahasa pemrograman pada App Inventor adalah berupa blok LEGO, dimana anda dapat memasang masing-masing blok yang nantinya menjadi satu aplikasi yang terintegrasi)


Gambar 3. Koding pada Layar Block

9. Klik pada Built dan pilih App (provide QR code for .apk)

Gambar 4. Built Aplikasi

10. Scan QR code, jika pada smartphone anda belum terinstalasi QR code scanner, maka anda perlu menginstalasinya terlebih dahulu.

Gambar 5. QR Code untuk download APK ke Smartphone

11. Smartphone akan memblokir instalasi APK dari sumber yang tidak diketahui, sehingga anda perlu mengubah Setting, Security, Unknown Sources (ON)

12. Setelah instalasi dan Run, dan silakukan coba klik pada On dan Off dan perhatikan LED BUILTIN pada board WeMos.
 Gambar 6. Icon aplikasi IOT pada Launcher

Gambar 7. Hasil Run Aplikasi




1 komentar:

  1. bisakah memberi file skectnya yang di arduino,soalnya itu terlalu panjang

    BalasHapus