Датчик диаметра у меня был, хороший оптический, и работал он без проблем пока я не стал принтер переделывать. Удручал размер, и последней каплей стало что на прозрачном абс он не работал.
Сел и стал разрабатывать свой. Остановился на датчике холла с линейной характеристикой. Попробовал, работает, но убил температурный дрейф. Стал думать как выйти из положения, сначала смотрел в сторону датчиков с термокомпенсацией. Дорого и под заказ. Пришла мысль поставить пару датчиков и считать разницу, так как дрейф однонаправленый. Проверил. Работает.

стл модель http://3dtoday.ru/3d-models/detali-dlya-3d-printerov/raznoe/datchik_diametra_i_okonchaniya_filamenta_/

Один датчик стоит вниз второй вверх. магнит на подвижной планке примерно между ними снизу

06c6e33c50811642c8ed66b0b626b5ba.jpg

В планке стоит подшипник, сам подшипник должен быть качественным, так как его биения влияют на точность. И запрессован магнит.
8c60e73db81d19f7c88c700d8832637f.jpg

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

PREVIEW

В качестве процессора взял недорогую ардуино , добавил функции датчика окончания филамента, точнее контроля диаметра. Можно задать верхний нижний лимит и если они будут превышены то выдавать сигнал. Например не стоит толкать через боудет пластик больше чем 1.95 , вероятность застрять высока, да и меньше 1.55 тоже не все хорошо будет ..

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

прикинул, пружина для авторучки подходит , так что желающие могут собирать детали. Как включить в прошивке я потом распишу.
итак список деталей с ссылкой где брал
датчики холла, 2 шт  https://arduino.ua/prod1474-datchik-holla-ss49e
Неодимовый магнит 5×2мм — 1 шт (есть в том же магазине )
Радиальный подшипник F623ZZ 3х10х4мм (есть там же но бьют сильно) 
Arduino Nano ATmega168 CH340 нераспаянная (самая дешевая из подходящих) можно Arduino Nano ATmega 328 но она дороже.
 
Провода и разъемы по вкусу, можно взять шлейф 10-жильный 28AWG разноцветный 50 см, немного распустить и на все хватит скорее всего, или взять метр …  На сам датчик  с ардуино нано идет 4 провода, и 3 провода (если не подключать датчик окончания филамента)  либо 4 если подключать датчик окончания на рампс (ну или что там у вас)
Активный динамик (buzzer) может быть подключен вместо или вместе с выходом на рампс и пищать если кончился филамент

резистор на 1 -3 ком и конденсатор 0.1-4.7 мкф  всегда можно где нибудь выковырять
 
Резистор я ставил между d10 и d11 ногой ардуины конденсатор + на 11 и минус на 12 , это если конденсатор   полярный, если нет то как угодно.
с 11 ноги идет выход напряжения на рампс — диаметр филамента. 7 нога выход датчика окончания, 6 пищалка минус , + пищалки на 5 вольт.

Настройка датчика состоит из 2 частей.
1 настройка самого датчика.
Необходимы 2 сверла 1.5 и 2 мм для калибровки.  в принципе сами по себе размеры не обязательно такие, их можно ввести при калибровке главное чтобы это были известные размеры.
Подключаемся к ком порту ардуины нано через встроенный терминал ардуино, скорость 115200 
при подключении получаем список команд
ставим 1.5 мм штырь , набираем cal1 — калибруем толщину 1.5 мм
ставим 2.0 мм штырь , набираем cal2 — калибруем толщину 2 мм
если все сделано правильно то после этого измерение будет идти верно
 
настройка марлина
Configuration.h
устанавливаем диаметр
#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75
 
 
Configuration_adv.h
Включаем датчик
#define FILAMENT_WIDTH_SENSOR
 
 #define MEASUREMENT_DELAY_CM  12   // (cm) The distance from the filament sensor to the melting chamber
указываем расстояние от датчика до экструдера
 
#define FILWIDTH_ERROR_MARGIN  0.25  // (mm) If a measurement differs too much from nominal width ignore it
указываем допустимый разброс, после которого сигнал датчика игнорируется
 #define MAX_MEASUREMENT_DELAY 20    // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM.
выделяем память для , значение должно быть больше чем MEASUREMENT_DELAY_CM
 
 #define FILAMENT_LCD_DISPLAY
это по желанию, отображает диаметр и множитель потока при печати
 
и возможно temperature.cpp  (у меня в  1.1.19 версии была ошибка, не хотело компилировать )
что менял уже не помню, помню что переносил какую-то переменную из функции в глобальную (за пределы функции)

как вложить файл не нашел , выложил на гугл диск
прошивка https://drive.google.com/file/d/12rh00LAVtfr45crQdMc4H-ATQN8bqSHz/view?usp=sharing
Подробнее…

Датчик диаметра филамента, простой недорогой из доступных деталей