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

Общие вопросы по Arduino IDE для ESP8266

vvzvlad

New member
выложите код посмотреть, возможно дело в чем-то еще.
Код:
#include <ESP8266WiFi.h>
int pin0 = 0;
const char* ssid     = "MikroTik-951";
const char* host = "54.76.115.213";
const char* password = "FERG3N76";
const int port = 1235;
int buttonState = 0;

int status = 0;
WiFiClient client;
int flag;
int wifi_iteration=0;

void setup() {
  Serial.begin(115200);
  pinMode(0, INPUT);
  delay(2000);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    if (wifi_iteration < 40)
    {  
    delay(200);
    Serial.print(".");
    wifi_iteration++;
    }
    else
    {
      Serial.print("\n\rError conenction. Wait WD reset...");
      while(1) {}
    }

  
  }

  Serial.println("");
  Serial.println("WiFi connected. IP address: ");
  Serial.println(WiFi.localIP());
  client.connect(host, port);
  Serial.println("Server connected.");
  attachInterrupt(0, send, RISING);
  Serial.println("Interrupt attached.");

}


void loop() {
  //buttonState = digitalRead(0);
  if (flag == 1)
  {
  client.print(String("1\n"));
  //Serial.println("Send command");

  while(client.available()){
    String line = client.readStringUntil(10);
    Serial.print(line);
    Serial.print("\n\r");
  }
  delay(300);
  flag = 0;
  }
  
}

void send()
{
flag=1;
}
 

igrr

Moderator
Команда форума
и esp перестала стартовать
Это мы напоролись на проблему с неправильной работой ROM-функции, стирающей облать флэша. При заливке сегмента .irom0.text затирался сектор флэша по адресу 0 и чип, понятное дело, не мог загрузить программу.
Оказывается, на форуме информация была еще в феврале, но в тулах для прошивки (esptool.py и esptool-ck) этот момент не был исправлен до сих пор (было только сообщение "подождем пока авторы пофиксят" :D).
Я добавил фикс в esptool-ck, в текущей версии проблема должна быть исправлена.
 

vvzvlad

New member
@vvzvlad а как (между чем и чем) вы измеряете величину задержки?
Между платой и программой на телефоне(simbian). Нажимаю одновременно две кнопки(на плате и на телефоне), они отправляет запросы на один и тот же сервер на разные порты, сервер считает разницу между запросами. Повторяем сто раз для получения более-менее достоверного значения.
 

pvvx

Активный участник сообщества
@vvzvlad а как (между чем и чем) вы измеряете величину задержки?
Между соединением и выводом символов "WiFi connected. IP address: " + "Server connected." + "Interrupt attached." на 115200 и задержкой delay(300). Вроде так :)
Смотрим, сколько времени потребовалось эксплореру на запрос простейшего ответа по HTTP от модуля подключенного к AP станции:
TimeHTTP.gif
да включеной отладкой в UART1 у модуля:
Код:
srv[80] 192.168.1.2:3255 [1] listen
srv[80] 192.168.1.2:3255 [1] read: 255 of253[/web.cgi] GET f[/web.cgi] head[195]:200 send: cf253 dis
srv[80] 192.168.1.2:3255 [1] disconnect
Итого на всё - 2.175964-2.171922 = 0.004042 сек. Это от старта соединения по HTTP до его полного закрытия, с учетом тормоза самого эксплорера и проверок на всевозможные вирусы...
А на запрос HTTP к модулю и ответ файлом всего 2.174861-2.1731 = 0.001761 сек. При этом модуль разобрал запрос от эксплорера на все cookie, возможную авторизацию и прочие компоненты запроса по HTTP 1.1, открыл файл и передал его :)
Посмотрим, сколько требуется модулю на передачу esp.gif размером в 6571 байт:
Explorer:
esp_gif_explorer.gif
Google Chrome:
esp_gif_google_chrome.gif
Алгоритмы приема у Explorer и Google Chrome разные. Алгоритм Google Chrome пока не поддерживается в Arduino IDE - Chrom будет принимать от модуля с Arduino пока авторы его не оптимизируют - макс десяток килобайт в секунду.
И эксплореры всегда открывают по несколько соединений для запроса файла... По умолчанию - 5 шт, т.к. хотят качать в несколько потоков, предполагая что будут встроенные ссылки в HTML на другие файлы...
В связи ещё с сильными различиями версий HTTP и типов запросов без специализированного сервера HTTP с минимальной, но необходимой функциональностью, работа Arduino как сервера HTTP не возможна. Т.е. её нельзя будет включать в глобальный инет - или помрет или будет лажать...
 
Последнее редактирование:

tsrman

New member
переменную int flag; желательно объявлять как volatile

опять же у Вас delay(300) после нажатия кнопки пройдет от 0 до 300мс прежде чем пойдет отправка. Все таки как Вы измеряете задержку?
 

vvzvlad

New member
Между соединением и выводом символов "WiFi connected. IP address: " + "Server connected." + "Interrupt attached." на 115200 и задержкой delay(300). Вроде так :)
опять же у Вас delay(300) после нажатия кнопки пройдет от 0 до 300мс прежде чем пойдет отправка. Все таки как Вы измеряете задержку?
Нет же. Задержка измеряется от нажатия кнопки до прихода пакета на сервер. Срабатывает прерывание на GPIO0, взводится флаг, который проверяется в главном цикле, при следующей итерации цикла, если флаг true - отправляются два символа по заранее открытому соединению.
Я же написал, как я измеряю саму задержку. Я не знаю абсолютных цифр, я могу только сравнивать esp8266 с чем-то другим. Сейчас это телефон с программой под simbian. Я нажимаю одновременно кнопку на GPIO0 и на телефоне, а зачем смотрю по логам сервера, кто прислал пакет быстрее и на сколько. Повторяю много раз, чтобы собрать статистику. Сейчас esp8266 делает это в среднем на 100мс дольше, чем телефон. HTTP и прочего так просто нет - только два байта в открытый tcp порт.
 

Victor

Administrator
Команда форума
На нашем форуме появилась возможность загружать свои (или чьи-то еще) скетчи для Arduino IDE в специальный раздел (новая ссылка в верхнем левом углу - Ресурсы)
Поддержка версий (не гитхаб конечно, но все же), рецензии, история изменений
После того, как вы загрузили свой скетч (файлом или как пост через тег CODE) автоматически создается тема на форуме для обсуждения в этом новом разделе
Если возникли вопросы, то обсуждение нововведений на форуме здесь.
 

pvvx

Активный участник сообщества
HTTP и прочего так просто нет - только два байта в открытый tcp порт.
Это без разницы - раз чистый TCP и открытое соединение, то должно быть ещё быстрее.
Функция в SDK срабатывания кнопки = долгодум.
Намудрили вы с этим:
Срабатывает прерывание на GPIO0, взводится флаг, который проверяется в главном цикле, при следующей итерации цикла, если флаг true - отправляются два символа по заранее открытому соединению.
Кода инициализации прерывания на GPIO0 не дали. Всем остается только гадать.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Срабатывание прерывания и промежуток между итерациями главного цикла занимают больше 100мс?
Неизвестно - кода то этого вы не дали. Что тама у вас вызывается - известно только вам.
Я могу строить только предположения :)
 

vvzvlad

New member
Кода инициализации прерывания на GPIO0 не дали. Всем остается только гадать.
Так эээ, вот он:
Код:
attachInterrupt(0, send, RISING);
И без разницы, если я в главном цикле напишу
Код:
  buttonState = digitalRead(0);
  if (buttonState == 1)
Задержка будет та же. Да и по логике вещей вариант с прерыванием должен быть быстрее - легче и быстрее проверить флаг(который взведется по прерыванию сразу после изменения состояния пина), чем вызывать долгую digitalRead, в которой у них там проверок 10 делается.
 

vvzvlad

New member
Дык в главном цикле у вас delay(300). Т.е. опрос идет с паузой в 300 mc?
А он не в главном цикле, задержка срабатывает только после отправки символа. А flag проверяется без задержек.
Код:
void loop() {
  if (flag == 1)
  {
    client.print(String("1\n"));
    while (client.available()) {
      String line = client.readStringUntil(10);
      Serial.print(line);
      Serial.print("\n\r");
    }
    delay(300);
    flag = 0;
  }
}
Это и защита от дребезга, и от частой посылки пакетов. Но первый пакет отправляется без задержек
 

pvvx

Активный участник сообщества
Вот тут какая-то фигня: https://github.com/anakod/Sming/blob/master/Sming/SmingCore/Interrupts.cpp#L112
Подтверждает прерывание только у назначенных функций, а если функция = NULL - то шо будет? (зависон?) И где переназначение повтора, т.е. когда оно сработает?
Для повтора надо вызвать void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state) - иначе следующего прерывания не будет. Аппаратная фигня - сбрасывается и её надо заряжать заново.
Код:
void GPIO_intr_handler(void * test_edge)
{
    uint32 gpio_status = GPIO_STATUS;
    GPIO_STATUS_W1TC = gpio_status;
    if(gpio_status & (1 << GPIO_TEST)) *((uint32 *)test_edge) = *((uint32 *)test_edge) + 1;
    gpio_pin_intr_state_set(GPIO_TEST, GPIO_PIN_INTR_ANYEDGE);
}
Код:
// ROM:40004D90
void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state)
{
    ets_intr_lock();
    volatile uint32 * gpio_pinx = &GPIO_PIN0;
    uint32 x = gpio_pinx[i] & 0xC7F;
    gpio_pinx[i] = x | intr_state << 7;
    ets_intr_unlock();
}
---
Если этот вариант, то тут четко написано 50ms :) : https://github.com/scottjgibson/esp8266/blob/master/esp_iot_sdk_v0.6/examples/IoT demo/driver/key.c#L154
Определитесь - какой вариант "дурины" работает у вас.

У меня прерывание по GPIOx срабатывает на RS-232 символы при 3MBaud. Их счетом за время я определяю - это нажата кнопка на RX или просто модуль перезагрузился во время передачи ему по RS чего-то :) Т.е. аппаратная скорость срабатывания очень высокая...

Но первый пакет отправляется без задержек
Вот и нашли ошибочку - надо заново заряжать прерывание... Ну и "вылечить" код Sming.
 
Последнее редактирование:

tsrman

New member
А он не в главном цикле, задержка срабатывает только после отправки символа. А flag проверяется без задержек.
что-то я не уверен что при срабатывании прерывания, цикл loop сбрасывается на начало, а не висит дальше в delay пока он не кончится. Может кто-то прокоментирует?
 
Последнее редактирование модератором:

vvzvlad

New member
Вот и нашли ошибочку - надо заново заряжать прерывание...
Я имел ввиду, что он отправляется без delay(300), а задержка отрабатывает после него. Да, если во время задержки нажать кнопку - она не сработает. Но после окончания задержки прерывание все равно продолжает срабатывать, даже если я его не взвожу заново.

что-то я не уверен что при срабатывании прерывания, цикл loop сбрасывается на начало, а не висит дальше в delay пока он не кончится. Может кто-то прокомментирует?
Висит дальше, с чего бы ему сбрасываться. Я-то рассматриваю ситуацию, когда прерывание активно, но не сработало, главный цикл работает вхолостую - постоянно проверяет флаг, а так как он false - заканчивается и начинается заново. При срабатывании прерывания в этом режиме при следующей итерации он пройдет проверку на true флага, и отправит символ, после чего заснет на 300мс. Да, если в эти 300мс нажать кнопку - она даже не сработает - флаг-то установится, но не проверится, и даже более того - после задержки он обнулится. Но у меня частота нажатий будет раз в пару секунд, мне это не важно.
 
Сверху Снизу