Скрыть объявление
Управляйте вашими ESP8266 и другими устройствами прямо с телефона из любой точки мира, где есть интернет!
Подробности и обсуждение IoT Manager в этой теме. Официальный сайт приложения и документация IoTmanager.ru
Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Для новичков

Тема в разделе "NodeMCU", создана пользователем exclus, 16 мар 2015.

  1. exclus

    exclus Новичок

    Сообщения:
    13
    Симпатии:
    0
    Всем доброго времени суток.
    Я хотел бы попросить сообщество составить руководство для новичков. С примерами работы с esp8266. Вроде бы информации много, а кроме как подключится к wi-fi и т.д. подробных инструкций нет. Хотя бы базовые примеры с веб сервером и отправкой команд в uart через вэб страницу, получением данных из uart и отображением на вэб странице. Можно другие примеры, только желательно код с комментариями, а то очень не просто разобраться в этом замечательном модуле.
     
  2. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
  3. exclus

    exclus Новичок

    Сообщения:
    13
    Симпатии:
    0
    Виктор, спасибо, я уже все прочитал. Мне не очень понятна очередность построения программы. Как я уже понял головной скрипт должен быть init.lua, куда мы пишем базовую программу по подключению модуля к сети. А дальше как запустить из него другие программы, например вэб сервер и управление (gpio, и отправка данных в уарт)? Можете показать пример скрипта с комментариями на русском?
     
  4. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    можно все и в init запихать - это неважно.
    просто, если в коде будет зависание или bootloop, придется весь модуль перепрошивать, поэтому делают в init вызов другого файла по таймеру.
    Например, так
    Код (Text):
    1. init.lua
    2. сначала команды подключения к сети,
    3. в конце
    4. tmr.alarm(0, 5000, 1,  function() dofile("main.lua") end)
    5.  
    6. в main.lua
    7. первой строкой
    8. tmr.stop(0)
    9. далее код
    Т.е. main будет запускаться через 5 сек после старта модуля, как раз уже когда подключились к WiFi
    Если в коде будет ошибка вы вручную сможете остановить таймер (нужно за эти 5 сек в терминале ввести tmr.stop(0)) и можно править main.lua

    Если в tmr.alarm третьим параметром поставить 0, то tmr.stop не нужен
    Ответ набросал быстро, тороплюсь, если что-то непонятно - спрашивайте, я вечером отвечу.
     
    Volk65 и SergNF нравится это.
  5. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    Вот еще красивое решение bootloop (если память позволяет)
    Код (Text):
    1. FileToExecute="main.lua"
    2. l = file.list()
    3. for k,v in pairs(l) do
    4.   if k == FileToExecute then
    5.     print("*** You've got 5 sec to stop timer 0 ***")
    6.     tmr.alarm(0, 5000, 0, function()
    7.       print("Executing ".. FileToExecute)
    8.       dofile(FileToExecute)
    9.     end)
    10.   end
    11. end
     
  6. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    А я бы еще порекомендовал вот эту статейку: http://mysku.ru/blog/ebay/30626.html - ее бы на наш ресурс перенести, а то чего ей на муське делать, но увы, это к автору :)
    Ув. Victor, а может нам где-нибудь собрать список ссылок на статьи? Понимаю, что ресурсы сторонние, но все же для общего дела, так сказать...
    Я бы как минимум туда включил ссылку на эту статью и из нее в конце ссылки "Полезные ссылки и литература".
     
  7. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    отправил запрос автору на публикацию у нас, ждем ответа
     
  8. Кирилл

    Кирилл Новичок

    Сообщения:
    17
    Симпатии:
    2
    На сколько я знаю у этого автора есть блог ... samopal.pro, кот вроде его, да и почерк тоже, вот только почему он до сих пор у себя не продублировал..., а может тут у всех есть свои блоги сайты и форумы )))
     
  9. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    Автор ответил положительно, прислал фото.
    В ближайшее время выложу эту статью к нам на сайт
     
  10. exclus

    exclus Новичок

    Сообщения:
    13
    Симпатии:
    0
    Всем привет, после долгой ночи и случайного "заседания" в нужном месте с утра обнаружил на "вражеском" форуме ссылку но простой проект. Собрал - работает, Ура. Прикрутил еще ШИМ управление, сам по API. И вот, что получилось.

    Код жирным шрифтом, комментарии курсивом, комментарии которые прошу пояснить подчеркнутым курсивом.

    Пример программы на NodeMCU для новичков (Веб сервер (раскрыть)

    wifi.setmode(wifi.STATION) -- Задаем режим работы esp8266, как wi-fi клиент
    wifi.sta.config("Homewifi","12345678") -- Подключаемся к wi-fi сети ("Имясети","пароль")
    print(wifi.sta.getip()) -- Пишем в UART полученные настройки (IP, Mask, Gateway)
    led1 = 3 -- Задаем переменную led1 = IO 3 = GPIO 15 (по таблице с API NodeMCU)
    led2 = 4 -- Задаем переменную led1 = IO 4 = GPIO 3 (по таблице с API NodeMCU)
    gpio.mode(led1, gpio. OUTPUT) -- Переключаем GPIO в режим выхода <- Удалите пробел между gpio. и OUTPUT
    pwm.setup(led2, 10, 512) -- Второй GPIO подключаем к ШИМ каналу указываем в скобках (номер GPIO, частота ШИМ, коэфициент заполнения ШИМ (обратная скважности) по умолчанию)
    srv=net.createServer(net.TCP) -- Задаем переменную srv = net.server (не совсем очевидно из данной команды, но судя по API переменная работает) и одновременно поднимаем TCP сервер. Почему-то не задаем timeout для не активных подключений, не знаю какой параметр он принемает по умолчанию.
    srv:listen(80,function(conn) -- Слушаем 80 порт, при подключении клиента создается socket - имя его переменной (conn). Как я понял это свободная переменная можно написать любую, которую удобно использовать
    -- Ниже не понимаю
    conn: on("receive", function(client,request) -- <- Удалите пробел между conn: и on
    local buf = "";
    local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
    if(method == nil)then
    _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
    end
    local _GET = {}
    if (vars ~= nil)then
    for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
    _GET[k] = v
    end
    end

    -- Ниже не понимаю, что значит этот buf, а дальше пишем на HTML (Заголовок с текстом, создаем кнопки при нажатии на которые получаются GET запросы к модулю (\"?pin=ON1\" и т.д.)
    buf = buf.."<h1> ESP8266 Web Server</h1>";
    buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
    buf = buf.."<p>GPIO2 <a href=\"?pin=100\"><button>100% light</button></a>&nbsp;<a href=\"?pin=50\"><button>50% light</button></a>&nbsp;<a href=\"?pin=10\"><button>10% light</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";

    --//--
    local _on,_off = "","" -- Не понимаю
    if(_GET.pin == "ON1")then -- Задаем условие, если модуль видит запрос (_GET.pin == "ON1"), то
    gpio.write(led1, gpio.HIGH); -- Выводим высокий уровень на GPIO (Подтягиваем к плюсу)
    elseif(_GET.pin == "OFF1")then -- или если модуль видит запрос (_GET.pin == "OFF1"), то
    gpio.write(led1, gpio.LOW); -- Выводим низкий уровень на GPIO (Подтягиваем к плюсу)
    elseif(_GET.pin == "100")then -- или если модуль видит запрос (_GET.pin == "100"), то
    pwm.setduty(led2,1023); -- Задаем заполнение ШИМ на GPIO равное 100 процентам (получается ~3,3 вольт)
    pwm.start(led2); -- и даем команду на включение подачи ШИМ в GPIO
    elseif(_GET.pin == "50")then -- или если модуль видит запрос (_GET.pin == "50"), то
    pwm.setduty(led2,512); -- Задаем заполнение ШИМ на GPIO равное 50 процентам (получается ~1.65 вольт)
    pwm.start(led2); -- и даем команду на включение подачи ШИМ в GPIO, из-за того что в самом начале задали низкую частоту ШИМ - здесь получим "Мигалку" ;-)
    elseif(_GET.pin == "10")then -- или если модуль видит запрос (_GET.pin == "10"), то
    pwm.setduty(led2,10); -- Задаем заполнение ШИМ на GPIO равное 10 процентам (получается ~0,33 вольт)
    pwm.start(led2); -- и даем команду на включение подачи ШИМ в GPIO, из-за того что в самом начале задали низкую частоту ШИМ - здесь получим тусклую "Мигалку" ;-)
    elseif(_GET.pin == "OFF2")then -- или если модуль видит запрос (_GET.pin == "OFF2"), то
    pwm.stop(led2); -- и даем команду на выключение подачи ШИМ в GPIO
    end -- Конец цикла if
    client:send(buf); -- Не понимаю
    client:close(); -- Не понимаю, но думаю... , нет все равно не понимаю
    collectgarbage(); -- Какой-то сборщик мусора из языка программирования LUA, чем занимается не понимаю
    end) -- Конец цикла "conn: on" <- Удалите пробел между conn: и on
    end) -- Конец цикла "srv:listen"



    Вот под этим я понимаю "код для новичков". Прошу людей знающих посмотреть и написать ответ на недостающие комментарии ( это - где написано, что я не понимаю), я обновлю пост. Мне кажется вот с такими примерами будет проще осваиваться таким как я. На всякий случай схема подключений из примера.
    Схема подключений (раскрыть)
    [​IMG]


    Исходник взят от сюда http://randomnerdtutorials.com/esp8266-web-server/

    P.S. После некоторого времени работы отваливается подключение по Wi-fi????
     
    Последнее редактирование: 17 мар 2015
  11. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    exclus, на этом форуме всегда рады помочь, особенно тем, кто так аккуратно оформляет посты, как ваш. Причем это не ирония, а искренняя благодарность.
    Однако вы должны понять, что разбирать по строчке чужие скрипты вряд ли кто-то захочет.
    Вам может показаться это несправедливым, потому что вы пытались разобраться сначала самостоятельно с каждой строчкой и только потом обратились за помощью на форум,
    но дело в том, что большинство ваших вопросов касаются самого языка Lua и никак не связаны с NodeMCU и ESP8266, а специалистов именно по языку Lua у нас немного.
    Я вообще знаю только одного (и, увы, это не я). Большинство, как и вы разбирает каждую строку и не имеет уверенности в своих знаниях чтобы давать советы другим.
    Я вам рекомендую что-то почитать по Lua и большинство вопросов по этому скрипту у вас прояснится.
    Ну или хотя бы задавайте по одному вопросу за раз - так отвечать намного проще. Я вам отвечу на первый.
    Вы абсолютно правы, что заметили это.
    Дело в том, что NodeMCU быстроразвивающийся проект и часть скриптов в сети просто устарела, потому что API NodeMCU развивается, команды меняются и добавляются новые.
    В первых версиях второго параметра просто не было. Он появился позднее, а в скрипте, который вы нашли осталось все по старому. Некоторые команды остались совместимы со старыми версиями, а некоторые нет.
    я вам привел выдержку из ChangeLog NodeMCU
    Велика вероятность, что скрипт очень старый и, может быть, вообще не рабочий.
    В данной строке нужно скрипт исправить, прописать таймаут явно.
     
  12. exclus

    exclus Новичок

    Сообщения:
    13
    Симпатии:
    0
    Скрипт рабочий, я туда еще и ШИМ управление, добавил. Не обязательно LUA, просто это самое простое, что я нашел для esp на вашем форуме. А прошивки которые пишет pvvx, это для меня вообще дебри, а для него маленький веб сервер ))). Нужно с чего начинать. Просто без таких простых примеров тяжело.
    А какой язык вы посоветует для еsp? Родной SDK его как я понял тоже хорошая вещь, но примеров простых я для него не нашел пока.
    Ну может найдется человек который сможет сказать что такое buf )))
     
  13. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    Клиент (браузер) шлет GET запрос в ESP8266, а ESP8266 выплевывает в ответ html страницу. Ответ от esp8266 происходит в строке
    Код (Text):
    1. client:send(buf)
    т.е. buf это строковая переменная, которая содержит в себе html код, который собирается в одну переменную в скрипте ранее путем конкатенации строк оператором ".."
    Как-то так.
     
  14. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    Кроме Lua (NodeMCU) и С(SDK) пока и нет вариантов. Идет работа над MicroPython, но как-то вяло... Пока рулит тока NodeMCU и pvvx!
     
  15. exclus

    exclus Новичок

    Сообщения:
    13
    Симпатии:
    0
    А в SDK пишут на чистом С, AT прошивка это просто что бы wi-fi - uart мост поднимать, как я понял. Я единственное не понимаю, программа занимает место во флеше которого 512кб, а оперативной памяти всего 20 кб, остается как я понял. Или это не так?
     
  16. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.182
    Симпатии:
    368
    да, все верно.
    флеш - это по аналогии с компьютером типа жесткий диск, а оперативка в самом чипе SoC ESP8266EX
     
  17. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    exclus, действительно, если возникают вопросы по коду - лучше бейте их на более мелкие :)
    Тогда отвечать будет проще. Я вот LUA не знаю. То есть вообще. Но по аналогии с другими языками многие строчки становятся понятны (хотя может и ошибочно конечно).
    Но расписать сразу целую простыню не возьмусь... А по частям более мелким - можно попробовать.
    И еще одно, пожалуйста, кроме тега Спойлер не забывайте еще и тег Код. Берем Спойлер, в него Код, а в него уже сам код, тогда не придется вставлять в код ненужные пробелы, чтобы смайлики не получались, и писать потом, чтобы их удалили ;)
    Ну и отступы вначале строк в коде тоже обязательны! Без них вообще блоки кода отделять друг от друга - всю голову сломаешь...
    Я попытался так почитать, как у вас, все в один уровень - пипец просто :)
    Вы не подумайте - это не придирка. Просто чем приятнее вы оформляете свой вопрос, тем больше желания на него ответить ;)

    В идеале еще бы к коду номера строк слева... Victor, скажите, пожалуйста, а нельзя ли к блоку Код добавить нумерацию строк слева, как в редакторах кода? Чтобы проще было по коду общаться, сразу писать: "в строке № 23 имеем то и это"?
    Вот, например, как вот тут (дождитесь, пока загрузится).
    Спасибо!
     
    Последнее редактирование: 18 мар 2015
  18. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Вот, ради интереса попробовал причесать ваш, exclus, код:
    Код (раскрыть)
    Код (Lua):
    1.  
    2. -- Задаем режим работы esp8266, как wi-fi клиент
    3. wifi.setmode(wifi.STATION)
    4. -- Подключаемся к wi-fi сети ("Имясети","пароль")
    5. wifi.sta.config("Homewifi","12345678")
    6. -- Пишем в UART полученные настройки (IP, Mask, Gateway)
    7. print(wifi.sta.getip())
    8. -- Задаем переменную led1 = IO 3 = GPIO 15 (по таблице с API NodeMCU)
    9. led1 = 3
    10. -- Задаем переменную led1 = IO 4 = GPIO 3 (по таблице с API NodeMCU)
    11. led2 = 4
    12.  
    13. -- переменные обычно "объявляются", а не задаются и далее им "присваивается значение"
    14. -- во многих современных языках это делается сразу в 1 строку
    15. -- причем еще и без явного указания типа (кому-то это по душе. а кто-то яро против, но вот так)
    16. -- так что строка
    17. led2 = 4
    18. -- правильно читается как: объявляем переменную led2 (если это первый раз, где мы к ней обращаемся в коде)
    19. -- и присваиваем ей значение 4 (целочисленного типа в данном случае)
    20.  
    21. -- Переключаем GPIO в режим выхода
    22. gpio.mode(led1, gpio.OUTPUT)
    23.  
    24. -- Второй GPIO подключаем к ШИМ каналу указываем в скобках (номер GPIO, частота ШИМ, коэфициент заполнения ШИМ (обратная скважности) по умолчанию)
    25. pwm.setup(led2, 10, 512)
    26.  
    27. -- Создаем TCP сервер (вызовом команды net.createServer)
    28. -- Результат выполнения этой команды (ссылку на созданный сервер) помещаем в переменную srv
    29. srv = net.createServer(net.TCP)
    30. -- к слову сказать, если сейчас уже присутствует более новая версия функции net.createServer с бОльшим числом параметров,
    31. -- то правильнее будет использовать ее, так как обратная совместимость может рано или поздно и перестать работать.
    32. -- Другими словами, если вы используете более новую прошивку (версию функций и языка), то код нужно приводить в
    33. -- соответствие с ними, если не хотите потом заново весь код обыскивать, когда что-то перестанет вдруг работать.
    34.  
    35. -- нужно понимать, что выполняются строки справа налево, а точнее, сначала выполняется то, что стоит справа от символа присвоения "="
    36. -- и только потом результат этого выполнения присваивается тому, что записано слева от "="
    37. -- соответственно и читать стоит сначала то, что справа, а потом то, что слева от "="
    38.  
    39. -- Говорим созданному ранее TCP серверу, который у нас в переменной srv, слушать порт 80
    40. -- При подключении клиентов на этот порт этого сервера будет вызываться наша функция,
    41. -- которая объявлена тут же inline так сказать, с единственным параметром-переменной.
    42. -- В эту переменную будет передана ссылка на созданный для подключенного клиента socket
    43. -- (попадет эта ссылка в переменную conn, назвать эту переменную мы могли и по-другому, при желании)
    44. srv:listen(80, function(conn)
    45.  
    46.         -- Когда клиент к нам подключится, мы тут же для соединения с ним объявим еще одну функцию
    47.         -- по событию receive (что-то получили от клиента). Будет вызвана наша inline функция,
    48.         -- в которую будет передано 2 параметра: client - думаю, ссылка на клиента, который послал нам запрос,
    49.         -- и request - думаю, что текст запроса в виде строки
    50.         conn:on("receive", function(client, request)
    51.              
    52.                 -- объявляем локальную переменную buf, помещаем в нее пустую строку
    53.                 local buf = "";
    54.                 -- объявляем 5 локальных переменных
    55.                 -- _, _, method, path, vars
    56.                 -- помещаем в эти 5 переменных результат вызова функции string.find
    57.                 -- уверен, что это поиск подстроки "([A-Z]+) (.+)?(.+) HTTP" в строке request
    58.                 -- в интернетах легко найти точное описание, набрав нечто вроде LUA string.find в любом поисковике
    59.                 local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
    60.                 -- если method не nil (думаю, "не пусто", это значит, что мы нашли ту искому подстроку ранее)
    61.                 if(method == nil) then
    62.                         -- тогда снова ищем другую подстроку "([A-Z]+) (.+) HTTP" там же в request
    63.                         _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
    64.                 end
    65.                 -- объявляем еще одну локальную переменную _GET, типа массив, мне кажется
    66.                 local _GET = {}
    67.                 -- если vars "не пусто" (скорее всего в нее был ранее помещен массив найденных подстрок из request по первому string.find)
    68.                 if (vars ~= nil) then
    69.                         -- тогда мы циклом обходим все найденные в vars пары ключ - значение
    70.                         -- не могу 100% объяснить, как это работает - это в справочнике по LUA точно есть
    71.                         for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
    72.                                 _GET[k] = v
    73.                         end
    74.                 end
    75.                 -- но с уверенностью на 120% могу сказать, что результатом выполнения этого блока в итоге будет переменная _GET
    76.                 -- содержащая в себе массив со всеми запрошенными клиентом параметрами
    77.                 -- если клиент запросил, скажем http://наш_IP/page.html?key1=val1&key3=22
    78.                 -- то в _GET будет что-то вроде:
    79.                 -- key1 = val1 и key3 = 22
    80.  
    81.                 -- следующим блоком мы докидываем в переменную buf немного HTML текста
    82.                 buf = buf.."<h1> ESP8266 Web Server</h1>";
    83.                 buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
    84.                 buf = buf.."<p>GPIO2 <a href=\"?pin=100\"><button>100% light</button></a>&nbsp;<a href=\"?pin=50\"><button>50% light</button></a>&nbsp;<a href=\"?pin=10\"><button>10% light</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
    85.                 -- просто разбили его на несколько строк, то есть в итоге в buf будет весь этот текст
    86.  
    87.                 -- объявили еще 2 локальных переменных разом _on и _off, поместили в каждую по пустой строке
    88.                 local _on, _off = "",""
    89.                 -- ну и дальше проверка параметров в _GET
    90.                 -- если в _GET параметр pin имеет значение ON1 (строковое)
    91.                 if(_GET.pin == "ON1")then
    92.                         -- тогда вызываем метод gpio.write, который, почему-то мне кажется, выставляет на пин led1 единицу (HIGH)
    93.                         gpio.write(led1, gpio.HIGH);
    94.                 elseif(_GET.pin == "OFF1")then -- иначе, если в _GET параметр pin имеет значение OFF1
    95.                         -- тогда вызываем метод gpio.write, который выставляет на пин led1 нолик (LOW)
    96.                         gpio.write(led1, gpio.LOW);
    97.                 elseif(_GET.pin == "100")then -- иначе, если в _GET параметр pin имеет значение 100
    98.                         -- ШИМ на пине led2 с заполнением 1023
    99.                         pwm.setduty(led2,1023);
    100.                         -- запустить ШИМ на пине led2
    101.                         pwm.start(led2);
    102.                 elseif(_GET.pin == "50")then -- аналогично, но с другим заполнением (50%, видимо)
    103.                         pwm.setduty(led2,512);
    104.                         pwm.start(led2);
    105.                 elseif(_GET.pin == "10")then -- аналогично, но с другим заполнением (10%)
    106.                         pwm.setduty(led2,10);
    107.                         pwm.start(led2);
    108.                 elseif(_GET.pin == "OFF2")then -- по команде OFF2
    109.                         pwm.stop(led2); -- останавливаем ШИМ
    110.                 end -- Конец цикла if
    111.  
    112.                 -- отправляем клиенту, который послал нам этот запрос, в ответ весь тот текст, что ранее поместили в перменную buf
    113.                 client:send(buf);
    114.                 -- закрываем соединение с этим клиентом
    115.                 client:close();
    116.                 -- запускаем встроенный сборщик мусора (освобождает всю занятую до этого нашими действиями RAM память)
    117.                 collectgarbage();
    118.  
    119.         end) -- Конец inline функции "conn:on"
    120.  
    121. end) -- Конец inline функции "srv:listen"
    122.  


    Еще раз предупрежу: LUA не знаю вообще, так что все писал только по логике.
    Один раз только глянул в справочник, чтобы узнать, что в LUA комментарии, оказывается, начинаются с непривычного мне вовсе "--" =)

    А еще добило то, что, видимо, разрешено, как завершать строки (ну, точнее выполнение операторов) ";", так и не завершать их ими...
    В итоге пипец как раздражает то, что в коде присутствует и с ними вызов и без них.
    Если язык позволяет оба варианта, то нужно выбрать для себя что-то одно, и использовать это...
    И, если язык позволяет использование ";" в конце вызовов операторов, то лучше всегда ";" ставить, так как в большинстве языков программирования он обязателен - то есть проблем будет меньше потом.

    Ну и то, что я сказал уже - отступы слева, отделение логических блоков друг от друга и т.п.
    Это никак не влияет на выполнение кода, да еще и увеличивает его объем, но зато очень сильно повышает читабельность - а это в программировании очень и очень важно!

    Такие дела :)
     
    Последнее редактирование модератором: 18 мар 2015
    Victor нравится это.
  19. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Кстати, к слову сказать - посмотрел я на этот LUA, облизнулся в который раз...
    Все таки как же на нем просто все это делается, блин!..
    На самом деле мне, как web-разработчику, близки такие вот скриптовые языки высокого уровня.
    На них все как-то просто и понятно, есть множество встроенных функций, типа поиска подстрок по регулярным выражениям...
    Огорчает одно, оно же и останавливает от использования на ESP - глючность и нехватка ресурсов...
    Я привык, что написанный правильно код, должен правильно и отрабатывать на 100%. А то получается - все правильно написал, а оно падает через раз... Нет уж, нафиг!
    Но какая идея хорошая... Эх...
     
  20. exclus

    exclus Новичок

    Сообщения:
    13
    Симпатии:
    0
    Я сначала убрал код в сполер CODE , но у меня не получилось там сделать форматирование как у вас( ,выделить комментарии другим шрифтом). И спасибо большое за ваш ответ. Я уже понял, что код немного староват. Я обязательно обновлю все функции на новые.
     

Поделиться этой страницей