Jump to content
iT4iT.CLUB

Recommended Posts

Здравствуйте! Повторил проект. Все работает и отображается корректно. Понравилось!!!  Появилась мысль, что для полной метеостанции не хватает датчиков силы ветра, направления ветра (эти датчики довольно дорогие), облачности. Эти три параметра можно взять с openweathermap.org. Kitsum если Вас не затруднит: добавте пожайлуста код из Вашего проекта ""esp8266 и парсинг погоды с OpenWeatherMap"  в этот. Температуру, давление, влажность и тд. берем с своих датчиков, а силу ветра, направление ветра, облачность  с openweathermap.org и показания выводим рядом с своими . С Ув.                       

Share this post


Link to post
Share on other sites

Тоже хотел для этих целей головку от видеомагнитофона использовать.

лопасти большие - будет хорошо стартовать.

Зачетно !

Share this post


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

Здравствуйте! Повторил проект. Все работает и отображается корректно. Понравилось!!!  Появилась мысль, что для полной метеостанции не хватает датчиков силы ветра, направления ветра (эти датчики довольно дорогие), облачности. Эти три параметра можно взять с openweathermap.org. Kitsum если Вас не затруднит: добавте пожайлуста код из Вашего проекта ""esp8266 и парсинг погоды с OpenWeatherMap"  в этот. Температуру, давление, влажность и тд. берем с своих датчиков, а силу ветра, направление ветра, облачность  с openweathermap.org и показания выводим рядом с своими . С Ув.                       

И программу телепередач можно еще добавить. Удобно. 

Share this post


Link to post
Share on other sites

Здравствуйте. Обновился на 2.0 бета. Сначала все было нормально, но сегодня стало показывать плюс 10 градусов на улице и влажность 28 и десятые и сотые доли бегают туда-сюда. Показания стали явно некорректными. Датчик bme280.

Share this post


Link to post
Share on other sites

И у меня вопросик. Как сделать чтоб в вебе первое было "Температура" потом влажность и т.д. как на первой странице. А то получается так...

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

5ab76674baf02_.jpg.2d5518b86721b424745e7d0ea468d25f.jpg

и еще вопросик, где-то выше упоминалось о цвете индикаторов круговых, типа плюс красный минус синий.....это в планах?!?

Share this post


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

Здравствуйте. Обновился на 2.0 бета. Сначала все было нормально, но сегодня стало показывать плюс 10 градусов на улице и влажность 28 и десятые и сотые доли бегают туда-сюда. Показания стали явно некорректными. Датчик bme280.

Вдруг!...- я первую версию когда проверял, датчик выставил за окно (bme280), он был между москитной сеткой и стеклопакетом, т.е. частично защищён, до тех пор пока не прошел сильный дождь. Вначале перестал показывать вообще. Достал его, было видно окисления олова на плате (за окном тестово стоял не более недели). Закрыл пальцем отверстие на бме и зубной счеткой прочистил с спиртом. Стал как новый, но.... температуру он теперь показывает 180-195 градусов цельсия а влажность вроде в норме. Пробовал перепаять на донора, сам чип бме - результат такой же. Когда буду ставить на пмж - думал лаком пройтись акриловым датчик, заклеяв перед этим контакты и сам чип бме. Ну и будку нужно фантазировать. ЕЕ свойства не только не нагреватся на открытых лучах, но и не собирать конденсат.... так сказать мысли в слух со своей практики, кстати, по датчикам, щупал bmp280, bme280, ds18b20, dht11, am2301, bh1750, sht21(или si72xx я до сих пор не  понял какие они, там надпись gy21 и чип с белой наклейкой, работают в этом проекте с библиотекой sht21 нормально, потому что если ставить si - ахинею показывают) и все проверяю еще на распбери, на адафруитовских библиотеках в питоне. Личное мнение - со всех привлекают только bmpx80 - работают как часы, жалко нет влажности, но есть высота над уровнем моря; bme280 - загубил 3 датчика, скорее всего по причине, когда я их заставлял работать на улице, то о чем описал выше, но... самые точно быстро значения. По графикам на распбери видно. am2301 - так себе. Буду замещать bme или sht - лучше и точнее. sht - как и бме по точности и всем остальным удобствам - пока работают все, не одного вылета. bh - вопросов тоже нет, делают свое дело. dht11 - чудо сенсоры, живут своей жизнью. На графике за сутки, где температура и влажность от 20-24цельсия и 40-60влажности - бывает скачок температуры до 12, на графиках вижно. В влажности вообще - скорость реагирования никакая, а в показаниях ниже 30 или выше 80 - просто данные с неизвестности. ds - супер, просто делают свое дело. Для себя сделал вывод - ds,bme,bmp,sht(и ему подобных),bh - супер. Все остальное - ребенку в конструктор :)  Ничего не могу сказать о bme680 - читал но не щупал. sht31 пробовал - очень понравился, но не дешевый!

  • Like 1

Share this post


Link to post
Share on other sites
В 21.03.2018 в 04:19, vavandemidov сказал:

И программу телепередач можно еще добавить. Удобно. 

5 баллов!!! но уже лучше синхронизацию ключей закодированных каналов на dvb-s, с автоматических обновлением их через юарт в тюнер сразу. Желательно весь пакет НТВ+++....человеческая натура... а еще лучше топик стартер, всем кто использует его проект, по 1000 рублей на карту перечислит. Но и последнего, я уверен, всегда будет мало....

Edited by wildray

Share this post


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

И у меня вопросик. Как сделать чтоб в вебе первое было "Температура" потом влажность и т.д. как на первой странице. А то получается так...

  Скрыть содержимое

5ab76674baf02_.jpg.2d5518b86721b424745e7d0ea468d25f.jpg

и еще вопросик, где-то выше упоминалось о цвете индикаторов круговых, типа плюс красный минус синий.....это в планах?!?

Почитайте форум. Kitsum гдето объяснял как выводится...Первым будет отображаться последний инициализированный сенсор в users_auto.h  т.е. снизу вверх по порядку.

Share this post


Link to post
Share on other sites

Температура, влажность, давление - BME280. Ветер, направление, облачность - с openweathermap.org. Взял часть кода с " Умные часы на ESP8266 и SSD1306". В services.h  (там видно где) прописываем свой ключ  полученный при регистрации. После запуска сразу будут нули, значения подтянутся на шестой минуте, в логе видно. Может кого  заинтересует... P. S.  Ни как не получается направление ветра с градусов перевести в быстрее понятное  "С", "СВ", и так далее... Может кто поможет. P. S.2 Я только учусь.

скрин.JPG

Wether.7z

  • Thanks 1

Share this post


Link to post
Share on other sites

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

В 24.03.2018 в 17:02, RusD сказал:

Сначала все было нормально, но сегодня стало показывать плюс 10 градусов на улице и влажность 28 и десятые и сотые доли бегают туда-сюда.

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

В 25.03.2018 в 12:07, wildray сказал:

Как сделать чтоб в вебе первое было "Температура" потом влажность и т.д.

Небольшое упоминание можно посмотреть тут.

В 25.03.2018 в 12:07, wildray сказал:

и еще вопросик, где-то выше упоминалось о цвете индикаторов круговых, типа плюс красный минус синий.....это в планах?!?

В файле index.htm имеется функция chenge вызываемая каждые 5 секунд для получения новых данных от микроконтроллера. В её коде я оставил закомментированную строку показывающую как можно изменить цвет индикатора на примере сенсора с идентификатором out_temperature

$('.out_temperature').trigger('configure', {"fgColor":"#FF0000"});

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

21 час назад, Вадим сказал:

Ни как не получается направление ветра с градусов перевести в быстрее понятное  "С", "СВ", и так далее... Может кто поможет.

Для ESP8266 попробуйте такой вариант, он хоть и топорный, но частично решает Вашу задачу.

struct markup_t {
  uint8_t min;
  uint8_t max;
  String  side;
};

const markup_t grid[9] = {
    {0,   22,  "Север"},
    {23,  67,  "Северо-восток"},
    {68,  112, "Восток"},
    {113, 157, "Юго-восток"},
    {158, 202, "Юг"},
    {203, 247, "Юго-запад"},
    {248, 292, "Запад"},
    {293, 337, "Северо-запад"},
    {338, 360, "Север"}
};

String direction(uint8_t degree) {
  for (byte i=0; i<9; i++) {
    if (degree >= grid[i].min and degree <= grid[i].max) return grid[i].side;
  }
  return "error";
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  uint8_t degree = random(0, 360);
  Serial.printf("%d:\t%s\n", degree, direction(degree).c_str());
  delay(5000);
}

Должно получится что-то подобное

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

image.png

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Что-то не компилируется у меня. Ошибки сыпятся типа 'WiFiMode_t' has not been declared

P.S. А нет. Распаковал архив через 7-zip, а не WinRar. Скомпилировалось. Вот оно чо...

Edited by Forester

Share this post


Link to post
Share on other sites

А кто-нибудь проверял работу MQTT? Что-то у меня не работает. Хотя на предыдущих версиях работало.

Share this post


Link to post
Share on other sites

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

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

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

К сожалению, у меня нет данного датчика и Вы не указали библиотеку, которую хотите внедрить, но в любом случае, не думаю, что могут возникнуть какие-либо серьезные препятствия при добавлении их в проект. Хорошо, что Вы сообщили о прерывании, это немного изменит способ работы с сенсором. И так, давайте рассмотрим теоретическую часть:

  1. Подключите используемую библиотеку в пользовательском .h файле или в основном .ino файле
  2. Объявите сенсор, как это делается в примере, идущем с используемой библиотекой, опишите прерывание (убедитесь, что порт не занят)
  3. Объявите глобальную переменную и при каждом прерывании записывайте переданные данные с датчика в неё
  4. Опишите новый сенсор опираясь на пример программного сенсора из файла users_auto.h и в коде, используя оператор return, верните значение, хранимое в описанной ранее, глобальной переменной. Но помните, что возвращаемое значение должно иметь тип float и в случае необходимости произведите нужные преобразования.

Все должно взлететь.

3 часа назад, Forester сказал:

А кто-нибудь проверял работу MQTT? Что-то у меня не работает. Хотя на предыдущих версиях работало.

Что выводиться в Serial монитор при отправке данных?

Share this post


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

Что выводиться в Serial монитор при отправке данных?

services: send data to MQTT server
answer: CONNECTED

P.S. Вручную забил в Корневой путь espWeatherStation, после этого заработало.

Может, кто подскажет, как отправить по MQTT текст? Т.е. мне нужно отправить URL. Если воспользоваться mqttPublish, при компиляции получаю что-то типа:  cannot convert 'const char*' to 'float' for argument '2' to 'bool mqttPublish(String, float)'

Edited by Forester

Share this post


Link to post
Share on other sites

@Forester Постараюсь в ближайшее время восстановить свою метеостанцию, она была разбита во время оттепели упавшим куском льда с верхних этажей дома, и проверить замечания других пользователей и Ваши. А, что касаемо поддержки передачи текста для функции mqttPublish то замените её следующим кодом.

bool mqttPublish(String topic, String data) {
  if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic;
  return mqttAPI.publish(topic.c_str(), data.c_str(), true);
}
bool mqttPublish(String topic, float data) { return mqttPublish(topic, String(data)); }

Это должно решить Вашу проблему и добавить поддержку как float, так и String типа без изменения основного кода.

Share this post


Link to post
Share on other sites

Доброго времени суток! Сперва, хочу поблагодарить автора за столь замечательный проект. На его основе я сейчас создаю свою домашнюю метеостанцию. Пока только собрана на макетке, но работоспособна уже на 80%. Распечатана будка Стивенсона, жду, как приедет OLED-дисплей, который намереваюсь прикрутить к основному блоку. Немного подправил код программы, для работы с двумя датчиками - BME280 (внутренний) и Si7021 (внешний).

users_bme280_x2.h

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

#ifndef USERS_H
#define USERS_H

#include <BME280I2C.h> // https://github.com/finitespace/BME280
#include <HTU21D.h>
  HTU21D myHTU21D(HTU21D_RES_RH12_TEMP14);


  BME280I2C::Settings
  settings_in(
    BME280::OSR_X1,
    BME280::OSR_X1,
    BME280::OSR_X1,
    BME280::Mode_Forced,
    BME280::StandbyTime_1000ms,
    BME280::Filter_Off,
    BME280::SpiEnable_False,
    BME280I2C::I2CAddr_0x76
  );

  BME280I2C BME_IN(settings_in);

  /* Параметры индикаторов web интерфейса для плагина Knob
    Мин Макс Шаг Заголовок Ед. измер.
    |---------------------|----|------|------|--------------|---------| */
  knob_t *T = new knob_t( -40, 125, ".1", "Температура", "°C");
  knob_t *P = new knob_t(-500, 9000, ".01", "Давление", "mm");
  knob_t *H = new knob_t( 0, 100, ".01", "Влажность", "%");

  /* Функции, описывающие инициализацию датчиков */
  void out_init() {
    myHTU21D.begin();
  }
  void in_init() {
    BME_IN.begin();
  }

  /* Функции, описывающие как получить от внешнего датчика те или иные данные */
  float out_temp() {
    return myHTU21D.readTemperature(SI70xx_TEMP_READ_AFTER_RH_MEASURMENT);
  } 
  float out_hum() {
    return myHTU21D.readHumidity();
  }

  /* Функции, описывающие как получить от внутреннего датчика те или иные данные */
  float in_temp() {
    return BME_IN.temp(BME280::TempUnit_Celsius);
  }
  float in_hum() {
    return BME_IN.hum();
  }
  float in_pres() {
    return BME_IN.pres(BME280::PresUnit_torr);
  }

  /* Добавление датчиков в систему */
  void sensors_config() {
    Wire.begin(4, 5);

    /* Внешний датчик */
    sensors.add(H, device::out, 0x40, "out_humidity", out_hum, true);  
    sensors.add(T, device::out, 0x40, "out_temperature", out_init, out_temp, true);

    /* Внутренний датчик */
    sensors.add(P, device::in, 0x76, "in_pressure", in_pres, true);
    sensors.add(H, device::in, 0x76, "in_humidity", in_hum, true);
    sensors.add(T, device::in, 0x76, "in_temperature", in_init, in_temp, true);
  }

#endif

 

SERVICES.H (подправлена секция MQTT)

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

#ifndef SERVICES_H
#define SERVICES_H

#include <PubSubClient.h>
#include <ESP8266HTTPClient.h>
#include "webserver.h"

  WiFiClient wifiClient;
  PubSubClient mqttAPI(wifiClient);
  HTTPClient restAPI;

  String httpCodeStr(int code) {
    switch (code) {
      case -1: return "CONNECTION REFUSED";
      case -2: return "SEND HEADER FAILED";
      case -3: return "SEND PAYLOAD FAILED";
      case -4: return "NOT CONNECTED";
      case -5: return "CONNECTION LOST";
      case -6: return "NO STREAM";
      case -7: return "NO HTTP SERVER";
      case -8: return "TOO LESS RAM";
      case -9: return "ENCODING";
      case -10: return "STREAM WRITE";
      case -11: return "READ TIMEOUT";
      default: return http.codeTranslate(code);
    }
  }

  String mqttCodeStr(int code) {
    switch (code) {
      case -4: return "CONNECTION TIMEOUT";
      case -3: return "CONNECTION LOST";
      case -2: return "CONNECT FAILED";
      case -1: return "MQTT DISCONNECTED";
      case 0: return "CONNECTED";
      case 1: return "CONNECT BAD PROTOCOL";
      case 2: return "CONNECT BAD CLIENT ID";
      case 3: return "CONNECT UNAVAILABLE";
      case 4: return "CONNECT BAD CREDENTIALS";
      case 5: return "CONNECT UNAUTHORIZED";
      default: return String(code);
    }
  }

  bool mqttPublish(String topic, float data) {
    if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic;
    return mqttAPI.publish(topic.c_str(), String(data).c_str(), true);
  }

  void restAPIsend(String host, uint16_t port, String query) {
    restAPI.setUserAgent("weather station (www.it4it.club) " + WiFi.hostname());
    restAPI.setTimeout(5000);
    restAPI.begin(host, port, query);
    int code = restAPI.GET();
#ifdef console
    console.printf("answer: %s\n", httpCodeStr(code).c_str());
#endif
    restAPI.end();
  }

  /* mqtt.it4it.club */
  void sendDataToMQTT() {
    if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) {
#ifdef console
      console.println(F("services: send data to MQTT server"));
#endif
      // баг при прямой передаче значения (c_str) из конфига в setServer (не забыть поправить!)
      String server = conf.param("mqtt_server");
      mqttAPI.setServer(server.c_str(), 1883);
      mqttAPI.connect(WiFi.hostname().c_str(),
                      (conf.param("mqtt_login").length() ? conf.param("mqtt_login").c_str() : 0),
                      (conf.param("mqtt_pass").length() ? conf.param("mqtt_pass").c_str() : 0)
                     );
      if (mqttAPI.connected()) {
        //mqttPublish("light", sensors.get("out_light"));
        mqttPublish("out_temperature", sensors.get("out_temperature"));
        mqttPublish("out_humidity", sensors.get("out_humidity"));
        mqttPublish("in_pressure", sensors.get("in_pressure"));
        mqttPublish("in_temperature", sensors.get("in_temperature"));
        mqttPublish("in_humidity", sensors.get("in_humidity"));  

#ifdef console
        console.printf("answer: %s\n", mqttCodeStr(mqttAPI.state()).c_str());
#endif
        mqttAPI.disconnect();
      } else {
#ifdef console
        console.printf("answer: %s\n", mqttCodeStr(mqttAPI.state()).c_str());
#endif
      }
    }
  }

  /* https://thingspeak.com/ */
  void sendDataToThingSpeak() {
    if (wifi.transferDataPossible() and conf.param("thingspeak_key").length()) {
#ifdef console
      console.println(F("services: send data to ThingSpeak"));
#endif

      String query;
      query += "&field1=" + String(sensors.get("out_light"));
      query += "&field2=" + String(sensors.get("out_temperature"));
      query += "&field3=" + String(sensors.get("out_humidity"));
      query += "&field4=" + String(sensors.get("out_pressure"));

      restAPIsend("api.thingspeak.com", 80, "/update?api_key=" + conf.param("thingspeak_key") + query);
    }
  }

  /* https://narodmon.ru/ */
  void sendDataToNarodmon() {
    if (wifi.transferDataPossible() and conf.param("narodmon_id").length()) {
#ifdef console
      console.println(F("services: send data to Narodmon"));
#endif

      String query;
      query += "&L1=" + String(sensors.get("out_light"));
      query += "&T1=" + String(sensors.get("out_temperature"));
      query += "&H1=" + String(sensors.get("out_humidity"));
      query += "&P1=" + String(sensors.get("out_pressure"));

      restAPIsend("narodmon.ru", 80, "/get?id=" + conf.param("narodmon_id") + query);
    }
  }

#endif

 

Вот только есть небольшая проблема, в решении которой прошу помощи. А именно: передача информации по MQTT. Для меня это важно, так как хочу добиться передачи в Мажордомо. Суть проблемы в том, что передаются только первые 3 данных. Причем эта проблема у меня была ещё даже с одним датчиком ВМЕ280, передавалось пустое значение с отсутствующего люксометра. После того, как закомментировал строку

 //mqttPublish("light", sensors.get("out_light"));

в SERVICES.H, передаваться стали следующие 3 параметра, температура, влажность и давление. Сейчас же, когда должны передаваться 5 параметров с 2-х датчиков, передаются только температура и влажность с Si7021 и давление с BME280, всё в порядке, указанном в SERVICES.H. 

В Mosquitto отображается следующее:

5acb7c3fec9aa_2.PNG.cbd5563e8f69d2c0ef967519cc243d9f.PNG

После передачи 3-х параметров идёт непонятный Socket error on client ESP_FEDA21, disconnecting.

Подскажите пожалуйста, куда копать?

Share this post


Link to post
Share on other sites

Добрый день!

Огромное спасибо за замечательный проект.

Я новичок еще в деле esp8266 и, увы, не программист. Но сам проект мне очень понравился и хочу попробовать его повторить. Хотел узнать есть ли возможность заменить картинки и внешний вид изображений которые отображают информацию с датчиков? Добавить разделение на внешний и внутренний датчики чтобы отображать как-то информацию с датчиков на улице и в квартире?

Share this post


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

Добавить разделение на внешний и внутренний датчики чтобы отображать как-то информацию с датчиков на улице и в квартире?

Это есть и так, при использовании users_bme280_x2.h в интерфейсе появляется кнопка для переключения между показаниями датчиков.

Share this post


Link to post
Share on other sites
1 минуту назад, Dark FeniX сказал:

Это есть и так, при использовании users_bme280_x2.h в интерфейсе появляется кнопка для переключения между показаниями датчиков.

Кнопка это хорошо, но я говорил об одновременно отображении внешних и внутренних показаний. Допустим разделить экран на 2 части и подписать одну часть "Улица" и там отображать показания внешнего датчика, а вторую подписать "Квартира" и там отображать показания датчика в квартире. Так можно сделать?

Share this post


Link to post
Share on other sites
15 минут назад, doc_bravn сказал:

Кнопка это хорошо, но я говорил об одновременно отображении внешних и внутренних показаний. Допустим разделить экран на 2 части и подписать одну часть "Улица" и там отображать показания внешнего датчика, а вторую подписать "Квартира" и там отображать показания датчика в квартире. Так можно сделать?

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

Edited by Dark FeniX

Share this post


Link to post
Share on other sites
1 минуту назад, Dark FeniX сказал:

Думаю, да. Правкой html-кода. В теме были примеры, как добавляли самые разные датчики

Эх... Это и печально. Ибо я не владею языком html и не смогу правильно исправить. Может можете подкинуть ссылки на подобные примеры в этой теме о которых говорите?

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

  • 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...