Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
wifi.setmode(wifi.STATION)
wifi.sta.config("ssid","key")
wifi.sta.autoconnect(1) -- восстанавливаем соединение со станцией при потере связи
uart.setup(0,9600,8,0,1,0) -- коннектимся к ардуине
sv=net.createServer(net.TCP, 60) -- создаем сервер
global_c = nil
sv:listen(8266, function(c) -- и слушаем на порту 8266 :)
if global_c~=nil then -- много клиентов мне не надо - я управляю либо с телефона, либо с компа
global_c:close()
end
global_c=c
c:on("receive",function(sck,pl) uart.write(0,pl) end) -- что пришло по TCP валим в UART
end)
uart.on("data",4, function(data) -- Что ответила ардуина - шлем по TCP
if global_c~=nil then
global_c:send(data)
end
end,0 )
uart.write(0,"ARD:gettemp\n"); -- так отправляется запрос
uart.on("data", "\n",
function(data)
-- тут разбираются ответы
_,_,humidity,temp = data:find("OK: ([%d.]+),([%d.]+)");
end, 0);
К сожалению, Arduino Uno не в состоянии обеспечить такой ток
ESP8266 в прошивке AT периодически теряет точку доступа. И не умеет к ней переподключаться, единственный способ это сделать — RESET. Поэтому варианта тут два — ставить NodeMCU или вводить доп.хардверный костыль на Ардуине.
void loop() {
// при потере подключения - пытаемся переподключиться
while (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
if (WiFi.status() == WL_CONNECTED && ! mqttClient.connected()) {
if (mqttClient.connect(mqttId)) {
Serial.println("MQTT connected.");
} else {
Serial.println("MQTT connect fail.");
}
delay(500);
}
if (mqttClient.connected() && lastTime+10000 < millis()) {
mqttClient.publish("chart/chart1", "rand1=" + String(random(200,300)) + "&rand2=" + String(random(100, 200)));
Serial.println("MQTT published.");
lastTime = millis();
}
}
На Lua весь функционал вписывается в 20 строк, и это весьма удобно.
Добавим к этому код «сетевой карты к Ардуине», ну чтобы Ардуина общалась с сервером — это сколько еще строк?
#include <ESP8266WiFi.h>
#include <WiFiServer.h>
#include <MQTT.h>
#include <PubSubClient.h>
#define WIFI_SSID "test_ap"
#define WIFI_PWD "12345678"
IPAddress mqttIp(192, 168, 0, 220);
PubSubClient mqttClient(mqttIp);
String mqttId = "token";
long int lastTime = 0;
void setup() {
Serial.begin(115200);
Serial.println("Started.");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PWD);
}
void loop() {
while (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
if (WiFi.status() == WL_CONNECTED && ! mqttClient.connected()) {
if (mqttClient.connect(mqttId)) {
Serial.println("MQTT connected.");
} else {
Serial.println("MQTT connect fail.");
}
delay(500);
}
if (mqttClient.connected() && lastTime+10000 < millis()) {
mqttClient.publish("chart/chart1", "rand1=" + String(random(200,300)) + "&rand2=" + String(random(100, 200)));
Serial.println("MQTT published.");
lastTime = millis();
}
}
void connectWiFi(void) {
Serial.print("Connect to Wi-Fi");
int retries = 0;
while (WiFi.status() != WL_CONNECTED) {
retries++;
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("Wi-Fi connected.");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
ESP.getFreeHeap(). В handleNotFound() иллюстрируется работа с GET данными.def file_compile(self, path):
log.info('Compile '+path)
cmd = 'node.compile("%s")' % path
self._port.write(cmd + '\r\n')
r = self.dump()
log.info(r)
return r
Arduino + ESP8266 с нуля на примере Wi-Fi термометра, часть первая