В основу предлагаемой метеостанции положен самодельный компьютер 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
RubyFOX
Интересный формат вывода +