<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://usable.mybb.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Форум поддержки Naben Preferences</title>
		<link>http://usable.mybb.ru/</link>
		<description>Форум поддержки Naben Preferences</description>
		<language>ru-ru</language>
		<lastBuildDate>Thu, 04 Oct 2018 15:54:02 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>Погодная коробка ESP32</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=44#p44</link>
			<description>&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;#include &amp;lt;WiFi.h&amp;gt;
#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;ArduinoJson.h&amp;gt;
#include &amp;quot;time.h&amp;quot;
#include &amp;quot;Adafruit_BME280.h&amp;quot;
#include &amp;lt;HTTPClient.h&amp;gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;
LiquidCrystal_I2C lcd(0x27, 20, 4);

//#define I2C_SDA 4
//#define I2C_SCL 5
#define LED_PIN 2
#define BME280_ADDRESS 0x76

char buffer [256];
char server[] = &amp;quot;smtpcorp.com&amp;quot;; // smtp сервер сайта smtp2go для отправки через него емэйла
int port = 2525;

char login[] = &amp;quot;*****@gmail.com&amp;quot;; // Ваш логин с сайта smtp2go
char password[] = &amp;quot;******&amp;quot;;       // Ваш пароль с сайта smtp2go

char email_sendto[] = &amp;quot;*******@gmail.com&amp;quot;; // Адрес получателя письма
char email_sendfrom[] = &amp;quot;******@gmail.com&amp;quot;; // Адрес отправителя письма

char name_sendto[] = &amp;quot;*****&amp;quot;; // Имя получателя письма
char name_sendfrom[] = &amp;quot;*****&amp;quot;;      // Имя отправителя письма

char subject[] = &amp;quot;ESP32 was rebooted!&amp;quot;; // Тема письма


const long  gmtOffset_sec = 7200;
const int   daylightOffset_sec = 3600;
const char* ntpServer = &amp;quot;pool.ntp.org&amp;quot;;

Adafruit_BME280 bme;

const char* ssid     = &amp;quot;*****&amp;quot;;
const char* passwordwifi = &amp;quot;******&amp;quot;;

const char * hostDomain = &amp;quot;api.openweathermap.org&amp;quot;;
const int hostPort = 80;

const char * narmon = &amp;quot;narodmon.ru&amp;quot;;
const int narmonPort = 8283;

String line;

WiFiClient client;

unsigned long WeatherPreviousMillis = 0;
unsigned long NTPPreviousMillis = 0;
unsigned long NarmonPreviousMillis = 0;
String name1;
float temp;
float pressure;
float humidity;
float wind;
float bpi_USD_rate;
float USD_rate;


void Bitcoin() {
  HTTPClient http;
  http.begin(&amp;quot;http://api.coindesk.com/v1/bpi/currentprice.json&amp;quot;);
  int httpCode = http.GET();

  if (httpCode == HTTP_CODE_OK) {
    String payload = http.getString();
    StaticJsonBuffer&amp;lt;1536&amp;gt; jsonBuffer;
    JsonObject&amp;amp; root = jsonBuffer.parseObject(payload);
    if (root.success()) {
      {
        String time_updated = root[&amp;quot;time&amp;quot;][&amp;quot;updated&amp;quot;];
        //const char* time_updated = time[&amp;quot;updated&amp;quot;];
        //JsonObject&amp;amp; bpi = root[&amp;quot;bpi&amp;quot;];
        //JsonObject&amp;amp; bpi_USD = bpi[&amp;quot;USD&amp;quot;];
        bpi_USD_rate = root[&amp;quot;bpi&amp;quot;][&amp;quot;USD&amp;quot;][&amp;quot;rate_float&amp;quot;];
        Serial.print(&amp;quot;Curs of bitcoin: &amp;quot;);
        Serial.println(bpi_USD_rate);
        Serial.print(&amp;quot;Update time: &amp;quot;);
        Serial.println(time_updated);
      }
    } else {
      Serial.println(&amp;quot;parseObject() failed&amp;quot;);
      Serial.println(payload);
    }
  } else {
    Serial.println(&amp;quot;HTTP error&amp;quot;);
    Serial.println(httpCode);
  }
  http.end();
}

void USD() {
  HTTPClient http;
  http.begin(&amp;quot;http://www.nbrb.by/API/ExRates/Rates/145&amp;quot;);
  int httpCode = http.GET();

  if (httpCode == HTTP_CODE_OK) {
    String payload = http.getString();
    StaticJsonBuffer&amp;lt;1536&amp;gt; jsonBuffer;
    JsonObject&amp;amp; root = jsonBuffer.parseObject(payload);
    if (root.success()) {
      {
        USD_rate = root[&amp;quot;Cur_OfficialRate&amp;quot;];
        Serial.print(&amp;quot;Curs of USD: &amp;quot;);
        Serial.println(USD_rate);
      }
    } else {
      Serial.println(&amp;quot;parseObject() failed&amp;quot;);
      Serial.println(payload);
    }
  } else {
    Serial.println(&amp;quot;HTTP error&amp;quot;);
    Serial.println(httpCode);
  }
  http.end();
}

void SendMon()
{
  String cmd;
  cmd = &amp;quot;#**-**-**-**-**-**&amp;quot;;
  cmd += &amp;quot;\n&amp;quot;;
  cmd += &amp;quot;#T1#&amp;quot;;
  cmd += bme.readTemperature();
  cmd += &amp;quot;\n&amp;quot;;
  cmd += &amp;quot;#P1#&amp;quot;;
  cmd += (bme.seaLevelForAltitude(138, bme.readPressure() / 100.0F ) / 1.333);
  cmd += &amp;quot;\n&amp;quot;;
  cmd += &amp;quot;#H1#&amp;quot;;
  cmd += bme.readHumidity();
  cmd += &amp;quot;\n&amp;quot;;
  cmd += &amp;quot;#B1#&amp;quot;;
  cmd += bpi_USD_rate;
  cmd += &amp;quot;\n&amp;quot;;
  cmd += &amp;quot;##&amp;quot;;

  Serial.println(&amp;quot;Connecting to narodmon.ru:&amp;quot;);

  if (!client.connect(narmon, narmonPort))
  {
    Serial.println(&amp;quot;connection failed&amp;quot;);
    return;
  }
  Serial.println(&amp;quot;Connected!&amp;quot;);

  client.println(cmd);

  unsigned long timeout = millis();
  while (client.available() == 0)
  {
    if (millis() - timeout &amp;gt; 2000)
    {
      Serial.println(&amp;quot;&amp;gt;&amp;gt;&amp;gt; Client Timeout !&amp;quot;);
      client.stop();
      return;
    }
  }

  Serial.println(&amp;quot;closing connection&amp;quot;);
  client.stop();
  Serial.println(&amp;quot;Weather is loaded to narmon.ru&amp;quot;);

}

void requestURL(const char * host, uint8_t port)

{
  Serial.println(&amp;quot;Connecting to domain: &amp;quot; + String(host));

  if (!client.connect(host, port))
  {
    Serial.println(&amp;quot;connection failed&amp;quot;);
    return;
  }
  Serial.println(&amp;quot;Connected!&amp;quot;);

  client.println(&amp;quot;GET /data/2.5/weather?q=Homyel&amp;amp;mode=json&amp;amp;units=metric&amp;amp;APPID=8bb1caef3ad28de754c259361baffd58 HTTP/1.1&amp;quot;);
  client.print(&amp;quot;Host: api.openweathermap.org\r\n&amp;quot;);
  client.print(&amp;quot;Connection: close\r\n\r\n&amp;quot;);


  unsigned long timeout = millis();
  while (client.available() == 0)
  {
    if (millis() - timeout &amp;gt; 2000)
    {
      Serial.println(&amp;quot;&amp;gt;&amp;gt;&amp;gt; Client Timeout !&amp;quot;);
      client.stop();
      return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  while (client.available())
  {
    line = client.readStringUntil(&#039;\r&#039;);

  }
  Serial.println(&amp;quot;closing connection&amp;quot;);
  client.stop();


}

void printLocalTime()
{

  struct tm timeinfo;
  if (!getLocalTime(&amp;amp;timeinfo)) {
    Serial.println(&amp;quot;Failed to obtain time&amp;quot;);
    return;
  }
  Serial.println(&amp;amp;timeinfo, &amp;quot;%d.%m.%Y %H:%M:%S&amp;quot;);

  int intVar;   //Преобразуем значение времени в целове число, так как функция возвращает нам строку, непригодную для сравнения
  String time_int;
  char output[10];
  strftime(output, 10, &amp;quot;%H&amp;quot;, &amp;amp;timeinfo);
  time_int = String(output);
  intVar = time_int.toInt();
  Serial.println(intVar);

  if (intVar &amp;gt; 22 || intVar &amp;lt; 6 )
  {
    Serial.println(&amp;quot;SVET OFF&amp;quot;);
    lcd.noBacklight();

  }
  else
  {

    Serial.println(&amp;quot;SVET ON&amp;quot;);
    lcd.backlight();

  }

}
void printLocalTimeDateLcd()
{
  struct tm timeinfo;
  if (!getLocalTime(&amp;amp;timeinfo)) {
    Serial.println(&amp;quot;Failed to obtain time&amp;quot;);
    return;
  }
  lcd.setCursor(10, 0); //Переходим на 10 ячейку дисплея 1-ой строки
  lcd.println(&amp;amp;timeinfo, &amp;quot;%d.%m.%Y&amp;quot;);
  lcd.setCursor(15, 1); //Переходим на 15 ячейку дисплея 2-ой строки
  lcd.print(&amp;amp;timeinfo, &amp;quot;%H:%M:%S&amp;quot;);
   }

//void printLocalTimeTimeLcd()
//{
  //struct tm timeinfo;
 // if (!getLocalTime(&amp;amp;timeinfo)) {
 //   Serial.println(&amp;quot;Failed to obtain time&amp;quot;);
 //   return;
 // }
//  lcd.setCursor(15, 1); //Переходим на 15 ячейку дисплея 2-ой строки
 // lcd.print(&amp;amp;timeinfo, &amp;quot;%H:%M:%S&amp;quot;);
//}

void parseJSON(String weather)
{
  StaticJsonBuffer&amp;lt;3000&amp;gt; jsonBuffer;
  JsonObject&amp;amp; root = jsonBuffer.parseObject(weather);
  if (!root.success())
  {
    Serial.print(&amp;quot;ParseObject() failed&amp;quot;);
  }

  String name = root[&amp;quot;name&amp;quot;];
  name1 = name;
  // Serial.print(&amp;quot;City: &amp;quot;);
  // Serial.println(name1);

  temp = root[&amp;quot;main&amp;quot;][&amp;quot;temp&amp;quot;];
  // Serial.print(&amp;quot;Temp: &amp;quot;);
  // Serial.print(temp);
  // Serial.println(&amp;quot; C&amp;quot;);

  pressure = root[&amp;quot;main&amp;quot;][&amp;quot;pressure&amp;quot;];
  // Serial.print(&amp;quot;Pressure: &amp;quot;);
  //  Serial.print(pressure / 1.333);
  //  Serial.println(&amp;quot; mmHg&amp;quot;);


  humidity = root[&amp;quot;main&amp;quot;][&amp;quot;humidity&amp;quot;];
  // Serial.print(&amp;quot;humidity: &amp;quot;);
  //  Serial.print(humidity);
  // Serial.println(&amp;quot; %&amp;quot;);

  wind = root[&amp;quot;wind&amp;quot;][&amp;quot;speed&amp;quot;];

}

void setup()
{

  bme.begin(0x76);
  lcd.begin(21,22);
//  lcd.init();              // initialize the lcd
  lcd.backlight();

  Serial.begin(9600);
  delay(100);

  Serial.println();
  Serial.print(&amp;quot;Connecting to &amp;quot;);
  Serial.println(ssid);
  WiFi.begin(ssid, passwordwifi);
  int  var = 0;
  while (WiFi.status() != WL_CONNECTED &amp;amp;&amp;amp; var &amp;lt; 20) {
    delay(500);
    Serial.print(&amp;quot;.&amp;quot;);
    Serial.print(var);

    if (var == 19) {
      ESP.restart();
    }
    var++;
  }

  Serial.println(&amp;quot;&amp;quot;);
  Serial.println(&amp;quot;WiFi connected&amp;quot;);
  lcd.setCursor(0, 0);
  lcd.print(&amp;quot;Connected to &amp;quot;);
  lcd.setCursor(0, 1);
  lcd.print(ssid);
  Serial.println(&amp;quot;IP address: &amp;quot;);
  Serial.println(WiFi.localIP());

  lcd.setCursor(0, 3);
  lcd.print(WiFi.localIP());

  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(&amp;quot;MAC&amp;quot;);
  lcd.setCursor(0, 1);
  lcd.print(&amp;quot;30AEA437F33C&amp;quot;);
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(&amp;quot;Login on Narmon&amp;quot;);
  lcd.setCursor(0, 1);
  lcd.print(&amp;quot;leruetkins&amp;quot;);

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  Serial.println(&amp;quot;Time is updated on NTP&amp;quot;);
  requestURL(hostDomain, hostPort);
  parseJSON(line);
  // Serial.println(&amp;quot;Weather is updated on openweather.com&amp;quot;);
  Bitcoin();
  //Serial.println(&amp;quot;Bitcoin curs is updated&amp;quot;);
  USD();
   if  (bme.readTemperature() &amp;lt;= 0 )  {
    sendEmail();
    Serial.println(&amp;quot; ESP RESTART&amp;quot;);

    delay(2000);
    ESP.restart();
   }
  SendMon();
  // Serial.println(&amp;quot;Weather is loaded to narmon.ru&amp;quot;);


}
void efail()
{
  byte thisByte = 0;
  int loopCount = 0;
  client.println(F(&amp;quot;QUIT&amp;quot;));
  while (!client.available()) {
    delay(1);
    loopCount++;
    // if nothing received for 10 seconds, timeout
    if (loopCount &amp;gt; 10000) {
      client.stop();
      Serial.println(F(&amp;quot;\r\nTimeout&amp;quot;));
      return;
    }
  }
  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }
  client.stop();
  Serial.println(F(&amp;quot;disconnected&amp;quot;));
}

byte eRcv()
{
  byte respCode;
  byte thisByte;
  int loopCount = 0;
  while (!client.available()) {
    delay(1);
    loopCount++;
    // if nothing received for 10 seconds, timeout
    if (loopCount &amp;gt; 10000) {
      client.stop();
      Serial.println(F(&amp;quot;\r\nTimeout&amp;quot;));
      return 0;
    }
  }
  respCode = client.peek();
  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }
  if (respCode &amp;gt;= &#039;4&#039;)
  {
    efail();
    return 0;
  }
  return 1;
}



byte sendEmail() //Функция отправки письма
{
  byte thisByte = 0;
  byte respCode;
  if (client.connect(server, port) == 1) {
    Serial.println(F(&amp;quot;connected&amp;quot;));
  }
  else {
    Serial.println(F(&amp;quot;connection failed&amp;quot;));
    return 0;
  }
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending hello&amp;quot;));
  // replace 1.2.3.4 with your Arduino&#039;s ip
  client.println(&amp;quot;EHLO 1.2.3.4&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending auth login&amp;quot;));
  client.println(&amp;quot;auth login&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending User&amp;quot;));
  // Change to your base64 encoded user
  client.println(&amp;quot;bGVydWV0a2luc0BnbWFpbC5jb20=&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending Password&amp;quot;));
  // change to your base64 encoded password
  client.println(&amp;quot;c210cDEyM2E0NTY=&amp;quot;);
  if (!eRcv()) return 0;
  // change to your email address (sender)
  Serial.println(F(&amp;quot;Sending From&amp;quot;));
  //  client.println(&amp;quot;MAIL From: &amp;lt;leruetkins@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;MAIL From: &amp;lt;&amp;quot;);
  client.print(email_sendfrom);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  if (!eRcv()) return 0;
  // change to recipient address
  Serial.println(F(&amp;quot;Sending To&amp;quot;));
  //client.println(&amp;quot;RCPT To: &amp;lt;leruetkins@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;RCPT To: &amp;lt;&amp;quot;);
  client.print(email_sendto);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending DATA&amp;quot;));
  client.println(&amp;quot;DATA&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending email&amp;quot;));
  // change to recipient address
  //client.println(&amp;quot;To: You &amp;lt;her@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;To: &amp;quot;);
  client.print(name_sendto);
  client.print(&amp;quot; &amp;lt;&amp;quot;);
  client.print(email_sendto);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  // change to your address
  //client.println(&amp;quot;From: Me &amp;lt;her@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;From: &amp;quot;);
  client.print(name_sendfrom);
  client.print(&amp;quot; &amp;lt;&amp;quot;);
  client.print(email_sendfrom);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  //client.println(&amp;quot;Subject: 111\r\n&amp;quot;);
  client.print(&amp;quot;Subject: &amp;quot;);
  client.print(subject);
  client.println(&amp;quot;\r\n&amp;quot;);
  client.print(&amp;quot;ESP32 was rebooted at: &amp;quot;);
  struct tm timeinfo;
  getLocalTime(&amp;amp;timeinfo);
  client.println(&amp;amp;timeinfo, &amp;quot;%H:%M:%S %d.%m.%Y&amp;quot;);
  client.println(&amp;quot;Have a nice day!&amp;quot;);
  client.println(&amp;quot;.&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending QUIT&amp;quot;));
  client.println(&amp;quot;QUIT&amp;quot;);
  if (!eRcv()) return 0;
  client.stop();
  Serial.println(F(&amp;quot;disconnected&amp;quot;));
  return 1;
}



void loop()
{
  if (WiFi.status() != WL_CONNECTED){         //Проверям, есть ли подключение к wifi и если нету перезагружаемся
  ESP.restart();}
  
  if  (bme.readTemperature() &amp;lt;= 0 )  {        //Проверяем, подключён или  не завис ли bme280 и в случае чего перезагружаемся
    sendEmail();
    Serial.println(&amp;quot; ESP RESTSRT&amp;quot;);

    delay(2000);
    ESP.restart();

  }

  unsigned long CurrentMillis = millis();
  Serial.println(CurrentMillis);

  //Получение времени с NTP сервера
  int tntp = 3600000; // Интервал получения времени с NTP сервера
  Serial.println(CurrentMillis - NTPPreviousMillis);
  Serial.print(round((tntp - (CurrentMillis - NTPPreviousMillis)) / 60000)); // Количество оставшихся минут до получения времени с с NTP сервера
  Serial.println(&amp;quot; m. - estimated time to get time from NTP&amp;quot;);

  if (CurrentMillis - NTPPreviousMillis &amp;gt; tntp) {
    NTPPreviousMillis = CurrentMillis;
    Serial.println(NTPPreviousMillis);
    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
    Serial.println(&amp;quot;Time is updated on NTP&amp;quot;);
  }

  //Получение погоды с сайта openweather.com
  int tw = 1800000; // Интервал получения данных с сайта openweather.com в миллисекундах
  Serial.println(CurrentMillis - WeatherPreviousMillis);
  Serial.print((tw - (CurrentMillis - WeatherPreviousMillis)) / 60000); // Количество оставшихся минут до получения погоды с сайта openweather.com
  Serial.println(&amp;quot; m. - estimated time to get data from openweather.com&amp;quot;);
  if (CurrentMillis - WeatherPreviousMillis &amp;gt; tw) {
    WeatherPreviousMillis = CurrentMillis;
    Serial.println(WeatherPreviousMillis);
    requestURL(hostDomain, hostPort);
    parseJSON(line);
    Serial.println(&amp;quot;Weather is updated on openweather.com&amp;quot;);
  }

  //Отправка данных на народный мониторинг и получение данных о курсе биткоина
  int tn = 600000;
  Serial.println(CurrentMillis - NarmonPreviousMillis);
  Serial.print((tn - (CurrentMillis - NarmonPreviousMillis)) / 60000);
  Serial.println(&amp;quot; m. - estimated time to send data on narodmon.ru&amp;quot;);
  if (CurrentMillis - NarmonPreviousMillis &amp;gt; tn) {
    NarmonPreviousMillis = CurrentMillis;
    Serial.println(NarmonPreviousMillis);
    Bitcoin();
    delay(500);
    SendMon();
    delay(500);
    Serial.println(&amp;quot;Weather is loaded to narmon.ru&amp;quot;);
    Serial.println(&amp;quot;Curs of Bitcoin is updated&amp;quot;);
  }


  Serial.println();
  Serial.println(&amp;quot;-------------&amp;quot;);
  Serial.print(&amp;quot;Time: &amp;quot;);
  printLocalTime();
delay(500);
  Serial.println();
  Serial.print(&amp;quot;City: &amp;quot;);
  Serial.println(name1);

  Serial.print(&amp;quot;Temp outdoor: &amp;quot;);
  Serial.print(temp);
  Serial.println(&amp;quot; C&amp;quot;);

  Serial.print(&amp;quot;Humidity outdoor: &amp;quot;);
  Serial.print(humidity);
  Serial.println(&amp;quot; %&amp;quot;);

  Serial.print(&amp;quot;Pressure outdoor: &amp;quot;);
  Serial.print(pressure / 1.333);
  Serial.println(&amp;quot; mmHg&amp;quot;);

  Serial.print(&amp;quot;Wind outdoor: &amp;quot;);
  Serial.print(wind);
  Serial.println(&amp;quot; Km/h&amp;quot;);


  //parseJSON(line);
  // Serial.print(line);
  Serial.println();
  Serial.print(&amp;quot;Temp in home: &amp;quot;);
  Serial.print(bme.readTemperature());
  Serial.println(&amp;quot; C&amp;quot;);
delay(500);
  Serial.print(&amp;quot;Humidity in home: &amp;quot;);
  Serial.print(bme.readHumidity());
  Serial.println(&amp;quot; %&amp;quot;);
delay(500);
  Serial.print(&amp;quot;Pressure in home: &amp;quot;);
  Serial.print(bme.seaLevelForAltitude(138, bme.readPressure() / 100.0F ) / 1.333);
  Serial.println(&amp;quot; mmHg&amp;quot;);
delay(500);
  Serial.print(&amp;quot;Bitcoin curs: &amp;quot;);
  Serial.print(bpi_USD_rate);
  Serial.println(&amp;quot; USD&amp;quot;);
delay(500);
  Serial.print(&amp;quot;Curs of USD: &amp;quot;);
  Serial.print(USD_rate * 10000);
  Serial.println(&amp;quot; BEL RUB&amp;quot;);

  int T = round (bme.readTemperature());
  delay(500);
  int P = round (bme.seaLevelForAltitude(138, bme.readPressure() / 100.0F ) / 1.333);
  delay(500);
  int H = round (bme.readHumidity());
  delay(500);
  lcd.clear();
  printLocalTimeDateLcd();
  printLocalTimeTimeLcd();


  lcd.setCursor(0, 0);
  lcd.print(&amp;quot;T=&amp;quot;);
  lcd.print(T); // Вывод округлённого значения температуры с датчика

  lcd.setCursor(4, 0);
  lcd.print(&amp;quot;(&amp;quot;);
  lcd.print(round (temp));
  lcd.print(&amp;quot;)&amp;quot;);




  //Вывод давления с датчика BMP180 на дисплей
  lcd.setCursor(0, 1);
  lcd.print(&amp;quot;P=&amp;quot;);
  //Датчик выводит температуру в  дробных числах в гидропаскалях, поэтому преобразуем их в целые значения миллиметров ртутного столба
  // word pbmp = Pressurebmp / 133.3;
  lcd.print(P);
  lcd.setCursor(5, 1);
  lcd.print(&amp;quot;(&amp;quot;);
  lcd.print(round (pressure / 1.333));
  lcd.print(&amp;quot;)&amp;quot;);



  //Вывод влажности с датчика DHT11 на дисплей
  lcd.setCursor(0, 2);
  lcd.print(&amp;quot;H=&amp;quot;);
  lcd.print(H);
  lcd.setCursor(4, 2);
  lcd.print(&amp;quot;(&amp;quot;);
  lcd.print(round (humidity));
  lcd.print(&amp;quot;)&amp;quot;);

  lcd.setCursor(0, 3);
  lcd.print(&amp;quot;W=&amp;quot;);
  lcd.print(round (wind));
  lcd.print(&amp;quot;Km/h&amp;quot;);



  lcd.setCursor(10, 2);
  lcd.print(&amp;quot;USD=&amp;quot;);
  lcd.print(round (USD_rate * 10000));

  lcd.setCursor(10, 3);
  lcd.print(&amp;quot;BTC=&amp;quot;);
  lcd.print((int)bpi_USD_rate);






  delay(60000);

}

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Thu, 04 Oct 2018 15:54:02 +0300</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=44#p44</guid>
		</item>
		<item>
			<title>Часы из tm1637, ds3231 и Ethernet Shield W51 с синхронизацие через NTP</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=43#p43</link>
			<description>&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 18px&quot;&gt;Часы из tm1637, ds3231 и Ethernet Shield W51 с синхронизацие через NTP, показывающие попеременно время и температуру.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;Очень долго бился с этим модулем tm1637, в начале вообще не хотел работать, перепробовал несколько разных библиотек, но ничего хорошего из этого не получилось. Оказалось, что самая простая и понятная библиотека Digitaltube работает корректно только если пины DIO и CLK подключены именно к 11 и 10 портам на ардуино. Если кто-то найдёт и другие рабочие пины, то я вас поздравляю! Однако при подключении Ethernet Shield W5100 часы опять не хотели работать, ардуино просто завиасло и всё тут. И тут помогла лишь смена пинов на 10 и 9. Теперь всё корректно работает. К сожалению пингер и синхронизация одновременно работать отказывается. Удачи вам!&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://uploads.ru/PWROq.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s3.uploads.ru/t/PWROq.jpg&quot; alt=&quot;http://s3.uploads.ru/t/PWROq.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;На фотке пока что показан собранный прототип на ds1307, но позже будет фотка с ds3231. Возможно так же появятся схемы подключения.&lt;br /&gt;&lt;strong&gt;Использованное оборудование:&lt;/strong&gt;&lt;br /&gt;- &lt;a href=&quot;http://s.click.aliexpress.com/e/QBqjmMB2Z?af=185718449&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Arduino Uno R3&lt;/a&gt;&lt;br /&gt;- &lt;a href=&quot;http://s.click.aliexpress.com/e/BqVFeIEY7?af=185718449&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;TM1637&lt;/a&gt;&lt;br /&gt;- &lt;a href=&quot;http://s.click.aliexpress.com/e/URvfIUbyZ?af=185718449&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DS3231&lt;/a&gt;&lt;br /&gt;- &lt;a href=&quot;http://s.click.aliexpress.com/e/U3BYbyFmy?af=185718449&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ethernet Shield W5100&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Библиотеки:&lt;/strong&gt;&lt;br /&gt;- &lt;a href=&quot;https://www.dropbox.com/s/fa9b8kmqzn6fjln/libraries.zip?dl=0&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Скачать&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Скетч:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;Ethernet.h&amp;gt;
#include &amp;lt;EthernetUdp.h&amp;gt;
#include &amp;lt;EEPROM.h&amp;gt;
#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;DS3231.h&amp;gt;
#include &amp;lt;TM1637.h&amp;gt;
#define ON 1
#define OFF 0


#define CLK 10// Не рекомендую менять номера портов, так как на других модуль TM1673 может не завестись
#define DIO 9
TM1637 tm1637(CLK, DIO);
int8_t TimeDisp[] = {0xFF, 0xFF, 0xFF, 0xFF};
unsigned char ClockPoint = 1;

DS3231 clock;
RTCDateTime dt;
char compileTime[] = __TIME__;

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
}; 

byte ip[] = {
  192, 168, 2, 177
}; // ip address for ethernet shield

IPAddress gateway( 192, 168, 2, 1 );
IPAddress subnet( 255, 255, 255, 0 );


int p = 0;
unsigned int localPort = 123;       // local port to listen for UDP packets
char timeServer[] = &amp;quot;172.22.0.1&amp;quot;; // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
EthernetUDP Udp;


void setup()
{
  tm1637.init();
  tm1637.set();
  clock.begin();


  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println(&amp;quot;Failed to configure Ethernet using DHCP&amp;quot;);
    // no point in carrying on, so do nothing forevermore:
    for (;;)
      ;
  }
  Udp.begin(localPort);


  Serial.begin(9600);

  // Initialize DS3231
  Serial.println(&amp;quot;Initialize DS3231&amp;quot;);

  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);

  Serial.print(hour);
  Serial.println(&amp;quot;:&amp;quot;);
 Serial.println(minute);

  //Импровизированный хэш времени
  //Содержит в себе количество секунд с начала дня
  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;

  //Проверяем несовпадение нового хэша с хэшем в EEPROM
  if (EEPROMReadInt(0) != hash) {

    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);

    //Записываем эти данные во внутреннюю память часов.
    //С этого момента они начинают считать нужное для нас время
    clock.setDateTime(__DATE__, __TIME__);
  }

  // Set from UNIX timestamp
  // clock.setDateTime(1397408400);

  //Ручная установка времени и даты (YYYY, MM, DD, HH, II, SS)
  // clock.setDateTime(2014, 4, 13, 19, 21, 00);
  //pinger();
}

void loop()
{
  int tempa;
  dt = clock.getDateTime();
  if (dt.second &amp;gt;= 0 &amp;amp;&amp;amp; dt.second &amp;lt;= 5 ||
      dt.second &amp;gt;= 20 &amp;amp;&amp;amp; dt.second &amp;lt;= 25 ||
      dt.second &amp;gt;= 40 &amp;amp;&amp;amp; dt.second &amp;lt;= 45)
    //dt.second &amp;gt;= 30 &amp;amp;&amp;amp; dt.second &amp;lt;= 37) //
  {
    // clock.forceConversion();
    tm1637.point(POINT_OFF); // выключаем точки
    tempa = clock.readTemperature();
    //  tempa = tempa - 1; //Раскомментируйте и поставле своё значение для коррекции выводимой температуры
    TimeDisp[0] = tempa  / 10; // заполняем массив

    TimeDisp[1] = tempa  % 10;
    TimeDisp[2] = 0xF1;
    TimeDisp[3] = 12; // C
    Serial.println(tempa);
    delay(1000);
  }

  // часы
  else
  { ClockPoint = (~ClockPoint) &amp;amp; 0x01;


    if (ClockPoint) tm1637.point(POINT_ON);
    else tm1637.point(POINT_OFF);

    TimeDisp[0] = (dt.hour) / 10;
    TimeDisp[1] = (dt.hour) % 10;
    TimeDisp[2] = (dt.minute) / 10;
    TimeDisp[3] = (dt.minute) % 10;
    delay(500);

    Serial.print(&amp;quot;Raw data: &amp;quot;);
    Serial.print(__DATE__); Serial.print(&amp;quot;--&amp;quot;);
    Serial.print(__TIME__); Serial.print(&amp;quot;--&amp;quot;);
    Serial.print(dt.year);   Serial.print(&amp;quot;-&amp;quot;);
    Serial.print(dt.month);  Serial.print(&amp;quot;-&amp;quot;);
    Serial.print(dt.day);    Serial.print(&amp;quot; &amp;quot;);
    Serial.print(dt.hour);   Serial.print(&amp;quot;:&amp;quot;);
    Serial.print(dt.minute); Serial.print(&amp;quot;:&amp;quot;);
    Serial.print(dt.second); Serial.println(&amp;quot;&amp;quot;);
    // Serial.println(clock.readTemperature());
    //Serial.println(tempa);

  }
  tm1637.display(TimeDisp);
  if (dt.hour == 9 &amp;amp;&amp;amp; dt.minute == 0 &amp;amp;&amp;amp; dt.second &amp;lt;= 2 )
  {
    Serial.println(&amp;quot;Syncin from NTP&amp;quot;);
    updateT();
    Serial.println(&amp;quot;Sucsessful&amp;quot;);
  }
  
}

void updateT()
{
  
  sendNTPpacket(timeServer); // send an NTP packet to a time server

  // wait to see if a reply is available
  delay(1000);
  if ( Udp.parsePacket() ) {
    // We&#039;ve received a packet, read the data from it
    Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord &amp;lt;&amp;lt; 16 | lowWord;
    Serial.print(&amp;quot;Seconds since Jan 1 1900 = &amp;quot; );
    Serial.println(secsSince1900);

    // now convert NTP time into everyday time:
    Serial.print(&amp;quot;Unix time = &amp;quot;);
    // Unix time starts on Jan 1 1970. In seconds, that&#039;s 2208988800:
    const unsigned long seventyYears = 2208988800UL;
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears + 10800;
    // print Unix time:
    Serial.println(epoch);
    clock.setDateTime(epoch - 3600);


    // print the hour, minute and second:
    Serial.print(&amp;quot;The UTC time is &amp;quot;);       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600 ); // print the hour (86400 equals secs per day)
    Serial.print(&#039;:&#039;);
    if ( ((epoch % 3600) / 60) &amp;lt; 10 ) {
      // In the first 10 minutes of each hour, we&#039;ll want a leading &#039;0&#039;
      Serial.print(&#039;0&#039;);
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(&#039;:&#039;);
    if ( (epoch % 60) &amp;lt; 10 ) {
      // In the first 10 seconds of each minute, we&#039;ll want a leading &#039;0&#039;
      Serial.print(&#039;0&#039;);
    }
    Serial.println(epoch % 60); // print the second
  }
  // wait ten seconds before asking for the time again
}
// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(char* address)
{

  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);

  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay &amp;amp; Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123

  Udp.write(packetBuffer, NTP_PACKET_SIZE);

  Udp.endPacket();

}
//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}

//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);

  return (highByte &amp;lt;&amp;lt; 8) | lowByte;
}

char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - &#039;0&#039;) * 10 + int(string[startIndex+1]) - &#039;0&#039;;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Thu, 08 Oct 2015 19:03:08 +0300</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=43#p43</guid>
		</item>
		<item>
			<title>Погодная коробка (Версия 0.9)</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=42#p42</link>
			<description>&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pp.vk.me/c629204/v629204423/26143/oo_km89Z6Fg.jpg&quot; alt=&quot;https://pp.vk.me/c629204/v629204423/26143/oo_km89Z6Fg.jpg&quot; /&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#include &amp;lt;TextFinder.h&amp;gt;
#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;
#include &amp;lt;EEPROM.h&amp;gt;
#include &amp;quot;DS1307.h&amp;quot;

//Массив, содержащий время компиляции
char compileTime[] = __TIME__;

//Массив, содержащий дату компиляции
//char compileDate[] = __DATE__;

DS1307 clock;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Создание пользовательского значка градуса
byte gradus[8] = {
  B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000};



// ESP8266 -- Arduino
// ESP TX - 10 (Arduino SoftwareSerial RX)
// ESP RX - 11 (Arduino SoftwareSerial TX)
SoftwareSerial dbgSerial(10, 11);
TextFinder  finder(Serial);
// для SoftSerial скорость порта в 115200 является большой и не гарантирует стабильную работу
const int COM_BAUD = 9600;

void setup() {
  clock.begin();
  lcd.begin (16, 2);
  lcd.createChar(1, gradus);

  //Получаем часы, минуты, секунды
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);

  //Импровизированный хэш времени
  //Содержит в себе количество секунд с начала дня
  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;

   //Проверяем несовпадение нового хэша с хэшем в EEPROM
  if (EEPROMReadInt(0) != hash) {

    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);

    //Готовим для записи в RTC часы, минуты, секунды, год, месяц, день
    clock.fillByHMS(hour, minute, second); //Вставляем часы, минуты, секунды
    //clock.fillByYMD(year, month, day); //Вставляем год, месяц, день
    // clock.fillDayOfWeek(String(week[weekday(month, day, year)]).toInt()); //Вставляем день недели


    //Записываем эти данные во внутреннюю память часов.
    //С этого момента они начинают считать нужное для нас время
    clock.setTime();
  }
  dbgSerial.begin(COM_BAUD);
  Serial.begin(COM_BAUD);
  dbgSerial.println(&amp;quot;Setup done&amp;quot;);
    
 }

void loop() {
    //Получение времени
  clock.getTime();

    int clo = clock.hour;
  // Если больше заданного значения времени (часов), то выключится подсветка дисплея
  if (clo &amp;gt; 22 || clo &amp;lt; 7 )
  {
    lcd.noBacklight();
  }
  else
  {
    lcd.backlight();
  }

  Serial.println(&amp;quot;AT&amp;quot;);

  if (Serial.find(&amp;quot;OK&amp;quot;))
  {
    dbgSerial.println(&amp;quot;MODULE IS WORKING&amp;quot;);
  }

  lcd.setCursor(14, 0);
      lcd.print(clock.minute / 10);
      lcd.print(clock.minute % 10);

  Serial.println(&amp;quot;AT+CIPSTART=\&amp;quot;TCP\&amp;quot;,\&amp;quot;162.243.58.21\&amp;quot;,80&amp;quot;);
  delay(1000);
  if (Serial.find(&amp;quot;OK&amp;quot;))
  {
    dbgSerial.println(&amp;quot;Connected&amp;quot;);
  }
  Serial.println(&amp;quot;AT+CIPSEND=54&amp;quot;);
  delay(1000);
  if (Serial.find(&amp;quot;&amp;gt;&amp;quot;))
  {
    dbgSerial.println(&amp;quot;Enter data&amp;quot;);
  }
  Serial.println(&amp;quot;GET /data/2.5/weather?q=irkutsk&amp;amp;mode=xml&amp;amp;units=metric&amp;quot;);

  if (finder.find(&amp;quot;temperature value=&amp;quot;) )
  {
    int temperature = finder.getValue();
    dbgSerial.print(&amp;quot;Temp C:  &amp;quot;);
    dbgSerial.println(temperature);
lcd.setCursor(0, 0);
      lcd.print(&amp;quot;T=&amp;quot;);
      lcd.print(&amp;quot;      &amp;quot;);
      lcd.setCursor(2, 0);
      lcd.print(temperature);
      lcd.write(1);
      lcd.print(&amp;quot;C&amp;quot;);
    
  }

  if (finder.find(&amp;quot;humidity value=&amp;quot;) )
  {
    int humy = finder.getValue();
    dbgSerial.print(&amp;quot;Humidity:  &amp;quot;);
    dbgSerial.println(humy);
    lcd.setCursor(8, 0);
      lcd.print(&amp;quot;H=&amp;quot;);
      lcd.print(&amp;quot;    &amp;quot;);
      lcd.setCursor(10, 0);
      lcd.print(humy);
      lcd.print(&amp;quot;%&amp;quot;);
  }

  if (finder.find(&amp;quot;pressure value=&amp;quot;) )
  {
    int pres = finder.getValue();
    dbgSerial.print(&amp;quot;Pressure:  &amp;quot;);
    dbgSerial.println(pres);
     lcd.setCursor(0, 1);
      lcd.print(&amp;quot;P=&amp;quot;);
      lcd.print(pres);
      lcd.print(&amp;quot;mm&amp;quot;);
  }

    if (finder.find(&amp;quot;speed value=&amp;quot;) )
  {
    int speedv = finder.getValue();
    dbgSerial.print(&amp;quot;Wind speed:  &amp;quot;);
    dbgSerial.println(speedv);
          lcd.setCursor(8, 1);
      lcd.print(&amp;quot;W=&amp;quot;);
      lcd.print(&amp;quot;      &amp;quot;);
      lcd.setCursor(10, 1);
      lcd.print(speedv);
      lcd.print(&amp;quot;km/h&amp;quot;);
  }

   if (finder.find(&amp;quot;lastupdate value=&amp;quot;) )
  {
    int lastupdate = finder.getValue();
    dbgSerial.print(&amp;quot;Last update:  &amp;quot;);
    dbgSerial.println(lastupdate);
  }

  delay(600000);
  /*if ( Serial.available() )
    dbgSerial.write( Serial.read() );

  if ( dbgSerial.available() )
    Serial.write( dbgSerial.read() );

*/

}
//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}

//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);

  return (highByte &amp;lt;&amp;lt; 8) | lowByte;
}

//Вычисление времени
char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - &#039;0&#039;) * 10 + int(string[startIndex + 1]) - &#039;0&#039;;
}

/* 
 
 //Вычисление года
 int get4DigitInt(const char* string, int startIndex) {
 return (string[startIndex ] - &#039;0&#039;) * 1000 + (string[startIndex + 1] - &#039;0&#039;) * 100 + (string[startIndex + 2] - &#039;0&#039;) * 10 + (string[startIndex + 3] - &#039;0&#039;);
 }
 
 //Вычисление дня недели
 int weekday(int month, int day, int year)
 {
 int ix, tx, vx;
 switch (month) {
 case 2  :
 case 6  : 
 vx = 0; 
 break;
 case 8  : 
 vx = 4; 
 break;
 case 10 : 
 vx = 8; 
 break;
 case 9  :
 case 12 : 
 vx = 12; 
 break;
 case 3  :
 case 11 : 
 vx = 16; 
 break;
 case 1  :
 case 5  : 
 vx = 20; 
 break;
 case 4  :
 case 7  : 
 vx = 24; 
 break;
 }
 if (year &amp;gt; 1900)  // 1900 was not a leap year
 year -= 1900;
 ix = ((year - 21) % 28) + vx + (month &amp;gt; 2);  // take care of February
 tx = (ix + (ix / 4)) % 7 + day;              // take care of leap year
 return (tx % 7);
 }
 
 
 */&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Thu, 08 Oct 2015 18:43:14 +0300</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=42#p42</guid>
		</item>
		<item>
			<title>Weather web monitor</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=41#p41</link>
			<description>&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pp.vk.me/c628126/v628126423/2ef65/MWn67As5gZc.jpg&quot; alt=&quot;https://pp.vk.me/c628126/v628126423/2ef65/MWn67As5gZc.jpg&quot; /&gt;&lt;br /&gt;&lt;strong&gt;Weather web monitor &lt;/strong&gt;- Монитор погоды, который получает данные с сайта openweathermap.org и выводит на дисплей.&lt;br /&gt;В промежутке времени с 23.00 до 7.00 автоматически выключает подсветку дисплея. В коде закоментированы строки, пока не нужные для использования на данном дисплее (16x2), так как не хватает место для вывода всей инфы. В будущем на мониторчике 20x4 будет выводится более подробная погода,а так же дата и время. &lt;/p&gt;
						&lt;p&gt;Что бы получать погоду с вашего города нужно в адресе изменить, в данном случае irkutsk поменять на moscow. Так же погоду можно забирать с yahoo weather или другого сервиса, который может выдавать данные в xml или другом простом формате.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Использованное оборудование:&lt;/strong&gt;&lt;br /&gt;- Arduino Uno R3&lt;br /&gt;- Ethernet Shield W5100&lt;br /&gt;- DS1307&lt;br /&gt;- 16x2 дисплей&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Скетч:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;Ethernet.h&amp;gt;
#include &amp;lt;TextFinder.h&amp;gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;
#include &amp;lt;EEPROM.h&amp;gt;
#include &amp;quot;DS1307.h&amp;quot;

//Массив, содержащий время компиляции
char compileTime[] = __TIME__;

//Массив, содержащий дату компиляции
//char compileDate[] = __DATE__;

DS1307 clock;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Создание пользовательского значка градуса
byte gradus[8] = {
  B00111, B00101, B00111, B00000, B00000, B00000, B00000, B00000};


byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAD };
byte ip[] = { 
  192, 168, 0, 155 };
byte gateway[] = { 
  192, 168, 0, 1 };
byte subnet[] = { 
  255, 255, 255, 0 };

// Server openweathermap.org
IPAddress server(162,243,58,21);

EthernetClient client;
TextFinder  finder( client ); 

char place[50];

//char time[50];

void setup()
{
  clock.begin();
  lcd.begin (16, 2);
  lcd.createChar(1, gradus);
  // Start Ehternet
  Ethernet.begin(mac, ip);
  // Start Serial Port
  Serial.begin(9600);

  //Получаем часы, минуты, секунды
  byte hour = getInt(compileTime, 0);
  byte minute = getInt(compileTime, 3);
  byte second = getInt(compileTime, 6);

  /*
  //Получаем год, месяц и число
   int year = get4DigitInt(compileDate, 7);
   int day = getInt(compileDate, 4);
   int month;
   switch (compileDate[0] + compileDate[1] + compileDate[2]) {
   case &#039;J&#039;+&#039;a&#039;+&#039;n&#039;: 
   month = 1; 
   break;
   case &#039;F&#039;+&#039;e&#039;+&#039;b&#039;: 
   month = 2; 
   break;
   case &#039;M&#039;+&#039;a&#039;+&#039;r&#039;: 
   month = 3; 
   break;
   case &#039;A&#039;+&#039;p&#039;+&#039;r&#039;: 
   month = 4; 
   break;
   case &#039;M&#039;+&#039;a&#039;+&#039;y&#039;: 
   month = 5; 
   break;
   case &#039;J&#039;+&#039;u&#039;+&#039;n&#039;: 
   month = 6; 
   break;
   case &#039;J&#039;+&#039;u&#039;+&#039;l&#039;: 
   month = 7; 
   break;
   case &#039;A&#039;+&#039;u&#039;+&#039;g&#039;: 
   month = 8; 
   break;
   case &#039;S&#039;+&#039;e&#039;+&#039;p&#039;: 
   month = 9; 
   break;
   case &#039;O&#039;+&#039;c&#039;+&#039;t&#039;: 
   month = 10; 
   break;
   case &#039;N&#039;+&#039;o&#039;+&#039;v&#039;: 
   month = 11; 
   break;
   case &#039;D&#039;+&#039;e&#039;+&#039;c&#039;: 
   month = 12; 
   break;
   }
   char week[7][10] = {
   &amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;,
   &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;
   };
   */

  //Импровизированный хэш времени
  //Содержит в себе количество секунд с начала дня
  unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;

  //Проверяем несовпадение нового хэша с хэшем в EEPROM
  if (EEPROMReadInt(0) != hash) {

    //Сохраняем новый хэш
    EEPROMWriteInt(0, hash);

    //Готовим для записи в RTC часы, минуты, секунды, год, месяц, день
    clock.fillByHMS(hour, minute, second); //Вставляем часы, минуты, секунды
    //clock.fillByYMD(year, month, day); //Вставляем год, месяц, день
    // clock.fillDayOfWeek(String(week[weekday(month, day, year)]).toInt()); //Вставляем день недели


    //Записываем эти данные во внутреннюю память часов.
    //С этого момента они начинают считать нужное для нас время
    clock.setTime();
  }

}


void loop()
{
  //Получение времени
  clock.getTime();

  int clo = clock.hour;
  // Если больше заданного значения времени (часов), то выключится подсветка дисплея
  if (clo &amp;gt; 22 || clo &amp;lt; 7 )
  {
    lcd.noBacklight();
  }
  else
  {
    lcd.backlight();
  }

  if (client.connect(server, 80))
  {

    // Call Wetter-API
    // w: ID from your City
    // http://api.openweathermap.org/data/2.5/weather?q=irkutsk&amp;amp;mode=xml&amp;amp;units=metric
    ///
    Serial.println(&amp;quot;Connect to Yahoo Weather...&amp;quot;);
    client.println(&amp;quot;GET /data/2.5/weather?q=irkutsk&amp;amp;mode=xml&amp;amp;units=metric HTTP/1.0&amp;quot;);
    client.println(&amp;quot;HOST:api.openweathermap.org\n\n&amp;quot;);
    client.println();
    Serial.println(&amp;quot;Connected...&amp;quot;);

    Serial.print(clock.hour / 10);
    Serial.print(clock.hour % 10);
    Serial.print(&amp;quot;:&amp;quot;);


    Serial.print(clock.minute / 10);
    Serial.print(clock.minute % 10);
    Serial.print(&amp;quot;:&amp;quot;);
    Serial.print(clock.second / 10);
    Serial.print(clock.second % 10);
    Serial.print(&amp;quot;  &amp;quot;);


    Serial.print(clock.dayOfMonth / 10);
    Serial.print(clock.dayOfMonth % 10);
    Serial.print(&amp;quot;/&amp;quot;);

    Serial.print(clock.month / 10);
    Serial.print(clock.month % 10);
    Serial.print(&amp;quot;/&amp;quot;);
    Serial.print(clock.year + 2000, DEC);
    Serial.print(&amp;quot; &amp;quot;);


    /*
    switch (clock.dayOfWeek)
     {
     case 1:
     Serial.print(&amp;quot;MON&amp;quot;);
     break;
     case 2:
     Serial.print(&amp;quot;TUE&amp;quot;);
     break;
     case 3:
     Serial.print(&amp;quot;WED&amp;quot;);
     break;
     case 4:
     Serial.print(&amp;quot;THU&amp;quot;);
     break;
     case 5:
     Serial.print(&amp;quot;FRI&amp;quot;);
     break;
     case 6:
     Serial.print(&amp;quot;SAT&amp;quot;);
     break;
     case 7:
     Serial.print(&amp;quot;SUN&amp;quot;);
     break;
     }
     */

  }

  else
  {
    lcd.clear();
    lcd.print(&amp;quot;connection failed&amp;quot;);
 //   lcd.setCursor(0, 1);
  //  lcd.print(&amp;quot;Previous: &amp;quot;);
 //   lcd.print(&amp;quot;H=&amp;quot;);
   // lcd.print(hum);
 //   lcd.print(&amp;quot;%&amp;quot;);
    Serial.println(&amp;quot; connection failed&amp;quot;);
  }


  if (client.connected())
  {
     lcd.setCursor(14, 0);
      lcd.print(clock.minute / 10);
      lcd.print(clock.minute % 10);
    //lcd.clear();

    // wind

    // Temperature
    if(finder.find(&amp;quot;temperature value=&amp;quot;) )
    {
      int temperature = finder.getValue();
      Serial.print(&amp;quot;Temp C:  &amp;quot;);
      Serial.println(temperature);
      lcd.setCursor(0, 0);
      lcd.print(&amp;quot;T=&amp;quot;);
      lcd.print(&amp;quot;      &amp;quot;);
      lcd.setCursor(2, 0);
      lcd.print(temperature);
      lcd.write(1);
      lcd.print(&amp;quot;C&amp;quot;);


    }
    else
    {
      lcd.setCursor(0, 0);
      lcd.print(&amp;quot;T=&amp;quot;);
      lcd.print(&amp;quot;      &amp;quot;);
      lcd.setCursor(2, 0);
      lcd.print(&amp;quot;---&amp;quot;);
      Serial.print(&amp;quot;No Temperature Data&amp;quot;);
    }
    // Humidity
if(finder.find(&amp;quot;&amp;lt;humidity value=&amp;quot;) )
    {
      int humy = finder.getValue();
      Serial.print(&amp;quot;Humidity:  &amp;quot;);
      Serial.println(humy);
      lcd.setCursor(8, 0);
      lcd.print(&amp;quot;H=&amp;quot;);
      lcd.print(&amp;quot;    &amp;quot;);
      lcd.setCursor(10, 0);
      lcd.print(humy);
      lcd.print(&amp;quot;%&amp;quot;);

    }
    else
    {
      lcd.setCursor(8, 0);
      lcd.print(&amp;quot;H=&amp;quot;);
      lcd.print(&amp;quot;    &amp;quot;);
      lcd.setCursor(10, 0);
      lcd.print(&amp;quot;---&amp;quot;);
      Serial.print(&amp;quot;No Humidity Data&amp;quot;);
    }

    // pressure=
    if(finder.find(&amp;quot;pressure value=&amp;quot;) )
    {
      int pres = finder.getValue();
      pres = pres / 1.333;
      Serial.print(&amp;quot;pressure=:  &amp;quot;);
      Serial.println(pres);
      lcd.setCursor(0, 1);
      lcd.print(&amp;quot;P=&amp;quot;);
      lcd.print(pres);
      lcd.print(&amp;quot;mm&amp;quot;);
    }
    else
    {
      lcd.setCursor(0, 1);
      lcd.print(&amp;quot;P=&amp;quot;);
      lcd.print(&amp;quot;    &amp;quot;);
      lcd.setCursor(2, 1);  
      lcd.print(&amp;quot;---&amp;quot;);
      Serial.print(&amp;quot;No pressure=&amp;quot;);
    }
    

    //Поиск второго слова &amp;quot;speed&amp;quot;
    if(finder.find(&amp;quot;speed value=&amp;quot;) )
    {
      int speed2 = finder.getValue();
      //При желании выводить скорость ветра в метрах/секунду расскоментируйте строку ниже
      //speed2 = speed2 * 1000 / 3600;
      speed2 = speed2 * 3600 / 1000;
      Serial.print(&amp;quot;speed:  &amp;quot;);
      Serial.println(speed2);
      lcd.setCursor(8, 1);
      lcd.print(&amp;quot;W=&amp;quot;);
      lcd.print(&amp;quot;      &amp;quot;);
      lcd.setCursor(10, 1);
      lcd.print(speed2);
      lcd.print(&amp;quot;km/h&amp;quot;);
    }
    else
    {
            lcd.setCursor(8, 1);
      lcd.print(&amp;quot;W=&amp;quot;);
      lcd.print(&amp;quot;      &amp;quot;);
      lcd.setCursor(10, 1);
      lcd.print(&amp;quot;---&amp;quot;);
      Serial.print(&amp;quot;No wind data&amp;quot;);
    }

    // END XML
  }
  else
  {
    Serial.println(&amp;quot;Disconnected&amp;quot;);
  }

  client.stop();
  client.flush();

  //Время обновления данных с сервера
  delay(600000);
}

//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
  EEPROM.write(address, lowByte(value));
  EEPROM.write(address + 1, highByte(value));
}

//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
  byte lowByte = EEPROM.read(address);
  byte highByte = EEPROM.read(address + 1);

  return (highByte &amp;lt;&amp;lt; 8) | lowByte;
}

//Вычисление времени
char getInt(const char* string, int startIndex) {
  return int(string[startIndex] - &#039;0&#039;) * 10 + int(string[startIndex + 1]) - &#039;0&#039;;
}

/* 
 
 //Вычисление года
 int get4DigitInt(const char* string, int startIndex) {
 return (string[startIndex ] - &#039;0&#039;) * 1000 + (string[startIndex + 1] - &#039;0&#039;) * 100 + (string[startIndex + 2] - &#039;0&#039;) * 10 + (string[startIndex + 3] - &#039;0&#039;);
 }
 
 //Вычисление дня недели
 int weekday(int month, int day, int year)
 {
 int ix, tx, vx;
 switch (month) {
 case 2  :
 case 6  : 
 vx = 0; 
 break;
 case 8  : 
 vx = 4; 
 break;
 case 10 : 
 vx = 8; 
 break;
 case 9  :
 case 12 : 
 vx = 12; 
 break;
 case 3  :
 case 11 : 
 vx = 16; 
 break;
 case 1  :
 case 5  : 
 vx = 20; 
 break;
 case 4  :
 case 7  : 
 vx = 24; 
 break;
 }
 if (year &amp;gt; 1900)  // 1900 was not a leap year
 year -= 1900;
 ix = ((year - 21) % 28) + vx + (month &amp;gt; 2);  // take care of February
 tx = (ix + (ix / 4)) % 7 + day;              // take care of leap year
 return (tx % 7);
 }
 
 
 */&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Tue, 22 Sep 2015 18:49:27 +0300</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=41#p41</guid>
		</item>
		<item>
			<title>Naben Pinger 1.0</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=40#p40</link>
			<description>&lt;p&gt;&lt;a href=&quot;http://uploads.ru/9Axm3.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s6.uploads.ru/t/9Axm3.jpg&quot; alt=&quot;http://s6.uploads.ru/t/9Axm3.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Naben Pinger 1.0&lt;/strong&gt; - это проект на Arduino, помогающий удалённо пинговать нужный адрес в интернете или локальной сети ив случае отсутствия ответа перезагрузить модем. Был создан для работы Zyxel Kinetic от которого постоянно отваливался 3G модем.&lt;br /&gt;&lt;strong&gt;Использованное оборудование:&lt;/strong&gt;&lt;br /&gt;- Arduino Uno R3&lt;br /&gt;- Ethernet Shield W5100&lt;br /&gt;- 2 channel re&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Скетч:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;Ethernet.h&amp;gt;
#include &amp;lt;ICMPPing.h&amp;gt;
#include &amp;lt;Base64.h&amp;gt;

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
}; // max address for ethernet shield
byte ip[] = {
  192, 168, 2, 177
}; // ip address for ethernet shield
IPAddress gateway( 192, 168, 2, 1 );
IPAddress subnet( 255, 255, 255, 0 );
IPAddress pingAddr(192, 168, 45, 99); // ip address to ping
int i = 0;
SOCKET pingSocket = 0;

char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
int led7 = 7; // Горящая лампочка зелёного цвета при успешном пинге
int led6 = 6; // Горящая лампочка красного цвета при отсутствии пинга
int led5 = 5; // Лампочка жёлтого цвета, означающий наличие напряжения в сети
int led4 = 4; // Пин реле
char server[] = &amp;quot;smtpcorp.com&amp;quot;; // smtp сервер сайта smtp2go для отправки через него емэйла
int port = 2525;

char login[] = &amp;quot;her@gmail.com&amp;quot;; // Ваш логин с сайта smtp2go
char password[] = &amp;quot;12345678&amp;quot;;       // Ваш пароль с сайта smtp2go

char email_sendto[] = &amp;quot;her@gmail.com&amp;quot;; // Адрес получателя письма
char email_sendfrom[] = &amp;quot;her@gmail.com&amp;quot;; // Адрес отправителя письма

char name_sendto[] = &amp;quot;her&amp;quot;; // Имя получателя письма
char name_sendfrom[] = &amp;quot;Epic Fail&amp;quot;;      // Имя отправителя письма

char subject[] = &amp;quot;Modem was rebooted!&amp;quot;; // Тема письма
EthernetClient client;


void setup()

{
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led4, OUTPUT);
  // start Ethernet


  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  Serial.begin(9600);
  digitalWrite(led5, HIGH);
  digitalWrite(led4, HIGH);
}

void loop()
{
  ICMPEchoReply echoReply = ping(pingAddr, 4);
  if (echoReply.status == SUCCESS)
  {
    sprintf(buffer,
            &amp;quot;Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d&amp;quot;,
            echoReply.data.seq,
            echoReply.addr[0],
            echoReply.addr[1],
            echoReply.addr[2],
            echoReply.addr[3],
            REQ_DATASIZE,
            millis() - echoReply.data.time,
            echoReply.ttl);
    digitalWrite(led7, HIGH);
    digitalWrite(led6, LOW);
    i = 0; //Количество попыток пингования, после которых модем перезагрузиться
    Serial.println(buffer);
  }
  else
  {
    digitalWrite(led6, HIGH);
    digitalWrite(led7, LOW);
    sprintf(buffer, &amp;quot;Echo request failed; %d&amp;quot;, echoReply.status);
    i = i + 1;
    Serial.println(i);
    Serial.println(buffer);
    delay(100000); //Пауза между попытками пингования, когда было обнаружен
    if (i == 3) {
      Serial.println(&amp;quot;Fuck, now reboot modem&amp;quot;);
      digitalWrite(led5, LOW);
      digitalWrite(led4, LOW);
      i = 0;
      delay(5000); //Время на которое выключается реле
      digitalWrite(led5, HIGH);
      digitalWrite(led4, HIGH);
      delay(100000); //Время после включения реле (включается модем и подключается 3G модем)
      Serial.println(&amp;quot;Sending email&amp;quot;); //Вывод собщения в терминал, что будет выполнена попытка отправки письма на емаил.
      sendEmail(); //Попытка отправки письма на почтовый ящик о том, что модем был перезагружен
    }
  }
  delay(300000); //Пауза между пингованиями адресата
  }

byte sendEmail() //Функция отправки письма
{
  byte thisByte = 0;
  byte respCode;
  if (client.connect(server, port) == 1) {
    Serial.println(F(&amp;quot;connected&amp;quot;));
  }
  else {
    Serial.println(F(&amp;quot;connection failed&amp;quot;));
    return 0;
  }
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending hello&amp;quot;));
  // replace 1.2.3.4 with your Arduino&#039;s ip
  client.println(&amp;quot;EHLO 1.2.3.4&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending auth login&amp;quot;));
  client.println(&amp;quot;auth login&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending User&amp;quot;));
  // Change to your base64 encoded user
  client.println(strToBase64(login));
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending Password&amp;quot;));
  // change to your base64 encoded password
  client.println(strToBase64(password));
  if (!eRcv()) return 0;
  // change to your email address (sender)
  Serial.println(F(&amp;quot;Sending From&amp;quot;));
  //  client.println(&amp;quot;MAIL From: &amp;lt;her@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;MAIL From: &amp;lt;&amp;quot;);
  client.print(email_sendfrom);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  if (!eRcv()) return 0;
  // change to recipient address
  Serial.println(F(&amp;quot;Sending To&amp;quot;));
  //client.println(&amp;quot;RCPT To: &amp;lt;her@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;RCPT To: &amp;lt;&amp;quot;);
  client.print(email_sendto);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending DATA&amp;quot;));
  client.println(&amp;quot;DATA&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending email&amp;quot;));
  // change to recipient address
  //client.println(&amp;quot;To: You &amp;lt;her@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;To: &amp;quot;);
  client.print(name_sendto);
  client.print(&amp;quot; &amp;lt;&amp;quot;);
  client.print(email_sendto);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  // change to your address
  //client.println(&amp;quot;From: Me &amp;lt;her@gmail.com&amp;gt;&amp;quot;);
  client.print(&amp;quot;From: &amp;quot;);
  client.print(name_sendfrom);
  client.print(&amp;quot; &amp;lt;&amp;quot;);
  client.print(email_sendfrom);
  client.println(&amp;quot;&amp;gt;&amp;quot;);
  //client.println(&amp;quot;Subject: 111\r\n&amp;quot;);
  client.print(&amp;quot;Subject: &amp;quot;);
  client.print(subject);
  client.println(&amp;quot;\r\n&amp;quot;);
  client.println(&amp;quot;Modem was rebooted!&amp;quot;);
  client.println(&amp;quot;Modem was rebooted!&amp;quot;);
  client.println(&amp;quot;Modem was rebooted!&amp;quot;);
  client.println(&amp;quot;Modem was rebooted!&amp;quot;);
  client.println(&amp;quot;.&amp;quot;);
  if (!eRcv()) return 0;
  Serial.println(F(&amp;quot;Sending QUIT&amp;quot;));
  client.println(&amp;quot;QUIT&amp;quot;);
  if (!eRcv()) return 0;
  client.stop();
  Serial.println(F(&amp;quot;disconnected&amp;quot;));
  return 1;
}
byte eRcv()
{
  byte respCode;
  byte thisByte;
  int loopCount = 0;
  while (!client.available()) {
    delay(1);
    loopCount++;
    // if nothing received for 10 seconds, timeout
    if (loopCount &amp;gt; 10000) {
      client.stop();
      Serial.println(F(&amp;quot;\r\nTimeout&amp;quot;));
      return 0;
    }
  }
  respCode = client.peek();
  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }
  if (respCode &amp;gt;= &#039;4&#039;)
  {
    efail();
    return 0;
  }
  return 1;
}

void efail()
{
  byte thisByte = 0;
  int loopCount = 0;
  client.println(F(&amp;quot;QUIT&amp;quot;));
  while (!client.available()) {
    delay(1);
    loopCount++;
    // if nothing received for 10 seconds, timeout
    if (loopCount &amp;gt; 10000) {
      client.stop();
      Serial.println(F(&amp;quot;\r\nTimeout&amp;quot;));
      return;
    }
  }
  while (client.available())
  {
    thisByte = client.read();
    Serial.write(thisByte);
  }
  client.stop();
  Serial.println(F(&amp;quot;disconnected&amp;quot;));
}
// кодировка Base64
String strToBase64(char str[]) {
  char charArray[64];
  base64_encode(charArray, str, strlen(str));
  String result = charArray;
  return result;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Wed, 26 Aug 2015 16:59:12 +0300</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=40#p40</guid>
		</item>
		<item>
			<title>DS1307 и I2C 16x2 дисплей</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=39#p39</link>
			<description>&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://pp.vk.me/c628727/v628727423/16f1c/HPjOFvzfWwI.jpg&quot; alt=&quot;https://pp.vk.me/c628727/v628727423/16f1c/HPjOFvzfWwI.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Кому интересно, выкладываю скетч для работы с DS1307 и I2C 16x2 дисплеем. Основные возможности:&lt;br /&gt;1. Автоматическая установка даты и времени, а также дня недели при компиляции, не требующей повторно заливать скетч и комментировать строку установки времени(работает при помощи сравнивания хеша в EEPROM.&lt;br /&gt;2. Вывод всех этих данных на I2C 16x2 дисплей.&lt;/p&gt;
						&lt;p&gt;Данный скетч собирался из кусочков кодов, найденных на просторах интернета. Возможно код не оптимален, особенно в функции установки дня недели, но всё работает.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;EEPROM.h&amp;gt;
#include &amp;quot;DS1307.h&amp;quot;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;

//Массив, содержащий время компиляции
char compileTime[] = __TIME__;

//Массив, содержащий время компиляции
char compileDate[] = __DATE__;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
DS1307 clock;

void setup()
{
//Ручная установка времени и даты
//clock.fillByYMD(2013,1,19);//2013, Jan, 19,
//clock.fillByHMS(15,28,30);//15:28 30&amp;quot;
// clock.fillDayOfWeek(SAT);//Saturday
//clock.setTime();//write time to the RTC chip

lcd.begin (16, 2);
Serial.begin(9600);
clock.begin();

//Получаем часы, минуты, секунды
byte hour = getInt(compileTime, 0);
byte minute = getInt(compileTime, 3);
byte second = getInt(compileTime, 6);

//Получаем год, месяц и число
int year = get4DigitInt(compileDate, 7);
int day = getInt(compileDate, 4);
int month;
switch (compileDate[0] + compileDate[1] + compileDate[2]) {
case &#039;J&#039;+&#039;a&#039;+&#039;n&#039;: month = 1; break;
case &#039;F&#039;+&#039;e&#039;+&#039;b&#039;: month = 2; break;
case &#039;M&#039;+&#039;a&#039;+&#039;r&#039;: month = 3; break;
case &#039;A&#039;+&#039;p&#039;+&#039;r&#039;: month = 4; break;
case &#039;M&#039;+&#039;a&#039;+&#039;y&#039;: month = 5; break;
case &#039;J&#039;+&#039;u&#039;+&#039;n&#039;: month = 6; break;
case &#039;J&#039;+&#039;u&#039;+&#039;l&#039;: month = 7; break;
case &#039;A&#039;+&#039;u&#039;+&#039;g&#039;: month = 8; break;
case &#039;S&#039;+&#039;e&#039;+&#039;p&#039;: month = 9; break;
case &#039;O&#039;+&#039;c&#039;+&#039;t&#039;: month = 10; break;
case &#039;N&#039;+&#039;o&#039;+&#039;v&#039;: month = 11; break;
case &#039;D&#039;+&#039;e&#039;+&#039;c&#039;: month = 12; break;
}
char week[7][10] = {
&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;,
&amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;
};

//Импровизированный хэш времени
//Содержит в себе количество секунд с начала дня
unsigned int hash = hour * 60 * 60 + minute * 60 + second;

//Проверяем несовпадение нового хэша с хэшем в EEPROM
if (EEPROMReadInt(0) != hash) {

//Сохраняем новый хэш
EEPROMWriteInt(0, hash);

//Готовим для записи в RTC часы, минуты, секунды, год, месяц, день
clock.fillByHMS(hour, minute, second); //Всавляем часы, минуты, секунды
clock.fillByYMD(year, month, day); //Вставляем год, месяц, день
clock.fillDayOfWeek(String(week[weekday(month, day, year)]).toInt()); //Вставляем день недели

//Записываем эти данные во внутреннюю память часов.
//С этого момента они начинают считать нужное для нас время
clock.setTime();
}

}
void loop()
{
clock.getTime();
lcd.setCursor(0, 0);
lcd.print(clock.hour / 10);
lcd.print(clock.hour % 10);
lcd.print(&amp;quot;:&amp;quot;);

lcd.print(clock.minute / 10);
lcd.print(clock.minute % 10);
lcd.print(&amp;quot;:&amp;quot;);
lcd.print(clock.second / 10);
lcd.print(clock.second % 10);
lcd.print(&amp;quot; &amp;quot;);
lcd.setCursor(0, 1);

lcd.print(clock.dayOfMonth / 10);
lcd.print(clock.dayOfMonth % 10);
lcd.print(&amp;quot;/&amp;quot;);

lcd.print(clock.month / 10);
lcd.print(clock.month % 10);
lcd.print(&amp;quot;/&amp;quot;);
lcd.print(clock.year + 2000, DEC);
lcd.print(&amp;quot; &amp;quot;);

switch (clock.dayOfWeek)
{
case 1:
lcd.print(&amp;quot;MON&amp;quot;);
break;
case 2:
lcd.print(&amp;quot;TUE&amp;quot;);
break;
case 3:
lcd.print(&amp;quot;WED&amp;quot;);
break;
case 4:
lcd.print(&amp;quot;THU&amp;quot;);
break;
case 5:
lcd.print(&amp;quot;FRI&amp;quot;);
break;
case 6:
lcd.print(&amp;quot;SAT&amp;quot;);
break;
case 7:
lcd.print(&amp;quot;SUN&amp;quot;);
break;
}
delay(1000);
}

//Запись двухбайтового числа в память
void EEPROMWriteInt(int address, int value)
{
EEPROM.write(address, lowByte(value));
EEPROM.write(address + 1, highByte(value));
}

//Чтение числа из памяти
unsigned int EEPROMReadInt(int address)
{
byte lowByte = EEPROM.read(address);
byte highByte = EEPROM.read(address + 1);

return (highByte « 8) | lowByte;
}

char getInt(const char* string, int startIndex) {
return int(string[startIndex] - &#039;0&#039;) * 10 + int(string[startIndex + 1]) - &#039;0&#039;;
}

//Вычисление года
int get4DigitInt(const char* string, int startIndex) {
return (string[startIndex ] - &#039;0&#039;) * 1000 + (string[startIndex + 1] - &#039;0&#039;) * 100 + (string[startIndex + 2] - &#039;0&#039;) * 10 + (string[startIndex + 3] - &#039;0&#039;);
}

//Вычисление дня недели
int weekday(int month, int day, int year)
{
int ix, tx, vx;
switch (month) {
case 2 :
case 6 : vx = 0; break;
case 8 : vx = 4; break;
case 10 : vx = 8; break;
case 9 :
case 12 : vx = 12; break;
case 3 :
case 11 : vx = 16; break;
case 1 :
case 5 : vx = 20; break;
case 4 :
case 7 : vx = 24; break;
}
if (year &amp;gt; 1900) // 1900 was not a leap year
year -= 1900;
ix = ((year - 21) % 28) + vx + (month &amp;gt; 2); // take care of February
tx = (ix + (ix / 4)) % 7 + day; // take care of leap year
return (tx % 7);
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Fri, 21 Aug 2015 15:27:12 +0300</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=39#p39</guid>
		</item>
		<item>
			<title>Bootable USB Naben Preferences от 30.11.2013</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=38#p38</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;span style=&quot;font-size: 24px&quot;&gt;Bootable USB &lt;span style=&quot;color: #336699&quot;&gt;Naben Preferences &lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;(30.11.2013)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s019.radikal.ru/i600/1311/ca/13e5b4ad5da5.png&quot; alt=&quot;http://s019.radikal.ru/i600/1311/ca/13e5b4ad5da5.png&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Год/Дата Выпуска&lt;/strong&gt;: 2013&lt;br /&gt;&lt;strong&gt;Версия&lt;/strong&gt;: 30.11.2013 Build 1&lt;br /&gt;&lt;strong&gt;Разработчик&lt;/strong&gt;: Naben&lt;br /&gt;&lt;strong&gt;Сайт разработчика&lt;/strong&gt;: http://usable.mybb.ru/&lt;br /&gt;&lt;strong&gt;Лицензия:&lt;/strong&gt; © Все правые в резерве.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Разрядность&lt;/strong&gt;: 32bit&lt;br /&gt;&lt;strong&gt;Язык интерфейса&lt;/strong&gt;: Русский&lt;br /&gt;&lt;strong&gt;Таблэтка&lt;/strong&gt;: Не требуется&lt;br /&gt;&lt;strong&gt;Системные требования&lt;/strong&gt;: Компьютер с поддержкой загрузки c USB.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Описание&lt;/strong&gt;: Как часто бывало у вас, что вы скачали классную загрузочную флешку, а она не загружается и мало того - подвешивает компьютер в самом начале загрузки? У меня такое бывало и не раз, и это очень напрягало особенно, когда это случалось в самые&amp;#160; ответственные моменты. Поэтому представляю вам свой продукт! Загрузочная&amp;#160; флешка Bootable USB Naben Preferences основана на загрузчике Syslinux, который загружается практически на всех компьютерах в отличие от grub4dos.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Доп. информация&lt;/strong&gt;: Bootable USB Naben Preferences&amp;#160; &amp;#160;-&amp;#160; &amp;#160;мультизагрузочная флешка только с нужными инструментами для работы.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;p.s.&lt;/strong&gt; Принимаю багрепорты и пожелания, но не в ущерб функционалу, удобству и размеру.&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Состав&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;Naben Windows Live (Честно стырено у Alkid)&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;Acronis True Image Home 2013 Rus&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt;Acronis Disk Director 2011 Home Rus&lt;br /&gt;&lt;strong&gt;4.&lt;/strong&gt;Hiren&#039;s BootCD 10&lt;br /&gt;&lt;strong&gt;5.&lt;/strong&gt;Dr.Web Live USB&lt;br /&gt;&lt;strong&gt;6.&lt;/strong&gt;ESET Nod32&lt;br /&gt;&lt;strong&gt;7.&lt;/strong&gt;Kaspersky Rescue USB&lt;br /&gt;&lt;strong&gt;A.&lt;/strong&gt;Victoria 3.5 Rus&lt;br /&gt;&lt;strong&gt;B.&lt;/strong&gt;MemTest86+&lt;br /&gt;&lt;strong&gt;C.&lt;/strong&gt;Windows Memory Diagnostic&lt;br /&gt;&lt;strong&gt;D.&lt;/strong&gt;Active Passowrd Changer&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Инструкция по установке на флешку&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;Вставить флешку и запомнить её букву.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;Отформатировать флешку в FAT32 ( в особо запущенных случаях, говорят, нужен FAT16) с помощью программы &amp;quot;HPUSBFW.exe&amp;quot;.&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt;Распаковать содержимое папки &amp;quot;pack&amp;quot; на флешку.&lt;br /&gt;&lt;strong&gt;4.&lt;/strong&gt;Запустить из папки &amp;quot;Создание загрузочной флешки Syslinux&amp;quot; файл &amp;quot;Создание загрузчика на флешке.bat&amp;quot; и указать букву флешки.&lt;br /&gt;&lt;strong&gt;5.&lt;/strong&gt;Загрузочная флешка готова!&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Обновления антивирусов&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;ESET Nod32 - с этим антивирусом повезло больше всего, он без проблем обновляется через интернет и свои базы и настройки сохраняет в папке &amp;quot;/sysrescue/base/&amp;quot;.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;Kaspersky Rescue USB - тут одновременно всё и сложно и просто. Так как антивирус загружается не напрямую через линукс, а монтируется образ диска, а потом уже с него идёт загрузка, то что бы обновить базы, вам придётся скачать с интернета заново образ загрузочного диска и кинуть вместо &amp;quot;/rescue/rescue.iso&amp;quot;. Если есть идеи, как запускать Касперыча минуя монтирование образа диска, то прошу в комментарии.&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt;Dr.Web Live USB - загружается через линуксовое ядро, отчего грузится быстро и уверенно, даже базы обновляются через интернет, но вот почему-то не сохраняются на флешку. Что бы залить свежие базы, нужно скачивать оригинальный загрузочный диск от доктора и потрошить его. По идее нам нужен только один файл, который кладём в &amp;quot;/boot/module/drweb_bases.dwm&amp;quot;, правда пока сам не проббовал :)&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Пример файла конфигурации меню &amp;quot;syslinux.cfg&amp;quot; (&amp;quot;/boot/syslinux/syslinux.cfg&amp;quot;)&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Если по какой-то причине какая-либо из программ не хочет загружаться, например, на вирутальной машине, возможно поможет обновление файла конфигурации меню &amp;quot;syslinux.cfg&amp;quot;, который периодически совершенствуется и обновляется. Например, как сегодня 01.12.2013 :)&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;UI /boot/syslinux/vesamenu.c32
FONT /boot/syslinux/fonts/866_8x16.psf
PROMPT 0
TIMEOUT 300
MENU AUTOBOOT Автоматическая загрузка выделенного меню через # секунд

MENU TITLE Naben Boot USB via SYSLINUX 2014
MENU BACKGROUND yumi.png
MENU WIDTH 72
MENU MARGIN 5
MENU VSHIFT 0
MENU HSHIFT 4
MENU ROWS 18
MENU ENDROW 30
MENU HELPMSGROW 24
MENU CMDLINEROW 24
MENU TABMSGROW 32
MENU TABMSG
MENU NOTABMSG
MENU TIMEOUTROW 32
menu color title 1;36;44 #66A0FF #00000000 none
menu color hotsel 30;47 #C00000 #DDDDDDDD
menu color sel 30;47 #000000 #FFFFFFFF
menu color border 30;44 #D00000 #00000000 std
menu color scrollbar 30;44 #DDDDDDDD #00000000 none

LABEL * Загрузка GRUB4DOS
#MENU HIDE
KERNEL /boot/grub/grub.exe
APPEND --config-file=/boot/grub/menu.lst
TEXT HELP
Загрузка GRUB4DOS.
ENDTEXT

LABEL * Найти и загрузить Win 7 или Win 8
KERNEL /boot/grub/grub.exe --config-file=&amp;quot;find --set-root --ignore-floppies --ignore-cd /bootmgr; map () (hd0); map (hd0) (); map --rehook; find --set-root --ignore-floppies --ignore-cd /bootmgr; chainloader /bootmgr; savedefault --wait=2&amp;quot;
MENU DEFAULT
TEXT HELP
Найти и загрузить Win 7 или Win 8.
ENDTEXT

LABEL * Найти и загрузить NTLDR of Windows NT/2K/XP
KERNEL /boot/grub/grub.exe --config-file=&amp;quot;find --set-root --ignore-floppies --ignore-cd /ntldr; map () (hd0); map (hd0) (); map --rehook; find --set-root --ignore-floppies --ignore-cd /ntldr; chainloader /ntldr; savedefault --wait=2&amp;quot;
TEXT HELP
Найти и загрузить NTLDR of Windows NT/2K/XP.
ENDTEXT

LABEL * Загрузка с жёсткого диска
KERNEL /boot/syslinux/chain.c32
APPEND hd1
TEXT HELP
Загрузка с первого жёсткого диска.
ENDTEXT

LABEL * Перпезагрузка
KERNEL /boot/syslinux/reboot.c32
TEXT HELP
Перезагрузить компьютер.
ENDTEXT

LABEL * Выключить
KERNEL /boot/syslinux/poweroff.c32
TEXT HELP
Выключить компьютер.
ENDTEXT

MENU SEPARATOR

LABEL 1. Загрузка Naben Windows Live
KERNEL /boot/syslinux/chain.c32 hd0 1 ntldr=/minint/setupldr.bin
TEXT HELP
Позволяет загрузиться в почти полноценную операционную систему.
Загружается около 5 минут. Есть поддержка сети, RAID, USBFLASH, DVD.
Включены разнообразные утилиты для рботы с жёстким диском.
ENDTEXT

LABEL 2. Загрузка Acronis True Image Home 2013 Rus
KERNEL /boot/acronis/ti/dat3.dat
INITRD /boot/acronis/ti/dat2.dat
APPEND ramdisk_size=91455 vga=0x317 quiet
TEXT HELP
Запуск лучшей программы для создания точных копий разделов жёсткого диска.
Есть поддержка винтов с интерфейсом SATA, USB мышей и сети.
ENDTEXT

LABEL 3. Загрузка Acronis Disk Director 2011 Home Rus
KERNEL /boot/acronis/dd/dat3.dat
INITRD /boot/acronis/dd/dat2.dat
APPEND  ramdisk_size=96000 vga=0x317 quiet
TEXT HELP
Запуск лучшей программы для разметки и форматирования жёсткого диска.
Есть поддержка винтов с интерфейсом SATA и USB мышей.
ENDTEXT

LABEL 4. Запустить Hiren&#039;s BootCD 10
LINUX /boot/memdisk
INITRD /hbcd/boot.img
APPEND raw
TEXT HELP
Лучший пакет программ для диагностики и восстановления работы компьютера.
ENDTEXT

LABEL 5. Загрузить Dr.Web Live USB
KERNEL /boot/vmlinuz
APPEND ID=BsBOyT4fNyMhFf6V root=/dev/ram0 init=/linuxrc init_opts=4 quiet initrd=/boot/initrd vga=791 splash=no,theme:drweb changes=/boot/module/base CONSOLE=/dev/tty1 BOOT_LANG=ru_RU.UTF-8 raid6_pq=no pata_qdi=no
TEXT HELP
Загрузить Dr.Web Live USB.
ENDTEXT

LABEL 6. Загрузка ESET Nod32
KERNEL /sysrescue/vmlinuz  initrd=/sysrescue/initrd.gz ramdisk_size=6666 root=/dev/ram0 rw autoexec=xconf;telinit~4 changes=/sysrescue/base
INITRD /sysrescue/initrd.gz
TEXT HELP
Загрузка ESET Nod32 с функцией обновления и сохранения обновлений на флешке.
ENDTEXT

LABEL 7. Загрузка Kaspersky Rescue USB
KERNEL /boot/grub/grub.exe --config-file=&amp;quot;errorcheck off; find --set-root --ignore-cd /rescue/rescueusb.iso; errorcheck on; map /rescue/rescueusb.iso (0xff) || map --mem /rescue/rescueusb.iso (0xff); map --hook; chainloader (0xff); boot; changes=/rescue/bases&amp;quot;
TEXT HELP
Загрузка Kaspersky Rescue USB.
ENDTEXT

MENU SEPARATOR

LABEL A. Запустить Victoria 3.5 Rus
LINUX /boot/memdisk
INITRD /boot/bcdw/victoria.ima
APPEND raw
TEXT HELP
Запуск продвинутой программы для проверки и восстановления жёсткого диска.
ENDTEXT

LABEL B. Запустить MemTest86+
KERNEL /boot/bcdw/memtest
TEXT HELP
Запуск программы для тестирование памяти на ошибки.
ENDTEXT

LABEL C. Запустить Windows Memory Diagnostic
LINUX /boot/memdisk
INITRD /boot/bcdw/winmemte.img
APPEND raw
TEXT HELP
Запуск альтернативной программы для тестирование памяти на ошибки.
ENDTEXT

LABEL D. Запустить Active Passowrd Changer
LINUX /boot/memdisk
INITRD /boot/bcdw/apch.ima
APPEND raw
TEXT HELP
Запуск программы для сброса или изменения паролей в Windows.
ENDTEXT&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Полезные советы&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Тут я решил собрать немного полезных советов при работе с данной загрузочной флешкой.&lt;br /&gt;[*]Если вдруг вы нажали на пункт меню &amp;quot;Найти и загрузить Win 7 или Win 8&amp;quot;, но у вас не стоит этих ОСей, то вылетит приглашение для ввода команд от груба вида &lt;strong&gt;grub &amp;gt;&lt;/strong&gt;. Не пугайтесь, просто введите &lt;strong&gt;reboot&lt;/strong&gt;и компьютер перезагрузится, либо, если вы очень умный, другие команды, которые вы знаете. Аналогичная ситуация и с пунктом меню &amp;quot;Найти и загрузить NTLDR of Windows NT/2K/XP&amp;quot;.&lt;br /&gt;[*]Если вы нажали на пункт меню &amp;quot;Загрузка с жёсткого диска&amp;quot; и операционноя система стоит у вас не на первом жёстком диске, а к примеру на втором, то, нажав клавишу &lt;strong&gt;TAB&lt;/strong&gt;, вы сможете отредактировать параметры этого пункта меню, указав &lt;strong&gt;hd2&lt;/strong&gt;.&lt;br /&gt;[*]Если поставить значок комментария &lt;strong&gt;#&lt;/strong&gt; перед командой &lt;strong&gt;MENU HIDE&lt;/strong&gt; в конфигурационном файле меню &amp;quot;/boot/syslinux/syslinux.cfg&amp;quot;&amp;#160; пункта &amp;quot;Загрузка GRUB4DOS&amp;quot; (это 29 строка), вы можете включить этот пункт меню на свой страх и риск, и при загрузке с флешки сможете попасть в меню загрузчика grub4dos. Однако многие пункты там уже не работают, конфигуритруйте его под себя в файле &amp;quot;/boot/grub/menu.lst.&lt;br /&gt;[*]Редактирование команд в загрузчике grub4dos осуществляется нажатием клавиши &lt;strong&gt;E&lt;/strong&gt;, когда выбран нужный пункт меню.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;В этой версии:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt; Теперь Acronis True Image Home 2013 Rus сохраняет и восстанавливает образы нормально.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;MD5 архива:&lt;/strong&gt;&lt;br /&gt;8f372dc2992454d1243f0a82043924a5 *Bootable_USB_Naben_Preferences_30.11.2013.zip&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Скачать (1,56 ГБ):&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://yadi.sk/d/J9AOYBs9Dk3Te&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://yadi.sk/d/J9AOYBs9Dk3Te&lt;/a&gt;&lt;br /&gt;p.s. Ссылка не является прямой, что бы скачать программу, ссылку нужно открывать и качать в браузере.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Sun, 24 Nov 2013 15:54:27 +0400</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=38#p38</guid>
		</item>
		<item>
			<title>Total Commander 8.01 Naben Preferences (20.11.2012)</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=37#p37</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;span style=&quot;font-size: 24px&quot;&gt;Total Commander 8.01 &lt;span style=&quot;color: #336699&quot;&gt;Naben Preferences &lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;(20.11.2012)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;a href=&quot;http://s44.radikal.ru/i104/1209/27/02895185ef3b.png.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s44.radikal.ru/i104/1209/27/02895185ef3bt.jpg&quot; alt=&quot;http://s44.radikal.ru/i104/1209/27/02895185ef3bt.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Дата выпуска&lt;/strong&gt;: 18.11.2012&lt;br /&gt;&lt;strong&gt;Версия&lt;/strong&gt;: 8.01&lt;br /&gt;&lt;strong&gt;Разработчик&lt;/strong&gt;: &lt;a href=&quot;http://www.usable.mybb.ru/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Naben&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Платформа&lt;/strong&gt;: Windows&lt;br /&gt;&lt;strong&gt;Совместимость&lt;/strong&gt; с Win95, Win98, Win2000, WinXP, WinVista, Win7&lt;br /&gt;&lt;strong&gt;Системные требования&lt;/strong&gt;: Любые&lt;br /&gt;&lt;strong&gt;Таблэтка&lt;/strong&gt;: Присутствует&lt;br /&gt;&lt;strong&gt;Описание&lt;/strong&gt;: Вышло обновление сборки Total Commander 8.01 Naben Preferences (20.11.2012). &lt;br /&gt;&lt;strong&gt;Доп. информация&lt;/strong&gt;: Total Commander 8.01 Naben Preferences - очень удобный и простой в использовании файловый менеджер. Сборка специально сконфигурирована для тех, кто не привык к сложностям и долгим, мучительным настройкам, а также для тех, кто понимает, что такое функциональный минимализм. Она оснащена плагинами и утилитами, которые сильно помогают в повседневной жизни. Сборка не влияет на другие установленные в системе сборки Total Commander, настройки не зависят от реестра. Данная сборка ставится и работает без проблем, протестирована много раз на разных компах.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Основные отличия и преимущества данной сборки:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt;Запуск по команде totalcmd из меню &amp;quot;Пуск-&amp;gt;Выполнить&amp;quot; в том числе и из меню поиска в Windows Vista и Seven.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;Интеграция HDD Scanner в контекстное меню проводника.&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt;Не перегруженный интерфейс программы, только нужные и полезные пункты меню и кнопки.&lt;br /&gt;&lt;strong&gt;4.&lt;/strong&gt;Запуск Internet Explorer по команде ie из командной строки Total Commander.&lt;br /&gt;&lt;strong&gt;5.&lt;/strong&gt;Основная панель только с иконкой для AkelPad для самостоятельного размещения своих иконок и дополнительная панель с программами и полезными ярлыками для Windows.&lt;br /&gt;&lt;strong&gt;6.&lt;/strong&gt;Быстрый доступ к Вашей сети из меню быстрых каталогов по нажатию Mshome (если название вашей рабочей группы отличается, то нужно создать ярлык вашей рабочей группы, переименовать в Mshome и кинуть в папку:Total Commander\Custom\Other\Mshome.lnk).&lt;br /&gt;&lt;strong&gt;7.&lt;/strong&gt;Небольшой размер сборки с сохранением хорошего функционала (~7.9 Мб).&lt;br /&gt;&lt;strong&gt;8.&lt;/strong&gt;Использование двух цветов на именах файлов (зелёный - для &amp;quot;сегодняшних&amp;quot;файлов, синий - для файлов, которым 3 дня, так удобнее находить новые файлы).&lt;br /&gt;&lt;strong&gt;9.&lt;/strong&gt;Отображение архивов в неповторимом красном стиле.&lt;br /&gt;&lt;strong&gt;10.&lt;/strong&gt;Использование оригинального Totalcmd.exe, не испорченного патчами.&lt;br /&gt;&lt;strong&gt;11.&lt;/strong&gt;Самая последняя русификация и справка в chm стиле от CaptainFlint.&lt;br /&gt;&lt;strong&gt;12.&lt;/strong&gt;Все настройки и файлы хранятся исключительно в директории программы.&lt;br /&gt;&lt;strong&gt;13.&lt;/strong&gt;Выделение файлов и папок - правой кнопкой мыши. Вызов контекстного меню файлов и папок делается посредством удержания правой кнопки мыши в течении одной секунды.&lt;br /&gt;&lt;strong&gt;14.&lt;/strong&gt;Хранение панелей инструментов, быстрых каталогов и других пользовательских настроек в отдельной папке &amp;quot;Custom&amp;quot; для быстрого сохранения и восстановления Ваших настроек при обновлении сборки &lt;strong&gt;(работает с версии от 29.08.2008)&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;15.&lt;/strong&gt;Быстрый поиск с диалогом поиска теперь без нажатия на Alt.&lt;br /&gt;&lt;strong&gt;16.&lt;/strong&gt;Установленная сборка не зависит от реестра и никак не влияет на другие установленные в системе сборки Total Commander.&lt;br /&gt;&lt;strong&gt;17.&lt;/strong&gt;Список исключений содержит ненужные System Volume Information, Desktop.ini,Thumbs.db, Recycler, $recycle.bin, которые не отображаются в панелях.&lt;br /&gt;&lt;strong&gt;18.&lt;/strong&gt;Удобная и быстрая навигация по папкам с помощь стрелок &amp;quot;Вправо&amp;quot; и &amp;quot;Влево&amp;quot;.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Отличия клавиатурных сочетаний:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;F1&lt;/strong&gt; - Распаковка архивов.&lt;br /&gt;&lt;strong&gt;F2 &lt;/strong&gt;- Переименование файла/каталога.&lt;br /&gt;&lt;strong&gt;F9 &lt;/strong&gt;- Создание папки с именем текущей даты и вход в неё.&lt;br /&gt;&lt;strong&gt;F10&lt;/strong&gt; - Создание текстового файла и его открытие.&lt;br /&gt;&lt;strong&gt;F11&lt;/strong&gt; - Копирование имени файла в буфер.&lt;br /&gt;&lt;strong&gt;F12&lt;/strong&gt; - Копирование полного имени файла в буфер.&lt;br /&gt;&lt;strong&gt;Num*&lt;/strong&gt; - Установка атрибутов для файлов и папок.&lt;br /&gt;&lt;strong&gt;Ctrl+E&lt;/strong&gt; - Показать дерево каталогов в панели (1/2/0).&lt;br /&gt;&lt;strong&gt;Ctrl+H&lt;/strong&gt; - Показать скрытые (Вкл/выкл).&lt;br /&gt;&lt;strong&gt;Ctrl+K&lt;/strong&gt;- Запустить сеанс DOS (Консоль).&lt;br /&gt;&lt;strong&gt;Ctrl+N&lt;/strong&gt; - Запустить блокнот AkelPad.&lt;br /&gt;&lt;strong&gt;Ctrl+O &lt;/strong&gt;- Открыть меню &amp;quot;Файловые ассоциации...&amp;quot;.&lt;br /&gt;&lt;strong&gt;Ctrl+Shift+F&lt;/strong&gt; - Команда &amp;quot;Новое FTP-соединение...&amp;quot;.&lt;br /&gt;&lt;strong&gt;Ctrl+Shift+H &lt;/strong&gt; - Активировать исключения (Вкл/выкл).&lt;br /&gt;&lt;strong&gt;Ctrl+Shift+K&lt;/strong&gt; - Показать командную строку.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Состав сборки:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Архиваторные плагины:&lt;/strong&gt;&lt;br /&gt;7zip 0.5.8.0 - Работа с 7z архивами&lt;br /&gt;ChmDir 0.4.1 - Работа с chm файлами&lt;br /&gt;Diskdir 1.1.0.0 - Создание каталогов&lt;br /&gt;Iso 1.7.7.4 - Работа с образами дисков&lt;br /&gt;Imaginator 2.0.3.0 - Работа с образами ima и img&lt;br /&gt;MsiPlus 0.5.0.0 - Работа с msi инсталляциями&lt;br /&gt;MultiArc 1.4.1.7 - Работа с cab архивами&lt;br /&gt;MhtUnPack 1.0.1.0 - Работа с mht и msg файлами&lt;br /&gt;NSCopy 2.2.0.0 - Копирование файлов с повреждённых носителей&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Плагины файловой системы:&lt;/strong&gt;&lt;br /&gt;PluginManager 1.6.0.0 - Управление всеми плагинами&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Плагины внутреннего просмотра:&lt;/strong&gt;&lt;br /&gt;ListDoc 1.2.0.0 - Просмотр документов Word&lt;br /&gt;Excellence 1.1.1.0 - Просмотр документов Excel&lt;br /&gt;HtmlView 1.1.0.0 - Просмотр html&lt;br /&gt;ICLView 2.5.0.0 - Просмотр иконок и icl архивов&lt;br /&gt;Imagine 1.0.5.0 - Просмотр изображений&lt;br /&gt;MediaShow 0.9.5.0 - Прослушивание музыки и просмотр фильмов&lt;br /&gt;Office2007 0.0.4.0 - Просмотр docx, ppsx, pptx, xlsx файлов&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Информационные плагины:&lt;/strong&gt;&lt;br /&gt;DirSizeCalc 1.0.7.0 - Подсчёт размеров файлов и папок&lt;br /&gt;Exif 1.4.7.b - Служебная информация о фотографии &lt;br /&gt;Media 0.6.0.0 - Информация об аудио и видео файлах&lt;br /&gt;Images 0.0.0.0 - Информация об изображениях&lt;br /&gt;NTLinks 1.0.0.7 - Показ жёстких и символических ссылок&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Дополнительные программы:&lt;/strong&gt;&lt;br /&gt;AkelPad 4.7.9.0 - Хороший блокнот с плагинами&lt;br /&gt;Back2Life 2.5.0.0 - Восстановление удалённых данных&lt;br /&gt;HDD Scanner 2.8.0.0 - Отображение винта в виде диаграммы&lt;br /&gt;No Close Replacer 1.3.0.0 - Запуск дос-программ по Shift+Enter&lt;br /&gt;Starter 5.6.1.4 - Автозагрузка и список процессов компа&lt;br /&gt;TCUPNew 1.3.0.0 - Быстрое создание текстовых файлов&lt;br /&gt;NtfsLinks 1.2.1.0 - Создание жёстких и символических ссылок &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Архиваторы:&lt;/strong&gt;&lt;br /&gt;Ace 2.0.4.0 - Консольный архиватор&lt;br /&gt;ARJ Rus 3.1.0.0 - Консольный архиватор&lt;br /&gt;Lha 2.6.7.0 - Консольный архиватор&lt;br /&gt;UC 3.0.5.0 - Консольный архиватор&lt;br /&gt;WinRAR GUI 4.2.0.0 - Архиватор с графическим интерфейсом&lt;br /&gt;MsCab 0.6.3.0 - Работает через плагин MultiArc&lt;br /&gt;7z 4.5.7.0 - Работает через плагин 7zip&lt;br /&gt;Uharc 0.6.0.0 - Работает через плагин MultiArc&amp;#160; &amp;#160;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;В этой версии:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt;Обновлён NoClose Replacer 1.3.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;Добавлен архиватор uharc 0.6 для работы с uha-архивами (только создание, просмотр и извлечние файлов).&lt;br /&gt;&lt;strong&gt;3.&lt;/strong&gt;Обновлён архиваторный плагин MultiArc 1.4.17.&lt;br /&gt;&lt;strong&gt;4.&lt;/strong&gt;Добавлен архиваторный плагин Imaginator 2.03 для открытия и редактирования образов ima и img (есть ограничение на размер, составляющее примерно 50 Мб).&lt;br /&gt;&lt;strong&gt;5.&lt;/strong&gt;Обновлён блокнот AkelPad 4.7.9 и плагины к нему.&lt;br /&gt;&lt;strong&gt;6.&lt;/strong&gt;Исправлена ошибка вызова справки по настройкам wincmd.ini.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;MD5 инсталлятора:&lt;/strong&gt;&lt;br /&gt;a23628219d259985bdfef4a7d82d05cc *Total_Commander_8.01_NP_20.11.2012.exe&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Скачать (~7,9 Мб):&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://narod.ru/disk/63857904001.999e408962c47626352a31752870dbe4/Total_Commander_8.01_NP_20.11.2012.zip.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://narod.ru/disk/63857904001.999e40 &amp;#8230; 2.zip.html&lt;/a&gt;&lt;br /&gt;p.s. Ссылка не является прямой, что бы скачать программу, ссылку нужно открывать и качать в браузере.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Sun, 02 Sep 2012 14:15:09 +0400</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=37#p37</guid>
		</item>
		<item>
			<title>Foobar2000 1.03 NP (25.06.2010)</title>
			<link>http://usable.mybb.ru/viewtopic.php?pid=34#p34</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;span style=&quot;font-size: 24px&quot;&gt;Foobar2000 1.03 &lt;span style=&quot;color: #336699&quot;&gt;Naben Preferences &lt;/span&gt; &lt;span style=&quot;color: red&quot;&gt;(25.06.2010)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;a href=&quot;http://radikal.ru/F/s019.radikal.ru/i639/1211/19/31b6a30a324b.jpg.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s019.radikal.ru/i639/1211/19/31b6a30a324bt.jpg&quot; alt=&quot;http://s019.radikal.ru/i639/1211/19/31b6a30a324bt.jpg&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Год выпуска&lt;/strong&gt;: 2010&lt;br /&gt;&lt;strong&gt;Версия&lt;/strong&gt;: 25.06.2010&lt;br /&gt;&lt;strong&gt;Разработчик&lt;/strong&gt;: &lt;a href=&quot;http://www.usable.mybb.ru/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Naben&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Платформа&lt;/strong&gt;: Windows&lt;br /&gt;&lt;strong&gt;Совместимость с Vista&lt;/strong&gt;: да&lt;br /&gt;&lt;strong&gt;Системные требования&lt;/strong&gt;: Любые&lt;br /&gt;&lt;strong&gt;Таблэтка&lt;/strong&gt;: Не требуется&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Доп. информация&lt;/strong&gt;:&lt;br /&gt;Foobar2000 1.03&amp;#160; Naben&amp;#160; Preferences&amp;#160; -&amp;#160; &amp;#160;хороший&amp;#160; аудиоплеер с&amp;#160; минималистичным интерфейсом,&amp;#160; включающий в&amp;#160; себя&amp;#160; множество функций для поддержки метаданных и высококачественного&amp;#160; воспроизведения&amp;#160; аудио,&amp;#160; а&amp;#160; также&amp;#160; удобная оболочка&amp;#160; &amp;#160;для конвертирования огромного числа аудиформатов.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Основные отличия и преимущества данной сборки:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt;Маленькая и компактная сборка, которая очень легка в освоении.&lt;br /&gt;&lt;strong&gt;2.&lt;/strong&gt;Пока ещё не придумал.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Отличия клавиатурных сочетаний:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;F1&lt;/strong&gt; - Открыть этот документ &lt;br /&gt;&lt;strong&gt;F2&lt;/strong&gt; - Добавить в очередь &lt;br /&gt;&lt;strong&gt;F3&lt;/strong&gt; - Очистить очередь &lt;br /&gt;&lt;strong&gt;F4&lt;/strong&gt; - Открыть файл лирики &lt;br /&gt;&lt;strong&gt;F5&lt;/strong&gt; - Перечитать теги &lt;br /&gt;&lt;strong&gt;F6&lt;/strong&gt; - Переименовать &lt;br /&gt;&lt;strong&gt;F7&lt;/strong&gt; - Поиск &lt;br /&gt;&lt;strong&gt;F8&lt;/strong&gt; - Очистить плейлист &lt;br /&gt;&lt;strong&gt;F9&lt;/strong&gt; - Диалог конвертации &lt;br /&gt;&lt;strong&gt;F10&lt;/strong&gt; - Диалог Text Tools &lt;br /&gt;&lt;strong&gt;F11&lt;/strong&gt; - Сохранить настройки &lt;br /&gt;&lt;strong&gt;F12&lt;/strong&gt; - Диалог выбора темы оформления &lt;br /&gt;&lt;strong&gt;Left&lt;/strong&gt; - Перемотать назад на 10 сек. &lt;br /&gt;&lt;strong&gt;Right&lt;/strong&gt; - Перемотать вперед на 10 сек. &lt;br /&gt;&lt;strong&gt;Ctrl+Enter&lt;/strong&gt; - Открыть текущий каталог в Total Commander &lt;br /&gt;&lt;strong&gt;Shift+Enter&lt;/strong&gt; - Открыть текущий каталог в Проводнике &lt;br /&gt;&lt;strong&gt;1&lt;/strong&gt; - Свойства файла (теги) &lt;br /&gt;&lt;strong&gt;2&lt;/strong&gt; - Свойства файла &lt;br /&gt;&lt;strong&gt;3&lt;/strong&gt; - Диалог &amp;quot;Типы тегов&amp;quot; &lt;br /&gt;&lt;strong&gt;4&lt;/strong&gt; - Получить теги из базы freedb2.org &lt;br /&gt;&lt;strong&gt;5&lt;/strong&gt; - Сверить lossless в базе accuraterip.com&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Плагины:&lt;/strong&gt;&lt;br /&gt;foo_cuefilter.dll 0.1.7.0 - Фильтрует дубликатов, работа с CUE файлами &lt;br /&gt;foo_cuesheet_creator.dll 0.4.6 - Создание списков Cuesheet &lt;br /&gt;foo_dsp_bs2b.dll 3.1.0 - Улучшение звучания аудио в наушниках &lt;br /&gt;foo_dumb.dll 0.9.9.16 - Проигрывает трекерные файлы &lt;br /&gt;foo_input_alac.dll 1.0.5 - Проигрывает файлы Apple Lossless ALAC. &lt;br /&gt;foo_input_monkey.dll 2.1.4 - Проигрывает файлы Monkey&#039;s Audio files (.APE)&lt;br /&gt;foo_masstag.dll 1.8.4 - Автоматическое редактирование тэгов &lt;br /&gt;foo_midi.dll 1.94 - Проигрывает файлы midi &lt;br /&gt;foo_out_ks.dll 1.2.2 - Воспроизведение напрямую мимо микшера Windows&lt;br /&gt;foo_preview.dll 1.4 - Предпрослушивание треков &lt;br /&gt;foo_run.dll 0.3.7 - Выполняет внешнюю программу &lt;br /&gt;foo_stop_after_queue.dll 0.1 - Отановка после очереди &lt;br /&gt;foo_textfile.dll 0.0.3 - Создание текстовых фалов лирики &lt;br /&gt;foo_texttools.dll 1.0.3 - Копирование информации о файле &lt;br /&gt;foo_ui_hacks.dll 30.04.10 - Хак для небольшого расширения функционала &lt;br /&gt;foo_uie_esplaylist.dll 0.1.1.0 - Компонент удобного плейлиста &lt;br /&gt;foo_uie_lyrics2.dll 0.4.6.15 - Скачивает из интернета и отображает лирику &lt;br /&gt;foo_utils.dll 0.6.2 - Файловые операции над треками плейлиста &lt;br /&gt;foo_verifier.dll 1.1 - Проверяет файлов на ошибки декодирования &lt;br /&gt;foo_vis_vumeter.dll 07.06.10 - Аналоговый индикатор уровня громкости &lt;br /&gt;foo_wave_seekbar.dll 0.2.5 - Полосу прокрутки в виде формы волны &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Энкодеры: &lt;/strong&gt;&lt;br /&gt;flac.exe 1.2.1 - Конвертация в *.flac &lt;br /&gt;wavpack.exe 4.60.0 - Конвертация в *.wv &lt;br /&gt;lame.exe 3.98.2 - Конвертация в *.mp3 &lt;br /&gt;Takc.exe 1.1.2 - Конвертация в *.tak &lt;br /&gt;MAC.exe 4.06 - Конвертация в *.ape &lt;br /&gt;oggenc2.exe 1.21 RC2 - Конвертация в *.ogg &lt;br /&gt;mppenc.exe 1.16 - Конвертация в *.mpc &lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;В этой версии:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.&lt;/strong&gt;Первая alfa сборка.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;MD5 инсталлятора:&lt;/strong&gt;&lt;br /&gt;a42d2e38c5b511fe6d4d4d10ef0a9803 *Foobar2000_1.03_NP_(25.06.2010).exe&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Скачать (~6 Мб):&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;http://narod.ru/disk/63858328001.4c28bdb5811ca7bdad4d652f16c9b7c1/Foobar2000_1.03_NP_(25.06.2010).zip.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;http://narod.ru/disk/63858328001.4c28bd &amp;#8230; ).zip.html&lt;/a&gt;&lt;br /&gt;p.s. Ссылка не является прямой, что бы скачать программу, ссылку нужно открывать и качать в браузере.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Admin)</author>
			<pubDate>Tue, 06 Jul 2010 22:48:28 +0400</pubDate>
			<guid>http://usable.mybb.ru/viewtopic.php?pid=34#p34</guid>
		</item>
	</channel>
</rss>
