В этой статье объясняется, как собрать простую библиотеку Go для датчика температуры Дс18б20 без использования каких-либо внешних репозиториев, кроме встроенных библиотек Go.

Компоненты проекта

Этот небольшой проект включает в себя:
Устройства и компоненты:

  • Датчик температуры Дс18б20 (подробнее: https://bit.ly/3IWEhn0)
  • Резистор 4,7 кОм
  • Raspberry Pi 2B (также должен нормально работать с другими версиями)

Языки:

  • Перейти (базовый уровень)
  • Баш (базовый уровень)

Система:

  • Linux (ОС Raspberry)

Другое:

  • Учетная запись GitHub для публикации библиотеки

Подходит ли язык Go для Raspberry Pi?

Написание программ на Go для запуска их на Raspberry Pi может показаться экзотическим, но растущее число различных библиотек Go на GitHub, посвященных Raspberry Pi, доказывает, что язык работает с устройствами Raspberry, и люди заинтересованы в его использовании.
Это так. не так популярен, как Python. GitHub показывает, что количество библиотек на основе Go составляет всего 10% от библиотек на основе Python для платформы Raspberry Pi.

Вы можете спросить, стоит ли использовать Go для написания программ для работы на устройствах Raspberry Pi.
Его разумно использовать для ваших проектов по следующим причинам:

  1. Go требует меньше памяти по сравнению с Python, потому что код Go скомпилирован в двоичный файл, который может запускаться машиной raspberry pi изначально.
    Напротив, выполнение скриптов Python на машине фактически запускает дополнительный интерпретатор, который использует больше памяти для перевода кода Python на родной язык машины во время выполнения.
    Весь перевод кода Go и оптимизация выполняются при компиляции программы Go. Это огромное преимущество из-за небольшого объема встроенной памяти в старых устройствах Raspberry.
  2. Тот факт, что программа Go может быть скомпилирована на родной язык машины, означает, что программа будет работать быстрее по сравнению с программами, запускаемыми интерпретаторами.
  3. Язык Go позволяет одновременно запускать параллельные программы
    , хотя Python этого не поддерживает.
  4. Огромным преимуществом использования Go является проверка безопасности типов и автоматическое форматирование кода во время сборки.
    Код унифицируется и проверяется перед компиляцией.
    Компилятор Go информирует программистов об утверждении или синтаксической ошибке. произошло в кодовой базе.
  5. Самые популярные интерфейсы и датчики для Raspberry Pi уже имеют поддерживающие их библиотеки Go.
    База, на которой программисты могут создавать свои собственные программы, уже широка и продолжает расти.

Шаг 1. Настройте Raspberry Pi для связи с датчиком

Датчик Ds18b20 использует протокол связи 1-wire для обмена информацией с устройством Raspberry Pi.
Датчик необходимо подключить к контакту GPIO 1-wire устройства Raspberry Pi.
По этой ссылке вы можете проверить, какой пин поддерживает 1-wire соединение для выбранного вами устройства: h ttps://pinout.xyz/pinout/1_wire

По умолчанию GPIO 4 является портом 1-Wire.

Чтобы включить порт по умолчанию, выполните шаги, перечисленные ниже.

Включить порт 1-wire можно двумя способами:

Шаг 1.1:

Решение 1:

Включение 1-wire с помощью интерфейса raspi-config. Введите в терминале:

В открытой программе выберите параметр interfaces, найдите параметр 1-wire и выберите включить, как показано ниже.

Решение 2 — вариант 1:

Либо отредактируйте файл /boot/config.txt, добавив или раскомментировав строку, как указано ниже:

Добавьте или раскомментируйте следующую строку:

Решение 2 — альтернатива 2:

В качестве альтернативы, если вы хотите использовать другой вывод GPIO, чем GPIO4, вы можете добавить следующую строку в файл /boot/config.txt. В данном случае GPIO 21 — это мой пользовательский контакт 1-wire.

Шаг 1.2:

Установите параметр подтягивания для вывода, а затем перезапустите конфигурацию с помощью этих команд (не забудьте изменить PIN_NUMBER на выбранное вами число — по умолчанию: 4, в моем случае 21).

Введите эти команды в терминал:

Шаг 2. Подключите датчик температуры к Raspberry.

Подключите датчик температуры, как показано на рисунке ниже.
Не забудьте использовать правильный резистор — 4,7 кОм. Сопротивление показано цветами на резисторе. Не забудьте подключить провод данных к контакту, который вы выбрали в качестве контакта 1-wire в конфигурации на шаге 1.
В следующем примере контакт данных — это GPIO 21. Вы можете подключить контакт данных к GPIO4 по умолчанию или используйте другой настраиваемый вывод GPIO, который вы выбрали на шаге 1.

Шаг 3. Проверьте конфигурацию и подключение

Теперь, когда датчик подключен и Raspberry Pi настроен, вы можете проверить, виден ли датчик на Raspberry. Введите в терминал вашей малины:

Вы должны увидеть список файлов, представляющих подключенные датчики. Датчик температуры будет виден как файл с адресом
похожим на 28–01195240e3ff.
Пример вывода команды:

pi@raspberrypi: $ ls /sys/bus/w1/devices/
28-01195240e3ff w1_bus_master1

Имя файла представляет собой адрес вашего датчика температуры.
Адрес датчика важен, поэтому обязательно скопируйте его для дальнейшего использования.

Вы можете использовать less для отображения содержимого файла:

Или с помощью кота:

Если вы правильно настроили датчик и пин, вы должны увидеть аналогичный вывод:

t=21312 – температура с точностью до 3 знаков после запятой
в градусах Цельсия (21,3 * C).

Шаг 4. Создайте пустой репозиторий и отправьте его на GitHub.

Начните с создания каталога на вашем компьютере (он не обязательно должен быть на Raspberry, потому что мы скомпилируем программу Go в двоичный файл и загрузим двоичный файл на Raspberry Pi). Назовем каталог ds18b20-go.
Откройте каталог. Добавьте пустой файл с именем main.go в этот каталог.
Чтобы создать и опубликовать библиотеку, вам необходимо установить git.

Затем инициализируйте репозиторий git. Вы можете сделать все это в терминале следующим образом:

После этих шагов вы можете создать репозиторий GitHub, в котором будет размещаться ваша библиотека golang.

Войдите в GitHub, создайте публичный репозиторий.

После создания репозитория вам будет предложено вставить в него код. Сделайте это, следуя инструкциям на странице GitHub:

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

Шаг 5: Начнем программировать!

Откройте файл main.go в каталоге ds18b20-go, который был создан на предыдущем шаге.

Если вы новичок в языке Go, обратите внимание, что если имя переменной или метода написано заглавной буквой,
это означает, что метод или переменная являются общедоступными и могут использоваться вне модуля (пакета).< br /> Имена строчных букв видны только в пределах пакета, в котором определено имя.

Модуль и импорт:

Во-первых, мы должны назвать модуль. Добавьте первую строку кода:

Во-вторых, импортируйте необходимые зависимости.
Нам нужны os, regexp и bufio для чтения файлов, errors для корректного возврата ошибок, math и strconv для округления и анализа температуры.

Структура датчика:

Теперь давайте определим структуру нашего датчика температуры с именем DS18B20.
Эта структура хранит адрес устройства и путь к файлу.
Обратите внимание, что адрес и путь к файлу являются закрытыми переменными, которые используются только для внутренние операции, которые доступны только в области пакета.

Пришло время написать первую функцию. Эта функция представляет собой общедоступный интерфейс, который позволяет вам инициализировать экземпляр нашей структуры датчика температуры.
В результате она возвращает новый экземпляр датчика. В качестве параметра программисту необходимо передать адрес датчика своего устройства Raspberry.
На следующем шаге мы добавим метод setSensorFilePath приватно.

Методы структуры сенсора:

Теперь нам нужно добавить закрытый метод, который подготовит путь к файлу во время инициализации структуры сенсора.
Мы будем использовать тип параметра *DS18B20 в этой функции, чтобы сообщить Go, что это метод, добавленный в структуру, чтобы его можно было вызвать в экземпляре датчика, например, sensor.setSensorFilePath().
Этот метод объединяет заданный адрес со стандартным путем raspberry pi к файлу из которого доступна измеренная температура.

Теперь, когда у нас есть путь к файлу, мы можем начать чтение температуры из файла.

Давайте добавим новый метод в структуру DS18B20.

Этот метод использует следующий метод getTemperatureFromFile(), который открывает файл и считывает из него температуру.
Затем он пытается проанализировать температуру и, если анализ не удался, возвращает ошибку. .
Если все в порядке, он возвращает температуру в виде числа с плавающей запятой.
Метод проверяет, составляет ли длина строки температуры не менее 3 символов, и не возвращает ли преобразование строки в число с плавающей точкой ошибку.

Функция считывания температуры:

Наконец, нам нужно определить getTemperatureFromFile и реализовать логику пошагового чтения температуры из файла.

Во-первых, мы должны открыть файл. Добавьте следующие строки в метод getTemperatureFromFile. Обратите внимание, что в случае ошибки мы хотим закрыть файл с помощью defer file.Close().

Во-вторых, создайте сканер и прочитайте файл построчно. Попробуйте найти строку температуры в каждой строке, используя regexp.
Температура, например, имеет формат t=20.000. "t=.*" соответствует ему. Если температура была найдена, удалите из нее t= и запишите ее в переменную measuredTemperature.

Последнее, что нужно сделать, это проверить, правильно ли была считана температура. Если все в порядке, метод возвращает ее.
Если в сканере произошла ошибка или температура является пустой строкой, он вернет ошибку.

Вот так выглядит файл main.go после всех изменений:

Шаг 6: Инициализируйте модули go и соберите проект

Чтобы правильно настроить проект как библиотеку, нам нужно определить файл mod.go. Для этого воспользуемся go lang, встроенным в cli.
Используйте эту команду для инициализации файла go.mod. Измените ‹ваше имя пользователя› на фактическое имя, которое вы используете в GitHub.

В результате в каталоге вашего проекта будет создан новый файл go.mod. Этот файл должен выглядеть примерно так:

Теперь вы должны быть в состоянии построить этот проект. Вы можете попробовать построить его с помощью этой команды:

В результате вы должны увидеть новый файл с именем ds18b20. Вы пока не можете проверить, работает ли он.

Шаг 7. Отметьте изменения и отправьте их на GitHub

Теперь давайте пометим текущую версию кодовой базы и отправим ее в удаленный репозиторий на GitHub:

После этих шагов вы можете использовать свою библиотеку в другом репозитории.

Шаг 8. Наконец, используйте библиотеку в другом проекте Go

Новый репозиторий:

В качестве примера создайте другой каталог и в нем создайте файл main.go. Также инициализируйте модули Go:

Добавьте свою версию созданной библиотеки в качестве зависимости (измените ‹your_user_name› и ‹your_library_name›):

Добавьте следующий код в main.go.

Измените ВАШ_АДРЕС_ДАТЧИКА на фактический адрес, который вы получили на шаге 3 во время проверки конфигурации.

Установка зависимостей:

Теперь вам нужно установить удаленные модули. Чтобы установить их, запустите их в консоли:

После этих шагов должны быть созданы два файла go.mod и go.sum. Файл go.mod будет выглядеть примерно так:

Компиляция:

Теперь вы можете скомпилировать свой репозиторий, чтобы использовать его на малине.
Go позволяет компилировать программы для разных машин. Для Raspberry PI необходимо использовать правильную конфигурацию.
Выполните следующую команду, чтобы создать репозиторий:

После этого скопируйте файл программы на вашу малину и выполните эту команду, чтобы сделать файл исполняемым:

Экспорт программы на устройство Raspberry:

Чтобы скопировать файл с вашего компьютера на raspberry pi, вы можете переместить его с помощью флешки или с помощью scp (копирование файлов через ssh) следующим образом (измените ‹directory_in_the_home_directory› на собственное имя каталога внутри домашний каталог):

Например, у меня есть каталог dev внутри домашнего каталога:

Теперь вы можете запустить программу в терминале Raspberry Pi.

Выполните следующие действия:

В результате вы должны увидеть вывод на консоль текущей температуры, считанной с датчика.

Поздравляем, если вы дочитали до конца этой статьи.
Я только что помог вам создать вашу первую библиотеку для Raspberry Pi!

В следующей статье я расскажу, как запустить эту программу автоматически при включении Raspberry Pi.
Таким образом, мы сможем собирать измерения температуры в базе данных или отображать их на ЖК-экране.

Вы можете найти библиотеку, которую я опубликовал здесь:
https://github.com/adrkakol/ds18b20-go/

PS: Мы нанимаем и имеем интересные вакансии во всех наших офисах в Скандинавии и Польше. Ознакомьтесь с нашими открытыми вакансиями на https://www.schibsted.pl/career/ и https://schibsted.com/career/.