Jump to content
iT4iT.CLUB

Recommended Posts

47 минут назад, post125 сказал:

а угарный газ где есть необходимость контроллировать? в котельной?

Ну если есть датчик, почему же не контролировать? Тем более в коде от @Kitsumэтот датчик прописан и остаётся только поменять OFF на ON. И во вторых это датчик углекислого газа и органических летучих соединений. 

  • Like 1

Share this post


Link to post
Share on other sites

Всем доброго времени суток.

Подскажите пожалуйста, может кто успешно прикрутил DHT22 к проекту, что-то у меня не взлетает нормально. Под рукой нет пока BME280, в пути, а за окном висит уже DHT22, дома BMP180. Хотел все на новой прошивке завести, частично получилось.

Вот что накалякал в users_auto.h

#if SENSOR_DHT22
    #include <DHT.h>
    #include <DHT_U.h>
    #define DHTTYPE DHT22;
    
    sensors_event_t event_t, event_h ;
    sensor_t dht_sensor;
    uint32_t delayMS;
  #endif
      
/*.....*/
void sensors_config() {
   /*...*/
#elif SENSOR_DHT22
      DHT_Unified DHT(10, DHT22); // 10 pin на ESP-12f
      pinMode(10, INPUT);
      DHT.begin(); 
      delayMS = dht_sensor.min_delay / 1000;
      DHT.humidity().getEvent(&event_h); 
      DHT.temperature().getEvent(&event_t);
      sensors.add(new knob_t(   0,   100, ".01", "В-ть улица","%"), "out_humidity1",
                  [&](){ return event_h.relative_humidity;}, true
                  );       
      sensors.add(new knob_t( -40,   80,  ".1", "Т-ра улица", "°C"), "out_temperature1",
                  [&](){ return event_t.temperature; }, true
                  );
    #endif;

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

Заранее спасибо

Share this post


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

датчик углекислого газа

это я невнимательно посмотрел, на алиэкспрессе увидел неправильный перевод описания датчика CCS8111. Там было указано угарный газ (CO). я себе для мониторинга CO2 поставил MH-Z19, поэтому с CCS8111 не знакомился.

Share this post


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

это я невнимательно посмотрел, на алиэкспрессе увидел неправильный перевод описания датчика CCS8111. Там было указано угарный газ (CO). я себе для мониторинга CO2 поставил MH-Z19, поэтому с CCS8111 не знакомился.

Интересно, обо датчика измеряют CO2, но разница в размерах и цене огромная...

Share this post


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

обо датчика измеряют CO2

CCS811 измеряет не только СО2 , но и другие летучие в-ва, которые косвенно то же будут влиять на показания СО2, отсюда точность по СО2 может уплывать. Его удобно использовать для мониторинга качества воздуха в помещении и организации проветривания.  MH-Z19 - инфракрасный  датчик только для СО2, к летучим органическим в-вам он нечувствителен, он у меня стоит в теплице для  "научного мониторинга"

Edited by post125
  • Thanks 1

Share this post


Link to post
Share on other sites
07.04.2018 в 19:50, Maks Crezi сказал:

Подскажите, куда запилить библиотечку для приема радиодатчиков Орегон

Добрый день!

У меня все внешние датчики подключаются к ESP через ардуины про мини, подключенные по шине i2c как slave. Данные от датчиков Орегон считываются одной из таких ардуин с приемником на 433МГц. Принимаю данные от 1-го датчика ветра WGR800, 1-го датчика осадков PCR800 и трёх термогигрометров THGR810. Данные всех пяти датчиков принимаются со статусом питания, если его не читать, можно еще добавить два термогигрометр.

Полный скетч в приложении. Там еще добавлен экран nextion. Его можно не подключать, без него работает нормально. скетч до конца не отработан. Проверен вебсервер ESP и народный мониторинг. MQTT знаю, что работает, но на всех датчиках еще не проверил.

INT_Meteo_D_4slaves_nextion4x16_mqtt_10-7-19.zip

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

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

05.07.2019 в 11:39, den48rus сказал:

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

У меня на практике получилось использовать экранированный медный ethernet кабель UTP 5E, общей длинной около 7 метров. Это были два отрезка для подключения двух датчиков BME280, один в помещении, другой на улице. Использовал по одной паре на каждый из контактов датчика - SDA, SCL, VCC и GND. Можно сажать датчики друг за другом, не обязательно тянуть до каждого свой кабель, в моем случае это была необходимость для выноса одного датчика на улицу. Главное ограничение, это общая емкость линии, если память не подводит, то она не должна превышать 400pF. Также стоит помнить, что на всех Китайских I2C  модулях распаяны подтягивающие резисторы, соответственно их количество растет пропорционально количеству модулей, а это не очень хорошо, хотя вполне работоспособно. Но имейте в виду, что это может сказаться на работоспособности и тогда будет необходимо убрать все подтяжки на модулях и поставить два резистора на стороне микроконтроллера.

05.07.2019 в 11:39, den48rus сказал:

И еще мысли, идеи: можно подключить DS18B20 в герметичном корпусе и закопать его в землю на глубину 50 см( или больше, меньше...), тем самым измерять температура почвы, промерзание почвы, может будет полезно садоводам. Можно подключить UV датчик и поставить его на крышу, закрыв его светопрозрачным колпаком от обычного датчика движения. Тем самым получать показания уровня ультрафиолета... Как вы думаете?

Идея интересная, нужно экспериментировать особенно с ультрафиолетом и тем пройдет ли он через пластиковую линзу, если пройдет то какой - А или В...

09.07.2019 в 17:33, den48rus сказал:

И еще, как можно допилить код для взятия показания VOC???

По умолчанию датчик CCS811 уже измеряет VOC. Обратите внимание на метод читающий показания с датчика.

ccs811.read(&eco2, &etvoc, &errstat, &raw);

В примере мы возвращали значение eco2, просто начните возвращать etvoc, и не забудьте поменять описание для сенсора в web.

10.07.2019 в 04:03, ddlencemc сказал:

Подскажите пожалуйста, может кто успешно прикрутил DHT22 к проекту, что-то у меня не взлетает нормально.

Я полагаю, что Вы используете эту библиотеку https://github.com/adafruit/DHT-sensor-library, попробуйте сделать следующие действия.

Подключите библиотеку, освободите (программно тоже) один из портов микроконтроллера для подключения датчика, объявите датчик DHT22 и описание для web.

#include "DHT.h"

DHT dht(10, DHT22); // Замените 10-ый порт на свободный

knob_t *T = new knob_t(-40, 125, ".1", "Температура", "°C");
knob_t *H = new knob_t(  0, 100, ".01", "Влажность", "%");

Далее в блоке с описанием сенсоров, например в функции sensors_config произведем инициализацию датчика и объявим сенсор температуры и влажности.

dht.begin();

sensors.add(T, "out_temperature", [&](){ return dht.readTemperature(); });
sensors.add(H, "out_humidity", [&](){ return dht.readHumidity(); });

 В теории должно заработать.

08.07.2019 в 17:46, ddlencemc сказал:

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

Проект слишком дырявый чтобы выкидывать его как что-то серьезное на github.

Share this post


Link to post
Share on other sites

Всем добрый день. Продолжаю мучать метеостанцию... Никак не могу добавить расчет точки росы. Добавлять формулу расчета и другие параметры надо во вкладку  users_auto.h ??

1332071918_2019-08-0214-51-56ESP8266_WS_V2.0_iT4IT.CLUB-users_auto.hArduino1.8.9.jpg.6674aa859fde305861b64f811fabab40.jpg

 

Далее.

1472955648_2019-08-0214-53-40ESP8266_WS_V2.0_iT4IT.CLUB-users_auto.hArduino1.8.9.jpg.65c5ba762f41fe111c1cc6cfe150b384.jpg

Но куда вставить формулу?? 

Я далек от программирования... Не могли бы вы пошагово объяснить?

Share this post


Link to post
Share on other sites

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

4 часа назад, den48rus сказал:

Никак не могу добавить расчет точки росы. Добавлять формулу расчета и другие параметры надо во вкладку  users_auto.h ?

Идеологически все файлы имена которых начинаются с префикса users_ считаются примерами. По факту Вы можете использовать только один из таких файлов в данном проекте. Каждый из файлов описывает ту или иную ситуацию использования микроконтроллера со своими датчиками и различными расчетами. После того, как определитесь какой пример Вам больше подходит, то в коде основного файла оставляете только этот файл подключенным через оператор #include, а все остальные users_ файлы необходимо закомментировать.

1_15.16.41.png

4 часа назад, den48rus сказал:

Но куда вставить формулу?? 

Тут все еще проще. Формула, в нашем случае, это просто функция, а следовательно она должна быть в области видимости того блока который её вызывает. Самый простой вариант, это разместить ее в том же файле где ее вызывают. Иногда бывает необходимость доступа к функции или объекту из нескольких точек в проекте, тогда можете разместить свой код, например, в tools.h

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

2_18.45.16.png

21 час назад, den48rus сказал:

https://youtu.be/18yeKmep-P8

Отличная идея для метеостанции) как вам?! Можно ли реализовать это на веб странице?! Или как доп модуль. 

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

PS: прошу прощение за долгие ответы, не всегда имею возможность отписаться.

  • Thanks 2

Share this post


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

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

Спасибо большое за объяснение. Всё заработало. Точка росы появилась. Я немного опишу, как я это сделал. Вдруг есть на форуме люди, которые тоже как и я "на вы" с программированием.

Сначала саму формула расчета точки росы вставил ниже формулы расчета абсолютной влажности во вкладке tools.h

1439435646_2019-08-0221-50-29ESP8266_WS_V2.0_iT4IT.CLUB-tools.hArduino1.8.9.jpg.6ed93402257c5508757e26bf6392072d.jpg

примечание: компилятор ругался на какие-то ошибки в строке 183. Быстро погуглив, нашел решение. Там где необходимы пробелы расставил именно пробелы, там где tab, именно tab. Говорят, что при копировании части кода из форума, эти вещи могут некорректно вставиться или по простому "не надо тащить всякий хлам в код" цитата...

После добавил визуализацию во вкладку users_auto.h. Вставил следующую часть кода.

1154379264_2019-08-0221-50-54ESP8266_WS_V2.0_iT4IT.CLUB-users_auto.hArduino1.8.9.jpg.9096ca7447a8cea42b153ae6e9838045.jpg

И там же добавил сенсор.

1997115221_2019-08-0221-51-20ESP8266_WS_V2.0_iT4IT.CLUB-users_auto.hArduino1.8.9.jpg.3e6844f6f358f195148cb915876ff564.jpg

Вот собственно и всё. После давил отправку показаний на народный мониторинг и thingspeak. Всё это делал во вкладке services.h Там всё интуитивно понятно. Даже я разобрался сразу. Только для thingspeak максимальное количество датчиков 8, для народного мониторинга можно больше. Но чаще можно отправлять данные в thingspeak и там можно добавлять красивую стрелочную анимацию показаний и делать расчеты и анализ в matlab, соответственно зная или немного разбираясь в языке программирования matlab. 

Еще пара слов про датчик CO2. Работает он не очень корректно. Данные часто убегают в космос.

22916065_2019-08-0311-51-31..thumb.jpg.f53de7f05d70377d2bde332839f9be69.jpg

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

К сенсору освещенности вопросов нет. 

Спасибо за помощь. Всем удачи!

  • Like 1

Share this post


Link to post
Share on other sites

Всем добрый день. Хочу поделиться неудачным опытом установки в отпуске в России. Станция работала у меня месяц на столе и вот пришло время занять свое законное место на улице. Так как расстояние от датчиков до ESP было около 2х метров, решил использовать витую пару категории 5е. С общим экраном. 2 на питание, остальные SDA и SCL на 3 датчика. Провода паять не было возможно, использовал скрутку с термоусадкой... Знаю, не есть хорошо это. Датчики проработали день или два потом перестали давать данные. Подозрения в скрутке или длине витой пары. Из-за отсутствия времени, не успел ничего поправить, оставил станцию не работающую до следующего года... Жаль. 

IMG_6853.JPG

IMG_6505.JPG

  • Like 1

Share this post


Link to post
Share on other sites

Привет дай пожалуйста ссылку, где брал корпус для датчика, уголок на 50 см?

Имеется проблема перегрева датчика, сторона размещения восточная. Кто сталкивался с данной проблемой, решит ли обертывание в фольгу? 

Share this post


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

решит ли обертывание в фольгу? 

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

Share this post


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

Привет дай пожалуйста ссылку, где брал корпус для датчика, уголок на 50 см?

Имеется проблема перегрева датчика, сторона размещения восточная. Кто сталкивался с данной проблемой, решит ли обертывание в фольгу? 

Сейчас в том магазине корпус уже не доступен, но вот ссылка на другой магазин 
https://s.click.aliexpress.com/e/8r5Ivlcob Как я понял, это запчасть от какой-то метеостанции. Если покопать ещё алиэксперсс, то можно и стойку найти и датчик температуры и влажности под этот корпус. Будет комплект. Только датчик беспроводной на 433 МГц на батарейках. Было бы неплохо придумать приёмник этого сигнала, что бы не иметь головной боли с протаскиванием проводов и т.п.  Вопрос перегрева можно попробовать решить оклейкой самих рёбер фольгированным скотчем. Только сами ребра, что бы оставить вентиляцию. Должно помочь. Стойку металлическую покупал в строительном магазине, была она 50 на 50, одну ногу укоротил. Крепил корпус под верхнее ребро к стойке на маленькие кабельные стяжки, решение так себе, но в спешке выбора не было

Share this post


Link to post
Share on other sites

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

27.08.2019 в 10:21, den48rus сказал:

Так как расстояние от датчиков до ESP было около 2х метров, решил использовать витую пару категории 5е. С общим экраном. 2 на питание, остальные SDA и SCL на 3 датчика.

Если я правильно Вас понял, от контроллера к каждому из датчиков идет отдельная линия I2C. То есть датчики подключены параллельно с последовательным питанием. Если это так, то как мне кажется, это не лучший вариант подключения. Рассмотрите последовательное подключение датчиков, и на каждый контакт выделите по одной паре из кабеля.

IMG_4095.JPG

 

 

Share this post


Link to post
Share on other sites
08.10.2018 в 12:04, Kitsum сказал:

Конечно есть нюансы, но они будут всегда.

Добрый день!

Хочу прикрутить к метеостанции магнитометр QRM3100 для отслеживания изменения магнитного поля.

 

#include <Wire.h>
float x, y, z;
byte QRM3100_I2C_ADDRESS =0x23;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  writeRegister(0b0000001,0b01110001); 
}

void loop() {

delay(500); 

while ((readRegister(0x34) & 0x80) != 0x80) {} 
  uint8_t mx2 = readRegister(0x24);
  uint8_t mx1 = readRegister(0x25);
  uint8_t mx0 = readRegister(0x26);
  uint8_t my2 = readRegister(0x27);
  uint8_t my1 = readRegister(0x28);
  uint8_t my0 = readRegister(0x29);
  uint8_t mz2 = readRegister(0x2A);
  uint8_t mz1 = readRegister(0x2B);
  uint8_t mz0 = readRegister(0x2C);

  x = ((int32_t)(mx2 * 256 * 256) | (mx1 * 256) | mx0);
  y = ((int32_t)(my2 * 256 * 256) | (my1 * 256) | my0);
  z = ((int32_t)(mz2 * 256 * 256) | (mz1 * 256) | mz0);


  Serial.print("M:  X\t");
  Serial.print(x);
  Serial.print("\t   Y\t");
  Serial.print(y);
  Serial.print("\t   Z\t");
  Serial.print(z);
  Serial.println("");
  delay(500);  
  
}

uint8_t readRegister(uint8_t address){  // функция чтения регистра
  uint8_t output;

  Wire.beginTransmission(QRM3100_I2C_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();

  delayMicroseconds(2);

  Wire.requestFrom(QRM3100_I2C_ADDRESS, 1);
  while(Wire.available())
  {
  output = Wire.read();
  }
  return output;
}

void writeRegister(uint8_t address, uint8_t value){ // функция записи в регистр
  Wire.beginTransmission(QRM3100_I2C_ADDRESS);
  Wire.write(address);
  Wire.write(value);
  Wire.endTransmission();
}

Скетч работает на ProMini, но не хочет на ESP8266. Насколько я понимаю, проблема в разрядности процессоров. ESP не хочет делать отрицательные "int". Пробовал методом "научного тыка" менять типы переменных, ничего хорошего не получается.

Ардуино выдает:   X    475.00       Y    -1268.00       Z    3557.00

ESP выдает: X    593.00       Y    16775842.00       Z    3409.00

т.е. положительные значения похожи, а с отрицательными беда.

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

 

Share this post


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

Скетч работает на ProMini, но не хочет на ESP8266. Насколько я понимаю, проблема в разрядности процессоров. ESP не хочет делать отрицательные "int". Пробовал методом "научного тыка" менять типы переменных, ничего хорошего не получается.

Ардуино выдает:   X    475.00       Y    -1268.00       Z    3557.00

ESP выдает: X    593.00       Y    16775842.00       Z    3409.00

т.е. положительные значения похожи, а с отрицательными беда.

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

 

А при чем тут разрядность?

uint8_t output;

https://ru.wikipedia.org/wiki/Stdint.h

Типы с точной шириной.

Не все системы могут поддерживать все эти типы.

Тип Описание
int8_t 8-битовый со знаком
int16_t 16-битовый со знаком
int32_t 32-битовый со знаком
int64_t 64-битовый со знаком
uint8_t 8-битовый без знака
uint16_t 16-битовый без знака
uint32_t 32-битовый без знака
uint64_t 64-битовый без знака

 

Как ты получишь знаковое число в без знаковую переменную?

Share this post


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

Скетч работает на ProMini, но не хочет на ESP8266

проблема с  работоспособностью этого скетча на ЕСП8266 решена:

 int8_t mx2 = readRegister(0x24);
  uint8_t mx1 = readRegister(0x25);
  uint8_t mx0 = readRegister(0x26);
  int8_t my2 = readRegister(0x27);
  uint8_t my1 = readRegister(0x28);
  uint8_t my0 = readRegister(0x29);
  int8_t mz2 = readRegister(0x2A);
  uint8_t mz1 = readRegister(0x2B);
  uint8_t mz0 = readRegister(0x2C);

так корректно  отображаются отрицательные значения. (помогли братья с форума esp8266)

Share this post


Link to post
Share on other sites
08.10.2018 в 12:04, Kitsum сказал:

Конечно есть нюансы, но они будут всегда.

Добрый день!

Магнитометр QRM3100 корректно работает на ESP8266 c данным скетчем:

#include <Wire.h>
float xхх, yyy, zzz;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  writeRegister(0b0000001,0b01110001); 
}

void loop() {

delay(500); 

while ((readRegister(0x34) & 0x80) != 0x80) {} 
  int8_t mx2 = readRegister(0x24);
  uint8_t mx1 = readRegister(0x25);
  uint8_t mx0 = readRegister(0x26);
  int8_t my2 = readRegister(0x27);
  uint8_t my1 = readRegister(0x28);
  uint8_t my0 = readRegister(0x29);
  int8_t mz2 = readRegister(0x2A);
  uint8_t mz1 = readRegister(0x2B);
  uint8_t mz0 = readRegister(0x2C);

  xxx = ((int32_t)(mx2 * 256 * 256) | (mx1 * 256) | mx0);
  yyy = ((int32_t)(my2 * 256 * 256) | (my1 * 256) | my0);
  zzz = ((int32_t)(mz2 * 256 * 256) | (mz1 * 256) | mz0);


  Serial.print("M:  X\t");
  Serial.print(xxx);
  Serial.print("\t   Y\t");
  Serial.print(yyy);
  Serial.print("\t   Z\t");
  Serial.print(zzz);
  Serial.println("");
  delay(500);  
  
}

uint8_t readRegister(uint8_t address){  // функция чтения регистра
  uint8_t output;

  Wire.beginTransmission(0x23);
  Wire.write(address);
  Wire.endTransmission();

  delayMicroseconds(2);

  Wire.requestFrom(0x23, 1);
  while(Wire.available())
  {
  output = Wire.read();
  }
  return output;
}

void writeRegister(uint8_t address, uint8_t value){ // функция записи в регистр
  Wire.beginTransmission(0x23);
  Wire.write(address);
  Wire.write(value);
  Wire.endTransmission();
}

но никак не получается на его основе в метеостанции создать новые сенсоры, не видит нкакие данные от QRM3100. Может что-то конфликтует?

вставляю в user_sensor след. образом:

#ifndef USERS_H
#define USERS_H
float MAG[3];
...
knob_t *MAG_X = new knob_t(-10000, 10000, ".01", "mag_X", "nG");
knob_t *MAG_Y = new knob_t(-10000, 10000, ".01", "mag_Y", "nG");
knob_t *MAG_Z = new knob_t(-10000, 10000, ".01", "mag_Z", "nG");
...

uint8_t readRegister(uint8_t address){  // функция чтения регистра
  uint8_t output;

  Wire.beginTransmission(0x23);
  Wire.write(address);
  Wire.endTransmission();

  delayMicroseconds(2);

  Wire.requestFrom(0x23, 1);
  while(Wire.available())
  {
  output = Wire.read();
  }
  return output;
}

void writeRegister(uint8_t address, uint8_t value){ // функция записи в регистр
  Wire.beginTransmission(0x23);
  Wire.write(address);
  Wire.write(value);
  Wire.endTransmission();
}
void getMAG() {

while ((readRegister(0x34) & 0x80) != 0x80) {} 
  writeRegister(0b0000001,0b01110001); 

  int8_t mx2 = readRegister(0x24);
  uint8_t mx1 = readRegister(0x25);
  uint8_t mx0 = readRegister(0x26);
  int8_t my2 = readRegister(0x27);
  uint8_t my1 = readRegister(0x28);
  uint8_t my0 = readRegister(0x29);
  int8_t mz2 = readRegister(0x2A);
  uint8_t mz1 = readRegister(0x2B);
  uint8_t mz0 = readRegister(0x2C);

  MAG[0] = ((int32_t)(mx2 * 256 * 256) | (mx1 * 256) | mx0);
  MAG[1] = ((int32_t)(my2 * 256 * 256) | (my1 * 256) | my0);
  MAG[2] = ((int32_t)(mz2 * 256 * 256) | (mz1 * 256) | mz0);

}

...
float getmag_x() { return MAG[0]; }
float getmag_y() { return MAG[1]; }
float getmag_z() { return MAG[2]; }
...  
  
void sensors_config() {
cron.add(cron::time_10s, getMAG, true);
...
  sensors.add(MAG_X, device::out,  "mag_x", getmag_x, true);
  sensors.add(MAG_Y, device::out,  "mag_y", getmag_y, true);
  sensors.add(MAG_Z, device::out, "mag_z", getmag_z, true);
...
}
#endif

Диаграммы создаются, но значения совсем не похожи на данные и не меняются.

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

****************************

почему-то заработало - полтергейст какой-то

Edited by post125
заработало

Share this post


Link to post
Share on other sites
8 минут назад, Василий Залукаев сказал:

Так я тебе тут показал куда копать.

эти указания не очевидны. не надо отвечать вопросом на вопрос. и еще раз озвучу, что на Про Мини скетч работал и из беззнаковых получались знаковые без проблем.

Edited by post125

Share this post


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

эти указания не очевидны. не надо отвечать вопросом на вопрос. и еще раз озвучу, что на Про Мини скетч работал и из беззнаковых получались знаковые без проблем.

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

Edited by Василий Залукаев

Share this post


Link to post
Share on other sites
22 минуты назад, Василий Залукаев сказал:

Головой подумать не судьба?

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

Edited by post125

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
      Просмотреть файл [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(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека Cron, реализует планировщик задач для периодического выполнения пользовательских функций.
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 09.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
    • By Kitsum
      Основная задача библиотеки, это прием пользовательских команд через 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.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...