Передать влажность с Arduino на другую Arduino посредством UART

seval
Offline
Зарегистрирован: 31.03.2013

Здравтвсуйте Уважаемые!

Мне необходимо включать вытяжной вентилятор при определенной влажности. Вентилятор один, а помещений откуда буду брать показания влажности - два. Есть несколько штук китайских, дешевых Arduino Pro Mini.

К первой Про Мини подключен DHT11.

#include "DHT.h"
 
#define DHTPIN 2     // what pin we're connected to
 
// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
 
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}
 
void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
  }
}

Я так понимаю, если здесь данные передаются в Serial, то их можно выловить другой Ардуино? 

Не подскажете как? 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Дак прямо и включайте одно SSR с двух дуин... Только диодами и резисторами их развяжите друг от друга...

seval
Offline
Зарегистрирован: 31.03.2013

Andrey_Y_Ostanovsky пишет:

Дак прямо и включайте одно SSR с двух дуин... Только диодами и резисторами их развяжите друг от друга...

Я прощу прощения, не сообщил что мало в этом разбираюсь. Я не понял что такое SSR?

Geronimo
Offline
Зарегистрирован: 06.05.2013

seval пишет:

Andrey_Y_Ostanovsky пишет:

Дак прямо и включайте одно SSR с двух дуин... Только диодами и резисторами их развяжите друг от друга...

Я прощу прощения, не сообщил что мало в этом разбираюсь. Я не понял что такое SSR?

 

Solis state relay

seval
Offline
Зарегистрирован: 31.03.2013

Ну у меня есть блок из 16 реле для ардуино. Там задуманно много чего. Хотелось бы именно вылавливать из UART и обрабатывать. Не нашел подобной информации в инете, потому спросил здесь.

А так спасибо. Не подумал о таком варианте.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Лучше вот тут почитать цикл статей...

http://easyelectronics.ru/upravlenie-moshhnoj-nagruzkoj-peremennogo-toka...

 

seval
Offline
Зарегистрирован: 31.03.2013

Andrey_Y_Ostanovsky пишет:

Лучше вот тут почитать цикл статей...

Дак у меня есть уже Relay Shield. Тиристоры это потом.

Если сделать так для передающего

#include "DHT.h"
#define DHTPIN 2     // what pin we're connected to
// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");
  dht.begin();
}

void loop() {

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(t) || isnan(h)) {

    Serial.println("Failed to read from DHT");

  } else {


    Serial.print(h);
    
   

  }

}

и для принимающего

int outputPin = 13;                //Вместо реле пока диод
int val;                           //здесь будет храниться принятый символ

void setup()
{
  Serial.begin(9600);              //установка порта на скорость 9600 бит/сек
  pinMode(outputPin, OUTPUT);      //устанавливаем 13 контакт в режим вывода
}

void loop()
{
  if (Serial.available()) {         //если есть принятый символ,
    val = Serial.read();            //  то читаем его и сохраняем в val
    if (val >= 50) {               //  если влажность выше 50%
      digitalWrite(outputPin, HIGH);//  то включаем светодиод
    }
    else {               //  иначе
      digitalWrite(outputPin, LOW); //    то выключаем светодиод
    }
  }
}

Будет так работать?

vlkam
Offline
Зарегистрирован: 17.02.2013

Если хочется именно UART тогда нужно смотреть в сторону RS485 и, соответственно микросхемы (или модуля) MAX485

seval
Offline
Зарегистрирован: 31.03.2013

Спасибочки. Вы уже не первый который говорит про RS485. Значит буду пробовать Модбас. Микрухи куплю, буду здесь спрашивать что и как.

vlkam
Offline
Зарегистрирован: 17.02.2013

seval пишет:
Спасибочки. Вы уже не первый который говорит про RS485. Значит буду пробовать Модбас. Микрухи куплю, буду здесь спрашивать что и как.

Модбас я так понимаю это протокол.

Если нужен обмен в одну сторону, то достаточно купить 2 шт (или больше) MAX485, вотнуть их в серийный порт, соединить проводами и работать как с серийником.

Вообще 485 отличается от обычного серийного только тем, что ему нужно указывать, в каком режиме работать - прием или передача

seval
Offline
Зарегистрирован: 31.03.2013

vlkam пишет:

Модбас я так понимаю это протокол.

Наверное. Я не очень в этом понимаю. Но помню что Модбас как то связан с RS485.

freearduino
Offline
Зарегистрирован: 21.04.2014

А можно сделать проще!

Передавать данные через передатчик и приемник 433МГц. Там очень простой код передачи и если расстояния не очень большие то работает отлично.
Не нужно никакие провода тянуть и передатчик стоит около 90р

seval
Offline
Зарегистрирован: 31.03.2013

freearduino пишет:

А можно сделать проще!

Передавать данные через передатчик и приемник 433МГц. Там очень простой код передачи и если расстояния не очень большие то работает отлично.
Не нужно никакие провода тянуть и передатчик стоит около 90р

Есть у меня такие передатчики. Еще не разбирался как с ними работать. Но у меня есть возможность бросить провода. Почему бы не сделать на проводах? А эфир оставить для будущих идей.

freearduino
Offline
Зарегистрирован: 21.04.2014

Ну я бы все таки не проводил провода

1)Нужно тратить время

2)Провода можно случайно перебить

3)С ними много мороки

Датчики стоят дешево и стабильно работают!)

В интернете много готовых программ!

 

P.S. Ну а так дело ваше)

vlkam
Offline
Зарегистрирован: 17.02.2013

freearduino пишет:
Ну я бы все таки не проводил провода

А насколько надежна связь ? У Вас есть опыт ?

freearduino
Offline
Зарегистрирован: 21.04.2014

Я делал метеостанцию. Там ардуина измеряет температуру и передает на другую ардуино.

Все работает очень надежно, в пределах 2-х комнатной квартиры все отлично! На майских праздника буду пробывать на дальность.

Смотрите код, если что не понятно спрашивайте.

http://cxem.net/cms/drafts/4430/preview/

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Странная логика. На мой взгляд, провода всегда лучше, если есть возможность их провести. Конечно, если не километр длиной. Впрочем ладно, это философский вопрос. Лично я бы не стал связываться с радио, если бы были провода.

freearduino
Offline
Зарегистрирован: 21.04.2014

Может быть вы и правы....но мне кажется провода это прошлый век)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ну хорошо, радио. Сосед поставил тоже самое и досвидос радио. Вспомните вафлю,мне пришлось купить роутер на 5 ГГц, потому что на 2.4 всё засрано. Может провода и винтаж, но пока что.. Особенно если провода культурно лежат в кабель канале. Да ладно это всего лишь моё мнение, не парьтесь, опыт - сын ошибок трудных.. С проводами на мой взгляд проблемы в расстоянии, usart метров на 15 можно сделать, либо городить типа рс485. Сам не делал, потому - теоретически, плюс начитался этого всего.

 

vlkam
Offline
Зарегистрирован: 17.02.2013

freearduino пишет:
На майских праздника буду пробывать на дальность.

Очень интересно, расскажите пожалуйста о результатах

seval
Offline
Зарегистрирован: 31.03.2013

freearduino пишет:

Я делал метеостанцию. Там ардуина измеряет температуру и передает на другую ардуино.

Все работает очень надежно, в пределах 2-х комнатной квартиры все отлично! На майских праздника буду пробывать на дальность.

Смотрите код, если что не понятно спрашивайте.

http://cxem.net/cms/drafts/4430/preview/

Страница не найдена

freearduino
Offline
Зарегистрирован: 21.04.2014
Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

kisoft пишет:

Особенно если провода культурно лежат в кабель канале.

... и по этому кабель-каналу к Вам дружными рядами топают муравьи, тараканы и прочая мелкая нечисть...

Наглухо бетонированные в глубине стеновой плиты провода - это наше всё!

vlkam
Offline
Зарегистрирован: 17.02.2013

Andrey_Y_Ostanovsky пишет:
Наглухо бетонированные в глубине стеновой плиты провода - это наше всё!

Дом дает усадку и наглуго бетонированные провода рвуться как нитки !

:-)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Это уже детали, как проложить. Я себе в новой хате не оставил под полом трубки для кабелей, теперь маюсь. Антенный провод верхом пробросил. Беда

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

kisoft пишет:
Я себе в новой хате не оставил под полом трубки для кабелей, теперь маюсь.

А я положил, но, как выясняется, недостаточно: надо было двойной запас гофры сразу бетонировать. :)

Насчет усадки дома - это миф, если пойдет усадка поперек провода - никакие каналы (даже железная труба) не спасут.

seval
Offline
Зарегистрирован: 31.03.2013


Может я как то не так нажимаю. Но все равно Страница не найдена.

seval
Offline
Зарегистрирован: 31.03.2013

kisoft пишет:
Это уже детали, как проложить.

Мне можно сказать повезло. Отделки внутренней практически нет, потому ещё можно кабели тянуть.

freearduino
Offline
Зарегистрирован: 21.04.2014

Извиняюсь

Вот правильная сылка http://cxem.net/arduino/arduino115.php

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

seval пишет:
kisoft пишет:
Это уже детали, как проложить.
Мне можно сказать повезло. Отделки внутренней практически нет, потому ещё можно кабели тянуть.

Удачи, а то мне теперь сверлить 160мм бетона в неудобных местах. Перфоратор есть, но это слабое утешение. Эхх

freearduino
Offline
Зарегистрирован: 21.04.2014

kisoft пишет:

seval пишет:
kisoft пишет:
Это уже детали, как проложить.
Мне можно сказать повезло. Отделки внутренней практически нет, потому ещё можно кабели тянуть.

Удачи, а то мне теперь сверлить 160мм бетона в неудобных местах. Перфоратор есть, но это слабое утешение. Эхх

 Я вот все никак не пойму, в наше время есть множество способов передачи данных. Зачм тянуть провода там где это можно не делать?

Даже питание Ардуины можно делать "локальным" используя солнечные панели. И если питать только ардуино то все окупится быстро.

seval
Offline
Зарегистрирован: 31.03.2013

freearduino пишет:

 Я вот все никак не пойму, в наше время есть множество способов передачи данных.

Стереотипы батенька. Мы русские такие загадочные!!!

Я вот пугало хочу сделать от птиц. Там я думу думаю как солнечными элементами запитать. А в двух ванных мне проще провода бросить.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

freearduino, попробуйте по воздуху подключить антенный провод и смотреть на другом конце кабельное телевидение и обычное аналоговое. Всё попкорн закончился

 

freearduino
Offline
Зарегистрирован: 21.04.2014

kisoft пишет:

freearduino, попробуйте по воздуху подключить антенный провод и смотреть на другом конце кабельное телевидение и обычное аналоговое. Всё попкорн закончился

И зачем мне переавать такой большой обьем данных?

Ведь речь шла о передачи числовых данных, а ели нужно вещать видео то и тут есть передатчики которые позволяют передаввать видео на расстояния 1200м. Так-же можно взять Wi-Fi переатчики.

P.S. Я конечно не утвержда что везде можно применить беспрводную технологию....)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вам не надо, а я в 24 сообщении говорил, что у меня проблема антенный кабель прокинуть, в этом контексте я и говорю

seval
Offline
Зарегистрирован: 31.03.2013

Мои микрухи MAX485 еще не пришли. Но у меня есть набор приемник/передатчик на 433 Мгц.

Попробовал передать влажность. Вроде получилось. 

Передатчик

#include <VirtualWire.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup(void)
{
	//Serial.begin(9600);
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
  dht.begin();
  
}

void loop(void)
{
	float h = dht.readHumidity();
  int number = h;
  char symbol = 'H';
  
  String strMsg = "z ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";
  
  char msg[255];
  
  strMsg.toCharArray(msg, 255);
  
  Serial.println(msg);
  
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(200);
}

Приемник

#include <VirtualWire.h>
int led = 13;

void setup()
{
  Serial.begin(9600);
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Задаем скорость приема
  vw_rx_start(); // Начинаем мониторинг эфира
  pinMode (led, OUTPUT);
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
  uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера

  if (vw_get_message(buf, &buflen)) // Если принято сообщение
  {
    // Начинаем разбор
    int i;
    // Если сообщение адресовано не нам, выходим
    if (buf[0] != 'z')
    {
      return; 
    }
    char command = buf[2]; // Команда находится на индексе 2
    
    // Числовой параметр начинается с индекса 4
    i = 4; 
    int number = 0;
    // Посколько передача идет посимвольно, то нужно преобразовать набор символов в число
    while (buf[i] != ' ')
    {
      number *= 10;
      number += buf[i] - '0';
      i++;
    }
    if (number > 40)
  	{
  		digitalWrite (led, HIGH);
  	}
  if (number < 40)	
  {
  	digitalWrite (led, LOW);
  }
    Serial.print(command);
    Serial.print(" ");
    Serial.println(number);
  }
}

Вообщем нужно включать вытяжку при сильной влажности, и выключать при нормальной.

В последующем буду собирать данные и куда нибудь выводить.

Думаю как бы мне передачу организовать по реже. Эфир, так сказать, не забивать.

seval
Offline
Зарегистрирован: 31.03.2013

А как организовать прием данных с двух передатчиков?

freearduino
Offline
Зарегистрирован: 21.04.2014

передатчик передает формирует пакет данных вот в этом цикле:

 String strMsg = "z ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";

Передается массив данных, первое значение массива это символ "z"

А приемник смотрит если первый символ зед то принимает, если нет то не принимает.

Т.е. Нужно в другом передатчики поставить вместо зед другой символ и когда будем принимать то по этому символу можно определить с какого передатчика пришли данные.

seval
Offline
Зарегистрирован: 31.03.2013

Спасибки. Попробую сегодня вечером.

seval
Offline
Зарегистрирован: 31.03.2013

Че то не могу разобратся. 

Получаю влажность с двух датчиков. И не могу распределить чья где влажность.

Код первого передатчика.

#include <VirtualWire.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup(void)
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
  dht.begin();
}

void loop(void)
{
	float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика
  int number = h;
  char symbol = '2';

  String strMsg = "f ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";

  char msg[255];

  strMsg.toCharArray(msg, 255);

  Serial.println(msg);

  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(2000);
}

Код второго

#include <VirtualWire.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup(void)
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
  dht.begin();
}

void loop(void)
{
	float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика
  int number = h;
  char symbol = '1';

  String strMsg = "s";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";

  char msg[255];

  strMsg.toCharArray(msg, 255);

  Serial.println(msg);

  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(2000);
}

Код приемника

#include <VirtualWire.h>

void setup()
{
  Serial.begin(9600);
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Задаем скорость приема
  vw_rx_start(); // Начинаем мониторинг эфира
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
  uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера

  if (vw_get_message(buf, &buflen)) // Если принято сообщение
  {
    // Начинаем разбор
    int i;
    // Если сообщение адресовано не нам, выходим
    if (buf[0] != 'f' & 's')
    {
      return; 
    }
    char command = buf[2]; // Команда находится на индексе 2

    // Числовой параметр начинается с индекса 4
    i = 4; 
    int number = 0;
    // Посколько передача идет посимвольно, то нужно преобразовать набор символов в число
    while (buf[i] != ' ')
    {
      number *= 10;
      number += buf[i] - '0';
      i++;
    }
    if (command = 2)
    {
    	
    Serial.print("Second floor");
    Serial.print(" ");
    Serial.println(number);}
    if (command = 1)
    {
    Serial.print("First floor");
    Serial.print(" ");
    Serial.println(number);}
  }

 

freearduino
Offline
Зарегистрирован: 21.04.2014

Сегодня купил несколько передатчиков и приемников

 

Вечером буду пробывать с нескольких передатчиков принимать сигнал.
Отпишусь.

freearduino
Offline
Зарегистрирован: 21.04.2014

Пробывал принимать данные с нескольких датчико.
Вот тут почитать можно: http://cxem.net/arduino/arduino119.php

Передавал с 2-х датчиков на 1 приемник, вполне неплохо получается.

seval
Offline
Зарегистрирован: 31.03.2013

freearduino пишет:

Вот тут почитать можно: http://cxem.net/arduino/arduino119.php

Спасибочки! Почитаю обязательно.

seval
Offline
Зарегистрирован: 31.03.2013

freearduino пишет:

Вот тут почитать можно: http://cxem.net/arduino/arduino119.php

 

Помогло.

Но теперь туплю и не могу зажечь светодиод если одна из влажности превысит например 42%

Передатчик 1

#include <VirtualWire.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup(void)
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
  dht.begin();
}

void loop(void)
{
	float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика
  int number = h;
  char symbol = 'b';

  String strMsg = "f ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";

  char msg[255];

  strMsg.toCharArray(msg, 255);

  Serial.println(msg);

  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(2000);
}

Предатчик 2

#include <VirtualWire.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11   // DHT 11
DHT dht(DHTPIN, DHTTYPE);

void setup(void)
{
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Устанавливаем скорость передачи (бит/с)
  dht.begin();
}

void loop(void)
{
	float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика
  int number = h;
  char symbol = 'a';

  String strMsg = "s ";
  strMsg += symbol;
  strMsg += " ";
  strMsg += number;
  strMsg += " ";

  char msg[255];

  strMsg.toCharArray(msg, 255);

  Serial.println(msg);

  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx(); // Ждем пока передача будет окончена
  delay(2000);
}

Приемник

#include <VirtualWire.h>
int led = 13;
int h1 = 0;
int h2 = 0;

void setup()
{
  Serial.begin(9600);
  vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Задаем скорость приема
  vw_rx_start(); // Начинаем мониторинг эфира
}
 
void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
  uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера
  if (vw_get_message(buf, &buflen))  {
    int i;
    int j;
    if (buf[0] == 's') {
      i = 4;
      int number = 0;
      while (buf[i] != ' ')  {
        number *= 10;
        number += buf[i] - '0';
        i++;
       
      }
    h2 = number; 
     Serial.print("Second floor-  ");
     Serial.println(number); 
    }
    else  {
       if (buf[0] == 'f')  {
          j = 4;
      int number2 = 0;
      while (buf[j] != ' ')  {
        number2 *= 10;
        number2 += buf[j] - '0';
        j++;
        
      }
    h1 = number2; 
     Serial.print("First floor-  ");
     Serial.println(number2);
       }
    }
 
  }
  if ((h1 || h2) > 42)
  	{
  		digitalWrite (led, HIGH);
  	}
  if ((h1 || h2) < 42)
  	{
  		digitalWrite (led, LOW);
  	}	
}
  

 

seval
Offline
Зарегистрирован: 31.03.2013

Так я и не победил это дело. Пришли мне готовые шилды RS485.

Пытаюсь сделать то что задумал посредством Модбас. Повторюсь необходимо получать данные о влажности с двух помещений, если влажность в любом из помещений поднялась выше (например) 70% то нужно включить вытяжку.

Есть три Ардуино про мини. Три http://www.ebay.com/itm/MAX485-module-RS-485-TTL-to-RS485-MAX485CSA-Converter-Module-For-Arduino-/170934217208?pt=LH_DefaultDomain_0&hash=item27cc7929f8 MODBUS шилда.

Два DHT11 датчитка.

Может уже делал кто то, что нибудь подобное?