ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠΎΠ³ΠΎ GSM-ΡΠ΅Π»Π΅ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡΡ Π»ΡΠ±ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ, ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΡ Π½Π° 220 Π ΠΈ ΠΌΠΎΡΠ½ΠΎΡΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 2 ΠΊΠΡ, Π² Π»ΡΠ±ΠΎΠΌ ΡΠ³ΠΎΠ»ΠΊΠ΅ ΠΠ΅ΠΌΠ»ΠΈ, Π³Π΄Π΅ Π΅ΡΡΡ ΡΠΎΡΠΎΠ²Π°Ρ ΡΠ΅ΡΡ.
ΠΠ°Π½Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ arduino nano ΡΠ΅ΡΠ΅Π· gsm ΠΌΠΎΠ΄ΡΠ»Ρ SIM800L. Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΡ
Π΅ΠΌΠ° ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΡΡΡΠΈΡ
ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅. ΠΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠ², ΡΠ°ΠΊ ΠΈ ΠΎΡ ΡΠ΅ΡΠΈ 220 Π. ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΎΡ ΡΠ΅ΡΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ Π΄ΠΎ 2 ΠΊΠΡ ΡΠ»Π΅ΠΊΡΡΠΎΡΠ½Π΅ΡΠ³ΠΈΠΈ. ΠΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠ², ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π²ΡΡ
ΠΎΠ΄Π½Π°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ 300 ΠΡ.
ΠΠΎΡΠΎΡΠΊΠΎ ΠΎ ΡΡ
Π΅ΠΌΠ΅.
Π ΡΡΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΠΈΡΡ 4 Π±Π»ΠΎΠΊΠ°:
- Π±Π»ΠΎΠΊ ΠΈΠ½Π²Π΅ΡΡΠΎΡΠ°
- Π±Π»ΠΎΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΈ Π±Π°ΡΠ°ΡΠ΅ΠΉ
- Π±Π»ΠΎΠΊ Π±Π΅ΡΠΏΠ΅ΡΠ΅Π±ΠΎΠΉΠ½ΠΈΠΊΠ°
- Π±Π»ΠΎΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ.
ΠΠ»ΠΎΠΊ ΠΈΠ½Π²Π΅ΡΡΠΎΡΠ° β ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠΉ ΠΈΠ½Π²Π΅ΡΡΠΎΡ ΠΌΠΎΡΠ½ΠΎΡΡΡΡ 500Ρ. ΠΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΠΈ Ρ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΠΌΠΎΡΠ½ΠΎΡΡΡΡ, Π½ΠΎ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π²ΡΡ ΠΎΠ΄Π½Π°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ ΡΠΎΠΆΠ΅ ΡΠΌΠ΅Π½ΡΡΠΈΡΡΡΡ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ ΠΈΠ½Π²Π΅ΡΡΠΎΡΠ°.
ΠΠ»ΠΎΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΈ Π±Π°ΡΠ°ΡΠ΅ΠΉ β ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ Π΄Π΅ΡΠ΅Π²ΡΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ BMS S3 ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ 3Ρ Π»ΠΈΡΠΈΠΈΠΉ ΠΈΠΎΠ½Π½ΡΡ Π±Π°ΡΠ°ΡΠ΅ΠΉ. ΠΠ°ΡΠ°ΡΠ΅ΠΈ ΡΡΠΎΡΡ Π²ΡΡΠΎΠΊΠΎΡΠΎΠΊΠΎΠ²ΡΠ΅. ΠΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΠ΄Π°Π²Π°ΡΡ ΡΠΎΠΊ Π² 35 Π°ΠΌΠΏΠ΅Ρ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ΅Π½ΡΡΠ°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΊΡΠΏΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ΅Π²ΡΠ΅ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΡ Ρ ΠΌΠ΅Π½ΡΡΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΡΠΎΠΊΠΎΠΌ.
ΠΠ»ΠΎΠΊ Π±Π΅ΡΠΏΠ΅ΡΠ΅Π±ΠΎΠΉΠ½ΠΈΠΊΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π½Π° ΡΡΠ°Π½Π·ΠΈΡΡΠΎΡΠ΅ VT3, VD4, R4, R5, R3. ΠΠ°ΡΠΎΠ΄ ΡΡΠ°Π±ΠΈΠ»ΠΈΡΡΠΎΠ½Π° VD4 ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ Π½Π° ΠΏΡΡΠΌΡΡ ΠΊ Π±Π»ΠΎΠΊΡ ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈ ΠΏΡΠΈ ΠΏΠΎΠ΄Π°ΡΠ΅ ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°Π½Π·ΠΈΡΡΠΎΡ VT3 ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ. ΠΠΎΡΠ»Π΅ Π΅Π³ΠΎ ΠΎΡΠΊΡΡΡΠΈΡ Π½Π° Π²ΡΠ΅ Π²Ρ ΠΎΠ΄Ρ ΡΠ΅Π»Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π» ΠΈ ΡΠ΅Π»Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡ Π΅ΠΌΡ ΠΎΡ Π±Π»ΠΎΠΊΠ° ΠΏΠΈΡΠ°Π½ΠΈΡ. ΠΠ°ΠΆΠ½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ Π³ΠΎΡΠΎΠ²ΡΡ ΡΠ΅Π»Π΅ΠΉΠ½ΡΡ ΡΠ±ΠΎΡΠΎΠΊ: Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π° Π²Ρ ΠΎΠ΄ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π», Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠΌ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, ΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ R3 ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²ΠΈΡΡ Π² ΡΠ°Π·ΡΡΠ² ΡΠΌΠΈΡΠ΅ΡΠ° ΡΡΠ°Π½Π·ΠΈΡΡΠΎΡΠ° VT3 ΠΈ ΡΠΎΠ΅Π΄Π΅Π½ΠΈΡΡ Π²Ρ ΠΎΠ΄ ΡΠ΅Π»Π΅ Ρ ΡΠΌΠΈΡΠ΅ΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΡΠ°Π½Π·ΠΈΡΡΠΎΡΠ°.
ΠΠ»ΠΎΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ β ΡΠΎΠ±ΡΠ°Π½ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π΅ SIM800 ΠΈ arduino nano.
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠΎΠ±ΡΠ°Π½Π½Π°Ρ ΡΡ
Π΅ΠΌΠ°
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π² ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
Π§ΡΠΎΠ±Ρ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π½Π°ΡΠ°Π»ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΌΡ Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° Π½ΡΠΆΠ½ΠΎ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ your_phone Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π°. Π’Π°ΠΊ ΠΆΠ΅ ΠΊ Π°ΡΠ΄ΡΠΈΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ LCD Π΄ΠΈΡΠΏΠ»Π΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ wh1601 ΠΈΠ»ΠΈ wh0802, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΡΡΠΎΡΠΊΠΈ cΠ½Π°Π΄ΠΏΠΈΡΡΡ lcd.
ΠΠΎΠ΄
char your_phone = "+79148389933";
#include <SoftwareSerial.h> // ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ SoftwareSerial Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ΠΏΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠΈΠ½Π΅ UART
SoftwareSerial softSerial(8,9); // Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ softSerial ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π²ΡΠ²ΠΎΠ΄Ρ RX, TX (ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π²ΡΠ²ΠΎΠ΄Ρ Arduino UNO)
// include the library code:
//#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
//const int rs = 12, en = 11, d4 = 5, d5 = 6, d6 = 7, d7 = 10;
//LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ²ΠΎΠ΄ TX ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ 2 Arduino, Π° Π²ΡΠ²ΠΎΠ΄ RX ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ 3 Arduino.
// ΠΠ½ΠΈΡΠΈΠΈΡΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΡΠΈΠ½ UART Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠΊΠΎΡΠΎΡΡΠ΅ΠΉ ΠΎΠ±Π΅ΠΈΡ
ΡΠΈΠ½: //
String buf2,buf3;
int g=0;
String cmd1;
void setup(){ //
init_port();
// lcd.begin(16, 2);
// Print a message to the LCD.
//lcd.clear();
// lcd.setCursor(0, 0);
/// lcd.print("VKL");
// lcd.setCursor(0, 1);
/// lcd.print("ZHDITE");
/// init_port();// ΠΠ½ΠΈΡΠΈΠΈΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΈΠ½Π΅ UART Π½Π° ΡΠΊΠΎΡΠΎΡΡΠΈ 9600 (ΠΌΠ΅ΠΆΠ΄Ρ Arduino ΠΈ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠΌ)
softSerial.begin(9600); // ΠΠ½ΠΈΡΠΈΠΈΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄Π°Π½Π½ΡΡ
ΠΏΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠΈΠ½Π΅ UART Π½Π° ΡΠΊΠΎΡΠΎΡΡΠΈ 38400 (ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ΠΈ Arduino)
Serial.begin(9600);
delay(30000);
// cmd1 ="AT+CMGF=1rn";
softSerial.print("AT+CMGF=1rn");
/// print_lcd(cmd1);
delay(1000);
dellAllSMS();
// cmd1 ="AT+CMGDA="DEL ALL"rn";
// print_lcd(cmd1);
//cmd1="AT+CPAS";
/// print_lcd(cmd1);
} //
char c;
int m=0;
int i=0;//
int n=0;
// ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ: // ΠΡΡ ΡΡΠΎ ΠΏΡΠΈΡΠ»ΠΎ Ρ ΠΌΠΎΠ΄ΡΠ»Ρ - ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΡ, Π° Π²ΡΡ ΡΡΠΎ ΠΏΡΠΈΡΠ»ΠΎ Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° - ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ
void dellAllSMS(){
/* This deletes all sms in memory
*/
softSerial.print("AT+CMGDA="DEL ALL"rn"); // set sms to text mode
delay(3000);
}
void pin_on_setb()
{
digitalWrite(2,1);
digitalWrite(13,1);
}
void pin_off_setb()
{
digitalWrite(2,0);
digitalWrite(13,0);
}
void pin_on_inv()
{
digitalWrite(3,1);
// digitalWrite(13,1);
}
void pin_off_inv()
{
digitalWrite(3,0);
// digitalWrite(13,0);
}
void init_port()
{
pinMode(2,1);
pinMode(3,1);
pinMode(13,1);
}
String readData(){
// this function just reads the raw data
uint16_t timeout=0;
while (!softSerial.available() && timeout<10000)
{
delay(10);
timeout++;
}
if(softSerial.available())
{
String output = softSerial.readString();
//if(DEBUG)
/// Serial.println(output);
return output;
}
}
String buf, bufferIndex;
int tempIndex=0;
int messageIndex;
int prev=0;
int power=0;
void loop(){ //
/* if(softSerial.available()){ Serial.write(softSerial.read());} // ΠΠ΅ΡΠ΅Π΄Π°ΡΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠΈΠ½Ρ UART Π² Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ (ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΅ΡΠ΅Π· Arduino ΠΊ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΡ)
if( Serial.available()){softSerial.write( Serial.read());} // ΠΠ΅ΡΠ΅Π΄Π°ΡΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΈΠ½Ρ UART Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ (ΠΎΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° ΡΠ΅ΡΠ΅Π· Arduino ΠΊ ΠΌΠΎΠ΄ΡΠ»Ρ )*/
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("Nagruzka");
// lcd.setCursor(0, 1);
// if (power==1)
// {
// lcd.print("VKL");
// }
// else {lcd.print("VIKL");}
softSerial.print(F("AT+CMGL="ALL",0"));
softSerial.print("r");
buf = readData();
// Serial.println(buf);
tempIndex = buf.lastIndexOf("+CMGL: ");
tempIndex = tempIndex + 6;
bufferIndex = buf.substring(tempIndex);
bufferIndex = bufferIndex.substring(1,(bufferIndex.indexOf(",")));
messageIndex = bufferIndex.toInt();
///Serial.println(messageIndex);
if(prev!=messageIndex)
{
tempIndex = buf.lastIndexOf(your_phone);
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("SMS READ");
if((digitalRead(4))&&(tempIndex!=-1))
{
pin_on_inv();
delay(2000);
pin_off_inv();
// i=1;
// power=1;
}
else
{
pin_on_setb();
delay(2000);
pin_off_setb();
// i=1;
// power=1;
}
// send_sms(number3);
prev++;
}
if(messageIndex>=2)
{
dellAllSMS();
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("SMS READ");
// lcd.setCursor(0, 1);
// lcd.print("SMS DEL");
// cmd1 ="AT+CMGDA="DEL ALL"rn";
// print_lcd(cmd1);
prev=0;
}
delay(10000);
}
STL ΡΠ°ΠΉΠ» Π΄Π»Ρ ΠΏΠ΅ΡΠ°ΡΠΈ ΠΊΠΎΡΠΎΠ±ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ
ΠΠΈΠ΄Π΅ΠΎ ΡΠ°Π±ΠΎΡΡ:
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com