#ifdef ESP32
#include <WiFi.h>
#define PIN 34
#else
#include <ESP8266WiFi.h>
#define PIN A0
#endif
WiFiServer server(80);
int curRange=0;
char ssid[] ="ssid";
char pass[]= "pass";
String header_1 = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
String html_1 = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<meta charset='utf-8'>
<title>Hello world</title>
<style>
html{font-family: arial,sans-serif; font-size:100%}
.big {font-size: 150%;}
</style>
</head>
<body>
<p><span id="rdm" class="big"></span></p>
</body>
<script>
var host;
function processReceivedCommand(data)
{
var value= parseInt(data);
document.getElementById('rdm').innerHTML = value;
}
function loadData()
{
const request = new XMLHttpRequest();
request.timeout=30000;
request.open('GET', '/range');
request.setRequestHeader('Content-Type', 'application/x-www-form-url');
request.addEventListener('ontimeout', () => {
setTimeout(loadData, 100);
});
request.addEventListener('readystatechange', () =>
{
if(request.readyState === 4)
{
processReceivedCommand(request.responseText);
setTimeout(loadData, 100);
}else{
// console.log("readyState ="+request.readyState);
}
});
request.send();
}
window.onload = function(e){
host = window.location.hostname;
loadData();
}
</script>
</html>
)=====";
void setup() {
Serial.begin(115200);
initWeb(true);
pinMode (PIN, INPUT);
}
void loop() {
for(int i=0;i<10;i++)
{
int u = analogRead(PIN);
}
#ifndef ESP32
delay(10);
#endif
curRange=millis();
processWeb();
}
void initWeb( bool softAP) {
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
if(softAP){
WiFi.softAP("Range", "1234567890");
delay(500);
WiFi.softAPConfig(local_ip, gateway, subnet);
Serial.print(F("[Started] ")); Serial.println(WiFi.softAPIP());
delay(100);
}else{
WiFi.begin(ssid,pass);
int count = 0;
while ( (WiFi.status() != WL_CONNECTED) && count < 17) {
Serial.print("."); delay(500); count++;
}
if (WiFi.status() != WL_CONNECTED){
Serial.println(""); Serial.print("Failed to connect to "); Serial.println(ssid);
while(1);
}
Serial.print(F("[CONNECTED]")); Serial.println(WiFi.localIP());
}
server.begin();
}
void processWeb(){
String header;
unsigned long currentTime = millis();
unsigned long previousTime = 0;
const long timeoutTime = 2000;
WiFiClient client = server.available(); // Check if a client has connected
if (!client) { return; }
currentTime = millis();
previousTime = currentTime;
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected() && currentTime - previousTime <= timeoutTime)
{
currentTime = millis();
if (client.available()) {
char c = client.read(); // read a byte, then
header += c;
if (c == '\n'){
if (currentLine.length() == 0)
{
if (header.indexOf("GET /range") >= 0){
client.println(String(curRange));
client.println();
break;
} else if (header.indexOf("GET /") >= 0) {
client.println( header_1 );
client.println();
client.println(html_1);
client.println();
break;
}
} else {
currentLine = "";
}
} else if (c != '\r') { currentLine += c; }
}
}
}
ну да, напрашивается новое правило работы с esp8266Ну очень интересная инфа, спасибо!
как там в комментах написано проблемы в основном у проприентарных девайсов, для самопальных все куда гуманнее.Сам процесс подключения к устройству через Web Bluetooth - не для слабонервных.
Если вместо одного корпуса потребуется два, то я предпочту bluepill с подцепленным к нему ESP-01 по uart.ну да, напрашивается новое правило работы с esp8266
если вам нужны GPIO входы и выходы, используйте внешние платки на i2c.
Когда-то давно я имел танцы с бубнами с bluetooth, в результате чего у меня о нем остались весьма негативные впечатления.как там в комментах написано проблемы в основном у проприентарных девайсов, для самопальных все куда гуманнее.
Вы наверно не пробовали ничего с BLE.Сам процесс подключения к устройству через Web Bluetooth - не для слабонервных.
Во-первых, API в целях безопасности сделано так, что соединение с устройством может быть программно инициировано только как результат клика на что-нибудь в браузере (именно поэтому во всех примерах всегда есть некая html кнопка, при нажатии на которую вызывается функция, содержащая вызов navigator.bluetooth.requestDevice() ).
При вызове requestDevice() Chrome открывает окно с надписью по центру "Совместимые устройства не найдены" (в этом месте нормальный пользователь уже завязал бы с таким сайтом, но мы не нормальный пользователь, верно? Если подождать 10...30 секунд, то с вероятностью процентов 80 в списке начнут появляться обнаруженные устройства (соответственно, с вероятностью процентов 20 не появится ничего, и это не связано с уровнем сигнала или работоспособностью устройств - просто где-то что-то не срослось).
Web Bluetooth
Поразбирался тут с Web Bluetooth . Это такой API в Chrome, через который можно из браузера коннектиться к BLE устройствам (только BLE) и работать с ними. Короче IoT и вот это вот всё ;) Смысл в том, что после соединения с устройством доступен некий набор характеристик (это типа портов в которые…cr-it.livejournal.com
Это всё выдумки. Есть флаг в бинарных либах, который отрубает доступ к ADC у дров.Ну что сказать, есть такая буква в этом слове Но как я понял дело тут вовсе не в том, что операции чтения аналогового входа занимают много ресурсов, а в том что этот вход для своих целей использует WiFi
Фича эта известна еще с 2016 года https://github.com/esp8266/Arduino/issues/1634
Вот пример максимально упрощенного кода демонстрирующего проблему.
При сборке вашего “скетча” в Arduino вываливается несколько сотен строк с разными wraning. Целая простыня. Среди них не найти своих ощибок…Ну что сказать, есть такая буква в этом слове Но как я понял дело тут вовсе не в том, что операции чтения аналогового входа занимают много ресурсов, а в том что этот вход для своих целей использует WiFi
Фича эта известна еще с 2016 года https://github.com/esp8266/Arduino/issues/1634
Вот пример максимально упрощенного кода демонстрирующего проблему.
Если закомментировать в loop вызов delay(10) на esp8266 то Wifi глохнет.
На esp32 все работает без проблем и с delay и без него.
C:#ifdef ESP32 #include <WiFi.h> #define PIN 34 #else #include <ESP8266WiFi.h> #define PIN A0 #endif WiFiServer server(80); int curRange=0; char ssid[] ="ssid"; char pass[]= "pass"; String header_1 = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; String html_1 = R"=====( <!DOCTYPE html> <html> <head> <meta name='viewport' content='width=device-width, initial-scale=1.0'/> <meta charset='utf-8'> <title>Hello world</title> <style> html{font-family: arial,sans-serif; font-size:100%} .big {font-size: 150%;} </style> </head> <body> <p><span id="rdm" class="big"></span></p> </body> <script> var host; function processReceivedCommand(data) { var value= parseInt(data); document.getElementById('rdm').innerHTML = value; } function loadData() { const request = new XMLHttpRequest(); request.timeout=30000; request.open('GET', '/range'); request.setRequestHeader('Content-Type', 'application/x-www-form-url'); request.addEventListener('ontimeout', () => { setTimeout(loadData, 100); }); request.addEventListener('readystatechange', () => { if(request.readyState === 4) { processReceivedCommand(request.responseText); setTimeout(loadData, 100); }else{ // console.log("readyState ="+request.readyState); } }); request.send(); } window.onload = function(e){ host = window.location.hostname; loadData(); } </script> </html> )====="; void setup() { Serial.begin(115200); initWeb(true); pinMode (PIN, INPUT); } void loop() { for(int i=0;i<10;i++) { int u = analogRead(PIN); } #ifndef ESP32 delay(10); #endif curRange=millis(); processWeb(); } void initWeb( bool softAP) { IPAddress local_ip(192,168,1,1); IPAddress gateway(192,168,1,1); IPAddress subnet(255,255,255,0); if(softAP){ WiFi.softAP("Range", "1234567890"); delay(500); WiFi.softAPConfig(local_ip, gateway, subnet); Serial.print(F("[Started] ")); Serial.println(WiFi.softAPIP()); delay(100); }else{ WiFi.begin(ssid,pass); int count = 0; while ( (WiFi.status() != WL_CONNECTED) && count < 17) { Serial.print("."); delay(500); count++; } if (WiFi.status() != WL_CONNECTED){ Serial.println(""); Serial.print("Failed to connect to "); Serial.println(ssid); while(1); } Serial.print(F("[CONNECTED]")); Serial.println(WiFi.localIP()); } server.begin(); } void processWeb(){ String header; unsigned long currentTime = millis(); unsigned long previousTime = 0; const long timeoutTime = 2000; WiFiClient client = server.available(); // Check if a client has connected if (!client) { return; } currentTime = millis(); previousTime = currentTime; String currentLine = ""; // make a String to hold incoming data from the client while (client.connected() && currentTime - previousTime <= timeoutTime) { currentTime = millis(); if (client.available()) { char c = client.read(); // read a byte, then header += c; if (c == '\n'){ if (currentLine.length() == 0) { if (header.indexOf("GET /range") >= 0){ client.println(String(curRange)); client.println(); break; } else if (header.indexOf("GET /") >= 0) { client.println( header_1 ); client.println(); client.println(html_1); client.println(); break; } } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } } } }
Ну там примерно так и написано, только народ утверждал что по этому выводу контролируется мощность передатчика.По ADC чип, предположительно, т.к. давно это было и всё не разгребал, определяет нагрев и рубит RF (throttling).
Попробуйте выставить плату "Lolin Wemos D1 R2". У меня ошибок нет. Играясь разными типами плат, можно добиться неработоспособности даже встроенного блинка(это не шутка, когда я впервые с этим столкнулся чуть не поседел ). Ну и ошибку бы неплохо глянуть...Исправьте – нехорошо это для “популярного среди антикваров продукта”.
Похоже на слетевшую скорость порта во время загрузки прошивки. Видите в конце [Started] 192.168.1.1 ? Вот тут только и подключился скетч.И выводит какие-то иероглифы:
Познакомьтесь это меню вашего роутера. Отключите автоподключение своей домашней точки доступа в настройках телефона. Они все вумные стали, видят что на Range нет интернета и сразу переподключаются на более с их точки зрения правильную.Ввел “192.168.1.1” в эксплорере и получил это:
Оно с ней и завязано, по дизасм.Ну там примерно так и написано, только народ утверждал что по этому выводу контролируется мощность передатчика.
Ошибки появятся в кодах самой Arduino - от её горе-писателей, когда включите опцию gcc показывать всю их кривизну.Попробуйте выставить плату "Lolin Wemos D1 R2". У меня ошибок нет. Играясь разными типами плат, можно добиться неработоспособности даже встроенного блинка(это не шутка, когда я впервые с этим столкнулся чуть не поседел ). Ну и ошибку бы неплохо глянуть...
Это кривость ESP8266. Кривизна в кодах ROM от Espressif.Похоже на слетевшую скорость порта во время загрузки прошивки. Видите в конце [Started] 192.168.1.1 ? Вот тут только и подключился скетч.
Это на компе и проводная сеть у меня 192.168.1.1. Никаких "вумных" роутеров в жизнь не видел.Познакомьтесь это меню вашего роутера. Отключите автоподключение своей домашней точки доступа в настройках телефона. Они все вумные стали, видят что на Range нет интернета и сразу переподключаются на более с их точки зрения правильную.
Например вБлин - а как мне подключиться к другой WiFi для Инет, когда в меню выбора WiFi торчит только соединение с этой "Range"?
void setup() {
Serial.begin(115200);
initWeb(true);
pinMode (PIN, INPUT);
}
Тогда, боюсь, это не проблема моего скетча и не мне ее решатьОшибки появятся в кодах самой Arduino
У меня кстати сейчас не плюется. заливаю раз за разом - терминал чистый. Хотя такую красоту я видел. мне она не мешает. в теории можно попробовать поставить скорость заливки скетча=скорости порта.Это кривость ESP8266.
Тогда вам надо менять сетку примеру. Например банально закомментировать следующие строкиЭто на компе и проводная сеть у меня 192.168.1.1.
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
А чей ASUS RT-AX92U мы тогда походу похакали?Никаких "вумных" роутеров в жизнь не видел.
Я решил что вы с телефона на нее зашли. Мой редми все время с нее соскакивать пытался на домашнюю wifi сетку. А раз вы зашли по локалке, у вас в сети, банальная коллизия случилась, образовались два компа с одним адресом - ардуина и ваш основной роутер. роутер стоял раньше по списку вот вы на него и попали.Ардуино на это неспособно уже много лет.
И это столько проблем с WiFi чтобы передать 10 байт в сек?Я решил что вы с телефона на нее зашли. Мой редми все время с нее соскакивать пытался на домашнюю wifi сетку. А раз вы зашли по локалке, у вас в сети, банальная коллизия случилась, образовались два компа с одним адресом - ардуина и ваш основной роутер. роутер стоял раньше по списку вот вы на него и попали.
Я же вроде написал? Замените в моем первоначальном примере функцию initWeb на следующуюНапишите алгоритм как не свершить колизии по IP адресам (и как оставить пользователю подключенный инет по WiFi).
void initWeb( bool softAP) {
WiFi.begin("ssid вашего роутера wifi","пароль к нему");
int count = 0;
while ( (WiFi.status() != WL_CONNECTED) && count < 17) {
Serial.print("."); delay(500); count++;
}
if (WiFi.status() != WL_CONNECTED){
Serial.println(""); Serial.print("Failed to connect to "); Serial.println(ssid);
while(1);
}
server.begin();
}
А кто запрещает поднять на роутере выделенную сетку специально для esp-шек? И пароля ей не надо. Как вошел так сразу и законнектился.Но это не катит для носимых устройств. Остается только BLE.
Не забываем, что это только версии и ничего более.Ну там примерно так и написано, только народ утверждал что по этому выводу контролируется мощность передатчика.