Подход новичка к программированию на примерах Графика ГВС

Вопросы от новичков
Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#1

Сообщение Alias » 11.12.2017{, 15:07}

Доброго всем времени суток!
Три недели назад набрел я на эту замечательную программу, хотя еще год назад на нее смотрел, но не зацепился. Давно собирался изучить вопрос Ардуино, как конструктора самодельщика, ибо в сети всего полно, но не алгоритмов под тебя. Но С++ не мое даже без плюсов и с маленькой буквы. Видео уважаемого Грачика и других сломали все психологические барьеры и, насмотревшись всяких видео понял, что пора начинать.
В сети очень много схем термостатирования. Но я ни одной не видел, чтобы применялся график для того же бытового водонагревателя. Как правило, все сводится к примитиву: выставил температуру и вперед! Но нет учета разбора воды потребителями в часы пик. Кроме того, крайне желательны периодические профилактические меры, среди которых - термическая дезинфекция.
Я на ютубе двум гуру закинул удочку на сей счет, но пока реакции нет и я попробовал разобраться сам. Дебют. Нужно же с чего-то начать. Пусть это будет не мигающий LED.
Итак, проект во вложении. Прошу гуру прокомментировать его и помочь с некоторыми вещами.
В общем - правильный ли подход в плане использования такого количества переменных для небольшой задачи? Это как-то сказывается на ресурсах Ардуино или переменные - просто для удобства программирования?
В частности - как преобразовать бинарное значение в число и как их складывать?
Никак, наверное.
Но я первоначально хотел именно это и использовать. Например, есть у нас три блока логики, на выходе которых нули или единицы. И я хотел использовать переменную, значение которой равно общему количеству единиц на этих выходах.
Допустим, если на всех трех выходах 1, то значение переменной - 3. Выкрутился с помощью аналогового переключателя. Это очень криво?
Для выбора уставки из трех значений применил мультиплексор. Может, правильно это сделать как-то иначе?
Для управления триггером часто рекомендуют применять не постоянный уровень, а одиночные импульсы. Насколько это оправданно? Ведь каждый блок - ресурсы микроконтроллера, хочется понапрасну не растрачивать их.
И, если кто-то будет смотреть схему, проверьте, пожалуйста, программу flprog на баг. Попробуйте удалить из первой платы последние три датчика, относящиеся к котлу и улице. Это я сначала на погодозависимость замахнулся. У меня после этого удаления отказываются сворачиваться все следующие платы, не выделяются и не редактируются в них элементы и связи. Перезагрузка программы, винды и прочего уже ничего не меняют и хорошо, если есть резервная копия. От версии не зависит.
Буду признателен за отклики!
Вложения
2343311.flp
(447.73 КБ) 59 скачиваний
Последний раз редактировалось Alias 13.12.2017{, 20:39}, всего редактировалось 1 раз.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Подход новичка к программированию на примерах Графика ГВС

#2

Сообщение pan » 11.12.2017{, 15:38}

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

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

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

если нужно будет наскрести немного памяти (при нехватке) то замените переменные integer  на byte там где это возможно.

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

Подход новичка к программированию на примерах Графика ГВС

#3

Сообщение Dev1 » 11.12.2017{, 16:05}

Даю на_водку... Соответственно, бойлер должен выдавать вам пиковый расход, считали наверное... Нужно больше? Пожалуйста... Греем бойлер до 90°С, на выходе бойлера ставим 3х-ходовой термосмеситель, выставляем на нем 45-50°С и получаем больше ГВС за счет подмеса холодной. И термообработка постоянная. Без термосмесителя не советую греть до 90 
Win7-64 FLProg v7.2.2 Portable :fie:

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#4

Сообщение Sancho » 11.12.2017{, 17:13}

Немного необходимо изменить плату 3.
Если оставить как есть - при отсутствии сигнала дезинфекция переменным "Режим бойлер_х" будут пере-присваиваться 0, т.к. это будет происходить перезапись переменной после "ДОГРЕВА". Посмотрите, проанализируйте, увидите.
Так-же можно, по Вашей схеме, уменьшить код, немного..
Вложения
8489865.png
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
rw6cm
Полковник
Сообщения: 2132
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 278
Имя: Владимир

Подход новичка к программированию на примерах Графика ГВС

#5

Сообщение rw6cm » 11.12.2017{, 17:34}

Alias писал(а):проверьте, пожалуйста, программу flprog на баг.
Это баг. Писал об этом. Автор вроде должен был устранить, но видно не успел.

Уберите с нижнего датчика, на 1 плате, надпись к блоку, или передвиньте ее выше датчика, и все будет ок.
Последний раз редактировалось rw6cm 11.12.2017{, 17:37}, всего редактировалось 1 раз.
Win10-64, FLProg (portable)

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#6

Сообщение Alias » 11.12.2017{, 18:26}

Спасибо откликнувшимся!
По порядку.
pan писал(а):закрепите эту тему
Спасибо за одобрение, но перебор. Максимум - перенести в другой раздел, если будет польза.
Dev1 писал(а):3х-ходовой термосмеситель
Чтобы температура воды не гуляла, нужен очень шустрый и точный смеситель. Иначе при переходных процессах тот же ПИД будет постоянно рыскать, отдаваясь в ощущениях. Я боюсь их, и трехходовиков, и ощущений, натерпелся на колонке С трех накопителей получается стабильная температура, пока не будет исчерпан весь запас, и если один из них на дезинфекции, риск ошпариться невелик. Постоянно высокая температура - это потери как энергии, так и ресурса ТЭНов.
Sancho писал(а):проанализируйте, увидите
Да, видел, оставил на десерт, пока схема действительно реализована без обработки этого подмножества, поскольку пересечения нет: догрев идет до полуночи, дезинфекция - следом за ней. Но мысль Вашу понял, интересная. Успел даже ее часть применить, пока ждал ответов, во вложении. Чуть позже изучу, спасибо!
rw6cm писал(а):и все будет ок
Не нашел темы и не сообразил в редакторе. Потому откатился до не самой свежей копии. Но нет худа без добра - пока снова рисовал, перо легло иначе и получилось даже лучше. Прав был:
pan писал(а):каждый конечно сделает одно и то же по разному
Думаю, с третьего раза нарисую иначе. Но "Я не волшебник, я только учусь" (с)

А вообще, насколько разумно доверять Ардуино такие вещи, как котел? Не с точки зрения газовой безопасности, там все штатное и котлу безразлично, что манипулирует его сознанием - жидкостный термостат или робот. У него своя группа безопасности. Я имею в виду зависания, ведь можно не только разморозить систему, но и заварить в ней чай
Сейчас у меня на котел завязан Овеновский погодозависимый ТРМ-151, но у него нет поправки на теплоинерционность здания, а это та еще беда. Пока справляюсь с ней с помощью силикатного кирпича. Но не то это, не то, буду писать свой блок внесения поправки, чтобы все учесть. Может и получится.
В любом случае, спасибо за помощь!
Вложения
1694112.png

Аватара пользователя
support
Супермодератор
Сообщения: 1838
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 687
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#7

Сообщение support » 11.12.2017{, 18:31}

rw6cm писал(а):Это баг. Писал об этом. Автор вроде должен был устранить, но видно не успел.
Исправил, в следующей версии её не будет.
Автор программы FLProg.

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

Подход новичка к программированию на примерах Графика ГВС

#8

Сообщение Dev1 » 11.12.2017{, 21:01}

Alias писал(а):Чтобы температура воды не гуляла, нужен очень шустрый и точный смеситель. Иначе при переходных процессах тот же ПИД будет постоянно рыскать, отдаваясь в ощущениях.
Вообще то он термостатический и никакого привода, а тем более ПИД регуляторов не требует.
Win7-64 FLProg v7.2.2 Portable :fie:

krom23
Лейтенант
Сообщения: 438
Зарегистрирован: 06.09.2015{, 15:18}
Репутация: 12
Откуда: Калуга
Имя: Андрей

Подход новичка к программированию на примерах Графика ГВС

#9

Сообщение krom23 » 12.12.2017{, 11:35}

Alias писал(а):Допустим, если на всех трех выходах 1, то значение переменной - 3.
Есть такой блок Дешифратор.

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#10

Сообщение Sancho » 12.12.2017{, 12:03}

krom23 писал(а):Цитата Alias ()Допустим, если на всех трех выходах 1, то значение переменной - 3.
Есть такой блок Дешифратор.
Увы, не он. Прочитайте внимательнее. Нужно преобразовать bool в integ, а затем сложить.
Или таблицу, или ...
Проще, как есть в проекте, на selector
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Dev1
Майор
Сообщения: 1015
Зарегистрирован: 12.07.2016{, 18:04}
Репутация: 58
Откуда: Гондурас

Подход новичка к программированию на примерах Графика ГВС

#11

Сообщение Dev1 » 12.12.2017{, 12:43}

Sancho писал(а):Увы, не он. Прочитайте внимательнее. Нужно преобразовать bool в integ, а затем сложить.Или таблицу, или ...
Может быть шифратор...


СпойлерПоказать
Блок "Номер входа"

[img]file:///E:/SOFT/FLProg_beta/FLProg_3-0-2/Help_html/rus/images/InputNumberBlock1.PNG[/img]

Блок служит для определения входа, на котором присутствует высокий логический уровень. На выходе блока будет значение соответствующее номеру такого входа. Если высокого уровня не будет ни на одном входе блока, на выходе будет 0.
Win7-64 FLProg v7.2.2 Portable :fie:

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#12

Сообщение Alias » 13.12.2017{, 11:03}

Dev1 писал(а):Может быть шифратор
Действительно! Ведь я смотрел на него и что-то упустил. Мало того, этот вариант меньше отнимает ресурсов. Я правильно оцениваю эффективность? Скопировать нужную плату в новый проект, "Компилировать проект" -> в IDE "Проверить" и сравнить в нижнем черном окне цифры для разных вариантов.
В моем случае с Аналоговым переключателем и Шифратором разница соответственно такая:
Скетч использует 474 байт / 466 байт
Глобальные переменные используют 15 байт / 13 байт
Считаю правильным сразу по возможности оптимизировать схему, спасибо за подсказку! Скриншот платы с двумя вариантами для удобства сравнения в приложении.
И еще можно вопрос по подходу к проектированию? На анализе логики не настаиваю, но если будут ошибки, готов к советам. Схема тоже во вложении. Я создал массивы, указав им конкретный тип, однако, судя по цвету связей, пошла пересортица. Как этого избежать, нужно ли конвертировать или пусть как есть остается?
Вложения
Kn.flp
(160.83 КБ) 52 скачивания
2231191.png

krom23
Лейтенант
Сообщения: 438
Зарегистрирован: 06.09.2015{, 15:18}
Репутация: 12
Откуда: Калуга
Имя: Андрей

Подход новичка к программированию на примерах Графика ГВС

#13

Сообщение krom23 » 13.12.2017{, 12:19}

Sancho писал(а):Увы, не он. Прочитайте внимательнее. Нужно преобразовать bool в integ, а затем сложить.
Вы верно не прочли описание блока. И входы там bool, и выход integ, мало того и для каждой комбинации "1" и "0" на входах своё число на выходе, одним словом классический двоично-шестнацетиричный дешифратор. Если надо уменьшить число(разрядность) входов, то на входе старшего разряда(D4(8)) устанавливаем "0" и получаем восьмеричный дешифратор. А с числами полученными на выходе можно производить любые операции.

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#14

Сообщение Sancho » 13.12.2017{, 13:02}

по скрину - Нижние компараторы(сравнение) заменить на один ==23, убрав заодно &.
По шифратору - попробуйте ещё раз прочитать мой пост 10, и ответить по Вашему шифратору - какой номер графика будет ночью вечером при ветре?
По горелкам - зачёт.
krom23,
krom23 писал(а):Вы верно не прочли описание блока. И входы там bool, и выход integ, мало того и для каждой комбинации "1" и "0" на входах своё число на выходе, одним словом классический двоично-шестнацетиричный дешифратор. Если надо уменьшить число(разрядность) входов, то на входе старшего разряда(D4(8)) устанавливаем "0" и получаем восьмеричный дешифратор. А с числами полученными на выходе можно производить любые операции.
Вам также нужно ответить на мой выше озвученный вопрос.
То, что описывает топикастер изображено на моём аватаре!!!! Только четырёх-разрядный(на аватаре).
А потом уже шифраторы....
P.S. Если Вы узнаете сами, без инета, то, что изображено на нём, то Ваши вопросы касательно моих знаний шифраторов/дешифраторов должны отпасть...
И входы там bool, и выход integ, мало того и для каждой комбинации "1" и "0" на входах своё число на выходе, одним словом классический двоично-шестнацетиричный дешифратор.
это всё-таки ШИФРАТОР  , т.к. при преобразовании нескольких единичных сигналов в более сложные штучные (byte,int) происходит их "шифрование"

Добавлено (13.12.2017, 13:02)
---------------------------------------------
P.S. Дополню насчёт селекторов.
Не смотрел( не создавал повтор платы из картинки топикастера с sel и шифратором), но при правильном расположении строк в коде при "ветре" вычисления, укладывается ли время в диапазон, выполнятся не будут, вообще, т.к. они будут не нужны, т.е. будут стоять после else в части кода sel .....
Последний раз редактировалось Sancho 13.12.2017{, 12:44}, всего редактировалось 1 раз.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#15

Сообщение Alias » 13.12.2017{, 13:48}

Sancho писал(а):заменить на один ==23
Я пока оставил так на случай, если придется расширить интервал, например, 22-23. Хотел было сделать на какой-нибудь таблице состояний, но как-то громоздко получается. Возможно, и переделаю. Найду более красивое решение - покажу.
Sancho писал(а):какой номер графика будет
Второй. Тот, что добавит температуры теплоносителя. Если ветер сильный, тут уже не до экономного режима. Хотел добавить логику, чтобы при ветре ночью вместо первого был  дневной нулевой режим, а днем - усиленный второй, но пока оставил. Тем более, что вообще не знаю, на чем сделать датчик ветра. Понятно, что это будет на герконе или оптике с большой интегрирующей цепочкой. Поэтому хвост и подвис. Но спасибо за беспокойство!
Про аватарку заинтриговали, но слишком мелко, чтобы понять:)
Sancho писал(а):т.е. будут стоять после else в части кода sel
Вы про уже скомпилированный код? Недопонял, о каком времени речь. Про то, что до того, как дойдет до опроса переменной Ветер, на выходе платы уже будет принято решение о Режиме? Мне всегда было слегка не понятно, как компилируется код, но если в блоке есть входы, все они должны ведь учитываться?
ЗЫ Перерисовал, если правильно понял
ЗЫ2 Во вложении два варианта - на компараторах и таблице Номера режимов поплыли, но это не критично. Несмотря на то, что элементов поубавилось, ресурсов поубавилось тоже:
Скетч использует 466 / 498 байт
Вложения
1807360.flp
(168.07 КБ) 62 скачивания
8090997.png
Последний раз редактировалось Alias 13.12.2017{, 14:16}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#16

Сообщение Sancho » 13.12.2017{, 14:18}

Alias писал(а):Перерисовал, если правильно понял
Немного не правильно. Я имел ввиду вариант с селекторами. На скрине здесь всё было верно.
krom23 писал(а):Вы верно не прочли описание блока
Каюсь, не читал. А если Вы нажмёте описание и сумеете мне показать, что это шифратор, слово такое в тексте или на скринах, - буду должен.... Даже в справке - номер входа, что, конечно, понятнее.
Хотя по описанию это приоритетный шифратор (или шифратор приоритета). Думал, такого в FLProg нет
Была мысль, что ЭТОТ ШИФРАТОР упаковывает биты в integer, что иногда НАМНОГО НУЖНЕЕ....
Вложения
8473327.png
Последний раз редактировалось Sancho 13.12.2017{, 14:43}, всего редактировалось 1 раз.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#17

Сообщение Alias » 13.12.2017{, 14:39}

Совсем запутался Который же вариант более надежен?
Вложения
2180886.png

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#18

Сообщение Sancho » 13.12.2017{, 14:52}

Alias писал(а):Совсем запутался
Ок, начнём с простого.
Как должна вести себя система(график) по случаю двух слагаемых ветер и время?
1. всего 3 режима: эконом, норма, тепло.  По времени = эконом/норма, ветер + по времени = норма/тепло.
2. ... ?
Последний раз редактировалось Sancho 13.12.2017{, 14:57}, всего редактировалось 1 раз.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#19

Сообщение Alias » 13.12.2017{, 15:09}

Вообще, днем нормальный режим. Ночью - экономный. Однако, в случае сильного ветра - тепло. Сейчас реализовано по логике с приоритетом во ветру, то есть при ветре уже не важно, ночь сейчас или день.
Позже введу избирательность, то есть +1 к любому режиму при ветре.
Я то недопонял и переспросил про схему в плане компиляции кода, мол, одна из цепочек логики на плате может просто проигнорироваться по непонятной мне причине.
На скриншоте в предыдущем сообщении опечатка в блоке CD - перепутаны входы. Просто рисовал иллюстрацию и не заметил сразую

Аватара пользователя
Sancho
Полковник
Сообщения: 3991
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 567
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Подход новичка к программированию на примерах Графика ГВС

#20

Сообщение Sancho » 13.12.2017{, 15:58}

Опечатку видел, догадался. На нижнем - при ветре 0 2.
Итого, схемы по функционалу равнозначны, смотрите размер.
По коду. При генерации кода для IDE почему-то всегда flprog пытается вставить в IF максимальное условие, а в else минимальное, а не наоборот. Если сделать наоборот, то при определённых условиях, if=true, время цикла заметно сократится.
Примеры:
С switch оригинал от FLProg

СпойлерПоказать

Код: Выделить всё

bool _gtv6; //Ветер
int _gtv13 = 0; //Режим
int _gtv14; //Текущий Час
int _swi3;
int _swi4;
void setup()
{
}
void loop()
{
//Плата:1
//Наименование:Режим ГВС
if(( (( ((_gtv14) >= (18)) && ((_gtv14) <= (23)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) ))
{_swi3=1;}
else
{_swi3=0;}
if(_gtv6)
{_swi4=2;}
else
{_swi4=_swi3;}
_gtv13 = _swi4;
}
С switch переделан в минимум

СпойлерПоказать

Код: Выделить всё

bool _gtv6; //Ветер
int _gtv13 = 0; //Режим
int _gtv14; //Текущий Час
void setup()
{
}
void loop()
{
//Плата:1
//Наименование:Режим ГВС
if(_gtv6)
{_gtv13=2;}
else
if(( (( ((_gtv14) >= (18)) && ((_gtv14) <= (23)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) ))
{_gtv13=1;}
else
{_gtv13=0;}
}
Чуть позже попробую ещё один вариант...

P.S. Правильный вариант от FLProg но с рисунка внизу поста

СпойлерПоказать

Код: Выделить всё

bool _gtv6; //Ветер
int _gtv13 = 0; //Режим
int _gtv14; //Текущий Час
int _swi1;
void setup()
{
}
void loop()
{
//Плата:1
//Наименование:Режим ГВС
if (_gtv6) {
_gtv13 = 2;
}
//Плата:2
//Наименование:Time
//Комментарии:Временные режимы
if (_gtv6 == 0) {
if(( (( ((_gtv14) >= (18)) && ((_gtv14) <= (23)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) || (( ((_gtv14) >= (0)) && ((_gtv14) <= (7)) )) ))
{_swi1=1;}
else
{_swi1=0;}
_gtv13 = _swi1;
}
}
Вложения
2538615.png
Последний раз редактировалось Sancho 13.12.2017{, 16:12}, всего редактировалось 1 раз.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Ответить

Вернуться в «Начинающим»