Skip to content

pvvx/EspLua

Repository files navigation

EspLua.ru

Версия 1.4.0 (на базе Espressif SDK версии 1.4.0 + патчи)

Проект в стадии доработки некоторых библиотек Lua под новые SDK от Espressif
с дальнейшим переходом к полностью открытому исходному коду по мере развития meSDK
и избавления от глючных библиотек NodeMCU

###Lua для Wi-Fi модулей esp8266 Построен на частях от ESP8266 sdk 1.4.0 + Патчи с изменениями
Ядро Lua на основе eLua проекта
Сjson на основе lua-cjson
Файловая система основана на spiffs
Транслятор UDK GCC 5.1 Ускоряющий загрузчик Rapid Loader v3

Резюме

  • Для детей, поиграться на вечер (на большее Lua на ESP8266 не рассчитана)
  • Легкий доступ к беспроводному маршрутизатору
  • Основа (ядро) на Lua 5.1.4
  • Предпочтительно программирование событий-Драйв.
  • Встроено json, file, timer, pwm, i2c, spi, 1-wire, net, mqtt, coap, gpio, wifi, adc, uart and system api.
  • Используется индекс для доступа к gpio, i2c, pwm.
  • Используются Integer и Float.

Журнал версий

2015-09-22 - Переход на SDK ver 1.4.0
2015-08-13 - Добавка: net.createServer(net.TCP[,timeout[, options]]) / net.createConnection(net.TCP[, secure[, options]])
2015-08-09 - Переход на SDK ver 1.3.0
2015-07-21 - Новые команды =wifi.getchl() и =wifi.setchl(1..13)
2015-07-18 - Добавление SDRAM Optimization Patch for SDK_v1.2.0 ('Heap' больше 36 килобайт)
2015-07-17 - Замена п.п. ввода UART, ремонт spiffs
2015-07-15 - Перестройка вызовов задач (ets_ru(), wdt)
2015-07-10 - Переход на SDK ver 1.2.0
2015-07-03 - Добавлена первая весрия rapid_loader-а (ускоренного загрузчика)
2015-07-02 - Начато перераспределение констант и других данных только в 48 килобайтную область IRAM
2015-07-01 - Новые команды =wifi.sta.rssi() и wifi.max_tpw(0..82)
2015-06-27 - Исправления/дополнения + новая команда file.fsstat()
2015-06-25 - Начало проекта

#Стартовый лог c парой команд

EspLua.ru 1.4.0 build 20150922  powered by Lua 5.1.4
lua: cannot open init.lua
> =node.heap()
41576

##Таблица GPIO

IO indexESP8266 pinIO indexESP8266 pin
0 [*]GPIO168GPIO15
1GPIO59GPIO3
2GPIO410GPIO1
3GPIO011GPIO9
4GPIO212GPIO10
5GPIO14
6GPIO12
7GPIO13
#### [*] В текущей версии D0(GPIO16) может быть использован только в качестве ножки ввода для чтения уровня 1 или 0. Другие функции, пока, с ним не работают.

#Прошивка Flash 0x00000.bin: 0x00000
0x0C000.bin: 0x0C000
esp_init_data_default.bin: 0x7C000
blank.bin: 0x7E000

  • Flash любого размера прошивается c опциями как 512 килобайтная. Анализ реального размера производится в ходе исполнения прошивки.

#Cкорость передачи RS-232 TTL по умолчанию baudrate: 115200

#Начните игру

####Подключение к точке доступа

    ip = wifi.sta.getip()
    print(ip)
    --nil
    wifi.setmode(wifi.STATION)
    wifi.sta.config("SSID","password")
    ip = wifi.sta.getip()
    print(ip)
    --192.168.18.110

####Манипулирование оборудованием, как в Arduino

    pin = 1
    gpio.mode(pin,gpio.OUTPUT)
    gpio.write(pin,gpio.HIGH)
    print(gpio.read(pin))

####Простейший клиент HTTP в стиле nodejs

    -- A simple http client
    conn=net.createConnection(net.TCP, 0)
    conn:on("receive", function(conn, payload) print(payload) end )
    conn:connect(80,"115.239.210.27")
    conn:send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\n"
        .."Connection: keep-alive\r\nAccept: */*\r\n\r\n")

####Или простейший HTTP-сервер

    -- A simple http server
    srv=net.createServer(net.TCP)
    srv:listen(80,function(conn)
      conn:on("receive",function(conn,payload)
        print(payload)
        conn:send("<h1> Hello, NodeMcu.</h1>")
      end)
      conn:on("sent",function(conn) conn:close() end)
    end)

####Подключение к MQTT Брокеру

-- init mqtt client with keepalive timer 120sec
m = mqtt.Client("clientid", 120, "user", "password")

-- setup Last Will and Testament (optional)
-- Broker will publish a message with qos = 0, retain = 0, data = "offline"
-- to topic "/lwt" if client don't send keepalive packet
m:lwt("/lwt", "offline", 0, 0)

m:on("connect", function(con) print ("connected") end)
m:on("offline", function(con) print ("offline") end)

-- on publish message receive event
m:on("message", function(conn, topic, data)
  print(topic .. ":" )
  if data ~= nil then
    print(data)
  end
end)

-- for secure: m:connect("192.168.11.118", 1880, 1)
m:connect("192.168.11.118", 1880, 0, function(conn) print("connected") end)

-- subscribe topic with qos = 0
m:subscribe("/topic",0, function(conn) print("subscribe success") end)
-- or subscribe multiple topic (topic/0, qos = 0; topic/1, qos = 1; topic2 , qos = 2)
-- m:subscribe({["topic/0"]=0,["topic/1"]=1,topic2=2}, function(conn) print("subscribe success") end)
-- publish a message with data = hello, QoS = 0, retain = 0
m:publish("/topic","hello",0,0, function(conn) print("sent") end)

m:close();
-- you can call m:connect again

UDP клиент и сервер

-- a udp server
s=net.createServer(net.UDP)
s:on("receive",function(s,c) print(c) end)
s:listen(5683)

-- a udp client
cu=net.createConnection(net.UDP)
cu:on("receive",function(cu,c) print(c) end)
cu:connect(5683,"192.168.18.101")
cu:send("hello")

####Сделайть что-нибудь с ШИМ

  function led(r,g,b)
    pwm.setduty(1,r)
    pwm.setduty(2,g)
    pwm.setduty(3,b)
  end
  pwm.setup(1,500,512)
  pwm.setup(2,500,512)
  pwm.setup(3,500,512)
  pwm.start(1)
  pwm.start(2)
  pwm.start(3)
  led(512,0,0) -- red
  led(0,0,512) -- blue

####Мигать светодиодом

  lighton=0
  tmr.alarm(1,1000,1,function()
    if lighton==0 then
      lighton=1
      led(512,512,512)
    else
      lighton=0
      led(0,0,0)
    end
  end)

####Запустить что-то, при старте системы (авто-запускаемый файл при старте)

  --init.lua will be excuted
  file.open("init.lua","w")
  file.writeline([[print("Hello, do this at the beginning.")]])
  file.close()
  node.restart()  -- this will restart the module.

####Пародия на Telnet

    -- a simple telnet server
    s=net.createServer(net.TCP,180)
    s:listen(2323,function(c)
       function s_output(str)
          if(c~=nil)
             then c:send(str)
          end
       end
       node.output(s_output, 0)   -- re-direct output to function s_ouput.
       c:on("receive",function(c,l)
          node.input(l)           -- works like pcall(loadstring(l)) but support multiple separate line
       end)
       c:on("disconnection",function(c)
          node.output(nil)        -- un-regist the redirect output function, output goes to serial
       end)
       print("Welcome to NodeMcu world.")
    end)

####Использование DS18B20

    -- read temperature with DS18B20
    node.compile("ds18b20.lua")   --  run this only once to compile and save to "ds18b20.lc"
    t=require("ds18b20")
    t.setup(9)
    addrs=t.addrs()
    -- Total DS18B20 numbers, assume it is 2
    print(table.getn(addrs))
    -- The first DS18B20
    print(t.read(addrs[1],t.C))
    print(t.read(addrs[1],t.F))
    print(t.read(addrs[1],t.K))
    -- The second DS18B20
    print(t.read(addrs[2],t.C))
    print(t.read(addrs[2],t.F))
    print(t.read(addrs[2],t.K))
    -- Just read
    print(t.read())
    -- Just read as centigrade
    print(t.read(nil,t.C))
    -- Don't forget to release it after use
    t = nil
	ds18b20 = nil
    package.loaded["ds18b20"]=nil

####Работа с дисплеем через I2C с u8glib u8glib это графическая библиотека с поддержкой различных дисплеев. Интеграция в nodemcu разработана на SSD1306 основе дисплея подключенного через порт I2C. Другие виды отображения и подключения SPI будет добавлены по "просьбе трудящихся".

#####Соединение I2C Подключите SDA и SCL на любые свободные GPIOs. Пример lua_examples/u8glib/graphics_test.lua SDA=5 (GPIO14) и SCL=6 (GPIO12). Они используются для настройки драйвера I2C EspLua.ru перед доступом к дисплею:

sda = 5
scl = 6
i2c.setup(0, sda, scl, i2c.SLOW)

#####Соединение SPI Используется аппартный HSPI на конкретных выводах ESP8266:

  • HSPI CLK = GPIO14
  • HSPI MOSI = GPIO13
  • HSPI MISO = GPIO12 (not used)

Другие выводы на любых доступных GPIO:

  • CS
  • D/C
  • RES (опция для некоторых дисплеев)

Также обратитесь к последовательности инициализации, например в lua_examples/u8glib/graphics_test.lua:

spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, spi.DATABITS_8, 0)

Комментарии и остальное на форуме esp8266.ru