• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Для новичков

joner9682

New member
Лучше подскажите как этот скетч адаптировать под mqtt и что бы понимал эти строки /joner9682@gmail.com/ESP8266/CONTROL/GPIO/4: false

Код:
/* Создание WiFi точки доступа и запуск на ней Web - сервера. */
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
/* Установка имени точки доступа и пароля входа в неё */
const char *ssi = "ESP_ksm_890m";
const char *passw = "ksm890mcom";
ESP8266WebServer server(80);
const int led0 = 0; // led0 - это GPIO0
const int led2 = 2;
const int led4 = 4;
const int led5 = 5;
const int led12 = 12;
const int led13 = 13; // led13 - это GPIO13
const int led14 = 14;
const int led15 = 15;
const int led16 = 16;
/* Web - сервер из браузера виден по адресу http://192.168.4.1 */
/* Определения функций, при обращении к которым сервер будет пересылать браузеру соответствующие сообщения */
void led0_on() {
digitalWrite(led0, 0);
server.send(200, "text/html","gpio0 on");
}
void led0_off() {
digitalWrite(led0, 1);
server.send(200, "text/html","gpio0 of");
}
void led2_on() {
digitalWrite(led2, 0);
server.send(200, "text/html","gpio2 on");
}
void led2_off() {
digitalWrite(led2, 1);
server.send(200, "text/html","gpio2 of");
}
void led4_on() {
digitalWrite(led4, 0);
server.send(200, "text/html","gpio4 on");
}
void led4_off() {
digitalWrite(led4, 1);
server.send(200, "text/html","gpio4 of");
}
void led5_on() {
digitalWrite(led5, 0);
server.send(200, "text/html","gpio5 on");
}
void led5_off() {
digitalWrite(led5, 1);
server.send(200, "text/html","gpio5 of");
}
void led12_on() {
digitalWrite(led12, 1);
server.send(200, "text/html","gpio12 on");
}
void led12_off() {
digitalWrite(led12, 0);
server.send(200, "text/html","gpio12 of");
}
void led13_on() {
digitalWrite(led13, 1);
server.send(200, "text/html","gpio13 on");
}
void led13_off() {
digitalWrite(led13, 0);
server.send(200, "text/html","gpio13 of");
}
void led14_on() {
digitalWrite(led14, 0);
server.send(200, "text/html","gpio14 on");
}
void led14_off() {
digitalWrite(led14, 1);
server.send(200, "text/html","gpio14 of");
}
void led15_on() {
digitalWrite(led15, 1);
server.send(200, "text/html","gpio15 on");
}
void led15_off() {
digitalWrite(led15, 0);
server.send(200, "text/html","gpio15 of");
}
void led16_on() {
digitalWrite(led16, 0);
server.send(200, "text/html","gpio16 on");
}
void led16_off() {
digitalWrite(led16, 1);
server.send(200, "text/html","gpio16 of");
}
void pwm120() {
analogWrite(12, 0);
server.send(200, "text/html","Slider12 0");
}
void pwm121() {
analogWrite(12, 5);
server.send(200, "text/html","Slider12 1");
}
void pwm122() {
analogWrite(12, 15);
server.send(200, "text/html","Slider12 2");
}
void pwm123() {
analogWrite(12, 60);
server.send(200, "text/html","Slider12 3");
}
void pwm124() {
analogWrite(12, 100);
server.send(200, "text/html","Slider12 4");
}
void pwm125() {
analogWrite(12, 150);
server.send(200, "text/html","Slider12 5");
}
void pwm126() {
analogWrite(12, 255);
server.send(200, "text/html","Slider12 6");
}
void pwm130() {
analogWrite(13, 0);
server.send(200, "text/html","Slider13 0");
}
void pwm131() {
analogWrite(13, 5);
server.send(200, "text/html","Slider13 1");
}
void pwm132() {
analogWrite(13, 15);
server.send(200, "text/html","Slider13 2");
}
void pwm133() {
analogWrite(13, 60);
server.send(200, "text/html","Slider13 3");
}
void pwm134() {
analogWrite(13, 100);
server.send(200, "text/html","Slider13 4");
}
void pwm135() {
analogWrite(13, 150);
server.send(200, "text/html","Slider13 5");
}
void pwm136() {
analogWrite(13, 255);
server.send(200, "text/html","Slider13 6");
}
void pwm150() {
analogWrite(15, 0);
server.send(200, "text/html","Slider15 0");
}
void pwm151() {
analogWrite(15, 5);
server.send(200, "text/html","Slider15 1");
}
void pwm152() {
analogWrite(15, 15);
server.send(200, "text/html","Slider15 2");
}
void pwm153() {
analogWrite(15, 60);
server.send(200, "text/html","Slider15 3");
}
void pwm154() {
analogWrite(15, 100);
server.send(200, "text/html","Slider15 4");
}
void pwm155() {
analogWrite(15, 150);
server.send(200, "text/html","Slider15 5");
}
void pwm156() {
analogWrite(15, 255);
server.send(200, "text/html","Slider15 6");
}
void root(){
server.send(200, "text/html","<h1>This is web-server on Wifi-esp-12.<br>He controls GPIO.<br>Command:/gpioxxon /gpioxxoff</h1>");
}
void setup() {
// GPIO работают на выход
pinMode(led0, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led12, OUTPUT);
pinMode(led13, OUTPUT);
pinMode(led14, OUTPUT);
pinMode(led15, OUTPUT);
pinMode(led16, OUTPUT);
// Чтобы после включения платы светодиоды не горели, на GPIO устанавливаются следующие уровни
// Так распаяна плата
digitalWrite(led0, 1);
digitalWrite(led2, 1);
digitalWrite(led4, 1);
digitalWrite(led5, 1);
digitalWrite(led12, 0);
digitalWrite(led13, 0);
digitalWrite(led14, 1);
digitalWrite(led15, 0);
digitalWrite(led16, 1);
delay(1000);
Serial.begin(115200);
Serial.println();
Serial.print("Configuring access point...");
/* You can remove the password parameter if you want the AP to be open. */
WiFi.softAP(ssi, passw);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.on("/gpio0on", led0_on); // Если набрать адрес http://192.168.4.1/gpio0on
// то браузер получит ответ gpio0 on
server.on("/gpio0off", led0_off);
server.on("/gpio2on", led2_on);
server.on("/gpio2off", led2_off);
server.on("/gpio4on", led4_on);
server.on("/gpio4off", led4_off);
server.on("/gpio5on", led5_on);
server.on("/gpio5off", led5_off);
server.on("/gpio12on", led12_on);
server.on("/gpio12off",led12_off);
server.on("/gpio13on", led13_on);
server.on("/gpio13off",led13_off);
server.on("/gpio14on", led14_on);
server.on("/gpio14off",led14_off);
server.on("/gpio15on", led15_on);
server.on("/gpio15off",led15_off);
server.on("/gpio16on", led16_on);
server.on("/gpio16off",led16_off);
server.on("/", root);
server.on("/pwm120", pwm120);
server.on("/pwm121", pwm121);
server.on("/pwm122", pwm122);
server.on("/pwm123", pwm123);
server.on("/pwm124", pwm124);
server.on("/pwm125", pwm125);
server.on("/pwm126", pwm126);
server.on("/pwm130", pwm130);
server.on("/pwm131", pwm131);
server.on("/pwm132", pwm132);
server.on("/pwm133", pwm133);
server.on("/pwm134", pwm134);
server.on("/pwm135", pwm135);
server.on("/pwm136", pwm136);
server.on("/pwm150", pwm150);
server.on("/pwm151", pwm151);
server.on("/pwm152", pwm152);
server.on("/pwm153", pwm153);
server.on("/pwm154", pwm154);
server.on("/pwm155", pwm155);
server.on("/pwm156", pwm156);
server.begin();
Serial.println("HTTP server started");
}
// Цикл по получению пакетов от браузера
void loop() {
server.handleClient();
}
 

serrgee

New member
"Адаптировать скетч" - это общий вопрос ваших знаний и умений, а не специфическая особенность ESP8266 с которой сталкиваются все, начавшие её использовать.
Да, обратите внимание: код, который вы запостили, написан на С, а не на Lua. Его не нужно адаптировать под Arduino IDE!
 
Последнее редактирование:

joner9682

New member
Да, обратите внимание: код, который вы запостили, написан на С, а не на Lua. Его не нужно адаптировать под Arduino IDE!
Мне просто нужно что бы этот скетч работал с dioty. Я примерно понимаю как должен выглядеть скетч но не знаю как его написать.
 

serrgee

New member
Прочитайте статью. Скетч писать не надо - он уже там есть. Нужно только изменить параметры подключения (вбить данные для Dioty) и разобраться с номерами пинов, которыми требуется управлять. И за вас это никто не сделает.
 

joner9682

New member
Залил другой скетч, для ESP-01 и удачно все работает
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <string.h>

// Update these with values suitable for you.
// Your WiFi settings
#define ssid "istoki-2" // the SSID of your WiFi network
#define password "0987654321zxcvbnm" // you wifi password
// Your DIoTY settings
#define mqtt_server "mqtt.dioty.co"
#define mqtt_port 1883
#define dioty_id "joner9682@gmail.com" // email address used to register with DIoTY
#define dioty_password "03d8d43d" // your DIoTY password
#define clientNr "01" // used for client id (increment when deploying
// multiple instances at the same time)

// Some project settings
#define slash "/" // all topics are prefixed with slash and your dioty_id
#define topicConnect "/ESP8266/connected" // topic to say we're alive
#define topicIn "/ESP8266/CONTROL" // topic to subscribe
#define GPIO0 0 // using GPIO 0 rather than 2 requires less power


// no changes required after this point

// DIoTY requires topic names to start with your userId, so stick it in the front
#define concat(first, second) first second

const char* connectTopic = concat(concat(slash, dioty_id), topicConnect);
const char* inTopic = concat(concat(slash, dioty_id), topicIn);

// failing to use unique client id's will cause you connection to drop,
// so make it unique's unique by using your userId and a sequence number
const char* client_id = concat(clientNr, dioty_id);


WiFiClient espClient;
PubSubClient client(espClient);
char msg[50]; // message to publish
int value = 0; // connection attempt

void setup_wifi() {

delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
  }

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
  }
Serial.println();

// The mobile app will publish 'true' or 'false' to the topic
// Switch on the LED if an 't' was received as first character, otherwise switch it off
if ((char)payload[0] == 't') {
Serial.println("payload[0] = 't': " + HIGH);
digitalWrite(GPIO0, HIGH); // Turn the LED on
} else {
digitalWrite(GPIO0, LOW); // Turn the LED off
Serial.println("payload[0] <> 't': " + LOW);
  }

}

void setup() {
Serial.begin(115200);
Serial.println("setup...");
pinMode(GPIO0, OUTPUT); // Initialize the GPIO0 pin as an output
digitalWrite(GPIO0, LOW);
Serial.println("output " + LOW);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}

void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
++value; //connection attempt
if (client.connect(client_id, dioty_id, dioty_password)) {
Serial.println("connected");
// Once connected, publish an announcement...
snprintf (msg, 50, "Successful connect #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish(connectTopic, msg, true);
// ... and resubscribe
client.subscribe(inTopic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
    }
  }
}
void loop() {

if (!client.connected()) {
reconnect();
  }
client.loop();
}
 

joner9682

New member
Меня не устроил 1 выход и я решил залить IoT Manager2.ino все работает. Проблем не наблюдается касаемо подключений и прошивки.
 

Ed007

New member
Возник такой вопрос: nodemcu вообще то работоспособная прошивка? Или лишь поиграться? Я попробовал прошить, потом закинуть файлик на 70кб - так ни разу не удалось его полностью записать, отвалы на разных процентах есплорера. Уже думал платка глючная, записал туда смартс - все работает как часы.
@joner9682 - [off]убери свои пароли из скетча
[/off]
 
Последнее редактирование:

Ed007

New member
@dimka_f
действительно, не подумал, хотя отвалы связи происходили и на 5%-15% прогресса. Создалось впечатление, что или nodemcu или esplorer имеют проблему с работой через rx, tx.
Второй удививший момент оказался github: я хотел скачать библиотеку ds18b20.lua размером 3кб, навел на нее курсор и выбрал save as, в результате скачивается файл ds18b20.lua размером 70кб. то есть это html страница!
nodemcu-firmware/lua_modules/ds18b20 at master · nodemcu/nodemcu-firmware · GitHub
 

Юрий Ботов

Moderator
Команда форума
@dimka_f
Второй удививший момент оказался github: я хотел скачать библиотеку ds18b20.lua размером 3кб, навел на нее курсор и выбрал save as, в результате скачивается файл ds18b20.lua размером 70кб. то есть это html страница!
nodemcu-firmware/lua_modules/ds18b20 at master · nodemcu/nodemcu-firmware · GitHub
Таки в корне есть кнопка "Clone & Download". Можно спокойно загрузить Zip проекта и потом из него доставать что душе угодно.
 

glonium

New member
Народ, подскажите можно ли так передавать параметры в dofile:
-- init.lua
rez=dofile("some.lua")(params)
-- some.lua
return function (p)
--делаем что нибудь
return r
 

nikolz

Well-known member
Народ, подскажите можно ли так передавать параметры в dofile:
-- init.lua
rez=dofile("some.lua")(params)
-- some.lua
return function (p)
--делаем что нибудь
return r
В dofile передавайте параметры через глобальную таблицу
т е это параметры в главной программе, которые не имеют префикса local
Например:
--------------------
x=100;
dofile("test.lua")
---------------------
--test.lua
y=x+20 -- эту переменную можно прочитать в главной прогамме
или
local z=x+20 -- эту нельзя
---------------------
если хотите передавать как в функцию, то сделайте из вставляемого кода модуль.
 

glonium

New member
Это то понятно что через глобальные переменные передавать надо, только это моветон!
Я просто искал способ чтобы global не загромождать.
 

nikolz

Well-known member
Это то понятно что через глобальные переменные передавать надо, только это моветон!
Я просто искал способ чтобы global не загромождать.
Сомневаюсь, что Вам понятно.
Так как передавая через глобальные Вы не только не загромождаете, но и экономите память.
Извените, c Вашим другом моветоном не знаком.
 

glonium

New member
Сомневаюсь, что Вам понятно.
От чего же вы так думаете?
Так как передавая через глобальные Вы не только не загромождаете, но и экономите память.
Тут речь идёт о global namespace а не о памяти.
Извените, c Вашим другом моветоном не знаком.
Позвольте вам представить моего друга ;)
моветон — Викисловарь
 

nikolz

Well-known member
спорить не буду, так как знаю внутренности VM луа хорошо.
Вы спросили - я сказал вариант, если считаете это дурным тоном, то какой смысл давать Вам советы?
 

nikolz

Well-known member
еще замечу что namespace это из другого языка , например C#, луа нет такого понятия.
Возможно поэтому Вы и не понимаете.
 

glonium

New member
предлогаю Вашему вниманию следующую конструкцию, в которой для любой вложенности используем только 2 глобальных переменных.
Код:
--- init.lua
function call(file,p)
    if (call_stack==nil) then
        call_stack={}
    end
    table.insert(call_stack,args)
    args=p
    local res=dofile(file)
    args=table.remove(call_stack)
    return res
end

print ("enter to init.lua")
print ("args in init.lua is:",args)

local r=call("call1.lua","parametrs for call1.lua")

print ("return to init.lua")
print ("args is:",args)
print ("call1.lu result:",r)
Код:
--- call1.lua
print ("enter to call1.lua")
print ("args in call1.lua is:",args)

print ("call1.lu rezult:")
local r=call("call2.lua","args for call2.lua")

print ("return to call1.lua")
print ("args incall1.lua is:",args)

print ("call2.lu result:",r)

return "call1.lua result"
Код:
--- call2.lua
print ("enter to call2.lua")
print ("args in call2.lua is:",args)

return "call2.lua result"
Вывод
Код:
enter to init.lua
args in init.lua is:    nil
enter to call1.lua
args in call1.lua is:    parametrs for call1.lua
call1.lu rezult:
enter to call2.lua
args in call2.lua is:    args for call2.lua
return to call1.lua
args incall1.lua is:    parametrs for call1.lua
call2.lu result:    call2.lua result
return to init.lua
args is:    nil
call1.lu result:    call1.lua result
оболчка для dofile держит стек аргументов вызова и переключает их.
Что думаете? Преимущества в том что скриптам (файлам) не надо помнить как их глобальные аргументы называются и что с остальными пересекуться.
 
Сверху Снизу