В основу предлагаемой метеостанции положен самодельный компьютер PIDP11, состоящий из «малинки» с эмулятором PDP-11 и корпуса с передней панелью с действующими светодиодами и переключателями. Но несмотря на это, у «малинки» осталось достаточно незанятых GPIO, чтобы подключить ещё и датчик давления и температуры.

На эмуляторе запущена ОС 2.11BSD, в которой «крутится» ПО метеостанции. Данные выводятся на два эмулятора терминала. Один из них — cool-retro-term — отображает текстовую информацию крупным шрифтом при помощи ASCII-арта. Второй — эмулятор графического терминала Tektronix 4010 с запоминающей трубкой — выводит кривые изменения давления и температуры.

Способ подключения датчика BME280 описан здесь:

Обозначение | Назначение   | GPIO на
на плате    |              | Raspberry Pi
датчика     |              |
------------+--------------+--------------
VCC         | 3,3 В        | P1-01
GND         | Общий        | P1-06
SCL         | SCL шины I2C | P1-05
SDA         | SDA шины I2C | P1-03

OLED-дисплей, показанный на фото ниже, подключён параллельно датчику, но ему назначен на шине I2C другой адрес. При желании можно вообще не устанавливать дисплей. Также автор установил кнопку для корректного завершения работы ОС перед выключением питания.



Чтобы заставить устройство работать, нужно первым делом добавить в запущенный в эмуляторе 2.11BSD нового пользователя так:

Войдите как корневой пользователь. Введите команду vipw для запуска редактора vi с файлом /etc/passwd

Поместите в файл строку:

firstname::201:20:fullname:/home/firstname:/bin/tcsh

где firstname и fullname — краткое и полное имена пользователя.

Выйдите из редактора, создайте пользователю домашнюю папку:

cd /home
 mkdir firstname
 chown firstname firstname

Скопируйте файлы .login и .cshrc в эту папку'

 cd /home/user
 cp .* /home/firstname
 cd /home/firstname
 chown firstname .*

Введите vi .login и отредактируйте приглашение командной строки, поменяв соответствующую строку на:

set prompt='%n@%m:%c$ '

Выйдите из редактора. Разлогиньтесь командой logout, смените новому пользователю пароль командой passwd под рутом, теперь можно войти в систему под логином и паролем нового пользователя.

После этого надо сделать, чтобы дата и время в системе устанавливались при загрузке автоматически, так (за приведённую ниже информацию автор благодарит Jason Vanick и Johnny Billquist):

Сначала настройте сеть и убедитесь, что ping работает. Затем непосредственно перед строкой ntpt в файле /etc/rc.local поместите строку:

ntp -sf pool.ntp.org

Поменяйте последнюю строку в файле /etc/ntp.conf на:

server pool.ntp.org

Можно выбрать любой другой NTP-сервер. Чтобы настроить часовой пояс, проверьте список поясов в файле /usr/share/zoneinfo и найдите там название вашего пояса. Войдите как корневой пользователь и введите команды:

cd /etc
mv localtime localtime.old
ln -s /usr/share/zoneinfo/timezone localtime

Следующая операция — установка и настройка программы, которая позволит в командную строку 2.11BSD, запущенной в эмуляторе, пробросить командную строку Raspbian, запущенной на реальной «малинке», так:

В Raspbian под рутом введите команду:

sudo apt-get install rsh-server

Создайте в домашней папке файл .rhosts следующего содержания:

bsd_ip_address bsd_user_name

где bsd_ip_address — IP-адрес виртуальной машины с 2.11 BSD, а bsd_user_name — имя пользователя в 2.11 BSD, который сможет выполнять команды на реальной «малинке», например:

192.168.1.99 rene

Установите для этого файла права доступа, иначе ничего не заработает:

chmod 600 .rhosts

Перейдите в эмулятор, войдите в 2.11 BSD как корневой пользователь и отредактируйте /etc/hosts — добавьте строку:

remote_ip_address remote_full_name remote_nick_name

где remote_ip_address — IP-адрес реальной «малинки», а remote_full_name и remote_nick_name — её доменное имя и псевдоним, например:

192.168.1.103 pizerow.home.lan pizerow

Войдите под ранее заданным именем (bsd_user_name) и проверьте, всё ли заработало:

rsh remote_nick_name -l pi -n “ls”

Вы только что выполнили из эмулятора команду ls на реальной «малинке». Если вместо этого перед вами появилась форма ввода пароля, значит, что-то пошло не так.

Теперь попробуйте что-нибудь посложнее. Введите команду:

rsh remote_nick_name -l pi -n “cat /sys/class/thermal/thermal_zone0/temp”

В папке rtest данного репозитория есть небольшая программа на языке C, которая показывает, как использовать popen для получения информации от той или иной программы и обрабатывать её так, чтобы получать человекочитаемый вывод в 2.11BSD:

rene@pdp11:rtest$ rtest
****************************************************
* The CPU temperature on the pizerow is 42.2 deg C *
****************************************************
rene@pdp11:rtest$

Вы только что увидели в эмуляторе температуру реального процессора, на котором этот эмулятор «крутится».

Скачайте скрипт на Python из папки weather/sensor данного репозитория.

Убедитесь, что скрипт правильно работает в remote pizerow и поместите его в папку /home/pi/bin

Запустите cool-retro-term и эмулятор, войдите в 2.11BSD как только что созданный пользователь и введите команды:

mkdir weather
cd weather

Тем или иным способом (например, с помощью FileZilla) перетащите файлы из папки weather/BSD репозитория в папку weather ОС, запущенной в эмуляторе. Введите команду weather, и программа вытащит данные из датчика и покажет их в таком виде:

 rene@pdp11:weather$ weather
 Contacting remote sensor...
 Data received, analyzing ...
 **************************************
 The sensor reports the following data:
 Temperature 7.0 C
 Pressure 969.8 hPa
 Humidity 66.8 %
 **************************************
 rene@pdp11:weather$

Если всё заработало, создайте в папке ~/weather папку dats, где weather2 сможет хранить лог:

cd
cd weather
mkdir data
weather2

weather2 начнё каждый день создавать в папке ~/weather/data по файлу с именем, соответствующем дате, и каждую минуту прибавлять к нему по строке с данными. А на терминал он будет непрерывно выводить следующее, обновляя экран также раз в минуту:



Ну а weather3 работает так же, только выводит ещё время и давление. Для перемещения курсора он использует библиотеку curses.



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

Приложение 1 — установка и настройка cool-retro-term

Приложение 2 — установка и настройка эмулятора графического терминала Tektronix 4010

Комментарии (1)


  1. RubyFOX
    03.04.2019 17:08

    Интересный формат вывода +