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

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

bolwoi

New member
Скажите, а каков диапазон и шаг частоты работы I2C ?

И еще порция приходов по UDP.
Код:
Код:
char ClientIPMask[] = "192.168.100.255";
unsigned int ClientPort = 53333;
unsigned int localPort = 55123;      // local port to listen on
byte packetBuffer[255]; //buffer to hold incoming packet
char  ReplyBuffer[] = "acknowledged";       // a string to send back
byte OutBuf [10] = {0};
WiFiUDP Udp;
byte value = 0;
int packetSize = 0;
int i = 0;

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true); // <- в функции setup, после Serial.begin
  WiFi.mode(WIFI_STA);//: выбрать режим WIFI_AP (точка доступа), WIFI_STA (клиент), илиr WIFI_AP_STA (оба режима одновременно).
  Serial.println("BEGINING"); 
  WiFi.begin(ssid, pass);
  while ( WiFi.status() != WL_CONNECTED)
  {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    delay(3000);
  }
  Serial.println("Connected to wifi");
  printWifiStatus();
  delay (10);
  Udp.begin(localPort);
  delay (10);}

void loop()
{ 
  packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.print("Received packet of size ");   Serial.print(packetSize);   Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();        Serial.print(remoteIp);     Serial.print(", port ");
    Serial.println(Udp.remotePort());

    int len = Udp.read(packetBuffer, 255);     
    Serial.print("Contents: ");    Serial.print(len );    Serial.println("Bytes");   
  
    for (i = 0; i <= 3; i++)  { Serial.print(packetBuffer[i]); Serial.print("   "); }   Serial.println(packetBuffer[4]);
  
    Serial.println(system_get_free_heap_size());
  }
  
  OutBuf[0] = value;   OutBuf[1] = value+1;   OutBuf[2] = value+2;   OutBuf[3] = value+3;   OutBuf[4] = value+4;  OutBuf[5] = value+5;
  OutBuf[6] = value+6;  OutBuf[7] = value+7;  OutBuf[8] = value+8;  OutBuf[9] = value+9; 
/* Udp.beginPacket("192.168.100.255", 53333);
  Udp.write(OutBuf, 10);
  Udp.endPacket();  */ 
  value++; 
  delay (250); 
// Serial.println(system_get_free_heap_size()); 
}

void printWifiStatus()
{ 
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip); 
}

Лог:
Код:
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
ip:192.168.100.18,mask:255.255.255.0,gw:192.168.100.1
Connected to wifi
SSID: TP-LINK_7D9E32
IP Address: 192.168.100.18
:rn 5

Received packet of size 5From 192.168.100.29, port 58205
:rd 5, 5, 0

Contents: 5Bytes
55   56   57   58   59
34896
:rn 5

Received packet of size 5From 192.168.100.29, port 58205
:rd 5, 5, 0

Contents: 5Bytes
55   56   57   58   59
34896
:rn 5

Received packet of size 5From 192.168.100.29, port 58205
:rd 5, 5, 0

Contents: 5Bytes
55   56   57   58   59
34896

Клиент UDP слушает порт 55123, а в программе отображается порт 58205.
Сами данные адекватны.

Есть еще одна непонятка - когда я откоменчиваю строки передачи по UDP, то прием байтов вообще не происходит. То есть при одновременных приеме/передаче пакетов, работает только передача.
 
Последнее редактирование:

igrr

Moderator
Команда форума
Скажите, а каков диапазон и шаг частоты работы I2C ?
https://github.com/esp8266/Arduino/issues/15 — тут обсуждается тема калибровки функции setClock. Как пишет автор, maximum frequency I got was ~307kHz with set values around 180000-200000.
Т.е. при setClock(180000) будет около 300kHz. А вообще надо промерить, как зависит частота от значения delay, которое используется внутри библиотеки, и зашить в код калибровочные значения. Есть кто-нибудь с осциллографом? :)

Received packet of size 5From 192.168.100.29, port 58205

Клиент UDP слушает порт 55123, а в программе отображается порт 58205.
Не вижу противоречия — хост 192.168.100.29 пересылает пакет с порта 58205 на ваш порт 55123. 58204 — порт на одной стороне, 55123 — на другой.

Есть еще одна непонятка - когда я откоменчиваю строки передачи по UDP, то прием байтов вообще не происходит. То есть при одновременных приеме/передаче пакетов, работает только передача.
Можно лог для этой ситуации? Просто ровно эта проблема была исправлена позавчера, и несколько человек подтвердили, что все окей. Насколько я понимаю, я вам отправил архив с новой версией. Неужели я вчера снова все сломал?..
 

bolwoi

New member
Не вижу противоречия — хост 192.168.100.29 пересылает пакет с порта 58205 на ваш порт 55123. 58204 — порт на одной стороне, 55123 — на другой.
Это я с протоколом не разобрался, наверное.
Можно лог для этой ситуации? Просто ровно эта проблема была исправлена позавчера, и несколько человек подтвердили, что все окей. Насколько я понимаю, я вам отправил архив с новой версией. Неужели я вчера снова все сломал?..
Я работаю сейчас на сборной солянке, которую вчера приготовил. Я так понимаю, что той версии сборки, ссылку на которую Вы мне дали, не исправлен баг с отправкой ¿ Тоесть там необходимо поправить файлы из предыдущих постов¿
Лог, в принципе, ничего полезного ее показывает. Только то, что отправляются данные, и все. А то, что принимаются - ни слова.
 

igrr

Moderator
Команда форума
@bolwoi да, тогда нужно заменить еще те три файла, что я прикреплял выше (WifiUdp.h, .cpp, UdpContext.h).
 

bolwoi

New member
Скачал последнюю версию (по последней ссылке), заменил там три выше указанных файла.
Та же проблема с одновременными приемом и передачей (коменчу передачу, тогда принимает).
 

Telek

New member
Проверил последний билд. sqrt заработал, pow дает ошибку
Код:
d:/arduino-1.6.1/hardware/tools/esp8266/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: C:\Users\jd\AppData\Local\Temp\build531319777593055206.tmp/sketch_apr14b.cpp.elf section `.text' will not fit in region `iram1_0_seg'
collect2.exe: error: ld returned 1 exit status
Ошибка компиляции
 

Telek

New member
Еще непонятный момент. Использую WiFiClient(Ниже часть кода).
Иногда случается так, что ответ на GET запрос не приходит. После этого в моем случае пропадает 168 байт оперативы. По идее, этот client должен позже отвалиться по таймауту и освободить память, но этого судя по всему не происходит. Как с этим бороться?
Код:
 if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    HostConnectionFailedCount++;
    return;
  }

  client.print(url + "\r\n");

  Serial.print("Wait");
  int wait_cnt=0;

  // Жду до 20 сек, а вдруг всеже прийдет ответ
  while ((!client.available()) && (wait_cnt<40)){
    Serial.print(".");
    wait_cnt++;
    delay(500);
  }

  Serial.println();
  if (wait_cnt>=40){
    Serial.println("wait_cnt 40");
  }

  // Читаем что пришло(если пришло)
  while (client.available()) {
    Serial.print("-");
    String line = client.readStringUntil('\r');
    Serial.print(line);

  }

  // Разрываем соединение
  client.stop();

  // Смотрим сколько памяти осталось
  Serial.println(system_get_free_heap_size());

Лог(он слегка от другой версии, но основаная проблема видна). Число после "closing connection" это размер доступной памяти.
Код:
connecting to 184.106.153.149
Requesting URL: GET /update?key=xxx&field1=735.87&field2=23.90&field3=0&field4=0&field5=0&field6=34832
Wait

-1163 // Ответ получен
closing connection
35232

connecting to 184.106.153.149
Requesting URL: GET /update?key=xxx&field1=735.82&field2=24.0&field3=0&field4=0&field5=3&field6=34320
Wait
....................
wait_cnt 20 // Тут ответ не получен, и ниже видно что уменьшился объем

closing connection
35064

connecting to 184.106.153.149
Requesting URL: GET /update?key=xxx&field1=735.84&field2=24.10&field3=0&field4=0&field5=0&field6=34544
Wait

-1165  // Ответ получен
closing connection
35064

Это все крутится в основном цикле. В нормальной ситуации объем свободной памяти стабилен. Но в случае отсутствия ответа client похоже "висит" вечно.
client.stop() - что делает в данной ситуации?

UPD. Вроде полечил. Сам дурак - каким-то образом закинул объявление переменной WiFiClient client в глобальные...
UPD2. Не починилось. Если ответ не приходит, то объем свободной памяти уменьшается.
UPD3. Потеря памяти после неполучения ответа проявляется стабильно в билде 67 с билдсервера. В релизе с githab(ссылка на который выложена в первом собщении этого топика) данная ошибка не проявляется - объем свободной памяти остается стабильным.
 
Последнее редактирование:

jcmvbkbc

New member
Я так понимаю, что там генерятся вспомогательные таблицы для ускорения вычислений.
Нет, там используются степенные ряды.
Может без них как-то?
Логичнее было бы без pow, да и без плавающей точки вообще.
 

goodwin

Member
Подергал за вымя UDP после внесения вышеописанных поправок:

После
Udp.begin(localPort);
принимаются пакеты предназначенные как для локального IP, выданного DHCP сервером, так и broadcast пакеты "255.255.255.255".
Это хорошо ;)

Вот с broadcast передачей беда:
Udp.beginPacket("255.255.255.255", 4444);
Udp.write(OutBuf, 12);
Udp.endPacket();
В сеть передается пакет с IP адресом назначения "0.0.0.0" и номером порта "0".
Не знаю, косяк ли это библиотеки arduino, либо SDK/LWIP.
Пробовал фунцию endPacketMulticast(IPAddress ip, uint16_t port).
Компилятор на нее ругается (что то с аргументом IPAddress).
Подергал так и сяк новомодную функцию SDK wifi_set_broadcast_if(1); (назначил интерфейс WIFI_STA для передачи UDP).
А хотелось бы broadcast - это одна из фишек, для которой и нужен UDP.

Ну и главное:
Запускаем прослушиваение порта
Udp.begin(localPort);
После передачи хотя бы одного пакета
Udp.beginPacket("192.168.0.2", 4444);
Udp.write(OutBuf, 12);
Udp.endPacket();
Слушающий порт затыкается.
На него больше ничего не приходит.
Помогает только вызов Udp.begin(localPort); после каждой передачи.
Это есть нехорошо...
 

bolwoi

New member
Вот с broadcast передачей беда:
Udp.beginPacket("255.255.255.255", 4444);
Udp.write(OutBuf, 12);
Udp.endPacket();
В сеть передается пакет с IP адресом назначения "0.0.0.0" и номером порта "0".
У меня с маской сети 192.168.100.255 работает.
Жаль, что главный фиксер не может пока нам помочь.
 

goodwin

Member
мультикаст x.x.x.255 тоже работает. Некорректно посылается именно 255,255,255,255.
 

bolwoi

New member
igrr, Как нам можно перебороть затык с одновременными приемом/передачей? Куда копать?
 

sherr

New member
У меня вопрос по сборке -- скачал с Гитхаба , собрал по инструкции, компилятор Xtensa не поставился (оно и понятно, под
Linux 32bit его и нет готового). Рядом собираю esp-open-sdk и переношу папку с компилятором в /home/sherr/Arduino/build/linux/work/hardware/esp8266com - те туда, куда просит Arduino . Поставил разрешение на исполнение всем кому положено ,,,
и ошибка при сборке даже пустого скетча :
Arduino: 1.6.1 (Linux), Плата"Generic ESP8266 Module, 80 MHz, 115200"

as: unrecognized option '--text-section-literals'
Ошибка компиляции.

Подкажите, чего не видит, и где нужные пути настраивать ?

ps и программатора esptool в меню нет .
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вот с broadcast передачей беда:
Udp.beginPacket("255.255.255.255", 4444);
Udp.write(OutBuf, 12);
Udp.endPacket();
В сеть передается пакет с IP адресом назначения "0.0.0.0" и номером порта "0".
Не знаю, косяк ли это библиотеки arduino, либо SDK/LWIP.
udp_sendto(pcb, p_out, IP_ADDR_BROADCAST, SERVER_PORT);
IP_ADDR_BROADCAST = 0xFFFFFFFF;
err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, u16_t dst_port)
* Send data to a specified address using UDP.
*
* @param pcb UDP PCB used to send the data.
* @param p chain of pbuf's to be sent.
* @param dst_ip Destination IP address.
* @param dst_port Destination UDP port.
*
* dst_ip & dst_port are expected to be in the same byte order as in the pcb.
*
* If the PCB already has a remote address association, it will
* be restored after the data is sent.

PS: DHСP работает (?) - значит LwIP тут не при чем, т.к. он использует broadcast запросы.
 
Последнее редактирование:

sherr

New member
и ошибка при сборке даже пустого скетча :
Arduino: 1.6.1 (Linux), Плата"Generic ESP8266 Module, 80 MHz, 115200"

as: unrecognized option '--text-section-literals'
Ошибка компиляции.

Подкажите, чего не видит, и где нужные пути настраивать ?

ps и программатора esptool в меню нет .
Извиняюсь, что цитирую сам себя ---
Где пути - нашел ,,,/platform.txt - там всё в порядке .
Но в этом же файле опция компилятора -mtext-section-literals .
а в ошибке --text-section-literals - это нормально ?
 
Сверху Снизу