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

Sming Open Source Framework для нативной разработки прошивок ESP8266

anakod

Moderator
Команда форума
Sming это фрамеворк для быстрой и удобной разработки своих прошивок под ESP8266 с использованием Arduino стиля управления GPIO, удобным встроенным инструментарием и возможностью подключения практически любых Arduino-совместимых библиотек.

Благодаря большой кодовой базе Ардуино мира и мощности и доступности чипа ESP, можно создавать по настоящему интересные и функциональные проекты за считанные часы разработки.



Возможности и преимущества
  • Скорость и удобство разработки
  • С++ и полноценный ООП
  • Работа с GPIO в Arduino стиле
  • Эффективное использование памяти и высокая производительность (на выходе - нативная прошивка)
  • Совместимость с большинством Arduino библиотек - используйте любые популярные датчики и устройства всего в несколько строк кода
  • Полноценная встроенная файловая система: spiffs
  • Встроенные классы HTTP клиента и Web сервера с удобным программным интерфейсом
  • Прекрасная поддержка JSON: ArduinoJson
  • Удобные обертки для основных системных API
  • Написано на базе последнего Espressif SDK
Скачать самую свежую версию можно на GitHub: https://github.com/anakod/Sming (лицензия: LGPL)
Если не хотите регистрироваться, можете просто скачать все файлы с помощью кнопки "Download ZIP".

Инструкции по быстрой установке:
- Для Windows
- Для Linux
- Для MacOS

А так же у нас есть online-чат, в котором почти всегда кто-нибудь присутствует :)
Там можно задать вопросы по Sming: по установке и настройке, по коду; предложить что-нибудь; помочь проекту!
Здесь всегда можно получить самую свежую и наиболее актуальную информацию. Основной язык общения - английский (т.к. участники со всего мира), но некоторые знают русский, и с ними можно пообщаться в личном чате.
В общем, добро пожаловать!
(для входа в чат используется аккаунт GitHub)

Поддержать развитие проекта
Нравиться Sming Framework? Я буду благодарен Вашей поддержке, как donate, так и любой помощи с документацией и примерами.


Некоторые примеры (остальные вы найдете внутри проекта):

Мигаем диодом:
Код:
#define LED_PIN 2 // GPIO2
...
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
DHT22
Код:
#include <Libraries/DHT/DHT.h> // Это обычная библиотека Arduino!

DHT dht(0, DHT22); // GPIO0

void init()
{
  dht.begin();
  float h = dht.readHumidity();
  float t = dht.readTemperature();
}

HTTP Client
Код:
HttpClient thingSpeak;
...
thingSpeak.downloadString("http://api.thingspeak.com/update?key=XXXXXXX&field1=" + String(sensorValue), onDataSent);
WEB Server
Код:
server.listen(80);
server.addPath("/", onIndex);
server.setDefaultHandler(onFile);

Serial.print("Started: ");
Serial.println(WifiStation.getIP());
...

void onIndex(HttpRequest &request, HttpResponse &response)
{
  TemplateFileStream *tmpl = new TemplateFileStream("index.html");
  auto &vars = tmpl->variables();
  vars["counter"] = String(counter);
  vars["IP"] = WifiStation.getIP().toString();
  vars["MAC"] = WifiStation.getMAC();
  response.sendTemplate(tmpl);
}
P.S. Я автор данного проекта. Буду рад Вашим отзывам и предложениям, участию в тестировании или помощи по улучшению функционала платформы. С документацией дела пока что обстоят не очень, но я постарался подготовить достаточно большое количество простых и наглядных примеров по всем основным функциям платформы.
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Если позволите три вопроса:
1. Как происходит общение с web сервером (через специально оформленные переменные как у pvvx или еще как-то?)
2. JQuery - в wiki написано "At start ESP will download all requried files from remote server. All content, including JQuery and Bootstrap will be saved on device (and can work offline). Static files stored in GZIPed mode." Т.е. движок JQuery не встроен в прошивку и нужно будет отдельно загрузить?
3. Подскажите пожалуйста сколько памяти в распоряжении разработчика - как оперативной, так и flash?
 

anakod

Moderator
Команда форума
1. Доступно несколько вариантов: можно отправлять файлы, текстовые строки, а так же работать с шаблонами в которые поставляются динамические переменные. Подробнее в примере: https://github.com/anakod/Sming/blob/master/HttpServer_Bootstrap/app/application.cpp

2. Фрамеворк намного шире и не ограничен одним jQuery, можно использовать любые библиотеки и другие файлы. Другое дело что пока мало вариантов чтобы изначально закидывать файлы в прошивку (поэтому в семпле используется HTTP). Я планирую добавить FTP доступ для этой цели.

3. На вскидку точно не скажу, но примерный размер доступного пространства в файловой системе ~210 КБ. Что касается оперативной памяти - сам фрамеворк не занимает почти ни сколько в базовом режиме работы, но около 1.5 КБ ест кеш файловой системы, если она подключена. В режиме сервера оверхид на каждый запрос можно посчитать, но он в любом случае совсем не большой (вероятно около 200-300 байт). Да, я забыл сказать главное: фрамеворк категорически не использует глючный espconn. Только нативный lwip, только хардкор :)
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Спасибо за ответы. Посмотрел пример и кажется понял, что переменные это строка вида {var} в html. Правильно?
 

anakod

Moderator
Команда форума
Да, все верно. Для более полного понимания можете ещё посмотреть на примере реального проекта с использованием шаблонов: https://github.com/anakod/Sming/tree/master/MeteoControl
--- добавлено: 20 мар 2015 в 13:01 ---
Я бы ещё добавил, что Вам ничего не мешает генерировать ответ обычной текстовой строкой и отдавать ее, НО в чипе очень мало оперативной памяти, поэтому этот вариант стоит применять только для минимальных объёмов данных. В отличие от этого, встроенные в фрамеворк шаблоны загружаются из флеш и отдаются маленькими фрагментами, с подстановкой параметров на лету, что обеспечивает очень эффективное управление памятью.
 
Последнее редактирование модератором:

CHERTS

Moderator
Команда форума
Да, я забыл сказать главное: фрамеворк категорически не использует глючный espconn. Только нативный lwip, только хардкор
А вот это очень хорошо, я уже 5 дней смотрю на Ваш проект, но пока ничего не тестировал.
Думаю включить его в состав UDK не как пример, а как отдельная обертка над Espressif SDK, но нужно все тестировать и больше больше примеров... всяких разных, это залог успеха.
 

CHERTS

Moderator
Команда форума
Эммм, что то рано я обрадовался, пытаюсь собрать SmingFramework, а в ответ гора ошибок:

Код:
5:30:42 **** Build of configuration Default for project SmingFramework ****
mingw32-make.exe -f C:/Espressif/examples/Sming/Sming/Makefile all
C+ system/stringconversion.cpp
In file included from c:/Espressif/ESP8266_SDK/include/user_interface.h:11:0,
                 from system/include/esp_systemapi.h:10,
                 from include/user_config.h:27,
                 from system/stringconversion.cpp:1:
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:23: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                       ^
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:31: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                               ^
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:40: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                                        ^
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:49: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                                                 ^
In file included from c:/Espressif/ESP8266_SDK/include/lwip/ip.h:39:0,
                 from c:/Espressif/ESP8266_SDK/include/lwip/tcp.h:42,
                 from system/include/espinc/lwip_includes.h:15,
                 from include/user_config.h:34,
                 from system/stringconversion.cpp:1:
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:23: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                       ^
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:31: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                               ^
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:40: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                                        ^
c:/Espressif/ESP8266_SDK/include/lwip/ip_addr.h:213:49: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Werror=literal-suffix]
   LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,             \
                                                 ^
cc1plus.exe: all warnings being treated as errors
mingw32-make.exe: *** [out/build/system/stringconversion.o] Error 1
C:/Espressif/examples/Sming/Sming/Makefile:326: recipe for target 'out/build/system/stringconversion.o' failed

15:30:45 Build Finished (took 2s.843ms)
 

CHERTS

Moderator
Команда форума
Эммм, что то рано я обрадовался, пытаюсь собрать SmingFramework, а в ответ гора ошибок
Проблема решена, подправил C:\Espressif\ESP8266_SDK\include\lwip\ip_addr.h

Код:
--- ip_addr.h.orig   2014-12-19 15:07:44.000000000 +0500
+++ ip_addr.h   2015-03-20 15:50:40.769937000 +0500
@@ -210,7 +210,7 @@
#define ip_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))
#define ip_addr_debug_print(debug, ipaddr) \
-  LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F,  \
+  LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F,  \
  ipaddr != NULL ? ip4_addr1_16(ipaddr) : 0,  \
  ipaddr != NULL ? ip4_addr2_16(ipaddr) : 0,  \
  ipaddr != NULL ? ip4_addr3_16(ipaddr) : 0,  \
но в UDK этого исправления нет, как следствие все кто использую UDK наступят на эти грабли
 

CHERTS

Moderator
Команда форума
Один нескромный вопрос, а зачем во всех примерах uart инициализирвется на 230400 ? Стандартной 115200 не хватает? Без влезания в код с первого набега и не понять, в чем засада.
 

CHERTS

Moderator
Команда форума
Пример Pressure_BMP180 не собирается, не хватает места в сегменте памяти

Код:
mingw32-make.exe -f C:/Espressif/examples/Sming/Pressure_BMP180/Makefile all
LD out/build/app.out
c:/espressif/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: out/build/app.out section `.text' will not fit in region `iram1_0_seg'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe: *** [out/build/app.out] Error 1
C:/Espressif/examples/Sming/Pressure_BMP180/Makefile:225: recipe for target 'out/build/app.out' failed
Пример Basic_WiFi тоже не собирается, ошибка

Код:
C+ app/application.cpp
In file included from include/user_config.h:29:0,
                 from app/application.cpp:1:
app/application.cpp: In function 'void ready()':
../Sming/system/include/esp_systemapi.h:25:60: error: cannot pass objects of non-trivially-copyable type 'class IPAddress' through '...'
#define debugf(fmt, ...) os_printf(fmt"\r\n", ##__VA_ARGS__)
                                                            ^
app/application.cpp:43:2: note: in expansion of macro 'debugf'
  debugf("%d %s", WifiAccessPoint.getIP(), WifiAccessPoint.getMAC().c_str());
  ^
C:/Espressif/examples/Sming/Basic_WiFi/Makefile:329: recipe for target 'out/build/app/application.o' failed
mingw32-make.exe: *** [out/build/app/application.o] Error 1
Буду смотреть дальше...
 

CHERTS

Moderator
Команда форума
Пример HttpServer_Bootstrap и HttpClient_ThingSpeak тоже не собираются, ошибки одинаковые

Код:
ut/build/app_app.a(HttpClient.o): In function `HttpClient::getResponseHeader(String, String)':
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::DateTime()'
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::parseHttpDate(String)'
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::DateTime()'
out/build/app_app.a(HttpClient.o): In function `HashMap<String, String>::contains(String) const':
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::parseHttpDate(String)'
out/build/app_app.a(HttpClient.o): In function `String::operator==(String const&) const':
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::DateTime()'
out/build/app_app.a(HttpClient.o): In function `HashMap<String, String>::contains(String) const':
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::DateTime()'
out/build/app_app.a(HttpClient.o): In function `HashMap<String, String>::indexOf(String) const':
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::parseHttpDate(String)'
C:\Espressif\examples\Sming\HttpServer_Bootstrap/../Sming/SmingCore/Network/../Boards.h:17: undefined reference to `DateTime::DateTime()'
collect2.exe: error: ld returned 1 exit status
C:/Espressif/examples/Sming/HttpServer_Bootstrap/Makefile:225: recipe for target 'out/build/app.out' failed
mingw32-make.exe: *** [out/build/app.out] Error 1
 

CHERTS

Moderator
Команда форума
Остальняе примеры нормально собираются, но есть одно но, взять к примеру Basic_Blink, там всего то помигивание светодиодом, то есть управление GPIO, а в прошивку линкуется все подряд или нет?
 

anakod

Moderator
Команда форума
Касательно первой ошибки - точно мой косяк, как-то вносил изменения в сдкашный файл для совместимости с си++11, но потом забыл об этом.
 

JustACat

Moderator
Команда форума
Блин, если такую штуку да еще довести до полного вида Ардуино, ну то есть:
- чтобы устанавливалось оно все как Ардуино одним екзешником и сразу работало
- чтобы была пара кнопочек только на панели инструментов:
-- скомпилировать (проверить код)
-- загрузить в МК
-- открыть встроенный терминал для проверки
- и чтобы такой же богатый набор библиотек и человеческий API для встроенного железа
Тогда, я даже боюсь представить, чтобы тогда было.
Ибо Ардуино (а точнее AVRки) у других чипов выигрывают лишь за счет как раз набранного уже комьюнити и, главное - кучи библиотек и возможности почти любую хрень подключить чуть ли не 1 вызовом либы + 1-2 строчками кода.
Это конечно по моему скромному мнению...

Так вот, если все это взять, и конвертнуть на чип ESP, который с 512 кило памяти (ну да, многое занято, но и свободно не мало) с возможностью расширения до 16 мегабайт легко, 80 мегагерцами вычислительной (а то и все 160), и с WiFi наконец!
"Вот она - рыба моей мечты!" - для домашних поделок и быстро что-то слабать для себя любимого на коленке :)

anakod, не знаю, уместно ли, но просто скажу так: честь вам и хвала!
CHERTS, и вам заодно, за ваш UDK!

Даешь Espruino Esspruino, ребята! (тут маленькая засада - Espruino-то уже занято другим проектом)
 

anakod

Moderator
Команда форума
Наконец я добрался до компьютера и сейчас начинаю разбираться с найденными проблемами.

Всем огромное спасибо за участие
 

pvvx

Активный участник сообщества
с возможностью расширения до 16 мегабайт легко
Данный проект не поддерживает более 4Мегобайт и то протестировать и на 4-ре не могу - нет такой flash. Есть только 16 Мегобайт, но в коде написано, что более 4-х незя. И ещё известно, что SDK кеширует всего 1 Мег Flash и как будет работать 2 или 4 - совершенно не понятно.... Так-же не нашел, гуляя по исходникам, что когда будет установлен в программе прошивки Flash на 1 Мег (или больше), область сохранения SDK переместиться и не будет ли конфликта с файловой системой?
 

ESP

New member
Всем огромное спасибо за участие
Заинтересовал ваш проект, задумка очень хорошая!!!
Возможность использовать arduino драйвера бля датчиков очень помогла бы многим.
Лично для меня нихватает только MQTT. Может есть возможность прикрутить эту библиотеку MQTT.
 

anakod

Moderator
Команда форума
Вышла новая версия Sming Framework v1.0.5
Изменения:
  • Поддержка Espressif SDK v1.0
  • Исправление ошибок
  • Стандартная скорость порта изменена на 115200
Теперь обо всем по порядку.

А вот это очень хорошо, я уже 5 дней смотрю на Ваш проект, но пока ничего не тестировал.
А как Вы нашли его до анонса, если не секрет? :)

Думаю включить его в состав UDK не как пример, а как отдельная обертка над Espressif SDK, но нужно все тестировать и больше больше примеров... всяких разных, это залог успеха.
Я весьма за, единственное есть просьба в таком случае поставить в первом посте ссылку на эту тему чтобы люди знали где задавать вопросы и вести обсуждение по Sming

Проблема решена, подправил C:\Espressif\ESP8266_SDK\include\lwip\ip_addr.h
Т.к. в SDK 1.0 похоже вообще решили выпилить открытый LWIP да еще и совместимость поломали, я решил включить его в комплект фрамеворка, сразу с внесенными необходимыми исправлениями. Сейчас должно собираться правильно и под старой версией SDK и под новой.

Один нескромный вопрос, а зачем во всех примерах uart инициализирвется на 230400 ? Стандартной 115200 не хватает? Без влезания в код с первого набега и не понять, в чем засада.
У меня был случай когда из-за низкой скорости порта я долго не мог отловить ошибку (она просто не успевала отправиться), после этого установил на максимум. но сейчас это не так актуально да и совместимость дороже, поэтому принял решение перейти на 115200.

Пример Pressure_BMP180 не собирается, не хватает места в сегменте памяти
Вот с этим реальная проблема, причем раньше работало без проблем, но видимо после расширения функционала, места стало не хватать. Единственный вариант - перенести некоторые системные либы в область ROM. Возникла идея пересобрать libmath так, чтобы базовая арифметика оставалась в RAM а всякие флоат операции легли в ROM. Но как это сделать правильно пока еще не придумал.
В качестве временного решения заблокировал функционал использующий pow в библиотеке, остальное работает без проблем.

Остальняе примеры нормально собираются, но есть одно но, взять к примеру Basic_Blink, там всего то помигивание светодиодом, то есть управление GPIO, а в прошивку линкуется все подряд или нет?
Тут несколько разных сторон и моментов. С одной стороны я не вижу больших проблем, т.к. код оперативную память не ест, а лишние N килобайт во флеш, большой роли (тем более для блинка :) не играют. С другой стороны текущий маке файл - явный костыль и я был бы рад любой помощи в его модернизации (могу рассказать поподробнее), т.к. сам с GNU compilers я фактически имею дело в первый или второй раз в жизни.

Что касается остальных ошибок - жаль в Eclipse не очень удобно сделан полный Rebuild, трудно подобные маленькие ошибки сразу выявлять, а учитывая что фрамеворк активно развивается и примеров уже довольно много, трудновато получается отслеживать что нигде ничего не забыл обновить.

Данный проект не поддерживает более 4Мегобайт и то протестировать и на 4-ре не могу - нет такой flash. Есть только 16 Мегобайт, но в коде написано, что более 4-х незя.
Проект писался мной в одиночку, в свободное от основной работы время, поэтому сразу был заложен ряд ограничений и четкие рамки проекта. Основной целью было получить высокую совметимость с Ардуино, удобный инструментарий для работы с веб-протоколами и при этом не "жрать" кучу оперативной памяти как Lua прошивки. При этом никаких костылей заведомо не закладывалось, поэтому добавить поддержку модулей с нестандартным флеш, совершенно не должно стать проблемой (если кто-то готов помочь в этих направлениях). На данный момент Sming тестировался только на стандартном размере флеш (я сам тестировал на ESP-01 и ESP-03). Вполне вероятно что для других размеров достаточно будет обновить Make файл (который все равно хорошо бы переписать более изящно). Я буду благодарен если кто-то протестирует этот вопрос и отпишется здесь и/или поможет с добавлением поддержки больших флеш.

И ещё известно, что SDK кеширует всего 1 Мег Flash и как будет работать 2 или 4 - совершенно не понятно.... Так-же не нашел, гуляя по исходникам, что когда будет установлен в программе прошивки Flash на 1 Мег (или больше), область сохранения SDK переместиться и не будет ли конфликта с файловой системой?
Про SDK, не подскажу, а в коде проблем возникнуть не должно, используется подход аналогичный Lua прошивкам - ищем точку окончания кода прошивки, добавляем отступ и выравнивание, после этого все остальное (кроме служебных секторов настроек в самом конце) - это область файловой системы, она форматируется. Можете посмотреть подробнее тут: https://github.com/anakod/Sming/blob/master/Sming/Services/SpifFS/spiffs.c#L42

Лично для меня нихватает только MQTT. Может есть возможность прикрутить эту библиотеку MQTT.
Мне как-то не приходилось работать с этим протоколом, может что-нибудь посоветуете почитать? Что касается библиотеки, ссылку на которую Вы дали, вероятнее всего она прекрасно будет работать со Sming без всякой адаптации, т.к. фрамеворк не заменяет стандартные возможности SDK, он просто добавляет ряд удобных оберток, более простые типы (такие как String) и совместимость с Ардуино. Но вот в сторону более тесной интеграции и удобных оберток к MQTT, вероятно стоит посмотреть.
 

Max Garmash

New member
Вышла новая версия Sming Framework v1.0.5
Мне как-то не приходилось работать с этим протоколом, может что-нибудь посоветуете почитать? Что касается библиотеки, ссылку на которую Вы дали, вероятнее всего она прекрасно будет работать со Sming без всякой адаптации, т.к. фрамеворк не заменяет стандартные возможности SDK, он просто добавляет ряд удобных оберток, более простые типы (такие как String) и совместимость с Ардуино. Но вот в сторону более тесной интеграции и удобных оберток к MQTT, вероятно стоит посмотреть.
MQTT - фактически стандартная шина для телеметрии. Очень много проектов его поддерживают. Определенно нужно эту либу пробовать включить в поставку. Сам попробую поэкспериментировать на днях со сборкой может и без шаманства взлетит.
 
Сверху Снизу