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

Запрос примеров для Sming

dimakein

New member
Здравствуйте, уважаемые форумчане. Я хочу реализовать управление RGB светодиодной лентой, но столкнулся с непонятным глюком:
переписал немного пример Basic_PWM, чтобы управлять тремя каналами, с ним никаких проблем нет
Код:
[HASHTAG]#include[/HASHTAG] <user_config.h>
[HASHTAG]#include[/HASHTAG] <SmingCore/SmingCore.h>

[HASHTAG]#define[/HASHTAG] LED_PIN1 13
[HASHTAG]#define[/HASHTAG] LED_PIN2 12
[HASHTAG]#define[/HASHTAG] LED_PIN3 14

DriverPWM RedPWM,GreenPWM,BluePWM;
Timer procTimer;

int i = 0,j=0,k=0;
bool countUp = true;
bool countDown = false;

void doPWM()
{

   if(countUp){
     if(i < 255 && j==0 && k==0){
       i++;
     }
     if(i == 255 && j<255 && k==0) {
       j++;
     }
     if(i == 255 && j == 255 && k < 255) {
       k++;
     }
     if(i == 255 && j == 255 && k == 255) {
       countUp = false;
       countDown = true;
     }
   }
   if(countDown){
     if(i > 0 && j==255 && k==255){
       i--;
     }
     if(i == 0 && j>0 && k==255) {
       j--;
     }
     if(i == 0 && j == 0 && k > 0) {
       k--;
     }
     if(i == 0 && j == 0 && k == 0) {
       countUp = true;
       countDown = false;
     }
   }
   Serial.printf("%d %d %d\r\n",i,j,k);
   RedPWM.analogWrite(LED_PIN1, i);
   GreenPWM.analogWrite(LED_PIN2, j);
   BluePWM.analogWrite(LED_PIN3, k);
}
void init()
{
   RedPWM.initialize();
   GreenPWM.initialize();
   BluePWM.initialize();
   procTimer.initializeMs(5, doPWM).start();
}

а когда таким же образом пытаюсь использовать этот пример в своем проекте ловлю глюки, почему-то не получается управлять одним из трех каналов(синим)
Мой код(это еще не до конца переписанный HttpServer_ConfigNetwork) под спойлером
Код:
[HASHTAG]#include[/HASHTAG] <user_config.h>
[HASHTAG]#include[/HASHTAG] <SmingCore/SmingCore.h>
[HASHTAG]#include[/HASHTAG] <AppSettings.h>
[HASHTAG]#include[/HASHTAG] <cstdio>
[HASHTAG]#include[/HASHTAG] <cstdlib>
[HASHTAG]#include[/HASHTAG] <cstring>

[HASHTAG]#define[/HASHTAG] RED_LED 13
[HASHTAG]#define[/HASHTAG] GREEN_LED 12
[HASHTAG]#define[/HASHTAG] BLUE_LED 14

DriverPWM RedPWM,GreenPWM,BluePWM;
HttpServer server;
FTPServer ftp;

BssList networks;
String network, password;
Timer connectionTimer;


int RED_value=0, GREEN_value=0, BLUE_value=0;
int tRED_value, tGREEN_value, tBLUE_value;

void onIndex(HttpRequest &request, HttpResponse &response)
{
   TemplateFileStream *tmpl = new TemplateFileStream("index.html");
   auto &vars = tmpl->variables();
   response.sendTemplate(tmpl); // will be automatically deleted
}


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

   if (file[0] == '.')
     response.forbidden();
   else
   {
     response.setCache(86400, true); // It's important to use cache for better performance.
     response.sendFile(file);
   }
}
[I][I][I][I][I]void onAjaxSetLedColor(HttpRequest &request, HttpResponse &response)
{
   String color = request.getQueryParameter("value");
   debugf("Get new led color: %s", color.c_str());
   RED_value = strtol(color.substring(0,2).c_str(),NULL,16);
   GREEN_value = strtol(color.substring(2,4).c_str(),NULL,16);
   BLUE_value = strtol(color.substring(4,6).c_str(),NULL,16);
   debugf("Parse color to RGB: %d %d %d",RED_value, GREEN_value, BLUE_value);

  if (RED_value > 255) RED_value=255;
  if (RED_value < 0) RED_value=0;
  RedPWM.analogWrite(RED_LED,RED_value);

  if (GREEN_value > 255) GREEN_value=255;
  if (GREEN_value < 0) GREEN_value=0;
  GreenPWM.analogWrite(GREEN_LED,GREEN_value);

  if (GREEN_value > 255) GREEN_value=255;
  if (GREEN_value < 0) GREEN_value=0;
  BluePWM.analogWrite(GREEN_LED,GREEN_value);

   JsonObjectStream* stream = new JsonObjectStream();
   JsonObject& json = stream->getRoot();
   Serial.printf("Current RGB colors1: %d %d %d\r\n",RED_value, GREEN_value, BLUE_value);
   json["status"] = (bool) true;
   json["red"]  = (int)  RED_value;
   json["green"]  = (int)  GREEN_value;
   json["blue"]  = (int)  BLUE_value;
   response.setAllowCrossDomainOrigin("*");
   response.sendJsonObject(stream);
   Serial.printf("Current RGB colors2: %d %d %d\r\n",RED_value, GREEN_value, BLUE_value);
}

void onAjaxGetLedColor(HttpRequest &request, HttpResponse &response)
{
   JsonObjectStream* stream = new JsonObjectStream();
   JsonObject& json = stream->getRoot();

   json["status"] = (bool) true;
   json["red"]  = (int)  RED_value;
   json["green"]  = (int)  GREEN_value;
   json["blue"]  = (int)  BLUE_value;

   Serial.printf("Current RGB colors: %d %d %d\r\n",RED_value, GREEN_value, BLUE_value);

   response.setAllowCrossDomainOrigin("*");
   response.sendJsonObject(stream);
}

void startWebServer()
{
   server.listen(80);
   server.addPath("/", onIndex);
   server.addPath("/ajax/setledcolor", onAjaxSetLedColor);
   server.addPath("/ajax/getledcolor", onAjaxGetLedColor);
   server.setDefaultHandler(onFile);
}

void startFTP()
{
   if (!fileExist("index.html"))
     fileSetContent("index.html", "<h3>Please connect to FTP and upload files from folder 'web/build' (details in code)</h3>");

   ftp.listen(21);
   ftp.addUser("me", "123"); // FTP account
}

void startServers()
{
   startFTP();
   startWebServer();
}

[I][I][I]void init()
{
   RedPWM.initialize();
   GreenPWM.initialize();
   BluePWM.initialize();

   RedPWM.analogWrite(RED_LED, 0);
   GreenPWM.analogWrite(GREEN_LED, 0);
   BluePWM.analogWrite(BLUE_LED, 0);

   Serial.begin(SERIAL_BAUD_RATE);
   Serial.systemDebugOutput(false);
   AppSettings.load();

   WifiStation.enable(true);
   if (AppSettings.exist())
   {
     WifiStation.config(AppSettings.ssid, AppSettings.password);
     if (!AppSettings.dhcp && !AppSettings.ip.isNull())
       WifiStation.setIP(AppSettings.ip, AppSettings.netmask, AppSettings.gateway);
     Serial.printf("Current network settings: ip %d  netmask %d gateway %d\r\n",WifiStation.getIP(), WifiStation.getNetworkMask(), WifiStation.getNetworkGateway());
   }
   WifiStation.startScan(networkScanCompleted);

   // Start AP for configuration
   WifiAccessPoint.enable(true);
   WifiAccessPoint.config("Sming Configuration", "", AUTH_OPEN);

   // Run WEB server on system ready
   System.onReady(startServers);
}
[/I][/I][/I][/I][/I][/I][/I][/I]
никто с подобным не сталкивался?
 
Последнее редактирование:

FGX

Member
Подскажите пожалуйста как по uart принимать данные?
Завести таймер rs232_Timer.initializeMs(10000, Serial_reseiv_Data).start(); // every 1 sec
И написать обработчик
char buf[100];

void Serial_reseiv_Data(){
int i=0;
if (Serial.available()){
while( Serial.available() && (i< 99)) {
buf[i++] = Serial.read();
}
buf[i++]='\0';
}
 

Casper

Member
Подскажите ещё такой момент, как отправить GET запрос? Из примера HttpClient_ThingSpeak пробую вставить свою ссылку client.downloadString("http://192.168.1.44/script.php?name=99", onDataSent); но ничего не происходит, даже onDataSent не срабатывает, на порту тишина.
P.S.
Почему-то он не хочет воспринимать ip адрес в ссылке URL((
 
Последнее редактирование:

M-a-x-x

New member
Доброго времени суток! Если кого не затруднит, покажите как по примеру "MeteoControl" написать свой код по отсылке данных датчиков DHT22, BH1750, BMP180, DS1820, PIR на MQTT сервер. Получается вебсервер на ESP не нужен, а только модульная структура. И в тоже время принимать с MQTT сервера команды по управлению GPIO. И как сделать чтобы от датчика движения и GPIO сразу же приходило значение, не зависимо от таймера опросов остальных датчиков?
Ну и что бы два раза не вставать:) - возможно ли адаптировать под Sming этот код для получения данных с сенсора THGN132N погодной станции Oregon?
 

Вложения

ntil

New member
день добрый.
Как бы мне поставить прерывание на быстрый таймер, в несколько десятков КГц ?
или как работать с I2S (не путать сI2C) из сминга?
или как организовать быстрый PWM + прерывание на него ?
Спасибо заранее!
 

M-a-x-x

New member
покажите как по примеру "MeteoControl" написать свой код по отсылке данных датчиков на MQTT сервер
В общем проведя несколько бессонных ночей, набросал примерно как это должно выглядеть. Надеюсь на этот раз кто нибудь в этой теме разбирающийся посмотрит приложенный пример и подскажет как это довести до ума, потому что я ниразу не программист и это всего лишь одно из моих хобби)
Итак, это подобно "MeteoControl" с модульной структурой, только с выпиленным вебсервером и экраном. Код не удалял, просто закомментировал, работу вебсервера, если раскомментировать строки, не проверял. А экран с четырьмя датчиками (DHT22, DS1820, BH1750, BMP180) не смог подружить, работает только с первыми двумя (компиляция проходит, но ESP8266 сыпит ошибки в терминал).
Но то что мне нужно делает - отправляет данные на MQTT сервер. Также управляет и отправляет статус GPIO OUTPUT (по таймеру) и INPUT (при изменении). Прикручено еще обновление по воздуху, вызывается сообщением "burn" в топик "testing/firmware", правда работает через раз)
По настройке: в файле "configuration.h" указываем параметры подключений, а в "application.cpp" в четырех местах (они пронумерованы) комментируем строки датчиков, которые не установлены.
Вопрос по получению данных с сенсора THGN132N погодной станции Oregon остается открытым)
 

Вложения

Negor

New member
Появилась идея запилить асинхронный ответ на запрос, но не знаю как в нашем с лучае с плюсами такое провернуть. Имеется код-пример списка сетей. Напомню вкратце
Код:
WifiStation.startScan(networkScanCompleted);

void networkScanCompleted(bool succeeded, BssList list){
// Code...
}
Это не очень круто, было бы лучше запилить так(код не компилится)
Код:
void httpAsyncList( HttpRequest &request, HttpResponse &responce){
    WifiStation.startScan([&responce](bool success, BssList list)mutable{
        JsonObjectStream* stream = new JsonObjectStream();
    JsonObject& json = stream->getRoot();
        json["scanSuccess"] = (bool)success;
        responсe.sendJsonObject(stream);
    });
}
Как такое правильно провернуть и возможно ли это?
 
Последнее редактирование:

Symrak

New member
Всем привет!
Всех с наступающими праздниками!

Прошу подсказать, существует ли/планируется ли реализация работы с кодировками в Sming?
В частности, вопрос актуален для httpClient, а точнее – для содержимого response.

Спасибо.
 

Symrak

New member
Всем доброго времени суток!

Подскажите пожалуйста,есть ли у кого пример реализации авторизации пользователя (запрос логина-пароля) при работе с Web-сервером?

Спасибо.
 
Кто нибудь подскажите пример,как с Web страницы,по событию нажатия кнопки,отправить в Serial port какое нибудь значение
 

Symrak

New member
Кто нибудь подскажите пример,как с Web страницы,по событию нажатия кнопки,отправить в Serial port какое нибудь значение
В примере HttpServer_Bootstrap это можно сделать, поменяв обработчик в коде на стороне модуля.
Так же можно, предварительно, выкачать самому и включить в SPIFFS файлы, которые будет тянуть модуль.
Работа с UART - см. Basic_Serial.
 

M-a-x-x

New member
Кто нибудь подскажите пример,как с Web страницы,по событию нажатия кнопки,отправить в Serial port какое нибудь значение
Можно еще пример HttpServer_AJAX посмотреть. Алгоритм примерно такой:
1. В файл примера в функции void startWebServer() добавить "server.addPath("/ajax/serial", onSerial);"
2. Добавить перед выше названной функции функцию:
Код:
void onSerial(HttpRequest &request, HttpResponse &response)
{
String info = request.getQueryParameter("value");
Serial.print("Value from page: ");
Serial.println(info);
}
3. В index.html между <script></script> добавить:
JavaScript:
$(document).ready(function() {
$(".someId").click(function() {
  var info = $(this).attr('data-value');
  $.getJSON('ajax/serial', {value: info}, function(data) {
  });
});
4. В сам код страницы добавить кнопку:
HTML:
<button type="button" class="someId btn btn-primary btn-sm" data-value="sendInfo">Send</button>
 

alexsk

New member
Доброго времени суток!

Разбираюсь с фреймворком на примере конкретной задачи: хочу поднять микро front-end "сервер" с минимальным restApi (чтение/запись данных от различных устройств, их конфигурирование и пр.), плюс раздача статику с SD (очень уж мало места в spiffs). Так же к этому "серверу" могут подключаться другие устройства/контроллеры, он хранит список подключенных устройств и метаданные по каждому из них (у кого какие данные можно прочитать и что им можно передавать). Таким образом реализуется возможность чтения и управления вторичными устройствами по restApi front-end сервера. Способ подключения вторичных устройств может быть любой.
Изначально предполагал коннектить их посредством nRF24, но так ничего и не вышло - не в какую не хочет моя esp201 дружить с nRF24lo1+. Собственно первый вопрос, нет ли у кого примера подключения этих двух устройств (в первую очередь имеются виду на какие пины подключать). Не один пример из Sming не полетел, esp просто уходит в ребут при большинстве вызовов радио (printDetails, например).

Кроме того, в процессе имплементации столкнулся с рядом проблем и непонятных мне ограничений:
  • Нельзя отправить свой HTTP код ответа, и набор предопределенных ограничен. Как минимум для реализации нормального кеширования нужен 302 (когда браузер имеет закешированную версию и хочет убедиться, что файл не изменился);
  • Вся работа с файлами в http-классах заточена под spiffs, отправить что то флешки никак;
  • Нельзя отправить в HttpResponse свой поток (например, посредством своей реализации IDataSourceStream, заточенной под файлы с той же внешней флешки);
  • В HttpRequest нет никакой информации о клиенте, хотя бы ip (в TCPConnection информация есть, но из калбэка HttpPathDelegate к нему не добраться);
  • Нет ни одного примера, как читать данные из body (они же, на сколько я понимаю, postData). Простейший пример - загрузка файла на сервер;
  • Нет примера обновления прошивки через http-сервер. Есть класс HttpFirmwareUpdate, но он является наследником HttpClient-а, т.е. заточен под загрузку с удаленного http-сервера. Хотелось бы иметь возможность обновляться не с определенного сервера, а с через собственный web-интерфейс;
  • Нет примера, как обновить прошивку, например с флешки (вставили флешку, если на ней есть определенный файл, обновляемся из него).
Первые четыре проблемы решил немного изменив и пересобрав сам фреймворк. Попутно реализовал отдачу статики с флешки или spiffs (файл ищется на spifffs, если нет там, то в определенной папке на внешней флешке (что бы не раздавать с флешки все подряд), если нет там то либо специальный файл (мне по дефолу нужно всегда отдавать index.html), либо если специального файла не указано, то 404. Бонусом прикрутил полноценное кэширование, с проверкой, не изменился ли файл (ориентируется по размеру и дате, для spiffs только по размеру).

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

Не решенные проблемы:
  • Подключение вторичных устройств. Буду благодарен, если кто-то подскажет, как подключить nRF24 или идею, как еще можно без проводов дружить esp с другими устройствами. Желательно без особых извращений... :)
  • Upload файлов - совершенно не понятно как вынуть нужную информацию из HttpRequest (кроме contentLength, которые кстати может быть и не указан в headers). Отдельно интересует как реализовать multipart-загрузку.
  • Обновление прошивки посредством web-интерфейса или SD карточки.
Спасибо за любую помощь, и сильно не пинайте...я можно сказать новичок в плане работы с микроконтроллерами вообще, и с esp8266 в частности.
 

rkravt

Member
Изначально предполагал коннектить их посредством nRF24, но так ничего и не вышло - не в какую не хочет моя esp201 дружить с nRF24lo1+. Собственно первый вопрос, нет ли у кого примера подключения этих двух устройств (в первую очередь имеются виду на какие пины подключать).
alexsk, дело в том, что nRF24lo1+ еще та капризная штука!
Пример Radio_nRF24L01 из Sming у меня тоже не взлетел, тот же ребут.
Попробуйте при инициализации nRF24lo1+ установить все возможных параметры идентичными!
Ибо только, наверное, Конфуцию известно как инициализируются эти модули при дефаултных настройках.

Вот мой пример инициализации, который работает на ура:
Код:
radio.setChannel(8);  // Установка канала вещания;
radio.setRetries(15, 15);  // Установка интервала и количества попыток "дозвона" до приемника;
radio.setDataRate(RF24_250KBPS);  // Установка минимальной скорости;
radio.setPALevel(RF24_PA_MAX);  // Установка максимальной мощности;
radio.enableDynamicPayloads();  // Разрешение отправки нетипового ответа передатчику;
radio.setAutoAck(1);   // Установка режима подтверждения приема;
radio.enableAckPayload();  // Разрешение отправки нетипового ответа передатчику
radio.setCRCLength(RF24_CRC_16);
//radio.setCRCLength(RF24_CRC_8);
//radio.setCRCLength(RF24_CRC_DISABLED);
 

alexsk

New member
rkravt, спасибо вечером попробую, о результатах отпишусь.

По поводу upload-а файлов и multipart/form-data, посмотрел внимательно на реализацию HttpRequest, а точнее на парсер параметров боди, и понял, что он и не догадывается, что бывают разные форматы боди. Что бы не пришло в запросе, он парсит боди как "application/x-www-form-urlencoded", даже не пытаясь заглянуть в content-type в хидере. Очень хочется запилить нормальный парсер, понимающий основные форматы (text/plain, multipart/form-data), и заодно научить его принимать потоки (файлы, raw-боди больше чем 4кб и пр.). Но тут уже безе значительной переделки всех http-классов не обойтись.

Если кому надо будет, пишите - выложу изменения. Со временем надеюсь удастся протолкнуть в апстрим.
 
Последнее редактирование:

alexsk

New member
rkravt, не полетело... Вот чего выдает в терминал:
[inline]
ets Jan 8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 23568, room 16
tail 0
chksum 0xe3
load 0x3ffe8000, len 884, room 8
tail 12
chksum 0x97
ho 0 tail 12 room 4
load 0x3ffe8378, len 2500, room 12
tail 8
chksum 0x5b
csum 0x5b
rl

start
STATUS.. = 0xff RX_DR=1 TX_DS=1 MAX_RT=1 RX_P_NO=7 TX_FULL=1
RX_ADDR_P0-1.. = 0xffffffffff 0xffffffffff
RX_ADDR_P2-5.. = 0xff 0xff 0xff 0xff
TX_ADDR.. = 0xffffffffff
RX_PW_P0-6.. = 0xff 0xff 0xff 0xff 0xff 0xff
EN_AA.. = 0xff
EN_RXADDR.. = 0xff
RF_CH.. = 0xff
RF_SETUP.. = 0xff
CONFIG.. = 0xff
DYNPD/FEATURE.. = 0xff 0xff
Data Rate. = pz?dZ~?(
.rl.l|.l`|.....ll.b|.l.rbl.brnnlnnbl.b.plb.lrlprn`.....l......b.nb|.ll.brnnn.ll`...nn.l`...nrn..rl`.prn`....rb`....b.nb|....brnnn...l`...nnll`...nrn...l.l`rn...`bnl.rnnn...lprn`....rb`ll.b.nb|.l..brnnn.l.l`...nn.l`...nrn..`..rn..`.rl
[/inline]
После этого уходи в ребут... С теми же параметрами на ардуине все летит на ура. Не понимаю, может именно с моделью esp201 что-то не так...
 
Сверху Снизу