(написал бы вчера, но почти двое суток интернета не было в поселке)
Потихоньку мои сниппеты для STM8 разрастаются. Чтобы переделать "вольтметр" в термометр на 1-wire (кстати, можно и простое термореле сделать на трехсимвольном "вольтметре" - у него свободных ног достаточно),понадобилась поддержка 1-wire. Все, что в интернете находил, было реализовано совершенно некрасиво: ногодрыгом с жуткими задержками (по сути, операция опроса термодатчика везде делалась блокирующей, что не очень хорошо для таких вещей, как динамическая индикация, опрос клавиатуры и т.п.).
Я сделал на таймере: у трехсимвольного "вольтметра" как раз второй канал compare/capture таймера TIM2 используется как аналоговый вход для измеряемого напряжения, т.е. модифицировать будет проще всего. И
Вот, что получилось. Пока что код непричесанный, содержит много отладочной информации + не до конца допиленный.
Что уже реализовано:
- опрос одного-единственного датчика с командой Skip ROM,
- вывод температуры в тысячных долях °C,
- сохранение ROM-кода подключенного датчика в EEPROM (т.к. я рассчитывал на STM8S003, то, несмотря на то, что у 105-го, на котором я тренируюсь, 1кБ EEPROM, датчиков максимум 14, т.к. у 003-го всего лишь 128Б),
- поочередный опрос всех датчиков с сохраненным ROM и выдача температуры.
Что еще нужно реализовать (UPD 08.04):
- убрать тысячные (т.к. точность DS18 ниже плинтуса, там даже округление до целых градусов - многовато, по-хорошему, надо в сторону ближайшей тройки, а то и четверки округлять), (сделано), теперь по крайней мере не так в глаза бросается; вот, например, для "устаканившихся" трех B20 и одного (четвертого) S20: 23.6, 23.5, 23.4, 23.5. А то и вообще: 23.6, 23.6, 23.4, 24.0...
- добавить возможность удаления ROM несуществующих датчиков, (сделано)
- перенести весь код на "вольтметр".
Потом еще хочу с DHT11/DHT22 научиться работать. Но у них совсем все уныло, т.к. только 1 датчик на линию можно вешать. Да и точность там ну совсем жуткая, даже DS18 фору даст!
А еще надо бы закончить с реализацией аппаратного 1-wire (через таймер с DMA) на STM32.