Потребовалось подключить датчик температуры DALLAS 18B20 (DS18B20) к RepkaPi 3, стандартная конфигурация платы не поддерживает такую шину «из коробки», для активации шины нужно модифицировать и пересобрать дерево устройств.
Такой способ мне не подходил, тогда обратился в группу telegram за помощью. Общими силами нашли решение, за что всем причастным огромное спасибо, а именно Serj GSG и Andrey Danin.
Решение - оверлеи, позволяющие динамически изменять и дополнять дерево устройств. Ниже поэтапная инструкция, как включить 1-Wire с помощью оверлеев.
-
Создайте файл /root/onewire.dts с содержимым ниже (смените пин на свой, если требуется):
/dts-v1/; /plugin/; / { compatible = "allwinner,h5"; fragment@0 { target = <&pio>; __overlay__ { w1_pa7_pins: w1-pa7-pins { pins = "PA7"; function = "gpio_in"; }; }; }; fragment@1 { target-path = "/"; __overlay__ { onewire { compatible = "w1-gpio"; pinctrl-names = "default"; pinctrl-0 = <&w1_pa7_pins>; gpios = <&pio 0 7 0>; status = "okay"; }; }; }; };
-
Установите компилятор:
sudo apt-get install device-tree-compiler
-
Выполните команду:
dtc -I dts -O dtb -o onewire.dtbo onewire.dts
-
Скопируйте полученный файл onewire.dtbo в /boot/overlays
-
Откройте в редакторе файл /boot/repkaEnv.txt и допишите в overlays onewire, сохраните.
-
Перезагрузите репку.
Вариант функции на Python для чтения показаний датчика DS18B20:
def read_temperature() -> float | None:
base_dir = '/sys/bus/w1/devices'
for entry in os.listdir(base_dir):
if re.match(r'^28-.*$', entry):
with open(f'{base_dir}/{entry}/w1_slave', 'r') as f:
lines = f.readlines()
if len(lines) == 2:
if re.match(r'^.+YES$', lines[0]):
search = re.search(r't=(\d+)', lines[1])
if search:
return float(search.group(1)) / 1000.0
return None