Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 28 апр 2017, 14:32

Полный перечень поддерживаемых в текущий момент I2C-устройств указан здесь.
Насчет MCP23017 пока ничего конкретного сказать не могу.

Andrey2509
Сообщения: 141
Зарегистрирован: 22 июн 2015, 13:24

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey2509 » 28 апр 2017, 14:42

Возможна ли поддержка датчика MH-Z14 по PWM-выходу? А то что-то показания через аналоговый выход сильно скачут, может по цифре точнее будут.
На сайте http://humkanet.ru/proshivka-datchika-co2 (сейчас не доступен, нашёл через web.archive.org) есть такая информация:
Итак, данные будем мерить по ШИМ. Из документации по датчику длина сигнала 1004мс, из них первые 2 секунды высокий уровень, последние 2 секунды низкий уровень, оставшиеся 1000мс это сами данные.
Показания передаются высоким уровнем. Тогда показания CO2 можно вычислить по формуле: ppm = 5000*(th-2)/1000, где 5000 максимально возможные показания (заявлено 5000ppm), th длительность фронта, 2 первые 2мс высокого уровня, 1000 длина полезного сигнала.
Формулу можно упростить, ppm = 5*(th-2).

Теперь осталось собственно измерить саму длительность высокого уровня. Для этого сначала требуется поймать начало высокого уровня. Так как начать измерение мы можем в любой момент, мы можем попасть как на высокий уровень так и на низкий уровень.
Чтобы определить начало высокого уровня нужно сделать три операции:
1) подождать пока уровень высокий (может на момент измерений мы попали в середину высокого уровня);
2) подождать пока уровень низкий (если мы попали на середину низкого уровня, этап 1 завершится моментально и реальную длительность низкого уровня снова определить не сможем);
3) замерить высокий уровень, на этом этапе уже будет гарантированно длительность высокого уровня th.

В МК atmega8 для измерения длительности сигнала можно использовать таймер в режиме счетчика пока на ножке ICP держится уровень (задается высокий или низкий) таймер отсчитывает тики.
Как только сигнал сменится вызовется прерывание. Помимо прерывания в регистре TIFR установится флажок ICF1. Мерить мы будем в синхронном режиме, поэтому прерывания использовать не будем, а будем ориентироваться как раз на этот флажок.
Еще один момент, если на ножке ICP всегда один уровень (например, датчик CO2 не подключен), то флаг ICF1 может никогда не выставиться. Но, помимо флага ICF1 есть еще и флаг TOV1, который выставляется при переполнении таймера. Как раз его и будем использовать для отработки этой ситуации.

Известно, что длительность полезного сигнала от MH-Z14 не превышает 1000мс, и МК atmega8 работает на частоте 1МГц. Таймер1 16-битный, если не использовать предделитель, то переполнение будет вызываться каждый 1000000/65536=15.25мкс, что гораздо меньше длительности полезного сигнала.
Поэтому для таймера будем использовать предделитель 64, тогда переполнение таймера будет вызываться каждые 65536мкс*256=4.19с. Если на ножке ICP не было изменения уровня дольше 4.19с то датчик к ней точно подключен!

После измерения таймером длительности сигнала и зная частоту МК можно получить значение в миллисекундах по простой формуле:
th = (t*64)/(fcpu/1000),
где th длительность в миллисекундах, t количество тиков таймера, fcpu частота МК. Для перевода времени в миллисекунды делим частоту процессора на 1000.

Собираем все вместе и получаем такую функцию:
uint16_t mhz14_read_pwm(uint32_t fcpu)
{
// Замеряем фронт
TCCR1B = _BV(CS11) | _BV(CS10);
for (char n=0; n<3; n++){
TCNT1 = 0;
while(!(TIFR & (_BV(ICF1) | _BV(TOV1))));
// Нет сигнала
if (bit_is_set(TIFR, TOV1)){
TCCR1B = 0;
TIFR |= _BV(TOV1);
return 0;
}
TIFR |= _BV(ICF1);
TCCR1B ^= _BV(ICES1);
}
TCCR1B = 0;
uint16_t t = ICR1 + 1;
// Длительность фронта в миллисекундах
t = (((uint32_t) t) << 6)/(fcpu/1000);
// Возвращаем ppm
return 5U*(t-2);
}

empenoso
Сообщения: 1039
Зарегистрирован: 11 ноя 2015, 08:03
Откуда: Пермь

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение empenoso » 28 апр 2017, 15:21

nevkon писал(а):Скорее всего имелось в виду какие датчики с интерфейсом поддерживаются мегой без участия сервера. Тоже думаю что стоит уже составить такой список.
Кстати что насчет MCP23017, а то времени уже прошло немало с момента объявления что будет?
Andrey_B писал(а):Полный перечень поддерживаемых в текущий момент I2C-устройств указан здесь.
Насчет MCP23017 пока ничего конкретного сказать не могу.
Да, вот что искал:
В данный момент поддерживаются датчики/устройства: HTU21D, Si7021 (в выпадающем списке выбрать HTU21D), BH1750, TSL2591, BMP180, BMP280, BME280, SSD1306, MCP23008 (но этот перечень будет расширен).

YuriyU
Сообщения: 15
Зарегистрирован: 22 мар 2017, 18:49

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение YuriyU » 03 май 2017, 18:12

YuriyU писал(а):
Andrey_B писал(а):YuriyU, я исследую вашу проблему. Осложняется это тем, что у меня эта ситуация не воспроизводится, а синтетически я ее сгенерировать пока не могу. Продолжаю поиски.
Кое-что удалось улучшить. Возможно, это не решит вашу проблему, но все же попробуйте.
Прекрасно понимаю насколько это не просто. Спасибо. Обновил. Отчитаюсь.
небольшой отчет
За неделю один раз прекращалась передача данных по srv-loop, значит эта проблема не ушла со сменой прошивки.
Но, по вашему запросу, в МДМ появилась аналогичная функция с возможностью настраивать периодичность опроса. Спасибо :)
Я переключился на нее, отказавшись от проблемного srv-loop.
Результат опроса с сервера стабилен в течении 2-х дней.

Сегодня был один сбой, для меня не критичный, а вам для статистики, может поможет в решении проблем.
На Мегу был отправлен очередной запрос ?cmd=all, мега замолчала, пролетели несколько TCP Retransmission, но Мега, все-таки, ответила на запрос и сессия завершилась корректно.
В этот момент обнулился счетчик uptime Меги.
Далее Мега продолжила работать в штатном режиме.
Есть дамп, если интересно.

UPD: поисследовал последний сбой. Склоняюсь к тому, что перезагрузка. В логе сервера нашел сообщение ?st=1. Wireshark, почему-то, не записал некоторые пакеты.
Подключил лабораторный БП. посмотрю еще.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 04 май 2017, 10:45

k_w_m писал(а):
Andrey_B писал(а): Добавить можно любой датчик. Я не сравнивал TSL2591 и TSL2561 между собой, но вроде бы у TSL2591 больше диапазон. С этой точки зрения для измерения природной освещенности лучше использовать датчик с максимальным диапазоном. Он нужен то всего один. А для остальных задач можно использовать копеечные BH1750 или TEMT6000. То есть острой необходимости в TSL2561 как бы и нет.
Действительно, лучше уж добавить двухкопеечные max44009 - еще больше диапазон: 0.045 - 188 000 lux; 22 bit
Первые результаты сравнительного тестирования TSL2591 и MAX44009 в условиях низкой освещенности.
Настройки TSL2591: Medium Gain, 200 ms Integration time

Красный график: TSL2591
Зеленый график: MAX44009
max44009vstsl2591-1.gif
max44009vstsl2591-1.gif (6.37 КБ) 4360 просмотров
Наблюдений несколько:
1. Форма графиков очень похожа
2. MAX44009 выдает больше "люксов", чем TSL2591 и чем выше освещенность, тем сильнее разница.
3. График MAX44009 более ступенчатый.

На более коротком промежутке в условиях раннего рассвета.
max44009vstsl2591-2.gif
max44009vstsl2591-2.gif (5.81 КБ) 4360 просмотров
1. TSL2591 при указанных настройках даже ночью показывает 0,02-0,04 (что, возможно, ближе к действительности, но практического смысла не имеет), тогда как MAX44009 идет с нулями. Минимальное значение для MAX44009 - 0.045 люкс
2. Я бы сказал, что TSL2591 раньше начал фиксировать увеличение освещенности. Примерно на 2-3 минуты.

Но! MAX44009 существенно дешевле. Калькуляция значений намного проще. Считывание данных быстрее.
Учитывая "эмпирический" набор формул, который предлагается даже не производителем (AMS), а Интернет-магазином Adafruit, а также некоторые сложности/путаница с настройками gain / integration time, MAX44009 выглядит неплохой альтернативой.

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

k_w_m
Сообщения: 98
Зарегистрирован: 19 июл 2013, 13:41

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение k_w_m » 04 май 2017, 11:43

Добрый день, Андрей.
Спасибо за глубокий практический анализ.
Немного смущает ступенчатость MAX. Вроде же заявлено 22 бита? Это датчик в реальности не выдаёт такую точность или возможны некорректности в функциях обработки?

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Bonefolder » 04 май 2017, 11:51

Спасибо за тест МАХ44009. Датчики лежат на столе, ждут внедрения.
Возможно, что "ступенчатость" графика МАХа, идёт из-за интервалов опроса? А плавность ТСЛ - из-за расчетных формул.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 04 май 2017, 12:09

Графики сформированы при одинаковых интервалах опроса - 1 минута.
Расчетные формулы, думаю, не при чем. Если считывать raw-значения каждую секунду, то видно, что у TSL2591 они меняются значительно чаще.
Биты к ступенчатости, строго говоря, прямого отношения не имеют. Но они задают диапазон.
Некорректная обработка? Вряд ли. RAW-данные от датчика MAX44009, как я уже сказал, меняются при плавном изменении освещенности реже, чем у TSL2591. Думаю, это специфика работы самого датчика.
Да, MAX44009 работал в режиме AUTO. Это очень полезный режим.
У TSL2591 этого режима нет. В результате если выставить Medium Gain, то при освещенности выше 2300 люкс (это освещенность в тени в солнечный день) этот датчик начинает показывать некорректные данные. Если выставить Low Gain, то при высокой освещенности все в порядке, но при низкой освещенности мы уже не получим десятые и сотые доли люксов. MAX44009 в этом смысле крут - он автоматически переключает Integration Time (от 100 до 800 мс), чтобы выдавать более-менее корректные данные во всем диапазоне. В целом для бытовых нужд MAX44009 подходит лучше: дешевле, автоматический режим работы, более широкий диапазон. А некоторая ступенчатость в практических задачах мешать не будет.

k_w_m
Сообщения: 98
Зарегистрирован: 19 июл 2013, 13:41

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение k_w_m » 04 май 2017, 17:21

Андрей, извините за навязчивость, но Вы какой библиотекой пользовались для MAX44009 ? (Не дают мне покоя ступеньки). Там читаются оба регистра 3 и 4 ?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 04 май 2017, 17:53

Читаются оба регистра: msb (High-Byte Register) и lsb (Low-Byte Register).

Код: Выделить всё

data = (msb << 8) | lsb;
e = (data & 0xF000) >> 12;
m = ((data & 0x0F00) >> 4) + (data & 0x000F);
m <<= e;
data = (m * 45) / 10;
На тестовых значениях из даташита все верно.

Код: Выделить всё

Lux = 2(exponent) x mantissa x 0.045
Exponent = 8xE3 + 4xE2 + 2xE1 + E0
Mantissa = 128xM7 + 64xM6 + 32xM5 + 16xM4 + 8xM3 + 4xM2 + 2xM1 + M0
Combining contents of register 0x03 and 0x04:
A code of 0000 0000 0001 calculates to be 0.045 lux.
A code of 0000 0001 0000 calculates to be 0.72 lux.
A code of 0001 0001 0001 calculates to be 0.765 lux.
A code of 1110 1111 1111 calculates to be 188,006 lux.
A code of 1110 1111 1110 calculates to be 187,269 lux
Кроме "0001 0001 0001", но в данном случае ошибка, по всей видимости, в даташите. По формуле получается 1.53, а не 0.765

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 04 май 2017, 18:44

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

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 05 май 2017, 18:37

Действительно оказалось, что реализация доступа к данным в регистрах у MAX44009 сделана не как у всех.
Вместо того, чтобы запросить данные по адресу 0x03, а затем считать 2 байта подряд (High, Low), необходимо отдельно запрашивать 0x03 и отдельно 0x04, причем между этими запросами должно быть не Start-Stop, а нечто под названием Repeated Start (это, чтобы данные во втором регистре случайно не изменились, пока производится считывание первого). В результате предыдущие замеры фактически не учитывали low byte (вернее, эти данные были некорректными) и опасения k_w_m были не напрасны.
Сделал изменения. Думаю, это должно повлиять положительно на плавность графика. Накоплю данные, опубликую новые графики.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 06 май 2017, 11:52

Новые результаты сравнительного тестирования датчиков освещенности MAX44009 и TSL2591

Зеленый график - MAX44009 (Auto Mode)
Красный график - TSL2591 (Gain Low, 100ms)

Для TSL2591 выбран режим Low Gain как наиболее универсальный. В этом режиме датчик нормально работает во всем диапазоне, но при низкой освещенности 0-20 люкс нет десятых долей, то есть шаг в этом диапазоне очень большой.
max44009-vs-tsl2591-1.gif
max44009-vs-tsl2591-1.gif (6.67 КБ) 4228 просмотров
Форма графиков фактически совпадает. MAX44009 выдает больше люксов.
max44009-vs-tsl2591-2.gif
max44009-vs-tsl2591-2.gif (5.88 КБ) 4228 просмотров
После корректировки прошивки наблюдается плавность изменений значений MAX44009. Все в порядке!
max44009-vs-tsl2591-3.gif
max44009-vs-tsl2591-3.gif (5.5 КБ) 4228 просмотров
Прекрасная чувствительность и разрешающая способность в условиях низкой освещенности.
Здесь мы видим угловатый график для TSL2591, что нормально в режиме Low Gain в условиях низкой освещенности.

hawkeye
Сообщения: 98
Зарегистрирован: 06 окт 2016, 22:16

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение hawkeye » 06 май 2017, 20:34

Хочу пожаловаться.
К P30 в режиме 1W подключен DS18B20, нормально работает и выводит показания на ssd.
Но у меня два раза воспроизводился такой дефект (сейчас на fw: 4.14b2):
- на главной странице пишет: -- XT2 -- P30 - IN
- на странице порта пишет: Type - NC
Заметил из-за того что в данном порту прописан вывод на дисплей и уже два раза с интервалом в месяц на экране появлялась только нижняя часть цифр, а наверху мусор. При этом сам контроллер по сети доступен, настройки других портов не менялись, штатно перезагружал его сохранением общих настроек, после перезагрузки тип порта восстанавливился в DS и показания на экран корректно выводятся.

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 06 май 2017, 21:57

hawkeye, прежде всего, необходимо обновить прошивку по крайней мере до 4.14b7.
В ближайшие дни планирую подключить SSD1306 для постоянной круглосуточной работы и нагрузить его и контроллер всякой работой. Проверю - будут ли какие-нибудь сбои на временных отрезках в месяц и более.

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Bonefolder » 08 май 2017, 22:51

Андрей, ждём обновления, с подключением МАХ44009.
Всех с наступающим Днём Победы!

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 09 май 2017, 12:47

http://ab-log.ru/files/File/megad-2561/ ... a2-hex.zip

- Добавлена команда для отображения крупно цифр на дисплеях SSD1306. Подробнее.

- Промежуточная поддержка MAX44009.
Пример: http://192.168.0.14/sec/?pt=31&scl=30&i2c_dev=max44009
Более полная поддержка с выбором устройства из списка появится немного позже.

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Bonefolder » 09 май 2017, 17:03

Andrey_B писал(а):[- Промежуточная поддержка MAX44009.
Пример: http://192.168.0.14/sec/?pt=31&scl=30&i2c_dev=max44009
Более полная поддержка с выбором устройства из списка появится немного позже.
Спасибо! Чтобы появилась промежуточная поддержка 44009, необходимо ставить эту прошивку?
И какой датчик выбирать при конфигурации порта?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 09 май 2017, 17:35

Bonefolder, для работы с MAX44009 необходима прошивка 4.15b2 или выше.
Датчик можно не выбирать. Параметр i2c_dev задает устройство, с которым будет работать контроллер.
Поэтому даже если в Web-интерфейсе выбран какой-то конкретный датчик, а на шине висят несколько устройств, остается возможность работать с остальными.

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Bonefolder » 09 май 2017, 19:39

Спасибо! Ушёл читать, как обновлять прошивку))

Ответить