Импульсный генератор + частотомер (Arduino)

На рисунке показана схема простого уст-ва которое может работать в режиме генератора импульсов и в режиме частотомера.

Генератор импульсов:

  • Длительность импульсов от 1 мкс до 8.3 сек
  • Регулировка скважности от 0 до 100.0%

Изменение длительности импульсов и скважности происходит при помощи энкодера, при нажатии на кнопку энкодера начнет мигать курсор в самом младшем разряде, при помощи ручки энкодера можно установить значение от 0 до 9, при повторном нажатии кнопки энкодера курсор перемещается на следующий разряд и так далее, до регулировки скважности, если нажать кнопку энкодера еще раз, то включится режим генерации и на экране LCD индикатора появится надпись «ON». Для удобства использования генератора добавлена кнопка «включение генерации», она позволяет не перебирать все разряды, а сразу включить генерацию если Вы уже установили необходимое значение длительности импульсов. Для перехода в режим изменения длительности импульсов достаточно один раз нажать кнопку энкодера.

Для перехода в режим частотомера необходимо нажать на кнопку «генер./част.», максимальная частота измерения 6.5 МГц. Частотомер имеет три режима времени измерения: 1, 0.1 и 10 секунд. Для изменения времени измерения нужно нажать кнопку энкодера.

Для перехода в режим генератора нужно снова нажать кнопку «генер./част.».

#include <LiquidCrystal.h>
#include <Encoder.h>
#include <TimerOne.h>
#include <FreqCount.h>
LiquidCrystal lcd(6, 7, 8, 11, 12, 13);// RS,E,D4,D5,D6,D7
Encoder myEnc(4, 3);// CLK, DT
 
void setup() {
  pinMode(2,INPUT); // КНОПКА ЭНКОДЕРА
  pinMode(A5,INPUT); // КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ
  pinMode(A4,INPUT); // ЧАСТОТОМЕР/ГЕНЕРАТОР
  lcd.begin(16, 2);// LCD 16X2
}
 
unsigned long f_sum,time;
long f[8]{0,0,0,0,0,0,0,512};
int i,x,y,cursor,h_g;
long oldPosition  = -999,newPosition;
float t;
const float popravka = 1.0004502;// поправочный коэффициент для повышения точности генератора (если нет эталона то коэффициент = 1.0000000)
 
unsigned long f_0;float f0;
int x1,n=3,r;
 
void loop() {
  if(digitalRead(A4)==HIGH){h_g++;y=0;delay(300);if(h_g>1){h_g=0;}}// ГЕНЕРАТОР/ЧАСТОТОМЕР (ПО УМОЛЧАНИЮ ПЕРВЫЙ ГЕНЕРАТОР)
 
  if(h_g==1){ i=0; // ЧАСТОТОМЕР ////////////////////////////////////////////////////////////////////
  if(y==1){FreqCount.begin(1000);}
 
  if(digitalRead(2)==LOW){n++;x1=0;delay(100);}// ВЫБОР ВРЕМЕНИ ИЗМЕРЕНИЯ ПРИ ПОМОЩИ КНОПКИ ЭНКОДЕРА
    lcd.setCursor(0,1);
  if(n==1){x1++;if(x1==1){FreqCount.begin(100);}r=-1;lcd.print("T = 0.1 s ");}
  if(n==2){x1++;if(x1==1){FreqCount.begin(10000);}r=1;lcd.print("T = 10 s ");}
  if(n==3){x1++;if(x1==1){FreqCount.begin(1000);}r=0;lcd.print("T = 1 s  ");}
  if(n>3){n=1;} 
    lcd.setCursor(0,0);
    lcd.print("F = "); // ВЫВОД ЧАСТОТЫ 
  if(f_0>=1000000 && n==3){f0=f_0/1000000.0;lcd.print(f0,6+r);lcd.print(" MHz");}
  if(f_0<1000000 && n==3){f0=f_0/1000.0;lcd.print(f0,3+r);lcd.print(" kHz");}
  if(f_0>=100000 && n==1){f0=f_0/100000.0;lcd.print(f0,6+r);lcd.print(" MHz");}
  if(f_0<100000 && n==1){f0=f_0/100.0;lcd.print(f0,3+r);lcd.print(" kHz");}
  if(f_0>=10000000 && n==2){f0=f_0/10000000.0;lcd.print(f0,6+r);lcd.print("MHz");}
  if(f_0<10000000 && n==2){f0=f_0/10000.0;lcd.print(f0,3+r);lcd.print(" kHz");}
 
  if (FreqCount.available()) { 
 
    f_0 = FreqCount.read(); // ИЗМЕРЕНИЕ ЧАСТОТЫ
 
   lcd.setCursor(10,1);lcd.print("***");// ИНДИКАЦИЯ ИЗМЕРЕНИЯ
  }
   delay(200);
   lcd.clear();
}
 
  if(h_g==0){// ГЕНЕРАТОР //////////////////////////////////////////////////////////////////
 
   if(i==8){   lcd.setCursor(10,1); lcd.print("ON ");// ГЕНЕРАЦИЯ ВКЛЮЧЕНА
   if(y==1){ Timer1.initialize(f_sum * popravka); // период  - запускаем только один раз после выхода из режима изминения параметров 
   Timer1.pwm(9, f[7]);} // k - коэффициент заполнения 0-1023. Сигнал снимаем с выхода 9
   delay(100);
 }
 
  if(digitalRead(2)==LOW){delay(300);i++;if(i>8){i=0;} myEnc.write(f[i]*4);// ОПРОС КНОПКИ ЭНКОДЕРА
  if(i==8){y=0;cursor=0;}}
  if(digitalRead(A5)==HIGH){delay(300);i=8;y=0;}// КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ
 
  if(i<8||cursor==1){ // В РЕЖИМЕ ИЗМЕНЕНИЯ ПЕРИОДА И ЗАПОЛНЕНИЯ ШИМ ГЕНЕРАЦИЯ ОТКЛЮЧЕНА
  lcd.setCursor(10,1); lcd.print("OFF");// ГЕНЕРАЦИЯ ВЫКЛЮЧЕНА
 
 long newPosition = myEnc.read()/4; // ОПРОС ЭНКОДЕРА
 
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    f[i]=newPosition;
 
    if(i<7){ // ОГРАНИЧЕНИЕ ПРИ ИЗМЕНЕНИИ ПЕРИОДА ОТ 0 ДО 9
    if(f[i]>9){myEnc.write(0);}
    if(f[i]<0){myEnc.write(9*4);}}
    else{// ОГРАНИЧЕНИЕ ПРИ ИЗМЕНЕНИИ ЗАПОЛНЕНИЯ ШИМ ОТ 0 ДО 1023
    if(f[7]>1023){f[7]=1023;}
    if(f[7]<0){f[7]=0;}}
  }
   f_sum=f[6]*1000000+f[5]*100000+f[4]*10000+f[3]*1000+f[2]*100+f[1]*10+f[0];// ПЕРИОД
   lcd.setCursor(0,0);// ВЫВОД ИНФОРМАЦИИ НА LCD 
   lcd.print("T = ");
   for(x=6;x>=0;x--){
   if(x==5||x==2){lcd.print(".");}// ВСТАВЛЯЕМ РАЗДЕЛИТЬ РАЗРЯДА
   if(cursor==1&&i==x){lcd.print(" ");}else{lcd.print(f[x]);}
   }
   lcd.print(" uS");
 
     // МИГАНИЕ КУРСОРА ПРИ ИЗМЕНЕНИИ ПАРАМЕТРОВ 
 
   if(millis()-time<200){cursor=1;}// 200 МС ПРОБЕЛ ВМЕСТО ЦИФРЫ
   if(millis()-time>200){cursor=0;}// 800 МС ПОКАЗЫВАЕМ ЦИФРУ
   if(millis()-time>1000){time=millis();}// ОТСЧЕТ 1 СЕКУНДЫ
  }
 
   // ВЫВОД НА LCD % ЗАПОЛНЕНИЯ ШИМ
   t=f[7]*100.0/1023;
   lcd.setCursor(0,1);lcd.print(t,1);if(cursor==1&&i==7){lcd.print("    ");}else{ lcd.print(" %   ");}
  }
y++;
}

Частотомер

Генератор

 

50%

20%

80%

Encoder.h

FreqCount.h

 TimerOne.h

 

Comments

  1. Автору схемы: а Вам кто-нибудь говорил, что у Вас в скетче ошибка? Выводы энкодера в схеме не соответствуют портам, объявленным в скетче.

  2. А сама схема рабочая. Если поправить исходник — как минимум частотомер работает (генератор проверить нечем, но на дисплее всё, что надо, отображается :о))

        1. Уважаемый, очень хороший замысел, полезный, изящный. частотомер работает исправно, но энкодер не работает, не работает прокрутка. то ли в скетче ошибка, то ли в библиотеке, но не работает и всё! пожалуйсто, исправьте скетч и подскажите откуда скачать библиотеку энкодера.
          zazai@mail.ru

  3. #include
    #include
    #include
    #include
    LiquidCrystal lcd(6, 7, 8, 11, 12, 13);// RS,E,D4,D5,D6,D7
    Encoder myEnc(2, 3);// CLK, DT

    void setup() {
    pinMode(4,INPUT); // КНОПКА ЭНКОДЕРА
    pinMode(A5,INPUT); // КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ
    pinMode(A4,INPUT); // ЧАСТОТОМЕР/ГЕНЕРАТОР
    lcd.begin(16, 2);// LCD 16X2
    Serial.begin(9600);
    // FreqCount.begin(1000)
    }

    unsigned long f_sum,time;
    long f[8]{0,0,0,0,0,0,0,512};
    int i=0,x,y,cursor,h_g = 1;
    long oldPosition = -999,newPosition;
    float F_F0, t;
    const float popravka = 1.00000;// поправочный коэффициент для повышения точности генератора (если нет эталона то коэффициент = 1.0000000)
    char *si[3]{«G»,»K»,»M»};
    int is = 0;
    unsigned long f_0;float f0 ,f_f = 0;
    int x1,n=3,r;

    void loop() {
    if(analogRead(4)>600){h_g++;y=0;delay(300);if(h_g>1){h_g=0;}}// ГЕНЕРАТОР/ЧАСТОТОМЕР (ПО УМОЛЧАНИЮ ПЕРВЫЙ ГЕНЕРАТОР)
    // h_g=1; i=0; y=1;
    if(h_g==1){ i=0; // ЧАСТОТОМЕР //
    if(y==1){FreqCount.begin(1000);}

    if(digitalRead(2)==LOW){n++;x1=0;delay(100);}// ВЫБОР ВРЕМЕНИ ИЗМЕРЕНИЯ ПРИ ПОМОЩИ КНОПКИ ЭНКОДЕРА pin2
    lcd.setCursor(0,1);
    if(n==1){x1++;if(x1==1){FreqCount.begin(100);}r=-1;lcd.print(«T = 0.1 s «);}
    if(n==2){x1++;if(x1==1){FreqCount.begin(10000);}r=1;lcd.print(«T = 10 s «);}
    if(n==3){x1++;if(x1==1){FreqCount.begin(1000);}r=0;lcd.print(«T = 1 s «);}
    if(n>3){n=1;}
    lcd.setCursor(0,0);
    lcd.print(«F = «); // ВЫВОД ЧАСТОТЫ
    if(f_0>=1000000 && n==3){f0=f_0/1000000.0;lcd.print(f0,6+r);lcd.print(» MHz»);}
    if(f_0=100000 && n==1){f0=f_0/100000.0;lcd.print(f0,6+r);lcd.print(» MHz»);}
    if(f_0=10000000 && n==2){f0=f_0/10000000.0;lcd.print(f0,6+r);lcd.print(«MHz»);}
    if(f_08){i=0;} myEnc.write(f[i]*4);// ОПРОС КНОПКИ ЭНКОДЕРА pin2 заменен на 4
    if(i==8){y=0;cursor=0;}}
    if(analogRead(5)>600){delay(300);i=8;y=0;}// КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ

    if(i<8||cursor==1){ // В РЕЖИМЕ ИЗМИНЕНИЯ ПЕРИОДА И ЗАОЛНЕНИЯ ШИМ ГЕНЕРАЦИЯ ОТКЛЮЧЕНА
    lcd.setCursor(5,1); lcd.print("OF");// ГЕНЕРАЦИЯ ВЫКЛЮЧЕНА

    long newPosition = myEnc.read()/4; // ОПРОС ЭНКОДЕРА

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    f[i]=newPosition;

    if(i9){myEnc.write(0);}
    if(f[i]1023){f[7]=1023;}
    if(f[7]<0){f[7]=0;}}
    }
    f_sum=f[6]*1000000+f[5]*100000+f[4]*10000+f[3]*1000+f[2]*100+f[1]*10+f[0];// ПЕРИОД
    // *
    F_F0 = f_sum;
    F_F0 =1/(F_F0/1000000);
    if (F_F0 999 && F_F0 9999 ) {F_F0=F_F0/1000; is=1;}

    lcd.setCursor(0,0);// ВЫВОД ИНФОРМАЦИИ НА LCD
    lcd.print(«T = «);
    for(x=6;x>=0;x—){
    if(x==5||x==2){lcd.print(«.»);}// ВСАВЛЯЕМ РАЗДЕЛИТЬ РАЗРЯДА
    if(cursor==1&&i==x){lcd.print(» «);}else{lcd.print(f[x]); }
    }
    lcd.print(» uS»);

    // МИГАНИЕ КУРСОРА ПРИ ИЗМИНЕНИИ ПАРАМЕТРОВ

    if(millis()-time200){cursor=0;}// 800 МС ПОКАЗЫВАЕМ ЦИФРУ
    if(millis()-time>1000){time=millis();}// ОТСЧЕТ 1 СЕКУНДЫ
    }

    // ВЫВОД НА LCD % ЗАПОНЕНИЯ ШИМ
    t=f[7]*100.0/1023;
    lcd.setCursor(0,1);lcd.print(t,1);if(cursor==1&&i==7){lcd.print(» «);}else{ lcd.print(«% «);}
    lcd.setCursor(8,1);
    lcd.print(» «);
    lcd.setCursor(8,1);
    lcd.print(si[is]);
    lcd.print(F_F0,2);

    }
    y++;
    }

  4. Добрый вечер скетч от автора liman28 почему-то энкодер работает не коректно в режиме генератора при прокрутке начинает моргать курсор при дальнейшем прокручивании курсор перемещается в следующий разряд кнопка на эндокере не реагирует немогу разобраться

      1. чтоб работал эндокера пины нужно поменять 2 на 4 в digitalRead(4) в генераторе и в частотомере но есть еще один недочет при включении генератора выключить его можно переключением в частотомер или отключением питания

          1. скетч поправленный на сайте с не рабочим энкодером переписывать не нужно вот ваш
            скетч с поправкой двух цифр проверенный вопрос можно отключать генератор кнопкой энкодера на дисплее отключен а генератор генерирует отключается кнопкой ген/част

          2. #include
            #include
            #include
            #include
            LiquidCrystal lcd(6, 7, 8, 11, 12, 13);// RS,E,D4,D5,D6,D7
            Encoder myEnc(2, 3);// CLK, DT

            void setup() {
            pinMode(4,INPUT); // КНОПКА ЭНКОДЕРА
            pinMode(A5,INPUT); // КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ
            pinMode(A4,INPUT); // ЧАСТОТОМЕР/ГЕНЕРАТОР
            lcd.begin(16, 2);// LCD 16X2
            }

            unsigned long f_sum,time;
            long f[8]{0,0,0,0,0,0,0,512};
            int i,x,y,cursor,h_g;
            long oldPosition = -999,newPosition;
            float t;
            const float popravka = 1.0004502;// поправочный коэффициент для повышения точности генератора (если нет эталона то коэффициент = 1.0000000)

            unsigned long f_0;float f0;
            int x1,n=3,r;

            void loop() {
            if(analogRead(4)>600){h_g++;y=0;delay(300);if(h_g>1){h_g=0;}}// ГЕНЕРАТОР/ЧАСТОТОМЕР (ПО УМОЛЧАНИЮ ПЕРВЫЙ ГЕНЕРАТОР)

            if(h_g==1){ i=0; // ЧАСТОТОМЕР ////////////////////////////////////////////////////////////////////
            if(y==1){FreqCount.begin(1000);}

            if(digitalRead(4)==LOW){n++;x1=0;delay(100);}// ВЫБОР ВРЕМЕНИ ИЗМЕРЕНИЯ ПРИ ПОМОЩИ КНОПКИ ЭНКОДЕРА
            lcd.setCursor(0,1);
            if(n==1){x1++;if(x1==1){FreqCount.begin(100);}r=-1;lcd.print(«T = 0.1 s «);}
            if(n==2){x1++;if(x1==1){FreqCount.begin(10000);}r=1;lcd.print(«T = 10 s «);}
            if(n==3){x1++;if(x1==1){FreqCount.begin(1000);}r=0;lcd.print(«T = 1 s «);}
            if(n>3){n=1;}
            lcd.setCursor(0,0);
            lcd.print(«F = «); // ВЫВОД ЧАСТОТЫ
            if(f_0>=1000000 && n==3){f0=f_0/1000000.0;lcd.print(f0,6+r);lcd.print(» MHz»);}
            if(f_0=100000 && n==1){f0=f_0/100000.0;lcd.print(f0,6+r);lcd.print(» MHz»);}
            if(f_0=10000000 && n==2){f0=f_0/10000000.0;lcd.print(f0,6+r);lcd.print(«MHz»);}
            if(f_08){i=0;} myEnc.write(f[i]*4);// ОПРОС КНОПКИ ЭНКОДЕРА
            if(i==8){y=0;cursor=0;}}
            if(analogRead(5)>600){delay(300);i=8;y=0;}// КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ

            if(i<8||cursor==1){ // В РЕЖИМЕ ИЗМИНЕНИЯ ПЕРИОДА И ЗАОЛНЕНИЯ ШИМ ГЕНЕРАЦИЯ ОТКЛЮЧЕНА
            lcd.setCursor(10,1); lcd.print("OFF");// ГЕНЕРАЦИЯ ВЫКЛЮЧЕНА

            long newPosition = myEnc.read()/4; // ОПРОС ЭНКОДЕРА

            if (newPosition != oldPosition) {
            oldPosition = newPosition;
            f[i]=newPosition;

            if(i9){myEnc.write(0);}
            if(f[i]1023){f[7]=1023;}
            if(f[7]=0;x—){
            if(x==5||x==2){lcd.print(«.»);}// ВСАВЛЯЕМ РАЗДЕЛИТЬ РАЗРЯДА
            if(cursor==1&&i==x){lcd.print(» «);}else{lcd.print(f[x]);}
            }
            lcd.print(» uS»);

            // МИГАНИЕ КУРСОРА ПРИ ИЗМИНЕНИИ ПАРАМЕТРОВ

            if(millis()-time200){cursor=0;}// 800 МС ПОКАЗЫВАЕМ ЦИФРУ
            if(millis()-time>1000){time=millis();}// ОТСЧЕТ 1 СЕКУНДЫ
            }

            // ВЫВОД НА LCD % ЗАПОНЕНИЯ ШИМ
            t=f[7]*100.0/1023;
            lcd.setCursor(0,1);lcd.print(t,1);if(cursor==1&&i==7){lcd.print(» «);}else{ lcd.print(» % «);}
            }
            y++;
            }

  5. #include
    #include
    #include
    #include
    LiquidCrystal lcd(6, 7, 8, 11, 12, 13);// RS,E,D4,D5,D6,D7
    Encoder myEnc(2, 3);// CLK, DT

    void setup() {
    pinMode(4,INPUT); // КНОПКА ЭНКОДЕРА
    pinMode(A5,INPUT); // КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ
    pinMode(A4,INPUT); // ЧАСТОТОМЕР/ГЕНЕРАТОР
    lcd.begin(16, 2);// LCD 16X2
    }

    unsigned long f_sum,time;
    long f[8]{0,0,0,0,0,0,0,512};
    int i,x,y,cursor,h_g;
    long oldPosition = -999,newPosition;
    float t;
    const float popravka = 1.0004502;// поправочный коэффициент для повышения точности генератора (если нет эталона то коэффициент = 1.0000000)

    unsigned long f_0;float f0;
    int x1,n=3,r;

    void loop() {
    if(analogRead(4)>600){h_g++;y=0;delay(300);if(h_g>1){h_g=0;}}// ГЕНЕРАТОР/ЧАСТОТОМЕР (ПО УМОЛЧАНИЮ ПЕРВЫЙ ГЕНЕРАТОР)

    if(h_g==1){ i=0; // ЧАСТОТОМЕР ////////////////////////////////////////////////////////////////////
    if(y==1){FreqCount.begin(1000);}

    if(digitalRead(4)==LOW){n++;x1=0;delay(100);}// ВЫБОР ВРЕМЕНИ ИЗМЕРЕНИЯ ПРИ ПОМОЩИ КНОПКИ ЭНКОДЕРА
    lcd.setCursor(0,1);
    if(n==1){x1++;if(x1==1){FreqCount.begin(100);}r=-1;lcd.print(«T = 0.1 s «);}
    if(n==2){x1++;if(x1==1){FreqCount.begin(10000);}r=1;lcd.print(«T = 10 s «);}
    if(n==3){x1++;if(x1==1){FreqCount.begin(1000);}r=0;lcd.print(«T = 1 s «);}
    if(n>3){n=1;}
    lcd.setCursor(0,0);
    lcd.print(«F = «); // ВЫВОД ЧАСТОТЫ
    if(f_0>=1000000 && n==3){f0=f_0/1000000.0;lcd.print(f0,6+r);lcd.print(» MHz»);}
    if(f_0=100000 && n==1){f0=f_0/100000.0;lcd.print(f0,6+r);lcd.print(» MHz»);}
    if(f_0=10000000 && n==2){f0=f_0/10000000.0;lcd.print(f0,6+r);lcd.print(«MHz»);}
    if(f_08){i=0;} myEnc.write(f[i]*4);// ОПРОС КНОПКИ ЭНКОДЕРА
    if(i==8){y=0;cursor=0;}}
    if(analogRead(5)>600){delay(300);i=8;y=0;}// КНОПКА ПРИНУДИТЕЛЬНОГО ВКЛЮЧЕНИЯ ГЕНЕРАЦИИ

    if(i<8||cursor==1){ // В РЕЖИМЕ ИЗМИНЕНИЯ ПЕРИОДА И ЗАОЛНЕНИЯ ШИМ ГЕНЕРАЦИЯ ОТКЛЮЧЕНА
    lcd.setCursor(10,1); lcd.print("OFF");// ГЕНЕРАЦИЯ ВЫКЛЮЧЕНА

    long newPosition = myEnc.read()/4; // ОПРОС ЭНКОДЕРА

    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    f[i]=newPosition;

    if(i9){myEnc.write(0);}
    if(f[i]1023){f[7]=1023;}
    if(f[7]=0;x—){
    if(x==5||x==2){lcd.print(«.»);}// ВСАВЛЯЕМ РАЗДЕЛИТЬ РАЗРЯДА
    if(cursor==1&&i==x){lcd.print(» «);}else{lcd.print(f[x]);}
    }
    lcd.print(» uS»);

    // МИГАНИЕ КУРСОРА ПРИ ИЗМИНЕНИИ ПАРАМЕТРОВ

    if(millis()-time200){cursor=0;}// 800 МС ПОКАЗЫВАЕМ ЦИФРУ
    if(millis()-time>1000){time=millis();}// ОТСЧЕТ 1 СЕКУНДЫ
    }

    // ВЫВОД НА LCD % ЗАПОНЕНИЯ ШИМ
    t=f[7]*100.0/1023;
    lcd.setCursor(0,1);lcd.print(t,1);if(cursor==1&&i==7){lcd.print(» «);}else{ lcd.print(» % «);}
    }
    y++;
    }

    в первый скетч не вставил библиотеки

Добавить комментарий

Войти с помощью: