Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Sming Open Source Framework", создана пользователем JustACat, 23 мар 2015.

  1. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Можно еще запускать таймер разово, то есть вызывать:
    procTimer.initializeMs(100, process).startOnce();
    Каждый раз в конце самой этой вашей процедуры void process() после всех обработок. Тогда таймер вторично не вызовется точно.
    Правда это не избавит вас от вызова других прерываний (если они есть - тут уже к @anakod'у) во время выполнения вашего кода. Тогда, если критично, то да, надо как-то запрещать прерывания на время выполнения критичного кода.
     
  2. ntil

    ntil Новичок

    Сообщения:
    8
    Симпатии:
    0
    дык я показал как прерывания запрещать, если что.
     
  3. Okadzaki

    Okadzaki Новичок

    Сообщения:
    24
    Симпатии:
    2
    Прошу добавить, или указать на существующий пример планировщика. Например на веб-странице указать время, оно запишется в файл, и по достижению этого время, будет выдана 1 или 0 на соответствующей ноге. Время берётся по NTP.
    В итоге, чтобы при выключении питания, программа опять открывала файл, брало ближайшее событие (время), и по его достижению - меняло состояние на ноге.
    Предпологаю, что числа нужно хранить в файле как массив JSON в формате time_t (UnixTime), но как-то реализовать не получилось.
     
  4. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Okadzaki, приведите код, подскажем. А вообще хороший пример чтения\записи данных в файл есть в примере HttpServer_ConfigNetwork. Для работы с массивами: json.createNestedArray("...")
     
  5. Okadzaki

    Okadzaki Новичок

    Сообщения:
    24
    Симпатии:
    2
    Есть например следующий обработчик страницы:
    Код (C):
    1. void onSchedule(HttpRequest &request, HttpResponse &response)
    2. {
    3.     if (request.getRequestMethod() == RequestMethod::POST){
    4.         uint8_t min = request.getPostParameter("minutes").toInt();
    5.         uint8_t hour = request.getPostParameter("hour").toInt();
    6.         uint8_t sec = request.getPostParameter("Seconds").toInt();
    7.  
    8.         uint16_t year = request.getPostParameter("year").toInt();
    9.         uint8_t month = request.getPostParameter("month").toInt();
    10.         uint8_t day = request.getPostParameter("day").toInt();
    11.          
    12.     bool state = request.getPostParameter("state").toInt();
    13.      time_t time = convertToUnixTime(sec,min,hour,day,month,year);
    14.      scheduleFile.save(time,state);
    15.     }
    16.     TemplateFileStream *tmpl = new TemplateFileStream("schedule.html");
    17.     auto &vars = tmpl->variables();
    18.     response.sendTemplate(tmpl);
    19. }
    Структура JSON, что будет хранится в файле - ориентировачно такая:
    Код (Javascript):
    1.  
    2. {
    3.   "times":[
    4.   {
    5.   "time": 111111111,
    6.   "state": true
    7.   },
    8.   {
    9.   "time": 111111111,
    10.   "state": true
    11.   }
    12.   ]
    13. }
    14.  
    А вот как сделать так, чтобы при записи в файл, оно дополняло массив ( а если файл с конфигурацией вообще пуст - создать массив, добавить в него первый объект) - не знаю.

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

    А раз в секунду, проверять, совпадает ли текущее время с тем ближайшем событием из файла. Как-то так:
    Код (C):
    1. void checkEvent(){
    2. time_t now = SystemClock.now(true);
    3. if (now == eventTime){
    4.     digitalWrite(RELAY_PIN,event_state);
    5.     scheduleFile.deleteEvent();
    6. }
    7. }
    8.  
    9. void connectOK(){
    10.     Serial.print("OK");
    11.     WifiAccessPoint.enable(false);
    12.     ntp.setAutoQueryInterval(30);
    13.     ntp.setAutoQuery(true);
    14.     /*if (!AppSettings.rtc_sync){
    15.         ntp.requestTime();
    16.     }*/
    17.     schedulePlan.initializeMs(1000,checkEvent);
    18.  
    19. }

    Сама же структура scheduleFile включает в себя функции по записи в файл, чтения ближайшего события, и удаление последнего события.
     
  6. alexhi

    alexhi Читатель

    Сообщения:
    77
    Симпатии:
    15
    Подскажите как в SMING настроить ногу RXD как цифровой вход , пробывал так pinMode(3,INPUT); не получается.
     
  7. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    alexhi, а вывод дебага отключали?
    Serial.systemDebugOutput(false);
    Хотя это же на TXD должно влиять, ну может еще что-то нужно...
    Если только может еще не делать в начале:
    Serial.begin();
    Т.к. в нем же как раз происходит настройка UART и запуск его прерываний.
     
    alexhi нравится это.
  8. alexhi

    alexhi Читатель

    Сообщения:
    77
    Симпатии:
    15
    JustCat,спасибо. Так работает:

    Serial.systemDebugOutput(false);
    [HASHTAG]#define[/HASHTAG] PIN_RXD 3
    pinMode(PIN_RXD,INPUT);
    while (1)
    {
    WDT.alive();
    delay(1000);
    Serial.println(digitalRead(PIN_RXD));
    }
     
  9. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Okadzaki, в целом все правильно. Хороший пример открытия и загрузки файла:
    https://github.com/anakod/Sming/blob/master/HttpServer_ConfigNetwork/include/AppSettings.h

    Если файла нет - инициализируете структуру, добавляете пустой массив (как создаются объекты в методе save). Далее по необходимости добавляете и удаляете узлы.
    Посмотрите документацию на исходную библиотеку: https://github.com/bblanchon/ArduinoJson там есть примеры и информация по методам.

    А вот пример создания массива и добавления элементов:
    https://github.com/anakod/Sming/blob/master/HttpServer_ConfigNetwork/app/application.cpp#L84
     
  10. Okadzaki

    Okadzaki Новичок

    Сообщения:
    24
    Симпатии:
    2
    А каким образом я смогу тогда просто дописать в файл элемент массива?
     
    Последнее редактирование модератором: 3 июн 2015
  11. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Загружаете текущее состояние из файла, получаете нужный узел по имени (собственно Ваш массив), а затем так же добавляете в него новый элемент.
     
  12. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Okadzaki, если приложите полный код (архивом), то возможно что-нибудь еще смогу подсказать.
    Обратное тоже верно: когда доделаете, буду очень рад принять pull-request в основной репозиторий, мне кажется пример планирования задач по времени - действительно интересная вещь для пользователей.
     
  13. Okadzaki

    Okadzaki Новичок

    Сообщения:
    24
    Симпатии:
    2
    Возникла проблема с сохранением в файл JSON.
    Есть следующая структура, в которой хранятся данные об файле с расписанием.
    Код (C):
    1.  
    2. #define TIMERS_FILE ".timers.conf"
    3. struct ScheduleFile{
    4.  
    5.    void save(time_t time, bool state){
    6.      DynamicJsonBuffer jsonBuffer;
    7.      if (!exist()){
    8.        JsonObject& root = jsonBuffer.createObject();
    9.        root["count"] = 1;
    10.        JsonArray& timesArray = root.createNestedArray("times");
    11.        JsonObject &item = timesArray.createNestedObject();
    12.        item.add("time",time);
    13.        item.add("state",state);
    14.        fileSetContent(TIMERS_FILE,root.toJsonString());
    15.      }else{
    16.        int size = fileGetSize(TIMERS_FILE);
    17.        char* jsonString = new char[size + 1];
    18.        fileGetContent(TIMERS_FILE, jsonString, size + 1);
    19.        JsonObject& root = jsonBuffer.parseObject(jsonString);
    20.        uint8 count = root["count"];
    21.        root["count"] = count + 1;
    22.        JsonArray& timesArray = root["times"];
    23.        JsonObject &item = timesArray.createNestedObject();
    24.        item.add("time",time);
    25.        item.add("state",state);
    26.        delete[] jsonString;
    27.        fileSetContent(TIMERS_FILE,root.toJsonString());
    28.      }
    29.    }
    30.  
    31.  
    32.  
    33.    bool exist() { return fileExist(TIMERS_FILE); }
    34.  
    35. };
    36.  
    На вход поступает bool и time_t (UNIX time число).
    Проблема заключается именно при записи в файл, если он уже существует. Вариации файла .timers.conf представлены ниже:
    Произошла первая запись в файл(файл до этого момента не существовал):
    Код (Javascript):
    1. {
    2.   "count": 1,
    3.   "times": [
    4.   {
    5.   "time": 1449832271,
    6.   "state": true
    7.   }
    8.   ]
    9. }
    Вторая:
    Код (Javascript):
    1. {
    2.   "count": 2,
    3.   "times": [
    4.     {
    5.       "time": 1449832271,
    6.       "state": true
    7.     },
    8.     {
    9.       "time": 1452600732,
    10.       "state": true
    11.     }
    12.   ]
    13. }
    Третья:
    Код (Javascript):
    1. {
    2.   "s.conf": 3,
    3.   "": [
    4.     {
    5.       " 3,\r\n  \"\": [\r\n    {\r\n      \" 3,\\r\\n  \\\"\\\": [\\r\\n    {\\r\\n      \\\" 3,\\\\r\\\\n  \\\\\\\"\\\\\\\": [\\\\r\\\\n    {\\\\r\\\\n      \\\\\\\" 3": 1449832271,
    6.       "\" 3,\\r\\n  \\\"\\\": [\\r\\n    {\\r\\n      \\\" 3,\\\\r\\\\n  \\\\\\\"\\\\\\\": [\\\\r\\\\n    {\\\\r\\\\n      \\\\\\\" 3": true
    7.     },
    8.     {
    9.       "\\\" 3,\\\\r\\\\n  \\\\\\\"\\\\\\\": [\\\\r\\\\n    {\\\\r\\\\n      \\\\\\\" 3": 1452600732,
    10.       "\\\\n    {\\\\r\\\\n      \\\\\\\" 3": true
    11.     },
    12.     {
    13.       "time": 1454288461,
    14.       "state": false
    15.     }
    16.   ]
    17. }
    Четвертая:
    Код (Javascript):
    1. {
    2.   "": 3,
    3.   "": [
    4.     {
    5.       "я?h": 1449832271,
    6.       "\" 3,\\r\\n  \\\"\\\": [\\r\\n    {\\r\\n      \\\" 3,\\\\r\\\\n  \\\\n  \\\\\\\\n  \\\\\\\\\\\\\\\\n  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\set-3\">\n \\\\Ђlя?Ш": true
    7.     },
    8.     {
    9.       "t-3\">\n \\\\Ђnя?Ш": 1452600732,
    10.       "\\\\n    {\\\\r\\\\n      \\\\\\\" 3": true
    11.     },
    12.     {
    13.       "time": 1454288461,
    14.       "state": false
    15.     }
    16.   ],
    17.   "count": 1,
    18.   "times":
    19. }

    После пятой записи, файл тупо становится размером в 2 байта, и ничего в себе не хранит.7
    Подскажите, в чем ошибка?
     
  14. Okadzaki

    Okadzaki Новичок

    Сообщения:
    24
    Симпатии:
    2
    Неужели никто с подобным не сталкивался?
     
  15. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Ошибка из-за того что delete[] jsonString; делается до того как файл записан. Соответственно данные могут быть потеряны (т.к. ArduinoJson не копирует память а использует исходную).
     
    JustACat и Okadzaki нравится это.
  16. Okadzaki

    Okadzaki Новичок

    Сообщения:
    24
    Симпатии:
    2
    Да, действительно проблема была в этом. Спасибо
     
  17. Данило

    Данило Новичок

    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте.
    Не подбросите пример для Mqtt. Почему то не публикует сообщение без таймера, если просто вызвать метод.
     
  18. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Пример есть в стандартных.
    Возможно проблема в том что Вы пробуете опубликовать сообщение до того как соединение с сервером установлено?
     
  19. VelAndr

    VelAndr Новичок

    Сообщения:
    25
    Симпатии:
    0
    Здравствуйте!
    Начинаю изучать Ваш sming - все очень красиво выглядит. В процессе написания первой тестовой прошивки (на основе примера ConfigNetwork) у меня не получилось сформировать файл с файловой системой spiffs с веб-контентом (чтобы не загружать страницы по FTP). Я пробовал использовать find | mkespfsimage > spiff_rom.bin , но ничего не получилось - в файловой системе остался все тот же index.html.
    Как правильно это делать, и можно ли вообще это сделать?
    Спасибо!
     
  20. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100

Поделиться этой страницей