Делитель напряжения и ардуино

Урок №5. Как использовать сенсоры с Arduino

К данным урокам для домашнего изучения можно заказать учебный набор.

Стоимость набора 3 200 руб.

Для занятия необходима установленная на компьютерах среда программирования miniBloq и драйвера для Arduino.

Макетные провода папа-папа

Контроллер Arduino UNO

Беспаечная макетная плата

Резистор 10 кОм

Резистор 220 Ом

Добрый день, ребята.

Ранее мы в вами познакомились с цифровыми пинами Arduino и знаем, что они могут принимать на вход только Да (True) или Нет (False).

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

Для этого на Arduino Uno имеется 6 аналоговых входов, с помощью которых можно считывать входящее напряжение.

Эти входы объединены на плате в группу «Analog In» и пронумерованы от A0 до A5. Давайте их найдем.

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

Делитель напряжения — это простая схема, которая позволяет получить из высокого напряжения пониженное. (Рис.1)

Используя только два резистора и входное напряжение, мы можем создать выходное напряжение, составляющее определенную часть от входного. Делитель напряжения является одной из наиболее фундаментальных схем в электронике.

Рис.1 Делитель напряжения

Как рассчитать делитель напряжения?

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

Рис.2 Формула расчета выходного напряжения

Это же потенциометр!

Потенциометр, с которым, я думаю, вы знакомы это и есть делитель напряжения.

Изнутри потенциометр представляет собой резистор и скользящий контакт, который делит резистор на две части и передвигается между этими двумя частями.

С внешней стороны, как правило, у потенциометра имеется три вывода: два контакта подсоединены к выводам резистора, в то время как третий (центральный) подключен к скользящему контакту. (Рис.3)

Рис.3 Схема потенциометра

Если контакты резистора подключить к источнику напряжения (один к минусу, другой к плюсу), то центральный вывод потенциометра будет выдавать напряжение, зависящее от положения ручки потенциометра.

Эксперимент с потенциометром и мультиметром

Проведите эксперимент, снимая показания мультиметром: Переведите движок потенциометра в верхнее положение и напряжение на выходе будет равно входному напряжению. Теперь переведите движок в крайнее нижнее положение и на выходе будет нулевое напряжение. Если же установить ручку потенциометра в среднее положение, то мы получим половину входного напряжения.

Подключение потенциометра к Arduino

Теперь давайте подключим потенциометр к одному из аналоговых входов, например, А2 и попробуем считать показания с помощью Arduino. (Рис. 4)

Рис.4 Подключение потенциометра к Arduino Uno

Важно

Показания входного напряжения от 0 до 5 В на аналоговом входе преобразуются в программе miniBloq в значения от 0 до 100.

Увидеть значения, которые передает нам аналоговый вход, мы можем с помощью блока терминал. (Рис.5)

Рис.5 Блок терминал

Блок терминал отображает на экране компьютера передданные в него значения.

Давайте напишем следующую программу (Рис.6).

Эта программа раз в секунду отправляет данные с аналогового входа А2 (sensor2) в терминал.

Рис.6 Вывод показаний аналогового входа в терминал

Для того, чтобы увидеть значения, необходимо открыть окно терминала (Рис.7)

Рис.7 Окно терминала

Теперь попробуйте повертеть ручку потенциометра. Значения должны меняться.

Светильник с регулируемой яркостью

Теперь предлагаю вам направить ваши знания в полезное русло.

Сделаем светильник с регулируемой яркостью. Для этого модифицируем наше устройство, добавив светодиод.

Так как яркость светодиода должна регулироваться, мы можем подключать его не ко всем пинам.

Конечно, только к тем, которые поддерживают ШИМ. (3, 5, 6, 9, 10, 11). Я выберу пин №5 и не забуду про резистор на 220 ом (Рис.8)

Рис.8 Светильник с регулируемой яркостью

Добавим в нашу программу с потенциометром блок, который будет направлять значения потенциометра в пин №5 на светодиод. (Рис.9)

Рис.9 Программа устройства «Светильник с регулируемой яркостью»

Подключаем сенсор

Другое применение делителя напряжения — это снятие показаний с датчиков.

Существует множество компонентов, которые меняют своё сопротивление в зависимости от внешних условий.

Так, термисторы меняют сопротивление от нуля до определённого значения в зависимости от температуры, фоторезисторы меняют сопротивление в зависимости от интенсивности попадающего на них света и т.д.

Если в схеме делителя напряжения заменить R1 или R2 на один из таких компонентов, напряжение на выходе (Vout) будет меняться в зависимости от внешних условий, влияющих на датчик.

Подключив это выходное напряжение к аналоговому входу Ардуино, можно получать информацию о температуре, уровне освещённости и других параметрах среды.

Допустим, сопротивление фоторезистора изменяется от 1 кОм (при освещении) и до 10 кОм (при полной темноте). Если мы дополним схему постоянным сопротивлением примерно 10 кОм, то мы можем получить широкий диапазон изменения выходного напряжения при изменении освещенности фоторезистора.

Давайте соберем следующую схему. (Рис.10)

Рис.10 Замена потенциометра на резистивный делитель напряжения с фоторезистором.

Теперь ваша программа, которая выводит значения нашего датчика в терминал.

Законспектируйте показания датчика при:

  • плохом освещении,
  • ярком освещении.

Измените программу, добавив условный оператор так, чтобы она включала светодиод, если в комнате темно и выключала его, если в комнате светло. (Рис.11)

Рис. 11. Вариант программы устройства «Умный светильник»

Дополнительно

Заменив фоторезистор на термистор, мы получим пожарную сигнализацию.

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

Задание для самостоятельного исполнения

Подумайте, как можно модифицировать устройство, чтобы порог срабатывания сигнализации или включения светодиода можно было регулировать.

Простой вольтметр на Arduino Uno

В данной статье мы рассмотрим создание на основы платы Arduino Uno и делителя напряжения простого цифрового вольтметра, который будет отображать измеренное значение напряжения на экране жидкокристаллического (ЖК) дисплея 16×2.

Внешний вид простого вольтметра на Arduino Uno

Плата Arduino имеет несколько аналоговых входов, к которым внутри платы подсоединены встроенные аналогово-цифровые преобразователи (АЦП). АЦП платы Arduino имеют разрядность 10 бит, поэтому значения на их выходах будут лежать в диапазоне от 0 до 1023. Мы можем считывать эти значения в программе, используя функцию analogRead() . Таким образом, если вы знаете опорное напряжение (reference voltage) АЦП, то вы легко можете рассчитать аналоговое напряжение, присутствующее на входе АЦП. Более подробно об аналогово-цифровом преобразовании в плате Arduino вы можете прочитать в этой статье.

Для измерения напряжения в нашем проекте цифрового вольтметра мы также будем использовать делитель напряжения. Измеренное значение напряжения мы будем показывать на экране ЖК дисплея 16×2 и выводить в окне монитора последовательной связи (Serial Monitor) Arduino IDE. Правильность измеренного значения напряжения мы будем проверять с помощью мультиметра.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. ЖК дисплей 16х2 (купить на AliExpress).
  3. Резисторы 10 кОм и 100 кОм (купить на AliExpress).
  4. Потенциометр 10 кОм (купить на AliExpress).
  5. Макетная плата.
  6. Соединительные провода.

Схема делителя напряжения

Делитель напряжения представляет собой схему из двух резисторов, показанную на следующем рисунке.

В нашем примере резисторы R1 и R2 имеют номиналы 100 кОм и 10 кОм. Средняя точка делителя напряжения используется для подачи сигнала на аналоговый вход платы Arduino. Напряжение, падающее на резисторе R2 (Vout), называется напряжением на выходе делителя напряжения. Оно может быть рассчитано по следующей формуле:

Vout = Vin (R2/R1+R2)

То есть напряжение на выходе делителя прямо пропорционально напряжению на его входе и отношению сопротивлений резисторов R1 и R2.

Используя приведенную формулу в коде программы для Arduino мы легко можем определить напряжение на входе делителя. Максимальное напряжение на входе (контактах) платы Arduino составляет 5 В, поэтому при используемых нами номиналах резисторов (их отношение составляет 100:10) мы с помощью нашего вольтметра сможем измерять напряжения до 55 В.

Работа схемы

Схема цифрового вольтметра на основе платы Arduino представлена на следующем рисунке.

Схема простого вольтметра на Arduino Uno

ЖК-дисплей подключен в 4-битном режиме. Его контакты DB4, DB5, DB6, DB7, RS и EN непосредственно подключены к контактам D4, D5, D6, D7, D8, D9 платы Arduino Uno.

Средняя точка делителя напряжения на резисторах R1 и R2, подключена к аналоговому контакту A0 платы Arduino. Остальные два конца делителя напряжения подключаются к источнику измеряемого напряжения и корпусу (земле).

Исходный код программы для Arduino

Основную часть кода программы составляет преобразование и отображение входного напряжения в отображаемое выходное напряжение с помощью приведенного выше уравнения Vout = Vin (R2/R1+R2). Как упоминалось ранее, выходное значение АЦП Arduino может варьироваться в диапазоне от 0 до 1023, а максимальное входное напряжение Arduino составляет 5 В, поэтому нам нужно умножить значение на выходе АЦП контакта A0 на 5/1024, чтобы рассчитать входное напряжение (на контакте A0).

void loop()
<
int analogvalue = analogRead(A0);
temp = (analogvalue * 5.0) / 1024.0; // формула для конвертирования значения напряжения
input_volt = temp / (r2/(r1+r2));

Мы будем отображать измеренное значение напряжение на экране ЖК-дисплея с помощью функции lcd.print и в окне монитора последовательной связи с помощью функции Serial.println .

Serial.print(«v color: #800080;»> Serial.println(input_volt);
lcd.setCursor(0, 1);
lcd.print(«Voltage color: #800080;»> lcd.print(input_voltage);

Далее представлен полный текст программы.

#include // библиотека для работы с ЖК дисплеем
LiquidCrystal lcd( 4, 5, 6, 7,8 ,9 ); // контакты, к которым подключен ЖК дисплей
float input_volt = 0.0;
float temp=0.0;
float r1=100000.0; //сопротивление резистора r1
float r2=10000.0; // сопротивление резистора r2
void setup()
Serial.begin(9600); // инициализируем последовательный порт связи для передачи на скорости 9600 бод/с
lcd.begin(16, 2); // устанавливаем число столбцов и строк используемого нами ЖК дисплея
lcd.print(«DC DIGI VOLTMETER»);
>
void loop()
int analogvalue = analogRead(A0);
temp = (analogvalue * 5.0) / 1024.0; // формула для конвертирования значения напряжения
input_volt = temp / (r2/(r1+r2));
if (input_volt < 0.1)
input_volt=0.0;
>
Serial.print(«v color: #800000;»>// выводим значение напряжения в окно монитора последовательной связи
Serial.println(input_volt);
lcd.setCursor(0, 1);
lcd.print(«Voltage color: #800000;»> // выводим значение напряжения на экран ЖК дисплея
lcd.print(input_volt);
delay(300);
>

Видео, демонстрирующее работу схемы

Похожие статьи

Комментарии

Простой вольтметр на Arduino Uno — 22 комментария

Serge Kompaniets говорит 24.10.2022 в 01:13 :

Прикладывау свои вариант. Адаптирован под управление по усб. Добавлена коррекция показании.
Исползуетса в автоматике.
Принт START/ STOP отмените если не надо. Я писал под старыи драивер.
Команды:
GET_VDC return Voltage
GET_COR return correction level
GET_NEG return Negative voltage (need add relay for switch measuring wires)
SET_CORR_X.XX (X.XX for example 0.15). write to EEPROM #include
char correction[16];
String correct;
String getCorrect;
String correctFull;
String getCommand;
String minus = «-«;
int set;
int geta;
int getb;
float input_volt = 0.0;
float temp=0.0;
float r1=100000.0; //сопротивление резистора r1
float r2=10000.0; // сопротивление резистора r2
void setup()
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Serial.begin(115200);
>
void loop()
< String command;
while (Serial.available()) char c = Serial.read(); //gets one byte from serial buffer
command += c; //makes the String readString
delay(2); //slow looping to allow buffer to fill with next character
>
command.toUpperCase();
if (command.length() > 0) geta = command.indexOf(«GET»);
set = command.indexOf(«SET»);
if(geta != -1) getCommand = command.substring(geta,geta + 7);
getCommand.trim();
// Serial.println(getCommand); // GET_VDC, GET_COR
>
if(set != -1) correctFull = command.substring(set,set + 13);
getCommand = command.substring(set,set + 8);
correct = correctFull.substring(9,13);
correctFull.trim();
getCommand.trim();
correct.trim();
//Serial.println(correctFull); //SET_CORR_X.XX
// Serial.println(getCommand); //SET_CORR
// Serial.println(correct); //X.XX
>
>
if (getCommand == «GET_VDC») int analogvalue = analogRead(A0);
getCorrect = EEPROM.get(1, correction);
temp = (analogvalue * 5.0) / 1024.0;
input_volt = temp / (r2/(r1+r2));
if (input_volt < 0.1)
input_volt=0.0;
>
delay(100);
Serial.println(«START»);
delay(100);
input_volt = input_volt + getCorrect.toFloat();
Serial.println(input_volt);
delay(100);
Serial.println(«STOP»);
getCommand = «»;
return;
>
if (getCommand == «SET_CORR») correct.toCharArray(correction, 20);
EEPROM.put(1, correction);
getCorrect = EEPROM.get(1, correction);
delay(100);
Serial.println(«START»);
delay(100);
Serial.println(getCorrect);
delay(100);
Serial.println(«STOP»);
getCommand = «»;
return;
>
if (getCommand == «GET_COR») getCorrect = EEPROM.get(1, correction);
delay(100);
Serial.println(«START»);
delay(100);
Serial.println(getCorrect);
delay(100);
Serial.println(«STOP»);
getCommand = «»;
return;
>
if (getCommand == «GET_NEG») digitalWrite(13, HIGH);
delay(500);
int analogvalue = analogRead(A0);
getCorrect = EEPROM.get(1, correction);
temp = (analogvalue * 5.0) / 1024.0;
input_volt = temp / (r2/(r1+r2));
if (input_volt < 0.1)
input_volt=0.0;
>
delay(100);
Serial.println(«START»);
delay(100);
input_volt = input_volt + getCorrect.toFloat();
Serial.println(minus + input_volt);
delay(100);
Serial.println(«STOP»);
//delay(300);
digitalWrite(13, LOW);
getCommand = «»;
return;
>
>

Хорошо, спасибо за полезную информацию.
Эмиль Ермолаев говорит 13.09.2022 в 20:52 :
вы можете отправить нормальный скетч. исправленный.
Вы имеете ввиду исправление номиналов резисторов в скетче?

Ошибка в описании схемы и кода программы, R1=100k R2=10k
float r1=100000.0; //сопротивление резистора r1
float r2=10000.0; // сопротивление резистора r2 проверяйте перед опубликованием.

Да, Вадим, спасибо за внимательность. Перечитал статью, действительно, при ее чтении может возникнуть впечатление что R1=10k, а R2=100k (и в программе введены эти значения), но на самом деле должно быть наоборот чтобы нашим вольтметром можно было измерять напряжения до 55 В. Либо же просто поменять эти сопротивления местами. Как это лучше исправить чтобы было более понятно, пока не решил. Все таки непростое это дело как что то простое объяснить как можно более доступным языком От админа: исправил

Еще одна ошибка — делить нужно на 1023, не?
Нет, на 1024. Потому что 2 в десятой степени равно 1024

. И одна неточность — лучше кодить так:
input_volt = temp / (10000.0/110000.0);
Зачем отнимать у АЛУ микроконтроллера лишний ресурс на вычисление, зачем занимать память лишний раз под переменные?
На минуточку, система выделяет памяти для переменной типа float аж целых 32 бита. Тут можно было обойтись одной переменной типа float, и все математические действия проводить в ней. И быстродействие повысилось бы.

Да, можно немного повысить и быстродействие, и снизить расход памяти, но это все не критично для такого простого проекта

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

Да, и это тоже верно. Для такого сравнительно простого проекта экономия 32 бит памяти не так критична

В нашем примере резисторы R1 и R2 имеют номиналы 10 кОм и 100 кОм
* В нашем примере резисторы R1 и R2 имеют номиналы 100 кОм и 10 кОм соответственно

Спасибо за внимательность. Исправил
Что нужно изменить в программе, чтоб на дисплее показывало три знака после запятой?

Необходимо чтобы значения переменной input_volt рассчитывались с большей точностью чем два знака после запятой. Как это сделать, к сожалению уже не помню. Может быть поможет изменение ее типа с float на double

Изменить строку Serial.println(input_volt); на Serial.println(input_volt, 3); и lcd.print(input_volt); на lcd.print(input_volt, 3);

Спасибо за подсказку. Я сразу как то и не сообразил

Спасибо за информацию, скажите если у меня источник питания может выдать 18,5 вольт и 15 ампер, можно ли через делитель измерить напряжение и не выгорит ли порт и вся ардуина от этих 15 ампер, или она возьмет только столько сколько ей надо?

Не особо силен в этой тематике, но вам сначала нужно разобраться в том, является ли ваш источник питания источником тока или источником напряжения (это зависит от его внутреннего сопротивления) и какой ток пойдет через резисторы в делителе если к нему подключить ваш источник питания. Если сопротивление входа у контакта Ардуино намного больше сопротивлений резисторов в делителе, то по правилу параллельного соединения сопротивлений большой ток в Ардуино не пойдет. Но прежде чем подключать плату Ардуино к представленной схеме, в вашем случае я бы сначала измерил мультиметром ток в делителе и напряжение в его средней точке

Вольтметр переменного тока на Arduino Uno

В этом проекте мы рассмотрим создание вольтметра переменного тока на основе платы Arduino Uno, которым можно будет измерять напряжение переменного тока в вашей квартире. Выводить измеренное напряжение мы будем в окне монитора последовательной связи (serial monitor) Arduino IDE.

Внешний вид вольтметра переменного тока на Arduino Uno

Создание цифрового вольтметра значительно проще создания аналогового вольтметра поскольку в случае аналогового вольтметра нам будут необходимы уверенные знания в таких физических параметрах как крутящий момент, потери на трение и т.д. В то время как для создания цифрового вольтметра нам будет нужен просто ЖК дисплей или даже экран вашего компьютера (в нашем рассматриваемом случае) чтобы вывести измеренное значение напряжения. Также на нашем сайте вы можете посмотреть проект цифрового вольтметра от 0 до 25 В на микроконтроллере AVR.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Трансформатор 12-0-12.
  3. Диод 1N4007 (купить на AliExpress).
  4. Конденсатор 1 мкФ (купить на AliExpress).
  5. Резисторы 10 кОм, 4,7 кОм (купить на AliExpress).
  6. Полупроводниковый стабилитрон 5v (диод Зенера — Zener diode) (купить на AliExpress).
  7. Соединительные провода.

Работа схемы

Схема рассматриваемого нами цифрового вольтметра на основе платы Arduino представлена на следующем рисунке.

Схема вольтметра переменного тока на Arduino Uno

В схеме необходимо сделать следующие соединения:

  1. Соедините высоковольтную часть трансформатора (220V) с источником напряжения, а его низковольтную часть (12v) — с делителем напряжения в схеме.
  2. Соедините резистор 10 кОм последовательно с резистором 4,7 кОм. Убедитесь в том, что на вход схемы напряжение будет поступать с именно с резистора 4,7 кОм (не перепутайте резисторы).
  3. Соедините диод как показано на схеме.
  4. Подсоедините конденсатор и стабилитрон как показано на схеме.
  5. Соедините отрицательный вывод диода с контактом A0 платы Arduino.

Примечание : обязательно соедините землю Arduino с точкой, показанной на рисунке, иначе схема не будет работать.

Трансформатор для нашего проекта
Мультиметр для проверки работы нашего вольтметра Пример работы вольтметра на мониторе ПК

Зачем нужен делитель напряжения

Поскольку мы используем трансформатор 220/12 это значит что на его низковольтной стороне будет напряжение 12 В, которое не подходит для питания платы Arduino (не подходит в качестве ее входного напряжения). Поэтому мы и используем делитель напряжения чтобы получить подходящее напряжение для платы Arduino.

Зачем нужны диод и конденсатор

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

Но напряжение на выходе диода не будет “гладким” (ровным) и будет содержать большие пульсации, которые нежелательно (в нашем случае) подавать на аналоговый вход платы Arduino. Поэтому в схему и включен конденсатор чтобы сглаживать пульсации напряжения на выходе диода.

Назначение стабилитрона

Можно повредить плату Arduino если на ее контакт подать напряжение более 5 В. Поэтому, чтобы напряжение на контакте Arduino не превысило 5 В, в схеме и используется стабилитрон.

Принцип работы вольтметра переменного тока на основе Arduino

Принцип работы нашего проекта составляют следующие действия:

  1. Входное высоковольтное напряжение понижается до напряжения примерно 12 В, приемлемого для работы низковольтных схем.
  2. С выхода делителя напряжения на резисторах мы получаем напряжение, пригодное (по номиналу) для подачи на контакт платы Arduino. Максимальное измеряемое схемой напряжение мы получим с помощью ее симуляции (см. ниже).
  3. Поступающее напряжение (аналоговое) поступает на аналоговый контакт A0 платы Arduino. С помощью аналогово-цифрового преобразования (АЦП), доступного на контакте A0, это входное напряжение преобразуется в число от 0 до 1023. 0 В будет соответствовать 0, а 5 В – 1023.
  4. Плата Arduino конвертирует это значение с выхода АЦП в соответствующее значение напряжения на входе схемы (формула приведена ниже в статье).

Симуляция работы схемы

Моделирование работы схемы было произведено в симуляторе Proteus.

Симуляция работы вольтметра при входном напряжении 311 В

Нахождение максимального входного напряжения осуществлялось методом проб.

При пиковом максимальном переменном напряжении равном 440 В (311 r.m.s, Rated Maximum Sinusoidal — Максимальная (предельная) синусоидальная мощность) напряжение на входе контакта A0 было равно 5 Вольтам, то есть максимуму. То есть наша схема может измерять максимум 311 r.m.s напряжения (440 В пикового напряжения).

Симуляция работы вольтметра при входном напряжении 285 В

Моделирование производилось для различных величин входного напряжения – от 220 r.m.s до 440v.

Исходный код программы

Значение, получаемое с контакта A0, мы будем записывать в переменную m:

m=pinMode (A0,INPUT) ; // режим работы контакта a0 – на ввод данных

Как следует из результатов симуляции схемы, максимальное напряжение 5 В на контакте A0 (1023 после преобразования) достигается при напряжении на входе схемы равном 311 В. То есть значение с выхода АЦП 1023 будет соответствовать 311 Вольтам на входе схемы. Следовательно, чтобы рассчитать значение напряжения на входе схемы, можно использовать формулу:

n=(311/1023)*m Вольт или n=(m*0.304177).

Далее вычисленное по этой схеме измеренное значение напряжения на входе схемы мы будем выводить в окне монитора последовательной связи (serial monitor). Более подробно все эти процессы показаны на видео, приведенном в конце статьи.

Serial.print(» analog input «) ; // выводим строку “analog input” в окно монитора последовательной связи
Serial.print(m);// выводим значение напряжения на входе контакта A0

Далее выводим измеренное значение переменного напряжения на входе схемы.

Serial.print(» ac voltage «) ; // выводим строку “ac voltage” в окно монитора последовательной связи
Serial.print(n) ; // выводим значение напряжения на входе схемы

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

Далее приведен полный текст программы.