• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Для новичков

nikolz

Well-known member
Да я отлаживал на компе у меня ubuntu, поэтомя я пользовал gedit+lua, но на большой машине с памятью не так все просто она выделяется страницами по мере надобности интерпритатору, если нехватает ему в ход идет файл подкачки поэтому очень трудно уловить размер heap он постоянно меняется по мере необходимости.
сборщик мусора позволяет получить размер памяти используемой VM LUa
вызываете сборщик для получения размера занятой памяти
потом пишите фрагмент скрипта
потом вызываете сборщик для освобождения памяти
снова вызываете сборщик для определения занятой памяти
таким образом Вы изучаете сколько и для чего.
Это работает на всех компах и на ESP тоже
 

nikolz

Well-known member
В Lua восемь основных типов: nil (неопределенный), boolean (логический), number (числовой), string (строковый), function (функция), userdata (пользовательские данные), thread (поток), и table (таблица). Nil - это тип значения nil [пустое значение], главное свойство которого – отличаться от всех остальных значений и обозначать отсутствие пригодного значения.
Справочное руководство по языку Lua 5.1
 

glonium

New member
Да руководство я прочитал давно уже. А вот выгружается обект, когда количество ссылок на него равно 0! Это как "smart pointers" или "умные указатели" если хотите в c++. Пример
A={1,2,3,4,5} ---выделение паамяти для массива a ссылается на массив
B=A ---B ссылается на тот же массив
B=nil --- удаляет ссылку на массив, но массив в памяти
A=nil --- удаляет последнюю ссылку на массив количество ссылок на массив 0 он не кому не нужен его удаляет gc.
 

nikolz

Well-known member
Да руководство я прочитал давно уже. А вот выгружается обект, когда количество ссылок на него равно 0! Это как "smart pointers" или "умные указатели" если хотите в c++. Пример
A={1,2,3,4,5} ---выделение паамяти для массива a ссылается на массив
B=A ---B ссылается на тот же массив
B=nil --- удаляет ссылку на массив, но массив в памяти
A=nil --- удаляет последнюю ссылку на массив количество ссылок на массив 0 он не кому не нужен его удаляет gc.
---------------------
Вы не правильно поняли.
У Вас всего один "объект"- таблица A.
B - хранит ссылку на таблицу A
Поэтому B=nil - освобождает не таблицу, а память, в которой хранится ссылка на A.
A=nil освобождает память под таблицу.
Зачем Вы пытаетесь находить в других языках похожее действие? Вам так понятнее?
 

glonium

New member
Я тоже и написал что вы и сказали. Это не "похожее в других языках" а реализация механизма в самом lua, так как lua это встраиваемый язык то он распространяется в виде библиотек на c++ а в них реализован именно такой механизм. А знание реализации лучше понять логику работы. В python если хотите такая же реализация.
 

nikolz

Well-known member
Я тоже и написал что вы и сказали. Это не "похожее в других языках" а реализация механизма в самом lua, так как lua это встраиваемый язык то он распространяется в виде библиотек на c++ а в них реализован именно такой механизм. А знание реализации лучше понять логику работы. В python если хотите такая же реализация.
Если не загромождать обсуждаемый вопрос ненужной информацией, то обсуждение будет более продуктивным.
Если Вы изучаете луа, то зачем писать про питон или C++?
Если Вам важно сообщить всем о том,
что Вы знакомы с языками питон и С++,
то тогда напишите о себе отдельно,
вне обсуждения луа.
Так будет более понятнее, о чем собственно идет беседа.
 

glonium

New member
Понимание этого механизма облегчает понимание многих вещей, например замыканий.
 

nikolz

Well-known member
Понимание этого механизма облегчает понимание многих вещей, например замыканий.
Все эти механизмы хорошо написаны в документации по луа.
Особенно в API C for LUA .
Если С знаете, то рекомендую почитать исходники VMLua
и поэкспериментировать с DLL.
 

Alexgulin

New member
Здравствуйте. Купил такой модуль NodeMCU V3 Lua WI FI модуль интеграции ESP8266 + дополнительная память 32 М flash, USB serial CH340G купить на AliExpress думал чтобы меньше проблем было. Однако не могу по нему информации найти. Изначально модуль мигал встроенным светодиодом на плате. Попытался залить программу при помощи программы "Ардуино", предварительно установив необходимые модули, но теперь и светодиод не моргает и не понятно что делать. Правильно ли я понимаю что модуль надо сначала прошить. только вот что шить
 

Alexgulin

New member
читать здесь:
Uploading code - NodeMCU Documentation
программировать через ESPflasher
мне в этой программе только одну кнопку "F"нажать? или надо как то конфигурировать. Прошивка нужна или она уже идёт в программе. Чтото подсказывает что прошивку надо отдельно. А пункт "Аdvanced" там надо трогать чтото. Если брать стороннюю прошивку то где брать ту которая подходит мне
 

joner9682

New member
Доброе время суток, после некоторого времени и повозившись с прошивкой IoTmanager2.ino чего я добился, а именно: изначально сделал 5 выходов под реле, но задумавшись о датчиках решил опробовать на фотодатчике который установлен на желтой плате ESP-12.

У меня получилось сделать полное управление одного канала под датчик, учитывая что на все датчиков идет аналоговый вход со значениями от 0 до 1024, то можно использовать этот код под любой датчик, достаточно только откалибровать. И так, при достижении уровня затемненности 100 и выше приходит уведомление и вместе с уведомлением включается один из выходов который вам нужен.

P.S.: Я не нашел нигде прошивки на этом коде с датчиком поэтому и решил поделиться своей наработкой.
 

Вложения

Foss

New member
Добрый день. У меня есть прошивка для этого модуля, вот код:

-- вводим имя сети и пароль сюда
ssid,pass = "Connectify-me","12345678";

if (file.open('wificonf') == true)then
ssid = string.gsub(file.readline(), "\n", "");
pass = string.gsub(file.readline(), "\n", "");
file.close();
end

wifi.setmode(wifi.STATION)
wifi.sta.config(ssid,pass)
wifi.sta.autoconnect(1);
print('IP:',wifi.sta.getip());
--print('MAC:',wifi.sta.getmac());

led2 = 2
led1 = 1
gpio.mode(led1, gpio_OUTPUT)
gpio.mode(led2, gpio_OUTPUT)
restart=0;

gpio.write(led1, gpio.LOW);
gpio.write(led2, gpio.LOW);


t=0
tmr.alarm(0,1000, 1, function() t=t+1 if t>999 then t=0 end end)

srv=net.createServer(net.TCP, 1000)
srv:listen(80,function(conn)
conn:eek:n("receive",function(client,request)
-- парсинг для отслеживания нажатий кнопок _GET
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
-- это начало веб сайта
-- в начале ставим <html><body>, в конце каждой строки знак \
-- в конце последней строки не ставим знак \, а </body></html>
conn:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
<!DOCTYPE HTML>\
<html>\
<head>\
<title>WILDFLAME</title>\
<style>\
body {height: calc(100vh); background-color: #000; background-image: -moz-linear-gradient(top, #000 0, #005BFF 100%); background-image: -webkit-linear-gradient(top, #000 0, #005BFF 100%); background-image: -o-linear-gradient(top, #000 0, #005BFF 100%); background-image: -ms-linear-gradient(top, #000 0, #005BFF 100%); background-image: linear-gradient(to bottom, #000 0, #005BFF 100%);}\
.container{margin: 0 auto;}\
h1 {text-align:center; color:#ff0000;font-size:90px; font-family:Arial; margin: 70px auto;}\
.key1,.key2{color:#fff; font-size:60px; text-transform: uppercase; text-align:center; font-family: Arial; }\
.key1 span,.key2 span {vertical-align: middle;}\
.key1 button{margin-left: 80px;}\
.key2 button{margin-left: 50px;}\
button{background:#3F3F3F; border-radius:5px; width:100px;height:100px; -webkit-transition: all 0.3s ease;transition: all 0.3s ease; box-shadow: inset 0px 1px 0px #5A5A5A, 1px 1px 0px 0px #626262, 0px 2px 15px #FFF;}\
button:focus{background:#FBF63F; box-shadow: inset 0 0px 11px rgb(255, 255, 255);}\
button:hover{box-shadow: inset 0px 0px 8px rgb(255, 255, 255);}\
button:active{background:#FBF63F; box-shadow: inset 0 0px 11px rgb(255, 255, 255);}\
</style>\
</head>\
<body>\
<div class="container">\
<br/>\
<h1>WILDFLAME</h1>\
<br/>\
<div class="key1"><span>Start/Stop</span><a href="/?pin=ON1"><button class="btn active"></button></a></div><br/>\
<div class="key2"><span>Eco/Normal</span><a href="/?pin=ON2"><button class="btn active"></button></a></div>\
<p>&nbsp;</p>\
</div>\
</body>\
</html>')
-- это конец
-- теперь опрос нажатых кнопок
local _on = "",""
if(_GET.pin == "ON1")then
gpio.write(led1, gpio.HIGH);
tmr.delay(150000)
gpio.write(led1, gpio.LOW);
end
if(_GET.pin == "ON2")then
gpio.write(led2, gpio.HIGH);
tmr.delay(150000)
gpio.write(led2, gpio.LOW);
end


conn:eek:n("sent",function(conn) conn:close() end)
collectgarbage();


end)

end)

Использую NodeMCU lua, есть вот такая вот проблема, а именно: я заливаю прошивку в модуль через ESPlorer, у меня все отображается правильно, когда я захожу на модуль через браузер, кроме цвета самого заднего фона, он у меня отображается почему то белым, а должен отображаться сверху черным и плавно переходить к низу в синий. Может кто знает в чем может быть дело?
 

Victor

Administrator
Команда форума
я захожу на модуль через браузер, кроме цвета самого заднего фона, он у меня отображается почему то белым, а должен отображаться сверху черным и плавно переходить к низу в синий
попробуйте разными браузерами зайти. за фоновый градиент отвечает
CSS:
background-image: -moz-linear-gradient(top, #000 0, #005BFF 100%);
background-image: -webkit-linear-gradient(top, #000 0, #005BFF 100%);
background-image: -o-linear-gradient(top, #000 0, #005BFF 100%);
background-image: -ms-linear-gradient(top, #000 0, #005BFF 100%);
background-image: linear-gradient(to bottom, #000 0, #005BFF 100%);
(это для разных браузеров, т.е. moz- это для firefox, webkit - для chrome и т.д.)
 

Юрий Ботов

Moderator
Команда форума
Ограничтесь для body такой строкой:
body { height:100vh; background: linear-gradient(#000,#06f);}\

вместо ваших:
body {height: calc(100vh); background-color: #000; background-image: -moz-linear-gradient(top, #000 0, #005BFF 100%); background-image: -webkit-linear-gradient(top, #000 0, #005BFF 100%); background-image: -o-linear-gradient(top, #000 0, #005BFF 100%); background-image: -ms-linear-gradient(top, #000 0, #005BFF 100%); background-image: linear-gradient(to bottom, #000 0, #005BFF 100%);}\

линейный градиент давно все поддерживают: Can I use... Support tables for HTML5, CSS3, etc
 

joner9682

New member
Добрый день форумчане, я столкнулся с такой проблемой: мне нужно чтобы уведомления на телефон 1 раз приходили а не каждые 50 миллисекунд. Вот
Код:
if (client.connected()) {
      newtime = millis();
      if (newtime - oldtime > 50) { // 0,05 sec
        int x = analogRead(pin[8]);
        val = "{\"status\":\"" + String(x) + "\"}";
        client.publish(sTopic[8] + "/status", val ); // widget 8
        oldtime = newtime;
        if ((millis() - pushtime > 50) && (x > 900)) {

          if (val > "900") {
            digitalWrite(pin[4], HIGH);

          }

          String msg = "ADC более 900! (" + String(x) + ")";
         push(msg);
         pushtime = millis();
      
        } else if ((millis() - pushtime > 50) && (x < 900)) {


          if (x < 900) {
            digitalWrite(pin[4], LOW);

          }

          String msg = "ADC менее 900! (" + String(x) + ")";
         push(msg);
         pushtime = millis();
       
        }

      }

      int key;
      key = digitalRead(pin[9]);
      if ( stat[9] != setStatus(key) ) {
        stat[9] = setStatus(key);
        pubStatus(sTopic[9], stat[9] ); // widget 9
      }

      client.loop();
    }
  }
}

Основная задача сделать чтобы уведомления приходили только 1 раз при достижении 900 и наоборот, при том нужно сохранить быстроту срабатывания. Буду искренне благодарен.
 
Последнее редактирование:
Сверху Снизу