Skip to content

fernandomorse/Sming

 
 

Repository files navigation

Sming

Sming - Open Source framework for high efficiency WiFi SoC ESP8266 native development with C++ language.

ESP8266 C++ development framework

Gitter (chat) Donate Download Build

Summary

  • Fast & user friendly development
  • Work with GPIO in Arduino style
  • High effective in performance and memory usage (this is native firmware!)
  • Compatible with standard Arduino libraries - use any popular hardware in few lines of code
  • rBoot OTA firmware updating
  • Built-in file system: spiffs
  • Built-in powerful network and wireless modules
  • Built-in JSON library: ArduinoJson
  • HTTP, AJAX, WebSockets support
  • MQTT protocol based on libemqtt
  • Networking based on LWIP stack
  • Simple and powerful hardware API wrappers
  • Crash handlers for analyzing/handling system restarts due to fatal errors or WDT resets.
  • SSL support based on axTLS 2.1+ with Lwirax.
  • Out of the box support for HTTP, MQTT and Websocket client connections over SSL.
  • Out of the box support for OTA over HTTPS.
  • SNI and Maximum Fragment Length SSL support.
  • Optional alternative PWM support based on Stefan Bruens PWM
  • Optional custom heap allocation based on Umm Malloc
  • Based on Espressif NONOS SDK. Tested with versions 1.4 and 1.5.

Latest Release

Getting started

Additional needed software

Optional features

  • Custom PWM: If Sming is compiled with ENABLE_CUSTOM_PWM=1 then instead of using the Espressif SDK pwm library a custom PWM library will be used.
  • SSL: The SSL support is not built-in by default to conserve resources. If you want to enable it then take a look at the Readme in the Basic_Ssl samples.
  • Custom Heap Allocation: If your application is experiencing heap fragmentation then you can try the Umm Malloc heap allocation. To enable it compile Sming with ENABLE_CUSTOM_HEAP=1. In order to use it in your sample/application make sure to compile the sample with ENABLE_CUSTOM_HEAP=1. Avoid enabling your custom heap allocation AND -mforce-l32 compiler flag.

You can find more information about compilation and flashing process by reading esp8266.com forum discussion thread.

Examples

More information at Wiki Examples page.

Simple GPIO input/output

#define LED_PIN 2 // GPIO2
...
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);

Connect to WiFi and start Serial communication

Serial.begin(9600);
Serial.println("Hello Sming! Let's do smart things.");

WifiStation.enable(true);
WifiStation.config("LOCAL-NETWORK", "123456789087"); // Put you SSID and Password here

Read DHT22 sensor

#include <Libraries/DHT/DHT.h> // This is just popular Arduino library!

#define WORK_PIN 0 // GPIO0
DHT dht(WORK_PIN, DHT22);

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);

void onDataSent(HttpClient& client, bool successful)
{
  if (successful)
    Serial.println("Successful!");
  else
    Serial.println("Failed");
}

OTA application update based on rBoot

void OtaUpdate() {
	
	uint8 slot;
	rboot_config bootconf;
	
	Serial.println("Updating...");
	
	// need a clean object, otherwise if run before and failed will not run again
	if (otaUpdater) delete otaUpdater;
	otaUpdater = new rBootHttpUpdate();
	
	// select rom slot to flash
	bootconf = rboot_get_config();
	slot = bootconf.current_rom;
	if (slot == 0) slot = 1; else slot = 0;

	// flash rom to position indicated in the rBoot config rom table
	otaUpdater->addItem(bootconf.roms[slot], ROM_0_URL);

	// and/or set a callback (called on failure or success without switching requested)
	otaUpdater->setCallback(OtaUpdate_CallBack);

	// start update
	otaUpdater->start();
}

Embedded HTTP WebServer

server.listen(80);
server.addPath("/", onIndex);
server.addPath("/hello", onHello);
server.setDefaultHandler(onFile);

Serial.println("=== WEB SERVER 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);
}

void onFile(HttpRequest &request, HttpResponse &response)
{
  String file = request.getPath();
  if (file[0] == '/')
    file = file.substring(1);
    
  response.setCache(86400, true);
  response.sendFile(file);
}

Documentation

A complete documentation can be created by running the command below. This requires doxygen to be installed on your system.

cd $SMING_HOME
make docs

The newly generated documentation will be located under Sming/docs/api

About

Sming - Open Source framework for high efficiency native ESP8266 development

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 37.9%
  • HTML 31.4%
  • C 21.3%
  • Other 4.5%
  • Processing 1.6%
  • Makefile 1.1%
  • Other 2.2%