Кухонный таймер на Bash для Raspberry Pi

Добавил своей малинке функцию кухонного таймера. Написал короткий скрипт для воспроизведения звукового файла через назначенный пользователем интервал времени. Скрипт получился такой:

#!/bin/bash
# kmstimer
echo "Таймер сработает через $1 минут"
for ((i=0; i<$1; i++))
  do
    echo "Прошло $i минут"
    sleep 60
  done
echo "Время вышло!"
echo "Время вышло" | festival --tts --language russian
mpg123 /home/pi/usr/share/sounds/default.mp3

Если на системе установлен синтезатор речи festival, то система получеловеческим голосом объявит, что время вышло, после чего воспроизведёт указанный в скрипте музыкальный файл.

Пример использования скрипта следующий:

/bin/kmstimer 15

где 15 — время в минутах.

Получившимся скриптом удобно пользоваться с android-смартфона, например через программу Raspi SSH. Добавляем новые кнопки с названием вроде «Таймер 15 минут (гречка)» и соответственно кодом «kmstimer 15» — таймер будет включаться нажатием одной кнопки на смартфоне.

C#: программа проверки полисов ОМС

2015-04-07 CheckPolis.exe — консольная прогамма для проверки полисов обязательного медицинского страхования через интернет. Запускается через командную строку так:

CheckPolis.exe XXXXxxxxXXXXxxxx XX.XX.XXXX
Результат выдаёт через stdout и как код возврата приложения
Возможные результаты:
* 0 — аргументы не заданы
* 1 — полис существует
* 2 — полис не существует
* 3 — ответ не распознан

Скачать

Написано за 4 часа. Некоторые события пока не обработаны. Исходный код:

/*
  * Created by SharpDevelop.
  * http://kmsvsr.ru
  * Date: 07.04.2015
  * Time: 17:47
  * 
  */
 
 /* args:
  * [0] - номер полиса
  * [1] - дата рождения
  * 
  * ответ программы:
  * 0 - аргументы не заданы
  * 1 - полис существует
  * 2 - полис не существует
  * 3 - ответ не распознан
  * 4 - ответ не получен
  * 5 - неведома ху...
 */
 
 using System;
 using System.Net;
 using System.IO;
 using System.Text;
 
 namespace CheckPolis
 {
     class Program
     {
         private static string POST(string Url, string Data)
         {// спасибо за функцию http://programmerinfo.ru/post_get/
           WebRequest req = WebRequest.Create(Url);
           req.Method = "POST";
           req.Timeout = 100000;
           req.ContentType = "application/x-www-form-urlencoded";
           byte[] sentData = Encoding.GetEncoding(1251).GetBytes(Data);
           req.ContentLength = sentData.Length;
           Stream sendStream = req.GetRequestStream();
           sendStream.Write(sentData, 0, sentData.Length);
           sendStream.Close();
           WebResponse res = req.GetResponse();
           Stream ReceiveStream = res.GetResponseStream();
           StreamReader sr = new StreamReader(ReceiveStream, Encoding.UTF8);
           //Кодировка указывается в зависимости от кодировки ответа сервера
           Char[] read = new Char[256];
           int count = sr.Read(read, 0, 256);
           string Out = String.Empty;
           while (count > 0)
           {
             String str = new String(read, 0, count);
             Out += str;
             count = sr.Read(read, 0, 256);
           }
           return Out;
         }
         
         public static int Main(string[] args)
         {
             if(args.Length > 1){ //если аргументов хотя бы два
                 //переменная в запрос с номером полиса
                 //ХХХХххххХХХХхххх
                 //переменная в запрос с датой рождения
                 //ХХ.ХХ.ХХХХ
                 string Data="polis=" + args[0] + "&birthday=" + args[1];
                 
                 //адрес страницы проверки полисов
                 string tfomsurl = "http://www.tfoms.e-burg.ru/citizens/check-the-relevance-of-the-policy/?type=special";
                 
                 //сюда получим страницу с ответом
                 string responseFromServer = "";
                 responseFromServer = POST(
                     tfomsurl,
                     Data);
                 
                 if(responseFromServer.Contains("<table class=\"wd-main data-table\">")){//если полис существует
                     Console.Write("1");
                     return 1;
                 }else if(responseFromServer.Contains("<h3 style=\"color: red\">")){//если полис не существует
                     Console.Write("2");
                     return 2;
                 }else{//если ответ непонятный
                     Console.Write("3");
                     return 3;
                 }
             } else { //справка по программе
                 Console.Write("0\nHelp:\nCheckPolis.exe XXXXxxxxXXXXxxxx XX.XX.XXXX");
                 Console.Write("\nhttp://kmsvsr.ru");
                 Console.Write("\nPress any key to continue . . . ");
                 Console.ReadKey(true);
                 return 0;
             }            
         }
     }
 }

BAT-скрипт для включения английского по умолчанию в окне входа

BAT-скрипт для включения английского по умолчанию в окне входа в Windows:

 Reg Add "HKU\.Default\Keyboard Layout\Preload" /V "1" /T Reg_Sz /D "00000409" /F
 Reg Add "HKU\.Default\Keyboard Layout\Preload" /V "2" /T Reg_Sz /D "00000419" /F
 echo "Сейчас компьютер будет перезагружен"
 pause
 shutdown /r /t 5

Raspberry Pi: автоматический полив грядок (не закончено)

Проект автополива  грядок на основе Raspberry PI, пока не закончен.

Имеется в наличии

Бак водонапорный к нему подключены 2 датчика верхний (DL1) и нижний уровень (D2) , реле полива (RL1) , насос из колодца (NS1)

Алгоритм работы 

1. Запуск полива по времени через кронтаб в 21.00

Если бак не пустой ( реле нижний уровень включено ) то включить реле полива

Поливать до тех пор пока бак не опустеет ( реле нежнего уровня выключено)

Выключить реле полива

2. Наполнить водонапорный бак

Включить насос

Насос работае до тех пор пока не выключиться реле на водонапорном баке ( реле верхнего уровня)

Завершить работу насоса

3. Ждать следующего включения в 21.00

Управление портами

Установка высокого и низкого уровней для порта, настроенного на выход выполняется так:

$ echo 1 > /sys/class/gpio/gpioXX/value
$ echo 0 > /sys/class/gpio/gpioXX/value

Определение состояние порта, настроенного на вход делается так:

$ cat /sys/class/gpio/gpioXX/value

Исходный код скрипта, запускающего автополив

#!/bin/bash 
DL1="..."    #подставить /sys/class/gpio/gpioXX/value 
D2="..."    #подставить /sys/class/gpio/gpioXX/value 
RL1="..."    #подставить /sys/class/gpio/gpioXX/value 
NS1="..."    #подставить /sys/class/gpio/gpioXX/value 
 
#1 
while ["$(cat $D2)" != '0'] ; do #Поливать до тех пор пока бак не опустеет ( реле нежнего уровня выключено) 
    echo 1 > $RL1            #включить реле полива 
    sleep 5     #через сколько секунд повторить проверку 
done 
echo 0 > $RL1 #Выключить реле полива 
 
#2 
echo 1 > $NS1        #Включить насос 
while ["$(cat $DL1)" != '0'] ; do #не выключиться реле на водонапорном баке ( реле верхнего уровня) 
    sleep 5     #через сколько секунд повторить проверку 
done 
echo 0 > $NS1    #Завершить работу насоса 
 
#3 конец, Ждать следующего включения в 21.00

Для справки:
http://eddnet.org/?p=1311 — условия
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html — циклы
http://younglinux.info/bash/commands.php — sleep
http://www.bash-scripting.ru/abs/chunks/ch04.html — работа с переменными

 

C#: Запуск команд CMD из кода программы

Для запуска сторонних программ из программы на C# в начало программы вставляем строчку

using System.Diagnostics;

и после этого запускаем команды CMD из нашего кода следующим образом:

Process.Start("calc");

Эта строчка например запустит виндовый калькулятор.

А эта строчка откроет проводник на диске D:

Process.Start("explorer""d:");

Так же можно запускать программы от имени другого пользователя, см. вамианты перегрузки .Start()