Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 166 из 223 ПерваяПервая ... 66116156163164165166167168169176216 ... ПоследняяПоследняя
Показано с 1,651 по 1,660 из 2227

Тема: ARDUINO

  1. #1651

    Регистрация
    16.02.2012
    Адрес
    За полярным кругом
    Сообщений
    5,670
    Записей в дневнике
    1
    Позывной
    ex RA1OGS
    Цитата Сообщение от Qekido Посмотреть сообщение
    Также какую операционную систему лучше использовать для работы с arduino: Windows или Linux?Спасибо за внимание!!!
    без разницы, что вам удобнее то и используйте, только если под XP будите работать то ставьте предпоследнюю версию софта 1.8.9 (последняя 1.8.10 что то ругается на ядро системы, но возможно это особенность моей системы).
    А покупать ардуинки и модули к ним выгоднее всего на алике, и цены низкие и качество нормальное, и подобрать можно несколько в одном магазине сэкономив на доставке немного, за надписью "Ардуино" на плате фирменных гнаться не стоит, работают одинаково. По крайней мере за 5 лет ни одной проблемы не возникло, а покупаю их регулярно.
    Последний раз редактировалось Milldi; 08.12.2019 в 23:43.


  2. #1652
    Аватар для UD2F
    Регистрация
    01.12.2007
    Адрес
    KO04HR
    Сообщений
    971
    Позывной
    UD2F (ex: RU2FM)
    Win10, Win7, Linux (Ubuntu 18.04) работает нормально
    73! Валентин

  3. #1653
    Аватар для tomcat
    Регистрация
    27.01.2010
    Адрес
    Магаляндия, колония США
    Сообщений
    1,674
    Записей в дневнике
    3

    Индикатор лампового УМ на Arduino nano 3 и LCD 2004. Тест.

    Цитата Сообщение от fedorenko28 Посмотреть сообщение
    Индикация работает быстро, не инертно при изменении показаний?

    Индикатор подключили к УМ и опробовали в SSB.

    Ссылка на кину.


    Нажмите на изображение для увеличения. 

Название:	IMG_20191215_180330_812.jpg 
Просмотров:	429 
Размер:	181.6 Кб 
ID:	326147



    По поводу отображения в SSB :

    Как сделать, чтобы ардуина проводила 3...5 измерений с портов А6 и А7, выбирала из них максимальное значение и уже его выводила на дисплей !?
    Последний раз редактировалось tomcat; 15.12.2019 в 19:21.
    ICOM-728, Mini SW2013, sdr-trx R3DI (Маламут), ATU N7DDC, Inv-V, GP.

  4. Спасибо от RK9AMX

  5. #1654
    Аватар для Integral
    Регистрация
    08.02.2007
    Адрес
    г. Снежное
    Сообщений
    2,926
    Записей в дневнике
    1
    Позывной
    UT0IS/D0ISM
    Цитата Сообщение от tomcat Посмотреть сообщение
    Индикатор подключили к УМ и опробовали в SSB.
    Как мне показалось по видео индикация все же получилась медленная и дерганная, а значит есть куда расти
    Цитата Сообщение от tomcat Посмотреть сообщение
    Как сделать, чтобы ардуина проводила 3...5 измерений с портов А6 и А7, выбирала из них максимальное значение и уже его выводила на дисплей !?
    Я делаю не так, чтобы показания были ровными и более плавными добавляю в код с аналоговых портов усреднение показаний. Т.е. происходит несколько измерений по каждому порту и среднее значение затем уходит в обработку. Усреднение сигнала можно сделать двумя способами, первый это по времени, второй - по количеству считываний с портов. Например временное усреднение:
    Код:
    void loop() {
        float U1=0,U2=0;                                                              //назначаем переменные прямой и обратной волны
        unsigned long CalcStart = millis();                                           //назначаем переменную отсчета времени CalcStart
        int ReadCnt=0;                                                                //назначаем переменную инкрементного счетчика для усреднения
      while ((millis()-CalcStart)<REFRESH_TIME){                                      //пока отсчет времени не сравняется с константой REFRESH_TIME:
        U1 += analogRead(A0);                                                         //суммируем значения U1 с порта А0
        U2 += analogRead(A1);                                                         //суммируем значения U2 с порта А1
        ReadCnt++;}                                                                   //увеличиваем значение счетчика ReadCnt на 1
        U1 = U1 / ReadCnt;                                                            //усредняем значение U1
        U2 = U2 / ReadCnt;                                                            //усредняем значение U2
    Работает это так, за время REFRESH_TIME происходит считывание и накопление значений с портов А0 и А1, сумма накапливается в U1 и U2. После чего сумма делится на количество измерений, которые получили за время измерения REFRESH_TIME. Полученное среднее значение U1 и U2 дальше отправляем на обработку в программу для получения КСВ и мощности. Параметр REFRESH_TIME удобнее всего задать как #define в начале скетча, где его можно быстро отредактировать. У меня он задан так:
    Код:
    #define REFRESH_TIME 10                                                           //время замера с аналоговых портов для усреднения
    Остальные переменные определены непосредственно в цикле loop.

    Добавлено через 12 минут(ы):

    Вот второй пример, по количеству измерений:
    Код:
        int U1=0,U2=0;                                                                //назначаем переменные прямой и обратной волны
        const int COUNT = 10;                                                         //назначаем константу кол-во измерений
      for (byte i=0; i<COUNT; i++){                                                   //включаем цикл измерения
        U1 +=  analogRead(A0);                                                        //суммируем значения U1 с порта А0
        U2 +=  analogRead(A1);}                                                       //суммируем значения U2 с порта А1
        U1 = U1 / COUNT;                                                              //усредняем значение U1
        U2 = U2 / COUNT;                                                              //усредняем значение U2
    Работает он практически так же как первый, но не требует функции времени millis(). Здесь запускаем цикл измерения с портов А0 и А1, количество измерений задаем константой COUNT. В данном случае делаем 10 измерений по каждому порту, получаем сумму и делим на количество измерений, т.е. на COUNT. Количество измерений не должно превышать 255, т.к. переменная i задана как byte. Из практики скажу, что больше 50 измерений делать нет смысла да и тормозит тогда программа. Можно увеличить частоту считывания с аналоговых портов до 125кГц, но это уже нужен прямой доступ к АЦП и к простому способу его не отнесешь. Пока думаю хватит на первое время
    Последний раз редактировалось Integral; 15.12.2019 в 20:36.
    Интеграл от человеческих заблуждений - истина, производная - безумие.

  6. Спасибо от RK9AMX, tomcat

  7. #1655
    Аватар для Integral
    Регистрация
    08.02.2007
    Адрес
    г. Снежное
    Сообщений
    2,926
    Записей в дневнике
    1
    Позывной
    UT0IS/D0ISM
    А вот ответ на ваш вопрос, как определить максимальное значение. Преобразуем предыдущий код и получим:
    Код:
        int U1=0,U2=0;                                                                //назначаем переменные прямой и обратной волны
        const int COUNT = 10;                                                         //назначаем константу кол-во измерений
      for (byte i=0; ++i<COUNT;){                                                     //включаем цикл измерения
        int U1temp =  analogRead(A0);                                                 //суммируем значения U1 с порта А0
        int U2temp =  analogRead(A1);                                                 //суммируем значения U2 с порта А1
      if (U1temp>=U1){U1=U1temp;}                                                     //получаем максимальное значение U1
      if (U2temp>=U2){U2=U2temp;}}                                                    //получаем максимальное значение U2
    //    U1 = U1 / COUNT;                                                              //усредняем значение U1
    //    U2 = U2 / COUNT;                                                              //усредняем значение U2
    Вводим в цикл измерения промежуточные переменные U1temp и U2temp. Как только новое значение больше или равно U1 или U2, то переписываем их на новое значение. В результате из 10 измерений в U1 и U2 мы получим максимальное значение. Количество измерений можно увеличить, из практики такой алгоритм работает хуже, чем простое усреднение, можете сравнить на практике. Для этого уже все имеется.
    Интеграл от человеческих заблуждений - истина, производная - безумие.

  8. Спасибо от RK9AMX, tomcat

  9. #1656
    Аватар для RK9AMX
    Регистрация
    26.03.2005
    Адрес
    Челябинск, MO05RE
    Сообщений
    1,345
    Записей в дневнике
    20
    Позывной
    RK9AMX
    Цитата Сообщение от Integral Посмотреть сообщение
    Код:
    void loop() {
        float U1=0,U2=0;                                                              //назначаем переменные прямой и обратной волны
        unsigned long CalcStart = millis();                                           //назначаем переменную отсчета времени CalcStart
        int ReadCnt=0;                                                                //назначаем переменную инкрементного счетчика для усреднения
      while ((millis()-CalcStart)<REFRESH_TIME){                                      //пока отсчет времени не сравняется с константой REFRESH_TIME:
        U1 += analogRead(A0);                                                         //суммируем значения U1 с порта А0
        U2 += analogRead(A1);                                                         //суммируем значения U2 с порта А1
        ReadCnt++;}                                                                   //увеличиваем значение счетчика ReadCnt на 1
        U1 = U1 / ReadCnt;                                                            //усредняем значение U1
        U2 = U2 / ReadCnt;                                                            //усредняем значение U2
    Описывать переменные U1 и U2 типом float совсем необязательно. Достаточно uint16_t. Отрицательное значение там не получится, а дробной частью можно пренебречь. Аналогично с переменной ReadCnt, достаточно uint8_t. Единственное условие: константа REFRESH_TIME не должна превышать значение 255.

    Задавая такой цикл вы тормозите выполнение программы на время REFRESH_TIME (10мс из примера). Это не всегда оправдано, а иногда даже вредно.

    Код:
    #define SAMPLING 10 // количество выборок АЦП max 255
    #define FWD A0 
    #define REV A1
    
    uint16_t u1, u2;
    uint8_t qt;
    ...
    void loop() {
    
      if (qt <= SAMPLING) {
        u1 += analogRead(FWD);
        u2 += analogRead(REV);
        qt ++;
      } else {
        u1 = u1 / qt;
        u2 = u2 / qt;
         ....
        // вычисляем КСВ, выводим значение на дисплей, т.п.
        u1 = 0;
        u2 = 0;
        qt = 0;
      }
    }
    Ещё на входы АЦП можно подключить конденсаторы 0.01-0.47uF (точное значение может выходить за предложенный диапазон). Значением этой емкости можно подобрать плавность нарастания/убывания столбика градусника.

    Функция analogRead в ардуино достаточно медленная, чтобы "отфильтровывать " шумы АЦП. Дополнительно усреднять значение, наверно, смысла особого нет. Можно обновлять значения на дисплее реже, используя millis().
    Последний раз редактировалось RK9AMX; 16.12.2019 в 08:48.
    Сомнения могут быть устранены только опытом.

  10. Спасибо от Integral, tomcat

  11. #1657
    Аватар для tomcat
    Регистрация
    27.01.2010
    Адрес
    Магаляндия, колония США
    Сообщений
    1,674
    Записей в дневнике
    3
    Цитата Сообщение от RK9AMX Посмотреть сообщение
    Ещё на входы АЦП можно подключить конденсаторы 0.01-0.47uF
    на входы АЦП уже были установлены конденсаторы 47 nF.
    ICOM-728, Mini SW2013, sdr-trx R3DI (Маламут), ATU N7DDC, Inv-V, GP.

  12. #1658
    Аватар для RK9AMX
    Регистрация
    26.03.2005
    Адрес
    Челябинск, MO05RE
    Сообщений
    1,345
    Записей в дневнике
    20
    Позывной
    RK9AMX
    Цитата Сообщение от tomcat Посмотреть сообщение
    на входы АЦП уже были установлены конденсаторы 47 nF.
    Ясно.
    Огромное спасибо за видео! Очень информативно показана работа "градусника". Если использовали алгоритм, который я предлагал, то есть над чем задуматься.
    При плавной регулировке напряжения всё красиво. А при передаче SSB выводится пиковое значение. Чтобы это красивее выглядело, можно затухание сделать плавнее. Если приложите скетч, попробую на досуге что-нибудь поправить для реализации этой задумки.
    Если конечно вы готовы ещё поковыряться с этим проектом.
    Сомнения могут быть устранены только опытом.

  13. Спасибо от tomcat

  14. #1659
    Аватар для tomcat
    Регистрация
    27.01.2010
    Адрес
    Магаляндия, колония США
    Сообщений
    1,674
    Записей в дневнике
    3
    Цитата Сообщение от RK9AMX Посмотреть сообщение
    Если приложите скетч, попробую на досуге что-нибудь поправить для реализации этой задумки.
    спасибо!

    скетч последней работоспособной версии от 29.11.2019 (15:35), которая на видео, в ней Ваши предложения пока еще не реализованы :

    LcdBarGraph_21_11_2019_I2C_1647.rar
    Последний раз редактировалось tomcat; 17.12.2019 в 17:52.
    ICOM-728, Mini SW2013, sdr-trx R3DI (Маламут), ATU N7DDC, Inv-V, GP.


  15. #1660
    Аватар для tomcat
    Регистрация
    27.01.2010
    Адрес
    Магаляндия, колония США
    Сообщений
    1,674
    Записей в дневнике
    3
    Цитата Сообщение от tomcat Посмотреть сообщение
    скетч последней работоспособной версии от 29.11.2019 (15:35), которая на видео,
    скетч для быстрого просмотра :

    Код:
    // -- Индикатор лампового УМ на Arduino nano 3 и LCD 2004
    
    
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    
    
    #define PMETER A6
     
    //byte lcdNumCols = 20; // -- number of columns in the LCD
    //byte sensorPin = 0; // -- value for this example
    uint16_t val_sm = 0;   
    uint16_t val_sm_old = 1;
     
    LiquidCrystal_I2C lcd(0x27,20,4); // -- creating LCD instance
    //LcdBarGraph lbg(&lcd, 20, 0, 0);  // -- creating bargraph instance, format is (&lcd, lcdNumCols, start X, start Y). So (&lcd, 16, 0, 1) would set the bargraph length to 16 columns and start the bargraph at column 0 on row 1.
    
    
    const uint8_t sm2[8] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00};
    const uint8_t sm1[8] {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00};
    const uint8_t sm0[8] {0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00}; 
    
    
    void setup(){
      // -- initializing the LCD
      lcd.init();                            // Инициализация lcd             
      lcd.backlight();                       // Включаем подсветку
      lcd.begin(20, 4);
      
      lcd.createChar(0, sm0); 
      lcd.createChar(1, sm1); 
      lcd.createChar(2, sm2); 
      
      lcd.clear();
      // -- do some delay some time I've got broken visualization
      //delay(100);
      
    }
     
    void loop()
    
    
    {
      // -- draw bar graph from the analog value readed
      //lbg.drawValue( analogRead(A6), 1021);
      // -- do some delay: frequent draw may cause broken visualization
    
    
      val_sm = analogRead(PMETER); 
      if ((abs(val_sm - val_sm_old)) > 3) {
        show_sm();
        val_sm_old = val_sm;
      }
      
      //delay(100);
    
    
      //lcd.clear();
      // измерение анодного напряжения
      // устанавливаем курсор в колонку 0, строку 2
      lcd.setCursor(0, 2);
      // считываем показания с аналогового входа A0
      int anodU = analogRead(A0);
      // переводим значения с АЦП A0 в вольты
      float sensorVoltage = anodU * (5.0 / 120.0); // тут правим коэффициент для другого верхнего значения напряжения
      // переводим вольты в напряжение
      int anodV = sensorVoltage * 100;
      // выводим результат на дисплей
      lcd.print("Ua=");
      // устанавливаем курсор в колонку 3, строку 2
      // на самом деле это третья строка, т.к. нумерация начинается с нуля
      lcd.setCursor(3, 2);
      lcd.print(anodV);
      lcd.print("V  ");
    
    
    // измерение анодного тока
      // устанавливаем курсор в колонку 10, строку 2
      lcd.setCursor(10, 2);
      // считываем показания с аналогового входа A1
      int anodI = analogRead(A1);
      // переводим значения с АЦП A1 в вольты
      float sensorVoltage1 = anodI * (5.0 / 123.0); // тут правим коэффициент для другого верхнего значения тока
      // переводим вольты в милиамперы
      int anodmA = sensorVoltage1 * 100;
      // выводим результат на дисплей
      lcd.print("Ia=");
      // устанавливаем курсор в колонку 13, строку 2
      lcd.setCursor(13, 2);
      lcd.print(anodmA);
      lcd.print("mA ");
    
    
    // измерение напряжения экранной сетки
      // устанавливаем курсор в колонку 0, строку 3
      lcd.setCursor(0, 3);
      // считываем показания с аналогового входа A2
      int gridU2 = analogRead(A2);
      // переводим значения с АЦП A2 в вольты
      float sensorVoltage2 = gridU2 * (5.0 / 120.0); // тут правим коэффициент для другого верхнего значения напряжения
      // переводим вольты в напряжение
      int gridV2 = sensorVoltage2 * 100;
      // выводим результат на дисплей
      lcd.print("Ug=");
      // устанавливаем курсор в колонку 3, строку 3
      // на самом деле это третья строка, т.к. нумерация начинается с нуля
      lcd.setCursor(3, 3);
      lcd.print(gridV2);
      lcd.print("V  ");
      
    // измерение тока экранной сетки
      // устанавливаем курсор в колонку 10, строку 3
      lcd.setCursor(10, 3);
      // считываем показания с аналогового входа A3
      int gridI2 = analogRead(A3);
      // переводим значения с АЦП A3 в вольты
      float sensorVoltage3 = gridI2 * (5.0 / 123.0); // тут правим коэффициент для другого верхнего значения тока
      // переводим вольты в милиамперы
      int gridmA2 = sensorVoltage3 * 100;
      // выводим результат на дисплей
      lcd.print("Ig=");
      // устанавливаем курсор в колонку 13, строку 3
      lcd.setCursor(13, 3);
      lcd.print(gridmA2);
      lcd.print("mA ");
    
    
    // измерение мощности и КСВ
      // устанавливаем курсор в колонку 10, строку 1
      lcd.setCursor(0, 1);
      // считываем показания с аналогового входа A6 A7
      int pwr1 = analogRead(A6);
      int pwr2 = analogRead(A7);
      // переводим значения с АЦП A6 A7 в вольты
      float U1 = pwr1 * (5.0 / 73.0);
      float U2 = pwr2 * (5.0 / 73.0);
      // переводим вольты в мощность и КСВ
      int pwr11 = ((U1*U1)/50) * 15; // тут правим коэффициент для мощности 1472 Вт
      int swr12 = ((U1+U2)/(U1-U2)) * 100;
      //ограничиваем значение КСВ на уровне 9.99
      // выводим результат на дисплей
      lcd.print("PWR=");
      // устанавливаем курсор в колонку 4, строку 1
      lcd.setCursor(4, 1);
      lcd.print(pwr11);
      lcd.print("W ");
    
    
    // устанавливаем курсор в колонку 10, строку 1
      lcd.setCursor(10, 1);
      // выводим результат на дисплей
      lcd.print("SWR=");
      lcd.print("      ");
      // устанавливаем курсор в колонку 13, строку 1
      lcd.setCursor(14, 1);
        lcd.print(swr12 / 100); //целая часть
      lcd.print(".");
      if (swr12 - (swr12/100)*100 <= 9) {
      lcd.print("0");
      }
      lcd.print(swr12 - (swr12/100)*100); //дробная часть
      //lcd.print(swr12=swr12*10); //дробная часть
      
      delay(150);
      
    }
    
    
    void show_sm() {
      uint8_t m;
      uint8_t a;
    
    
      a = (val_sm + 3) / 51; 
      lcd.setCursor(0, 0);
      for (m = 0; m < a; m++)
        if (m < 13)  //  до 70% не закрашенные квадратики
          lcd.print('\x00');  // символ sm0              
        else
          lcd.print('\x01'); // символ sm1              
      for (m = a; m < 19; m++)
        lcd.print('\x02');                
    }



    пересмотрел видео и возник еще вопрос :

    как закруглить отображение анодного напряжения кратно 20 или 50 В, так как беготня цифр немного отвлекает ?



    .
    Последний раз редактировалось tomcat; 18.12.2019 в 11:00.
    ICOM-728, Mini SW2013, sdr-trx R3DI (Маламут), ATU N7DDC, Inv-V, GP.

Страница 166 из 223 ПерваяПервая ... 66116156163164165166167168169176216 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •