ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. SergeiL

    SergeiL Оракул Модератор

    Так и я Вас не упрекаю! Нравится Вам так, ну и хорошо. Будет же работать!
    Я же про себя и написал.
     
  2. AlexU

    AlexU Гуру

    правильно или так:
    Код (C++):
    p=&buff[0];
    или более лаконичнее:
    Код (C++):
    p=buff;
     
  3. Igor68

    Igor68 Гуру

    Код (C++):

    &p[0]; //адрес размещение первого(нулевого) элемента массива
    //именно адрес размещения физический и никаких имён
    *pp=&p[0]; //указатель и тоже никаких имён, а тоже самое
    //если функция хочет
    int Func(char * par);
    //то я и вызываю так
    int res = Func(&p[0]);
    //или так
    int res = Func(pp);
    //мне так легче читается
     
     
  4. Igor68

    Igor68 Гуру

    Пардон! Похоже устал... и смотреть более не могу.
    Код (C++):

    #include <stdio.h>

    char dd[32];

    int main(int argc, char **argv)
    {
       char *p = &dd[0];
       sprintf(p, "car", 3);
       p[2] = 'd';
       printf("string:\"%s\"\n", p);
       return 0;
    }
     
    Вот работает и всё!

    А это для контроллера ADuC7024:
    Код (C++):
    #include <stdio.h>
    #include <ADuC7024.h>

    char dd[32];

    int main(int argc, char **argv)
    {
       char *p = &dd[0];
       sprintf(p, "car", 3);
       p[2] = 'd';
       //printf("string:\"%s\"\n", p);
        while(1)
        {
        }
       return 0;
    }
     
    Понятное дело вся работа только в симуляторе или JTAG+ADuC7024... никакого ввода-вывода в консоль и наблюдения чисто в массиве в ОЗУ
     
    Последнее редактирование: 3 авг 2017
  5. ИгорьК

    ИгорьК Гуру

    Последнее редактирование: 8 авг 2018
    sys нравится это.
  6. ИгорьК

    ИгорьК Гуру

    Приемы работы с памятью и модулем.
    Еще немного о блинке. На его примере разберемся с загрузкой и выгрузкой модулей, кое что узнаем о таблицах и уничтожении таймеров.

    Загружаем в память модуля файл blinkmodandremove.lua:
    Код (Lua):
    do
    -- локальная переменная mm таким образом ловит
    -- собственное название модуля для дальнейшей выгрузки
    local mm = ...
    print(mm)
    local M = {}
    M.pinsintervals = {}

    -- добавляем к функции, что изучали раньше, ссылку на внешнюю таблицу blinkstb
    function M.makeblinkandtimer(pin, interval, blinkstb)
        gpio.mode(pin, gpio.OUTPUT)
        local ligth = 1
        local function blink()
            gpio.write(pin, ligth)
            print("Writе  to "..pin.." "..ligth)
            -- за одно будем смотреть свободную память
            print("Heap = "..node.heap())
            ligth = (ligth == 0) and 1 or 0
        end
        local function maketimer()
            -- поскольку нам нужны зацепки за таймер
            -- создаем его через переменную
            local ltmr = tmr.create()
            -- запускаем таймер
            ltmr:alarm(interval, tmr.ALARM_AUTO, blink)
            -- и помещаем ссылку на него в глобальную таблицу
            table.insert(blinkstb, ltmr)
        end
        return maketimer()
    end

    function M.make(t, blinkstb, call)
        M.pinsintervals = t
        for _, v in pairs(M.pinsintervals) do
             M.makeblinkandtimer(v[1], v[2], blinkstb)
        end
        -- call - callback функция, будет исполнена в завершение
        -- работы модуля
        if call then
            -- вызов callback функции
            call()
            -- уничтожение самого загруженного модуля
            package.loaded[mm] = nil
        end
    end
    return M
    end
    Вызываем модуль следующим образом:
    Код (Lua):
    do
    -- глобальная таблица - склад таймеров-блинков
    blinkstb = {}

    pinsintervals = {
        {1, 5000},
        {2, 3000}
    }

    -- callback функция:
    -- уничтожаем в памяти следы
    -- загрузки модуля и глобальной
    -- таблицыс ногами и интервалами

    function killmod()
        pinsintervals = nil
        bl = nil
    end

    -- грузим модуль
    bl = require('blinkmodandremove')
    -- передаем в него данные о ногах и интервалах,
    -- о таблице - складе таймеров-блинков
    -- о функции, которая очистит память от лишнего

    bl.make(pinsintervals, blinkstb, killmod)

    -- через 10 секунд таймер уничтожит все блинки
    tmr.create():alarm(10000, 0, function(t)
        print("Stop And Kill Blinks!")
        ---[[
        tmr.stop(blinkstb[1])
        tmr.stop(blinkstb[2])
        tmr.unregister(blinkstb[1])
        tmr.unregister(blinkstb[2])
        blinkstb[1] = nil
        blinkstb[2] = nil
        blinkstb = nil
        -- и уничтожит сам себя
        t = nil
       --]]
       --[[ и то же самое компактно
        -- для любого количества блинкеров
        for _, v in pairs(blinkstb) do
              tmr.stop(v)
              tmr.unregister(v)
         end
         blinkstb = nil
         t = nil
        --]]


    end)
    end
    Идем дальше.
     
    Последнее редактирование: 19 янв 2018
    9xA59kK нравится это.
  7. Securbond

    Securbond Гуру

    Почитал "тему". Вот не думал, что два взрослых, вполне самодостаточных человека, опустятся до такого холивара. Как результат из неплохой задумки получилась флудильная какашка. Одного не понимаю, здесь кто то заставляет кого-то изучать lua насильно? Напоминает спор apple vs android. Видимо мужской климакс или ПМС это уж кому как нравится.
     
  8. ИгорьК

    ИгорьК Гуру

    :) Вы ошибаетесь - раньше тема называлась что-то типа "Троллим Си", все нормально :)

    Это я слегка прошелся по особенностям Сей - люди обиделись. Скоре это я виноват. Больше не буду.

    Тут во время Вашего отпуска была тема одного ненормального товарища про эфироны и ее долго не удаляли. Народ решил что "хуже быть не может", а я доказал что может - создал эту и спросил почему в Сях библиотека из двух файлов и зачем ";" в конце каждой строки.

    И началось... :) Поэтому все в контексте. Вопросам Lua это не мешает - я даю ссылки.
     
    Последнее редактирование: 9 авг 2017
  9. И каков ответ? И не каждая строчка заканчивается точкой с запятой.

    Дизайн си содержит множество дефектов, но как-то так получилось, что очень многое на нем написано.
     
  10. ИгорьК

    ИгорьК Гуру

    Думаю, ответ в том, что тот кто придумал Си был с огромным чувством юмора.
     
  11. b707

    b707 Гуру

    если серьезно, точка с запятой стоит не в конце строки, а в конце оператора. Операторов на одной строке может быть несколько, так же как один оператор может растянуться на много строк.
    Это если без троллинга :)
    Считаю такой синтаксис более логичным, чем разделение пробелами. Лунный синтаксис у меня вызывает вопрос. что за идиоты это придумали :)
     
    SmileOfFortune нравится это.
  12. issaom

    issaom Гуру

    Юмористы есть в любом языке программирования тот же делфи с его бесконечными бигин енд. Мне кажется важен не сам инструмент, а то как им владеешь и споры что лучше вообще бессмысленны ))) (можно ещё lisp из автокада вспомнить или язык 1с где вся программа как один комментарий читается)
     
  13. Как разобрать такое, если нет точки с запятой?
    Код (C++):
    a = b + c * d = e
    Я не готов утверждать, что это невозможно в принципе, но просмотром единственного лишнего символа справа обойтись не удастся точно.
     
  14. ИгорьК

    ИгорьК Гуру

    Луа придумал один парень из католического университета.
    И он решил так: если много операторов на строке - ставь ";" , а если один или конец строки - и без него сгодится.
    Парень был прост и подошел к делу экономно.
     
  15. ИгорьК

    ИгорьК Гуру

    Да, а вот еще серьезнее - в Луа нет оператора switch. Прикиньте как без него жить то вообще можно :)
     
  16. b707

    b707 Гуру

    А если оператор на 5 строк, тогда как?

    switch - это куча последовательных или вложенных if. обойтись без него несложно
     
  17. ИгорьК

    ИгорьК Гуру

    Это к тому кто такие операторы пишет :)
     
    Последнее редактирование: 10 авг 2017
  18. ИгорьК

    ИгорьК Гуру

    Это не куча, а икона программиста на Си :)
     
    Последнее редактирование: 10 авг 2017
  19. Ну вот еще одно чюдо - наслаждайтесь:
    Код (C++):
    void f(int i)
    {
      switch (i)
      {
        case 1:
          ...
          break;

        case 2:
          ...
          break;

        defualt:
          ...
          break;
      }
    }
     
  20. Neu

    Neu Нерд

    ИгорьК, есть у меня ESP8266 (точнее, WeMOS D1), мучаю сейчас ее Ардуйной ИДЭ.
    Тема с Lua показалась занимательной, для расширения кругозора в т.ч... Ну и сам событийный подход, конечно, привлекает... Не помогли бы вы парой советов, с какого боку подойти, чтобы начать программировать эту ESP с помощью Луа? Нужно наверное, перепрошить ее как минимум, плюс среда разработки иная и т.д.?