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

скетч с конфигуратором в eeprom, сервер и клиент

Denis Karasiov

New member
Ну, тогда и в функции записи аналогично надо попровить код:
Код:
void writeSettingsESP() {
  ...
  for (i = EEPROM_START; i < EEPROM_START+sizeof(eeprom_data); i++)
  ...
}
И еще вопрос по этому скетчу... Расчет CRC - это самописная часть, или взят готовый код? Пытался разобраться в нем, но совершенно не понимаю о чем там... Есть ли возможность дать описание на человеческом русском по следующим строкам? Описание функций попробовал почитать, но почти ничего не понял (кроме знаков препинания).
Код:
uint32_t memcrc;
uint8_t *p_memcrc = (uint8_t*)&memcrc; // Это!
...
static PROGMEM prog_uint32_t crc_table[16] = {
  0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
  0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
}; // Массив...
...
void readSettingsESP() {
  ...
  if (memcrc == datacrc) { // memcrc - единственное присвоение значения переменной в функции
writeSettingsESP, но при обычном считывании данных мы же ее вроде не используем?!
    ...
  } else {
    ...
  }
}
// А дальне - вообще проще застрелиться... :)
unsigned long crc_update(unsigned long crc, byte data) {
  byte tbl_idx;
  tbl_idx = crc ^ (data >> (0 * 4));
  crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
  tbl_idx = crc ^ (data >> (1 * 4));
  crc = pgm_read_dword_near(crc_table + (tbl_idx & 0x0f)) ^ (crc >> 4);
  return crc;
}

unsigned long crc_byte(byte *b, int len)
{
  unsigned long crc = ~0L;
  uint8_t i;

  for (i = 0 ; i < len ; i++)
  {
    crc = crc_update(crc, *b++);
  }
  crc = ~crc;
  return crc;
}
И еще дополнительно вопрос. В документации видел, что нельзя обращаться к EEPROM к области памяти менее 4 байт. Это имелось ввиду, именно это, или любой блок моих данных должен иметь кратность 4 байтам? И этот же вопрос к CRC. Там используется под него 4 байта. Это как-то связано с вышеупомянутой кратностью? То есть надо ли мне следить за этой кратностью при создании структуры данных?

Вот сейчас пишу и думаю, что, возможно даже лучше просто ответить на последние вопросы, чем окончательно взорвать мог алгоритмом CRC %)

Спасибо.
 

Vitaly

Member
запись тоже исправил

в esp eeprom не настоящий а эмулируется во флэше поэтому от этого может что-то зависеть по блокам, честно говоря не помню чтобы такое читал

crc32 сам из 4х байт, алгоритм я конечно где-то подсмотрел
 

Denis Karasiov

New member
запись тоже исправил

в esp eeprom не настоящий а эмулируется во флэше поэтому от этого может что-то зависеть по блокам, честно говоря не помню чтобы такое читал

crc32 сам из 4х байт, алгоритм я конечно где-то подсмотрел
Спасибо.

А написано по 4 байта было тут: https://esp8266.ru/arduino-ide-esp8266/#fast-start , но там так построена фраза, что это не очевидно, что имеется в виду.
 

Denis Karasiov

New member
И, возможно, нашел еще одну ошибку при попытке прирастить себе код...
Код:
unsigned long crc_byte(byte *b, int len)
{
  unsigned long crc = ~0L;
  uint8_t i;

  for (i = 0 ; i < len ; i++) {
    crc = crc_update(crc, *b++);
  }
  crc = ~crc;
  return crc;
}
Программа слетает при попытке включить пустой цикл (внутренность закомментировал). Что увидел: счетчик цикла - не более 255, а у меня значение больше len>300. Видимо, надо заменить тип uint8_t на другой. Так чтобы он был больше, чем максимально возможный объем данных в ESP.

Кстати, заодно маленький вопросик по ArduinoIDE. Можно ли как-то сделать так, чтобы при загрузке программы на ESP не перекомпилировалось все, а только тот код, который был изменен? На сколько я понял, он каждый раз компилирует все библиотеки, что очень долго (условно).
 
Последнее редактирование:

cerberus

New member
Доброго времени суток. Очень классные скетчи. Реально с кучей разумных предосторожностей.
Хочу слепить на их базе, просто:
При включении - в режиме точки доступа - спрашивает в браузере логин и пароль WiFi сети клиента.
Подключается, если это возможно, если не получилось перегружаемся и по кругу....

Если подключились, то занимаемся чем угодно...

Помогите застрял на WEB интерфейсе

Код:
void handleRoot()
{
    //String ssid_ap;
    //String pass_ap;
String str = "";
String html_header = "<html>\
<meta http-equiv=\"refresh\" content=\"text/html; charset=utf-8\">\
<head>\
<title>ESP8266 Settings</title>\
<style>\
   body { background-color: #fffff9; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
  </head>";

str += html_header;
str += "<body>\
    <form method=\"POST\" action=\"ok\">\
    <input name=\"ssid_ap\"> Логин Wi-Fi сети</br>\
    <input name=\"pass_ap\"> Пароль</br></br>\
    <input type=SUBMIT value=\"Save settings\">\
</form>\
</body>\
</html>";
server.send ( 200, "text/html", str );
}
Код:
void handleOk()
{
  String ssid_ap;
  String pass_ap;
  unsigned char* buf = new unsigned char[64];
  String str = "";
//  str += html_header;
//  str += "<body>";
//  EEPROM.begin(98);
  ssid_ap = server.arg(0);
  pass_ap = server.arg(1);

  // проверить пустые - нет

/*
  if (eeprom_data.STAenabled == true && WiFi.status() != WL_CONNECTED)
    s += "<br>wifi client enabled and disconnected";
  else if (eeprom_data.STAenabled == true && WiFi.status() == WL_CONNECTED)
  {
    s += "<br>wifi client connected";
  */
  Serial.print("level "+String(WiFi.RSSI())+" dBm");


      Serial.println();
      Serial.print("ssid_ap : ");
      Serial.println(ssid_ap);
   
      Serial.print(" pass_ap : ");
      Serial.println(pass_ap);

//server.hasArg("ssid");
//server.hasArg("CONFIGuser");
}
 

Вложения

Последнее редактирование:

krepton85

Member
@cerberus, я тоже этот код использую и нечто подобное сделал - если не подключился к роутару - то работает однвременно режим точки доступа и клиент пытается подключится, если успешно подключился, то переходит в режим только клиент. При первом запуске (т.с. из каробки когда esp8266) запускается режим только точки доступа.
Папробовал сделать тоже самое и с параметрами mqtt клиента, в итоге восстанавливается все отлично после перезагрузки, но уже не подключается к mqtt почему то, в итоге так и оставил mqtt параметры статично прописанными в скетче.
Кстати на данную тематику уже есть готовая библиатека wi-fi manager, но там мне не нравится то что нельзя изменить параметры подключения к роутеру в режиме wi-fi клиента (в этом примере что у нас с вами изначально тоже так сделано, я чуть подправил сейчас и в режиме клиента можно).
 

cerberus

New member
Да, все бы хорошо. Я в браузере прописал "login, passwordd" и ошибочно ввел не то что нужно и жмакнул "ок", пытаюсь подключиться - нет, ну и ладно опять в режим однвременно режим точки доступа и клиент

В примерах все нормально в принципе так и реализовано, но на стороне браузера, как сделать какие-то проверки, выдавать какие-то сообщения ?
 

krepton85

Member
@cerberus думаю просто создать доп. странички с разными ошибками и далее что бы переадресовывало на нужную из их как то так. Хотя зачем это все. Вроди скетч и так более чем достаточный. Если не то ввели - просто не подключится и можно по новой ввести правильно.
 

cerberus

New member
@cerberus думаю просто создать доп. странички с разными ошибками и далее что бы переадресовывало на нужную из их
Если есть возможность, помогите с кодом web странички. В html полный нуб.
Пытался найти в сети такое нечто, но там реализуют все через скрипты.
Есть еще мысль настраивать клиента через андроид, но для меня тоже темный лес,
 

cerberus

New member
Брр... Бороздил просторы интернета. Нашел
Код:
wifi.sta.getap(function(table))
Параметры

function(table): функция, которая вызывается по окончании сканирования сети
эта функция получает таблицу, с ключевым полем ssid, другие значения: authmode,rssi,bssid,channel
Возвращаемые значения

nil
Пример

    -- print ap list
    function listap(t)
      for k,v in pairs(t) do
        print(k.." : "..v)
      end
    end
    wifi.sta.getap(listap)
Какие-то Луа скрипты, куда их цеплять ???

Короче как получить список wi-fi сетей поблизости так и не нашел
 

krepton85

Member
@cerberus, нее не нужны тут lua скрипты, сканер wi-fi сетей есть в стандартных примерах. Пример называется ESP8266WiFi\ WIFIScan . только там вывод в сериал порт, а я сделал на вэб-страничку.
 

Paul469

New member
Добрый день.

Первичная ссылка со скетчем не работает. Перезалейте, пожалуйста. Тема интересная.
 

Paul469

New member
Очень богатая основа для старта. Для себя добавил настройку статического адреса клиента, гейт и маску сети. Ну и вынес все в отдельный h-файл.
Из пожеланий автору темы - оформить в виде отдельной библиотеки или на худой конец в отдельном h-файле. Это все-таки сервисные функции и не надо загромождать ими основной скетч, максимум - вызов пары функций. Ну и порезать лишнее - по всему коду осколки OTA и прочих нереализованных функций, в том числе на самой WEB странице. Тест порта тоже лишнее, как и сам раздел Action. В общем, урезать бы до основного движка - сохранение параметров и старт сетевого соединения.
А так - респект.
 

Vitaly

Member
планов это оформлять и выделять в библиотеку нет, для моих нужд этого хватило
как основа для развития тоже достаточно
к тому же готовых библиотек такой направленности на гитхабе присутствует в количестве

ps
и почему не реализованных? ota over http прекрасно работает, php скрипт даже выкладывал
 

Slacky

Member
@Vitaly, извиняюсь сразу, но вопрос наверно будет ламерским :))

Пришла платка Wemos D1 mini. Ваш скетч прошился. Теперь вижу на смартфоне WiFi-сеть - что-тотам-8266.

Вопрос - а какой пароль?

:))
 

Vitaly

Member
если речь об этом скетче то паролем будет заданный секрет + последние 4 символа мак адреса, как в имени модуля
т.е. в примере будет ESP8266-1234 пароль SECRET1234
#define NAME_TAG "ESP"
#define AP_SSID NAME_TAG "8266-"
#define AP_PASSWORD_PREFIX "SECRET" // + mac XXXX

предполагается, что схему каждый придумает себе сам и изменит
 
Сверху Снизу