Постепенно код для контроллера термодатчиками обрастает новыми функциями. Пока что он умеет лишь включать-выключать питание датчиков, вычислять температуры 16-ти датчиков и работать в режиме непрерывного сканирования, выдавая данные через USART. Вот такая получилась штука:
Вблизи хорошо видно отсутствие разъемов под RJ-45:
потому что сначала развел и заказал плату, а потом получил разъемы, которые оказались совершенно несовместимыми с посадочными местами под них. Также не надо было подтяжки I2C делать от питания логики, благо, дорожки питания логики и питания датчиков идут недалеко, при помощи скальпеля и проволочной перемычки проблему можно решить. USB пока только для питания (его оставлю напоследок, т.к. не горит), с CAN тоже еще не разбирался (а вот это нужно сделать поскорей). Вот так на экране выглядят показания в режиме сканирования. Нули возникли из-за плохого контакта (вообще, их быть не должно: если датчика нет или возникла временная проблема с коннектом с ним, должно выводиться -31000, то бишь -310.00°C; если же возникла ошибка преобразования температуры, должно быть -30000). Надо будет разобраться в режиме отладки, на каком этапе могут возникать нули.
Для тестирования я не стал писать функцию, т.к. это вообще однократная задача, поэтому оформил простенькие m-файлы вроде
XX=dlmread('testsensors_2');
time = XX(:,1) / 1000;
time -= time(1);
XX(:,1)=[];
XX /= 100;
plot(time, XX);
legend("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16");
xlabel("time, s"); ylabel("T, {}^\\circ{}C");
plotgr("2nd_test_b");
diffs=XX-median(XX,2);
plot(time, diffs);
legend("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16");
xlabel("time, s"); ylabel("\\Delta{}T, {}^\\circ{}C");
plotgr("2nd_test_b_diffmed");
А для сохранения графиков у меня есть старая рабочая функция:
В первой серии было аж три "неправильных" датчика. Похоже, у двух был плохой контакт (хотя звонилось все вполне нормально), а третий явно нагло врал:
Переворачивание свертка не помогло, похоже, этот датчик как-то криво откалибровали. Без него у оставшихся тринадцати разброс относительно медианной температуры был вполне вменяемым:
Дальше я взял третью пару, показания которой были ближе всего к медианным (на графике номера 5 и 6) и вставил ее в нулевой разъем (т.е. теперь это будут датчики 1 и 2), а в остальные разъемы вставил оставшиеся датчики. Вот что получилось:
Все-таки, я напутал с нумерацией и вставил другую пару — где разброс был довольно большим (почти ±0.1°C). После обеда из дома притащил еще пару датчиков (они так и лежали в рюкзаке вместе с наколенным "показометром", как в субботу померил температуру зеркала, так и не выложил) и вставил их в последний разъем:
Вообще какая-то ерунда выходит: в середине пусто, а показания тяготеют к двум группировкам сверху и снизу. На разности с медианой:
Возможно, это из-за того, что термодатчики еще не стабилизировались по температуре — все-таки, у меня очень дохленькая теплоизоляция (несколько слоев полиэтилена, жестяная банка из-под кофе, пупырчатый полиэтилен в один слой и тряпочка-очковтирательница). В любом случае, показания очень хорошо укладываются в желаемую точность не хуже 0.1°C. Жаль, что не выйдет сделать полноценного теста в широком диапазоне температур — для этого нужен нормальный термостат, дюралевая плита в пенопластовом ящике, залитая жидким азотом, не дает нормальной стабилизации температуры по всей своей поверхности.