Jump to content
iT4iT.CLUB

Recommended Posts

15.04.2019 в 21:36, post125 сказал:

Показания от -1 до +1 округляет до нуля как с фильтром, так и без фильтра.

Проблема действительно была в коде и искать её нужно в файле sensors.h, нас интересует метод clear

String sensors::clear(float value) {
  if ((int)value == 0) return "0";
  else if (value - (int)value == 0) return String((int)value);
  else return String(value);
}

Данный код используется для обрезания лишних нулей после запятой при формировании json объекта с данными журнала для их передачи в web интерфейс. Смысл был в уменьшении размера передаваемого объекта. Проблема крылась в самой первой проверке, её не смогут пройти числа меньше от -1 до 1 из-за приведения их к целому значению.

Замените его на более явный и понятный код

String sensors::clear(float value) {
  if (value == 0) return "0";
  if (value - (int16_t)value == 0) return String((int16_t)value);
  return String(value);
}

Вот пример его работы на числах близких к нулю

0.000000, 0
0.123400, 0.12
0.500000, 0.50
-0.900000, -0.90
1.000000, 1
0.987654, 0.99
9.000000, 9

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

1 час назад, post125 сказал:

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

Уверяю Вас, что все графики масштабируются одинаково. Все дело в том, что:

  1. Фактические показания барометра всегда находятся в узкой полосе по оси Y относительно лимитов этой оси
  2. График автоматически масштабируется под минимальные и максимальные значения переданных ему данных
  3. Изначально массив с данными для графика заполнен нулевыми значениями во всем своем диапазоне

Получается, что пока все нулевые значения не будут вытеснены из массива, а это первые 24 часа работы, график будет строиться с учетом этих значений т.к для него это живые данные, хотя в человеческом понимании (появление значений по оси Y отличных от 0) это дает ошибочное чувство, что график только начал наполняться и визуально изменяться. Даже если Вы перезапустите контроллер и откроете график до того, как контроллер начнет перезапись массива с логами, Вы увидите полностью построенный график, но просто все значения по оси Y равны 0.

Обратите внимание, как выглядит график давления после первых суток работы.

image.png

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

https://www.highcharts.com/demo/live-data

Возможно в API можно найти свойство, отвечающее за выход значения по оси Y за определенные лимиты и регулирующее поведение графика, но это мои догадки, ответ нужно искать в документации от Highcharts.

  • Thanks 1

Share this post


Link to post
Share on other sites
1 час назад, Kitsum сказал:

String sensors::clear(float value) {
  if (value == 0) return "0";
  if (value - (int16_t)value == 0) return String((int16_t)value);
  return String(value);
}

 

Скрытый текст

1744327075_7.thumb.jpg.2239460539f2507674510e5941e5e631.jpg

Супер! Работает! Спасибо!

 

1 час назад, Kitsum сказал:

Уверяю Вас, что все графики масштабируются одинаково

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

Edited by post125

Share this post


Link to post
Share on other sites
8 часов назад, post125 сказал:

А нельзя ли при запуске ESP первым значением с датчика заполнить все ячейки, а потом замещать их новыми данными? Тогда сразу графики будут презентабельными

Вы вполне можете так сделать, но, как и нулевые значения, это по-прежнему будут не настоящие данные на протяжении всего начального суточного графика. Тут уже кому, что больше нравится. Лично для меня логически более понятно, когда данные начинают поступать от 0, особенно если отображаются несколько источников информации, я сразу вижу, когда контроллер начал его наполнение. Если требуется более детально рассмотреть динамику изменений и при этом исключить влияние на масштабирование со стороны пограничных значений, я использую выделение нужной области, в народе просто зуммирование.

Выделение интересующей нас области

image.png

Результат зуммирования

image.png

Смотрите как будет удобнее лично Вам.

  • Thanks 1

Share this post


Link to post
Share on other sites
4 часа назад, Kitsum сказал:

Тут уже кому, что больше нравится

Благодарю за ответ и помощь! У меня что-то обе ESPки перезагружаются примерно 1 раз в сутки, поэтому корректного маштабирования графика мне не видать как своих ушей. Видимо, надо думать куда аккумулировать данные и оттуда строить гафики (что-то своё, не народномониторное). Нет ли какой-нибудь ссылки как построить простенький сервер для этих целей.

В следующей версии не планируете получать данные на ESP с удаленных датчиков через NRF подключенной к slave ардуине по i2c?

Share this post


Link to post
Share on other sites
1 час назад, post125 сказал:

У меня что-то обе ESPки перезагружаются примерно 1 раз в сутки

А вот это оставлять так не стоит. Не пытались выяснить через какое время после старта это происходит или после какого события? Обратите внимание, что в Serial монитор периодически сбрасываются данные о свободной памяти (freeHeap), это значение не должно постоянно уменьшаться. Обычно, после выполнения всех заданий в планировщике это значение останавливается на фиксированной отметке и больше не уменьшается. Также для отслеживания памяти через web можно добавить программный сенсор.

sensors.add(new knob_t(0, 81920, "1", "RAM", "Byte"), device::in, "ram", [&](){
  return 81920 - ESP.getFreeHeap();
});

Это первое с чего стоит начать.

Также можете отключать разные части кода и смотреть на работу в течении суток. И помните, что в ESP8266 v2.4.1 для Arduino IDE имеется утечка памяти. Я рекомендую использовать 2.4.2. В общем, не бросайте эту ситуацию.

1 час назад, post125 сказал:

Нет ли какой-нибудь ссылки как построить простенький сервер для этих целей.

Лично я использую Zabbix, передача данных идет через MQTT. Но думаю, что стоит отталкиваться от того, на чем вы можете развернуть какую-либо систему мониторинга.

1 час назад, post125 сказал:

В следующей версии не планируете получать данные на ESP с удаленных датчиков через NRF подключенной к slave ардуине по i2c?

Эту возможность планировалось реализовать в текущей версии, но выход ESP32 перебросил свободное время хобби микроконтроллеров на себя. Это вполне возможно в будущем.

Share this post


Link to post
Share on other sites

Добрый день! Благодарю за отзывчивость! Я Вас уже, наверное, достал своими вопросами. Програмный сенсор памяти я не убирал и на одной ESP добавил график на него. Сколько не смострел, значения не выходят за диапазон 49к-52к.

Скрытый текст

878405451_8.thumb.jpg.3b68a1e777df35f9455df52c75f0b8e7.jpg

там где ровно - примерно 51100-51200, где пики - примерно 51700.

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

Скрытый текст

1911226126_-12.thumb.jpg.e32e2682c48a386bcef986a572a0265f.jpg 1951972843_-11.jpg.2a7b94bc3bb4472c8efb98c8cea60937.jpg

16 часов назад, Kitsum сказал:

рекомендую использовать 2.4.2.

это я помню, использую 2,4,2

Edited by post125

Share this post


Link to post
Share on other sites
10.11.2017 в 13:06, Kitsum сказал:

@LogOFF хорошо, с гаражом мы разберемся. Но в любом случае, вся силовая часть ляжет на Ваши плечи и именно Вам решать, как управлять вентиляторами и нагревателями.

Что касаемо метеостанции на улице, то в принципе все уже готово, плюс ко всему будет описание, как перевести все на единый датчик BME280. А значит уменьшится бюджет всего проекта. Пока ждем датчики. Теплицы тоже подпадают под этот пункт.

А вот общение с центральным сервером это уже интересный вопрос связанный непосредственно с коммуникацией. Могу предположить, что имеются три разных объекта:

  1. Квартира с центральным сервером
  2. Удаленный участок с домиком и теплицей
  3. Гараж

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

У меня тоже малина с москитом и я искренне не понимаю зачем заставлять контроллер принимать решение когда это может сделать малина. Добавляем node-red и получаем гибкую систему настроек и логики событий доступных в браузере

Share this post


Link to post
Share on other sites
14 часов назад, post125 сказал:

Ранее пытался поднять частоту сбора данных на графики, как-то не получилось. Вроде бы вернул всё обратно.

Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху.

14 часов назад, post125 сказал:

Попробую перепроверить файл index.htm, может там что-то накосячил.

Работа index.htm не может влиять на микроконтроллер т.к весь код этого файла обрабатывается на стороне браузера. Контроллер принимает участие только в ответах на запросы API.

10 часов назад, svchekalin сказал:

зачем заставлять контроллер принимать решение когда это может сделать малина

По умолчанию контроллер полностью работает в автономном режиме, без подключения WiFi, сторонних сервисов, и внешней логики. Ставим в гараж, накидываем датчики, нагрузку, двигаем ползунки в web интерфейсе и в бой. Все остальное уже последствия различной степени интеграции в пользовательскую кухню. На данном этапе существования проекта можно легко добавить практически все идеи, описываемые в этой теме.

  • Thanks 1

Share this post


Link to post
Share on other sites
5 часов назад, Kitsum сказал:

Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху.

Добрый день! Ничего не делал, перестали перезагружаться. Видимо, код адаптировался. Понаблюдаю еще.

Edited by post125

Share this post


Link to post
Share on other sites
18.04.2019 в 09:13, Kitsum сказал:

Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху.

Добрый день!

в sensors.h указано byte logSize = 144; , т.е. как и было, больше ничего не менял в скетче, связанного с графиками. Если index.htm не влияет на перезагрузки, тогда не знаю что смотреть. попробую еще отключить ProMini с NRF.

стал изменять частоту отправки на народный монитор, сбор данных с датчиков и частоту проверки шины. При установке проверки и инициализации датчиков на 10 минут, сбора данных с датчиков 1, 3, 6 минут (с уличного датчика данные передаются каждые 3 минуты) на графике народного монитора обнаружил что ошибочные(нулевые ) значения длятся 10 минут. Изменил проверку шины и инициализацию датчиков на 20 минут, ошибочные данные на графике длятся от 20минут. Ошибки появляются как на народном мониторе, так и на графиках ESPшки , причём время появления ошибки разное на всех графиках. Можно ли вообще отключать проверку шины? Может проверка не дружит с ProMini?

ошибка длительностью 10мин (проверка шины и инициализация датчиков на 10 минут, сбора данных с датчиков 6 минут)

Скрытый текст

10minut.thumb.jpg.5aa1f3b11fa96fb052e7b4803e4fefed.jpg

ошибка длительностью 20мин (проверка шины и инициализация датчиков на 20 минут, сбора данных с датчиков 1 минута)
Скрытый текст

error20min.thumb.jpg.214f555bf544cf09f6f9b096dbdc2636.jpg

 

Share this post


Link to post
Share on other sites

Уважаемые форумчане испытываю  желание нарисовать печатную плату под проект метеостанции для заказа на производстве  в связи с этим хотелось бы спросить как видите это вы ? какие элементы добавить ? на данный момент понятно одно - она должна быть круглая для того чтобы поместить ее в будку стивенсона , у платы центральное отверстие под шпильку которое будет обведено полигоном для возможности использовать саму шпильку если возникнет необходимость , питание 5 вольт чтобы меньше было проблем с подбором блока питания. Жду пожеланий и уточнений . 

Share this post


Link to post
Share on other sites
15.04.2019 в 10:55, Kitsum сказал:

но с разовыми пропажами данных все сложнее

Добрый день!

Снизил частоту иницилизации шины до 1раза в час,  на одной ESPке пропуски отсутствуют пока, на другой был однократный пропуск только на одном датчике (болело два датчика). Видимо, ProMini не любят инициализацию шины i2c.

Уперся в нехватку оперативной памяти. Можно добавить еще 19 датчиков, с 20-го ESP перестаёт строить суточный график из стандартных четырёх датчиков - ошибка "Во время выполнения запроса произошла ошибка. Код ответа:200 (ОК)"; графики отдельно по каждому датчику пока еще строит.

Проект на ESP32 на горизонте не виднеется?

 

Share this post


Link to post
Share on other sites
19.04.2019 в 13:05, post125 сказал:

Можно ли вообще отключать проверку шины?

Да, удалите в основном файле строку

cron.add(cron::time_1m,  [&](){ sensors.checkLine();  }, true);

Всю инициализацию датчиков проведите самостоятельно без использования соответствующих функций при описании датчиков. Или замените указанную выше строку на разовый вызов метода checkLine

sensors.checkLine();
22.04.2019 в 20:44, post125 сказал:

Снизил частоту иницилизации шины до 1раза в час,  на одной ESPке пропуски отсутствуют пока, на другой был однократный пропуск только на одном датчике (болело два датчика). Видимо, ProMini не любят инициализацию шины i2c.

Проверка датчиков на шине проводится через определение доступности адресов датчиков

Wire.beginTransmission(sensor->address);
/* ... */
sensor->status = (Wire.endTransmission() == 0);

 

22.04.2019 в 20:44, post125 сказал:

Уперся в нехватку оперативной памяти. Можно добавить еще 19 датчиков, с 20-го ESP перестаёт строить суточный график из стандартных четырёх датчиков - ошибка "Во время выполнения запроса произошла ошибка. Код ответа:200 (ОК)"; графики отдельно по каждому датчику пока еще строит.

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

22.04.2019 в 20:44, post125 сказал:

Проект на ESP32 на горизонте не виднеется?

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

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
24.04.2019 в 20:57, Kitsum сказал:

Всю инициализацию датчиков проведите самостоятельно без использования соответствующих функций при описании датчиков. Или замените указанную выше строку на разовый вызов метода checkLine


sensors.checkLine();

Добрый день! Сутки прошли, полёт нормальный, ни одного пропуска данных на обоих контроллерах. Спасибо!

  • Like 1

Share this post


Link to post
Share on other sites

Добрый вечер. Хотел узнать почему не могу подключиться к роутеру пишет:

handle: start AP
- channel: 1
- physical mode: 802.11N
- mode: AP
- ip: 192.168.4.1
- mac: 5E:CF:7F:13:44:CD
HW: vcc 3.02v, freeHeap 34280
HW: vcc 3.02v, freeHeap 34280
HW: vcc 3.02v, freeHeap 34280
HW: vcc 3.02v, freeHeap 34280
HW: vcc 3.02v, freeHeap 34280
handle: home access point search (STA mode)
D8:5D:4C:C5:90:7E (-75 dBm) Mars
handle: start STA
event staDisconnected: ssid Mars, reason 201 (NO AP FOUND)
event staDisconnected: ssid Mars, reason 201 (NO AP FOUND)
event staDisconnected: ssid Mars, reason 201 (NO AP FOUND)
event staDisconnected: ssid Mars, reason 201 (NO AP FOUND)
event staDisconnected: ssid Mars, reason 201 (NO AP FOUND)
handle: start AP
- channel: 1
- physical mode: 802.11N
- mode: AP
- ip: 192.168.4.1
- mac: 5E:CF:7F:13:44:CD

роутер.png

Share this post


Link to post
Share on other sites
03.05.2019 в 22:25, vlasov67 сказал:

Добрый вечер. Хотел узнать почему не могу подключиться к роутеру пишет:

Контроллер жалуется, что не может найти точку доступа, но находит её при сканировании эфира. К сожалению, нет какой-либо дополнительной информации чтобы можно было явно указать на проблему.

Попробуйте следующее:

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

И еще, очень важное замечание. Обязательно перейдите на WAP2-PSK шифрование. И не скидывайте в открытый доступ скриншоты с настройками доступа к Вашему маршрутизатору. В данном случае, Вы засветили свой ключ доступа, и его обязательно нужно менять.

Share this post


Link to post
Share on other sites
15.10.2018 в 15:01, Kitsum сказал:

В первую очередь необходимо понять, что из себя представляет MQTT протокол.

Добрый день!

пытаюсь ввести пользователя и пароль (test/test) в настройкай MQTT в ESP - не даёт . Пишет "1: Некорректный пароль пользователя MQTT". Как можно упростить требования к паролю?

Скрытый текст

1506522433_-2.jpg.7c828262b05f36eff48ceea52ef84223.jpg

вопрос неактуальный - научился генерировать пароли через mosquitto_passwd, сделал более длинный пароль - сохранился в ESP, работает.

Edited by post125

Share this post


Link to post
Share on other sites

Доброе время суток.

@post125 за проверку пароля отвечает функция в файле index.htm

function checkPassw(passw) { return passw.match(/^.{5,63}$/); }

Что соответствует любой строке, содержащей от 5 до 63 символов.

  • Thanks 2

Share this post


Link to post
Share on other sites
1 час назад, Kitsum сказал:

за проверку пароля отвечает функция в файле index.htm 

Спасибо!

Share this post


Link to post
Share on other sites
14.03.2019 в 18:09, evgenyD сказал:

Добрый день! 

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

 температуре, влажности и давлению. подставляется содержимое mqtt_path дважды

Добрый день! помогите пожалуйста !!!!

подключил два BME280 и тензодатчик, с помощью отдельного скетча нашел калибровочный коэффициент и tareoffset и  забил их в скрипте постоянно. т.к. улей на весах должен стоять все время, то тарирование отключил tareoffset (для этого в библиотеке HX711_ADC выставил параметр doTare = 0) и все вроде как замечательно, но так как может понадобиться откалибровать весы заново и выполнить тарирование, сохранить эти параметры для дальнейшего измерения веса и отключить тарирование,  добавил в меню Калибровка весов (правда в остальных меню во многих ячейках пропало отображение значений ), а дальше как говориться завис, я только знакомлюсь с программированием :(

ESP8266_scale.zip

Share this post


Link to post
Share on other sites
28.05.2019 в 15:42, evgenyD сказал:

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

Хорошая задачка по поиску подводного камня. Проблема носит синтаксический характер и скрыта в JavaScript.

Вот кусочек кода из оригинального файла:

$("div.settings div.menuList").click(function() {
    var id = $(this).attr("id");
    $(".settings .menuList[id != " + id + "]").hide();
    $(".settings .menuList#" + id).css({"cursor": "default"});
    $(".settings #sl-" + id).show();
    if(id.match(/(global|mqtt|thingspeak|narodmon|gpio)/i)) {
        if(id === "gpio") apiGetGPIO();
        $(".settings input[type='submit']").show();
    }
    else if(id === "firmware") selfCheckSupportMD5();
    else if(id === "spiffs") apiGetSPIFFS();
    else if(id === "system") apiGetSystemInfo();
    else if(id === "i2c") apiGetI2CInfo();
});

А вот как выглядит регулярное выражение из Вашего файла для этого блока кода

id.match(/(global|mqtt|thingspeak|narodmon|gpio|)/i)

Проблема в лишнем символе " | " (вертикальная черта) в конце выражения. Этот символ, используемый в рамках круглых скобок обозначает логическое ИЛИ. В итоге Ваш шаблон закончен с логической ошибкой и сводит с ума обработчик. Вернитесь к оригинальному коду или допишите шаблон, полагаю, что Вы хотели сделать это:

id.match(/(global|mqtt|thingspeak|narodmon|gpio|scaleW)/i)

Последний вариант гарантирует, что в вашей ветке настроек веса появится кнопка сохранить.

28.05.2019 в 15:42, evgenyD сказал:

а дальше как говориться завис

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

Отсюда (index.htm)

<input type="text" id="scaleW_checkW" autocomplete="off" placeholder="5">

Сюда (esp8266)

conf.add("scaleW_checkW");

Далее в коде микроконтроллера Вы можете работать с этой переменной.

Я также заметил, что добавили кнопку "Откалибровать весы".

<div class="button" id="calibration">Откалибровать весы</div>

Если Вы хотите на неё повесить дополнительное действие, то необходимо организовать обработку события клика по ней

$("#sl-scaleW #calibration").click(function() {

});

В данном блоке реализуете обработку нажатия. Например, Вы можете выполнить AJAX запрос к WEB серверу ESP8266 и выполнить все необходимые действия на стороне микроконтроллера. В данном случае, возможно, Вам потребуется обновить значение эталонного веса, а только после этого произвести калибровку. Но, тут уже Вы сами решаете, что и как делать.

Share this post


Link to post
Share on other sites
Guest qastron

Доброго времени суток, уважаемый @Kitsum . Буквально пару дней назад нашел Ваш проект метеостанции, который, на мой взгляд, является самым продуманным и эстетически красивым из доступных бесплатно. Возникло желание повторить этот проект, но в процессе возникли некоторые сложности. Я ни в зуб ногой в программировании, просьба понять и простить) Делал вроде всё по инструкции, но компилятор выдаёт ошибку на строку

return mqttAPI.publish(topic.c_str(), data.c_str(), true); в файле services.h

пишет: invalid conversion from 'const char*' to 'const uint8_t* {aka const unsigned char*}' [-fpermissive]

если закомментировать строку, выдает ошибку на строку

mqttAPI.setServer(server.c_str(), 1883); в том же файле

пишет: 'class PubSubClient' has no member named 'setServer'

Библиотеки необходимые скачал и подключил, в файле users_auto.h написал OFF всем датчикам кроме BME280 (пока у меня только он в наличии), больше ничего не трогал. Как исправить ошибку и сделать, чтобы скетч скомпилировался и залился нормально?

 

 

 

Share this post


Link to post
Share on other sites

@qastron Только что проверил в Arduino IDE 1.8.9 с установленной поддержкой ESP8266 2.5.0 и последней версией (на 03.06.2019) библиотеки PubSubClient. Все собирается. Ошибки довольно странные т.к. указывают на не существующие или ошибочные методы. При это в оригинале библиотеки все используемые методы присутствуют. На всякий случай скину библиотеку PubSubClient установленную у меня. Убедитесь, что Вы используете именно ее.

pubsubclient-master.zip

Share this post


Link to post
Share on other sites

Версия Arduino IDE у меня 1.8.9, библиотеку поддержки ESP8266 обновил до версии 2.5.0 (изначально стояла  2.4.2 как написано в шапке темы - " на версиях выше работоспособность не проверялась"), библиотеку PubSubClient  подключил из приложенного Вами архива. В итоге старые ошибки компиляции ушли, за то появились новые)

Строка String codeTranslate(int code) { return ESP8266WebServer::_responseCodeToString(code); } в файле webserver.h

Ошибка: '_responseCodeToString' is not a member of 'ESP8266WebServer'

Если её закомментировать, то следующая ошибка:

Строка default: return  http.codeTranslate(code); в файле services.h

Ошибка: 'class http' has no member named 'codeTranslate'

Если и её закомментировать, то скетч таки компилируется и даже заливается. Далее, при попытке выполнить следующий шаг инструкции, залить папку data с помощью пункта меню ESP8266 Sketch Data Upload,  выдается ошибка SPIFFS Error: esptool not found! Хотя установку модуля выполнил строго по приложенной в шапке темы инструкции.

Что-то не идёт дело :(

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Kitsum
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Тема проекта
      Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
      Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки  
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера.
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 10.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...