• Система автоматизации с открытым исходным кодом на базе 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 держит стек аргументов вызова и переключает их.
Что думаете? Преимущества в том что скриптам (файлам) не надо помнить как их глобальные аргументы называются и что с остальными пересекуться.
 
Сверху Снизу