
Ну вот и наступил долгожданный 2009ый. За окном проливной дождь, и зарядил он так на несколько дней к ряду, если верить прогнозу погоды на моей таблетке (Nokia N810).
Пару дней назад, когда она мне только пришла по почте - перерыл в ней просто кучу настроек и вроде даже настроил её, что называется, "под себя". Хотя, как мы знаем, это процесс бесконечный, и такого рода настройки могут ковыряться очень долго, а точнее до тех пор, пока не потеряется интерес ко всему происходящему.
Так, пора уже и о самой теме начать писать. Поэтому плавно перехожу от погоды, к датчику внутренней температуры, которую нашёл я в этом самом плагине. Т.е. таблетка умеет выводить температуру на своём процессоре на экран. И возникла идея. Коли таблетка не сильно греется в режиме ожидания - значит показания этой температуры будут сильно походить на комнатную температуру, а следовательно можно будет проследить какая же у меня температура в комнате, пока я сплю.
Пожалуй будет разумным сразу дать скрипт, который я использую, а потом можно будет разжевать что же он делает.
#!/bin/bash
begin=`date +%Y-%m-%d-%H-%M-%S`;
while true;do
tempr=$(cat /sys/devices/platform/i2c_omap.1/i2c-1/1-0048/temp1_input)
echo "$(date +%Y/%m/%d-%H:%M:%S) $(expr $tempr / 1000).$(expr $tempr % 1000)" >>$begin.dat
sleep 60
done
Вот собственно оно и есть. А теперь по порядку...
Я использую баш, т.к. ну уж очень сильно я к нему привык на работе. И как-то не могу придумать ничего лучше чем он. Хотя есть подозрение, что этот скрипт сработает и с родным шелом Н810.
Так оно и есть. Для исторической справедливости я оставлю первую строчку, которая просто говорит системе какой шел (оболочку) система должна использовать для выполнения последующих команд. Но Вы, если у вас не стоит BASH шела, можете просто не включать эту строчку в скрипт - и он всё равно будет работать даже с таблеточным busybox'ом.
Следующая строчка просто присваивает переменной begin значение строки в виде текущей даты. Сделал я это для того, что бы потом называть файлы, в которые пишутся данные, именно этим названием, т.е. датой. Так проще будет разобраться когда же данные записывались.
Далее - мой любимый бесконечный цикл. =)
В переменную tempr вчитывается значение температуры на процессоре. Именно эта строчка и есть сердце скрипта. Cat - команда вывода в терминал содержимого файла, указанного после этой команды. Т.е. в файле /sys/devices/platform/i2c_omap.1/i2c-1/1-0048/temp1_input храниться значение температуры процессора в цельсиях, умноженная на 1000. Т.е. например файл может содержать строку "23750", что будет означать текущую температуру процессора 23.75 градуса Цельсия.
Последующая строка просто выводит результаты нескольких операций в файл. Echo "str" - выведет строку "str" в терминал; echo "str" >> filename - эта же команда перенаправить вывод текста в файл, причём >>, т.е. двойной знак больше говорит о том, что файл будет дописываться, одинарный же знак больше приведёт к тому, что файл будет перезаписываться каждый раз и как результат - в файле будет только одна строка.
Команды в форме $(command) - выполняют команду указанную в скобках и выдают значение вывода команды как текстовую строку. Поэтому команда $(date +%Y/%m/%d-%H:%M:%S) просто выведет текущее значение времяни в указанном формате, т.е. год/месяц/день-час:минута:секунда. А т.к. это команда находиться внутри команды echo с перенаправлением в файл записи - то значит в файл запишиться текущее время в том формате, который мы запросили. Последующие две команды просто производят математические операции. Т.к. в файле температура записанна в 1000 раз больше, чем мы хотели бы, то разумно её поделить на эту самую тысячу. Первая команда просто выдаст целую часть от деления, а вторая его остаток.
Sleep 60 - говорит скрипту поспать 60 секунд. Команда эта хорошая, тем что не нагружает никак процессор в это время. А скрипт просто пойдёт дальше выполнять свой while-цикл, после ожидания 60 секунд. Значение задержки можно поменять по вашему усмотрению.
Done - это команда в паре с do говорит где начинается и заканчивается while цикл.
Вот и всё. Скрипт готов и работает. Что бы его запустить - просто переходим в папку со скриптом, допустим вы назвали его как temp.sh, тогда команда запуска будет: sh temp.sh
Скрипт начнёт работать, но не будет выводить ничего на экран... - скучно. Одно только хорошо, что его в любой момент можно прервать, нажав cntr+c.
Но мы же люди граммотные, и можем запустить скрипт в фоновом режиме: sh temp.sh &
Что бы его остановить - я поступаю следующим образом - запускаю ps из терминала. Эта команда показывает все запущенные процессы. Обычно к самому концу вывода программы я и обнаруживаю запущенный свой скрипт, например так: 6466 root 1916 SW sh temp.sh
Первое число - это PID процесса. Что бы закончить процесс набираем kill -9 6466. Т.е. мы убиваем процесс с параметром -9 и указываем какой процесс убивать его PIDом.
Что бы вывести график температуры на рабочем компьютере (линуха на борту), я использовал стоящий почти везде gnuplot. Делаем следующее, т.к. все файлы писались с именами в виде "дата-время.dat", то копируем все эти файлы к себе на компьютер, например использую scp. Далее пишим все результаты в один файл (это не обязательно, просто я хотел посмотреть статистику за несколько дней). Команда:
for i in *.dat;do cat $i >>temperature.all;done
объединит все файлы с разрешением .dat в один файл - temperature.all.
Далее, если на компьютере уже стоит gnuplot, то можно просто записать все нижеприведённые команды в файл, скажем plot.gnuplot и запустить командой gnuplot plot.gnuplot
set xdata time
set timefmt "%Y/%m/%d-%H:%M:%S"
set format x "%a-%H:%M"
plot 'temperature.all' using 1:2 with boxes
pause -1
Чуть про этот файл по-подробнее: говорим gnuplot'у, что x данными является время. Вторая строка показывает в каком формате это врями записанно. Третья строка говорит в каком формате мы хоте ли бы видеть эти данные на графике. Далее само рисование данных из файла temperature.all использую первый и второй столбец, и рисовать будем "коробочками". Здесь так же можно использовать lines, points вместо boxes, кому как больше нравиться.
Pause -1 просит gnuplot остаться интерактивной. Т.е. не закрываться. При этом можно будет поменять размеры окна, перерисовать его и т.д. - это уже на ваше усмотрение.
Ех ты, вот это офрмление своей работы!
ReplyDeleteЕсли бы каждый программист так все записывал тщательно, то наверно появилось бы на много больше людей смыслящих в языках программирования! Классное решение для таблетки!
Обязательно продолжай и пиши новые посты.
P.S. Сегодня на тебя линк дам у себя!