Add example

pull/41/head
Hieromon Ikasamo 5 years ago
parent d42c36ca33
commit 6b702aaf4b
  1. 2
      .travis.yml
  2. 5
      examples/HelloWorld/Data/style.json
  3. 68
      examples/HelloWorld/HelloWorld.ino
  4. 263
      examples/mqttRSSI_NA/mqttRSSI_NA.ino

@ -32,5 +32,7 @@ script:
- buildExampleSketch HandlePortal
- buildExampleSketch HandlePortalEX
- buildExampleSketch Simple
- buildExampleSketch HelloWorld
- buildExampleSketch mqttRSSI
- buildExampleSketch mqttRSSI_FS
- buildExampleSketch mqttRSSI_NA

@ -0,0 +1,5 @@
{
"name" : "Caption",
"type" : "ACText",
"style": "text-align:center;font-family:'Avenir','Corbel','Osaka';color:Green;"
}

@ -0,0 +1,68 @@
/*
HelloWorld.ino, Example for the AutoConnect library.
Copyright (c) 2019, Hieromon Ikasamo
https://github.com/Hieromon/AutoConnect
This software is released under the MIT License.
https://opensource.org/licenses/MIT
*/
/*
To experience this example, upload the JSON file which is style.json
from the data folder. Its file contains the attributes for the Caption
of AutoConnectText. You can change the elements for your realization.
*/
#if defined(ARDUINO_ARCH_ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
typedef ESP8266WebServer WEBServer;
#elif defined(ARDUINO_ARCH_ESP32)
#include <WiFi.h>
#include <WebServer.h>
#include <SPIFFS.h>
typedef WebServer WEBServer;
#endif
#include <FS.h>
#include <AutoConnect.h>
#define HELLO_URI "/hello"
#define PARAM_STYLE "/style.json"
// Declare AutoConnectElements and AutoConnectAux for the custom Web page.
ACText(Caption, "Hello, world");
AutoConnectAux helloPage(HELLO_URI, "Hello", true, { Caption });
AutoConnect portal;
// Redirects from root to the hello page.
void onRoot() {
WEBServer& webServer = portal.host();
webServer.sendHeader("Location", String("http://") + webServer.client().localIP().toString() + String(HELLO_URI));
webServer.send(302, "text/plain", "");
webServer.client().flush();
webServer.client().stop();
}
// Load the attribute of the element to modify at runtime from external.
String onHello(AutoConnectAux& aux, PageArgument& args) {
File param = SPIFFS.open(PARAM_STYLE, "r");
aux.loadElement(param);
param.close();
return String();
}
void setup() {
delay(1000);
Serial.begin(115200);
SPIFFS.begin(); // Prepare SPIFFS
helloPage.on(onHello); // Register the attribute overwrite handler.
portal.join(helloPage); // Join the hello page.
portal.begin();
WEBServer& webServer = portal.host();
webServer.on("/", onRoot); // Register the root page redirector.
}
void loop() {
portal.handleClient();
}

@ -0,0 +1,263 @@
/*
ESP8266/ESP32 publish the RSSI as the WiFi signal strength to ThingSpeak channel.
This example is for explaining how to use the AutoConnect library.
In order to execute this example, the ThingSpeak account is needed. Sing up
for New User Account and create a New Channel via My Channels.
For details, please refer to the project page.
https://hieromon.github.io/AutoConnect/examples/index.html#used-with-mqtt-as-a-client-application
This example is based on the environment as of March 20, 2018.
Copyright (c) 2018 Hieromon Ikasamo.
This software is released under the MIT License.
https://opensource.org/licenses/MIT
*/
#if defined(ARDUINO_ARCH_ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define GET_CHIPID() (ESP.getChipId())
#elif defined(ARDUINO_ARCH_ESP32)
#include <WiFi.h>
#include <SPIFFS.h>
#include <HTTPClient.h>
#define GET_CHIPID() ((uint16_t)(ESP.getEfuseMac()>>32))
#endif
#include <FS.h>
#include <PubSubClient.h>
#include <AutoConnect.h>
#define PARAM_FILE "/param.json"
#define AUX_SETTING_URI "/mqtt_setting"
#define AUX_SAVE_URI "/mqtt_save"
#define AUX_CLEAR_URI "/mqtt_clear"
// Adjusting WebServer class with between ESP8266 and ESP32.
#if defined(ARDUINO_ARCH_ESP8266)
typedef ESP8266WebServer WiFiWebServer;
#elif defined(ARDUINO_ARCH_ESP32)
typedef WebServer WiFiWebServer;
#endif
// This example shows a sketch that realizes the equivalent operation
// of mqttRSSI without using JSON.
// By comparing this example with the example using JSON, mqttRSSI or
// mqttRSSI_FS, you will better understand AutoConnect's custom Web page
// facility.
// Declare AutoConnectElements for the page asf /mqtt_setting
ACText(header, "<h2>MQTT broker settings</h2>", "text-align:center;color:#2f4f4f;padding:10px;");
ACText(caption, "Publishing the WiFi signal strength to MQTT channel. RSSI value of ESP8266 to the channel created on ThingSpeak", "font-family:serif;color:#4682b4;");
ACInput(mqttserver, "", "Server", "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$", "MQTT broker server");
ACInput(channelid, "", "Channel ID", "^[0-9]{6}$");
ACInput(userkey, "", "User Key");
ACInput(apikey, "", "API Key");
ACElement(newline, "<hr>");
ACCheckbox(uniqueid, "unique", "Use APID unique");
ACRadio(period, { "30 sec.", "60 sec.", "180 sec." }, "Update period", AC_Vertical, 1);
ACSubmit(save, "Start", AUX_SAVE_URI);
ACSubmit(discard, "Discard", "/");
// Declare the custom Web page as /mqtt_setting and contains the AutoConnectElements
AutoConnectAux mqtt_setting(AUX_SETTING_URI, "MQTT Setting", true, {
header,
caption,
mqttserver,
channelid,
userkey,
apikey,
newline,
uniqueid,
period,
newline,
save,
discard
});
// Declare AutoConnectElements for the page as /mqtt_save
ACText(caption2, "<h4>Parameters available as:</h4>", "text-align:center;color:#2f4f4f;padding:10px;");
ACText(parameters);
ACSubmit(clear, "Clear channel", AUX_CLEAR_URI);
// Declare the custom Web page as /mqtt_save and contains the AutoConnectElements
AutoConnectAux mqtt_save(AUX_SAVE_URI, "MQTT Setting", false, {
caption2,
parameters,
clear
});
AutoConnect portal;
AutoConnectConfig config;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
unsigned int updateInterval = 0;
unsigned long lastPub = 0;
#define MQTT_USER_ID "anyone"
bool mqttConnect() {
static const char alphanum[] = "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"; // For random generation of client ID.
char clientId[9];
uint8_t retry = 10;
while (!mqttClient.connected()) {
if (mqttserver.value.length() <= 0)
break;
mqttClient.setServer(mqttserver.value.c_str(), 1883);
Serial.println(String("Attempting MQTT broker:") + mqttserver.value);
for (uint8_t i = 0; i < 8; i++) {
clientId[i] = alphanum[random(62)];
}
clientId[8] = '\0';
if (mqttClient.connect(clientId, MQTT_USER_ID, userkey.value.c_str())) {
Serial.println("Established:" + String(clientId));
return true;
}
else {
Serial.println("Connection failed:" + String(mqttClient.state()));
if (!--retry)
break;
}
delay(3000);
}
return false;
}
void mqttPublish(String msg) {
String path = String("channels/") + channelid.value + String("/publish/") + apikey.value;
mqttClient.publish(path.c_str(), msg.c_str());
}
int getStrength(uint8_t points) {
uint8_t sc = points;
long rssi = 0;
while (sc--) {
rssi += WiFi.RSSI();
delay(20);
}
return points ? static_cast<int>(rssi / points) : 0;
}
// Retreive the value of each element entered by '/mqtt_setting'.
String saveParams(AutoConnectAux& aux, PageArgument& args) {
// The 'where()' function returns the AutoConnectAux that caused
// the transition to this page.
mqttserver.value.trim();
channelid.value.trim();
userkey.value.trim();
apikey.value.trim();
updateInterval = period.value().substring(0, 2).toInt() * 1000;
// Echo back saved parameters to AutoConnectAux page.
String echo = "Server: " + mqttserver.value + "<br>";
echo += "Channel ID: " + channelid.value + "<br>";
echo += "User Key: " + userkey.value + "<br>";
echo += "API Key: " + apikey.value + "<br>";
echo += "Update period: " + String(updateInterval / 1000) + " sec.<br>";
echo += "Use APID unique: " + String(uniqueid.checked == true ? "true" : "false") + "<br>";
parameters.value = echo;
return String("");
}
void handleRoot() {
String content =
"<html>"
"<head>"
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
"</head>"
"<body>"
"<iframe width=\"450\" height=\"260\" style=\"transform:scale(0.79);-o-transform:scale(0.79);-webkit-transform:scale(0.79);-moz-transform:scale(0.79);-ms-transform:scale(0.79);transform-origin:0 0;-o-transform-origin:0 0;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;border: 1px solid #cccccc;\" src=\"https://thingspeak.com/channels/454951/charts/1?bgcolor=%23ffffff&color=%23d62020&dynamic=true&type=line\"></iframe>"
"<p style=\"padding-top:5px;text-align:center\">" AUTOCONNECT_LINK(COG_24) "</p>"
"</body>"
"</html>";
WiFiWebServer& webServer = portal.host();
webServer.send(200, "text/html", content);
}
// Clear channel using ThingSpeak's API.
void handleClearChannel() {
HTTPClient httpClient;
WiFiClient client;
String endpoint = mqttserver.value;
endpoint.replace("mqtt", "api");
String delUrl = "http://" + endpoint + "/channels/" + channelid.value + "/feeds.json?api_key=" + userkey.value;
Serial.print("DELETE " + delUrl);
if (httpClient.begin(client, delUrl)) {
Serial.print(":");
int resCode = httpClient.sendRequest("DELETE");
String res = httpClient.getString();
httpClient.end();
Serial.println(String(resCode) + "," + res);
}
else
Serial.println(" failed");
// Returns the redirect response.
WiFiWebServer& webServer = portal.host();
webServer.sendHeader("Location", String("http://") + webServer.client().localIP().toString() + String("/"));
webServer.send(302, "text/plain", "");
webServer.client().flush();
webServer.client().stop();
}
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
SPIFFS.begin();
if (uniqueid.checked) {
config.apid = String("ESP") + "-" + String(GET_CHIPID(), HEX);
Serial.println("apid set to " + config.apid);
}
config.bootUri = AC_ONBOOTURI_HOME;
config.homeUri = "/";
portal.config(config);
// Join the custom Web pages and register /mqtt_save handler
portal.join({ mqtt_setting, mqtt_save });
portal.on(AUX_SAVE_URI, saveParams);
Serial.print("WiFi ");
if (portal.begin()) {
Serial.println("connected:" + WiFi.SSID());
Serial.println("IP:" + WiFi.localIP().toString());
}
else {
Serial.println("connection failed:" + String(WiFi.status()));
while (1) {
delay(100);
yield();
}
}
WiFiWebServer& webServer = portal.host();
webServer.on("/", handleRoot);
webServer.on(AUX_CLEAR_URI, handleClearChannel);
}
void loop() {
portal.handleClient();
if (updateInterval > 0) {
if (millis() - lastPub > updateInterval) {
if (!mqttClient.connected()) {
mqttConnect();
}
String item = String("field1=") + String(getStrength(7));
mqttPublish(item);
mqttClient.loop();
lastPub = millis();
}
}
}
Loading…
Cancel
Save