Новости:

Форум Infotex WeaponMod

Тема: Антенный коммутатор на ардуино нано  (Прочитано 26875 раз)

Оффлайн Love777888 31 Июля 2018, 23:28:14

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
Приветствую, давно тут не был, в общем нужна помощь! Надумал себе сделать коммутатор, поставил треугольник на 20м, блок реле на три антенны, провел витую пару вниз с 10 го на второй этаж, обжал ее под LAN штеккер, купил даже корпус от старого но компактного роутера. Ну это все отступление, в общем дошла очередь до логики, нашел скетч (http://www.r9j.ru/news/19/466/) перевел его под три антенны, вроде работает, но светодиоды мне не очень нравиться, хотелось бы по I2C высвечивать на экране 16Х2 название включенной антенны, можно и бегущей строкой(если не трудно).
вот что я так сказать обрезал с того сайта:

//Порты для выходов переключаемых антенн
int ant1 = A2;
int ant2 = A1;
int ant3 = A0;
//Порты для кнопок
int bt1 = 2;
int bt2 = 3;
int bt3 = 4;
int NumButton; //Номер нажатой кнопки

void setup () {
// Назначаем порты на вход
pinMode (bt1,INPUT);
pinMode (bt2,INPUT);
pinMode (bt3,INPUT);
// Назначаем порты на выход
pinMode (ant1,OUTPUT);
pinMode (ant2,OUTPUT);
pinMode (ant3,OUTPUT);
}

void SetButton () //Определяем номер нажатой кнопки
{
if (digitalRead (bt1) == HIGH) {NumButton = 1;}
if (digitalRead (bt2) == HIGH) {NumButton = 2;}
if (digitalRead (bt3) == HIGH) {NumButton = 3;}
}

void loop ()
{
SetButton ();
switch (NumButton) { //Выбираем что и где нужно установить в зависимости от номера нажатой кнопки
case 1: {digitalWrite (ant1, HIGH); //Устанавливаем «1» выход антенны 1, остальные сбрасываем в «0»
digitalWrite (ant2, LOW);
digitalWrite (ant3, LOW);
break;
}
case 2: {digitalWrite (ant2, HIGH); //Устанавливаем «1» выход антенны 2, остальные сбрасываем в «0»
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
break;
}
case 3: {digitalWrite (ant3, HIGH);
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
break;
}
}
}

Оффлайн Koshak 01 Августа 2018, 19:10:52 (#1)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 2825
  • Карма: +271/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Цитировать
// Пины для дисплея A4 A5

#include <LiquidCrystal_I2C.h>

//Порты для выходов переключаемых антенн
int ant1 = A2;
int ant2 = A1;
int ant3 = A0;
//Порты для кнопок
int bt1 = 2;
int bt2 = 3;
int bt3 = 4;
int NumButton; //Номер нажатой кнопки

LiquidCrystal_I2C lcd(0x21,16,2);  // Адрес дисплея 0x21 !!!!!

void setup () {
// Назначаем порты на вход
pinMode (bt1,INPUT);
pinMode (bt2,INPUT);
pinMode (bt3,INPUT);
// Назначаем порты на выход
pinMode (ant1,OUTPUT);
pinMode (ant2,OUTPUT);
pinMode (ant3,OUTPUT);

lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.setCursor(0, 0); lcd.print("Antenna Switch");
}

void SetButton () //Определяем номер нажатой кнопки
{
if (digitalRead (bt1) == HIGH) {NumButton = 1;}
if (digitalRead (bt2) == HIGH) {NumButton = 2;}
if (digitalRead (bt3) == HIGH) {NumButton = 3;}
}

void loop ()
{
SetButton ();
switch (NumButton) { //Выбираем что и где нужно установить в зависимости от номера нажатой кнопки
case 1: {digitalWrite (ant1, HIGH); //Устанавливаем «1» выход антенны 1, остальные сбрасываем в «0»
digitalWrite (ant2, LOW);
digitalWrite (ant3, LOW);
lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Antenna 1");
break;
}
case 2: {digitalWrite (ant2, HIGH); //Устанавливаем «1» выход антенны 2, остальные сбрасываем в «0»
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Antenna 2");
break;
}
case 3: {digitalWrite (ant3, HIGH);
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Antenna 3");
break;
}
}
}

Можно так попробовать. Скролл можно посмотреть в примерах библиотеки дисплея.
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн Love777888 01 Августа 2018, 22:59:21 (#2)

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
Ухты! Спасибо, буду пробовать!

Оффлайн Love777888 02 Августа 2018, 04:02:11 (#3)

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
// Пины для дисплея A4 A5
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

//Порты для выходов переключаемых антенн
int ant1 = A2;
int ant2 = A1;
int ant3 = A0;
//Порты для кнопок
int bt1 = 2;
int bt2 = 3;
int bt3 = 4;
int NumButton; //Номер нажатой кнопки

LiquidCrystal_PCF8574 lcd(0x3F);  // Адрес дисплея читать сканером !!!!!

void setup () {
// Назначаем порты на вход
pinMode (bt1,INPUT);
pinMode (bt2,INPUT);
pinMode (bt3,INPUT);
// Назначаем порты на выход
pinMode (ant1,OUTPUT);
pinMode (ant2,OUTPUT);
pinMode (ant3,OUTPUT);

lcd.begin(16, 2);                     
  lcd.setBacklight(255);// Включаем подсветку дисплея
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");
}

void SetButton () //Определяем номер нажатой кнопки
{
if (digitalRead (bt1) == HIGH) {NumButton = 1;}
if (digitalRead (bt2) == HIGH) {NumButton = 2;}
if (digitalRead (bt3) == HIGH) {NumButton = 3;}
}

void loop ()
{
SetButton ();
switch (NumButton) { //Выбираем что и где нужно установить в зависимости от номера нажатой кнопки
case 1: {digitalWrite (ant1, HIGH); //Устанавливаем «1» выход антенны 1, остальные сбрасываем в «0»
digitalWrite (ant2, LOW);
digitalWrite (ant3, LOW);
//lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("   CI-BI-10M   ");
break;
}
case 2: {digitalWrite (ant2, HIGH); //Устанавливаем «1» выход антенны 2, остальные сбрасываем в «0»
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
//lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("  TRIANGLE-20  ");
 break;
}
case 3: {digitalWrite (ant3, HIGH);
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
  lcd.setCursor(1, 0);
  lcd.setCursor(0, 1);
  lcd.print("   DIPOL 40-M   ");
  delay(1000);
  break; 
}
}
}


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

 lcd.clear(); невероятно паразитная хрень, из за нее у меня мерцал экран.

Еще забыл при включении чтобы включена была одна антенна например си би, можно просто забыть нажать на клавишу выбора антенны и вкл передачу, как то так
  • « Последнее редактирование: 02 Августа 2018, 04:08:07 от Love777888 »

Оффлайн Love777888 02 Августа 2018, 15:14:05 (#4)

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
/ Пины для дисплея A4 A5
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

//Порты для выходов переключаемых антенн
int ant1 = A2;
int ant2 = A1;
int ant3 = A0;
//Порты для кнопок
int bt1 = 2;
int bt2 = 3;
int bt3 = 4;
int NumButton; //Номер нажатой кнопки

LiquidCrystal_PCF8574 lcd(0x3F);  // Адрес дисплея читать сканером !!!!!

void setup () {
// Назначаем порты на вход
pinMode (bt1,INPUT);
pinMode (bt2,INPUT);
pinMode (bt3,INPUT);
// Назначаем порты на выход
pinMode (ant1,OUTPUT);
pinMode (ant2,OUTPUT);
pinMode (ant3,OUTPUT);
digitalWrite (ant1, HIGH);
lcd.begin(16, 2);                     
  lcd.setBacklight(255);// Включаем подсветку дисплея
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");
  lcd.setCursor(0, 1);
  lcd.print("   CI-BI-10M   ");
}

void SetButton () //Определяем номер нажатой кнопки
{
if (digitalRead (bt1) == HIGH) {NumButton = 1;}
if (digitalRead (bt2) == HIGH) {NumButton = 2;}
if (digitalRead (bt3) == HIGH) {NumButton = 3;}
}

void loop ()
{
SetButton ();
switch (NumButton) { //Выбираем что и где нужно установить в зависимости от номера нажатой кнопки
case 1: {digitalWrite (ant1, HIGH); //Устанавливаем «1» выход антенны 1, остальные сбрасываем в «0»
digitalWrite (ant2, LOW);
digitalWrite (ant3, LOW);
//lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("   CI-BI-10M   ");
break;
}
case 2: {digitalWrite (ant2, HIGH); //Устанавливаем «1» выход антенны 2, остальные сбрасываем в «0»
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
//lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("  TRIANGLE-20  ");
 break;
}
case 3: {digitalWrite (ant3, HIGH);
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
  lcd.setCursor(1, 0);
  lcd.setCursor(0, 1);
  lcd.print("   DIPOL 40-M   ");
  delay(1000);
  break; 
}
}
}

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

Оффлайн Koshak 02 Августа 2018, 21:37:30 (#5)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 2825
  • Карма: +271/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Выключить дисплей можно командой lcd.setBacklight(0) число в скобках уровень подсветки.
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн Love777888 03 Августа 2018, 11:34:19 (#6)

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
Приветствую, про эту комманду я знаю, я не совсем пойму что нужно сделать, как писать сам синтаксис. Порядок такой:
Вкл и запуск ардуино на дисплее надпись и соотв антенна включена, подсветка погорела 5 сек и погасла,
далее я включаю следущ антенну подсветка загорелась и погасла через 5 сек, след антенна горит 5 сек. Тоесть при нажатии кнопки выбора антенны подсветка горит 5 сек и тухнет.

Оффлайн Love777888 03 Августа 2018, 21:12:04 (#7)

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

//Порты для выходов переключаемых антенн
int ant1 = A2;
int ant2 = A1;
int ant3 = A0;
//Порты для кнопок
int bt1 = 2;
int bt2 = 3;
int bt3 = 4;
int bt4 = 5;
int NumButton; //Номер нажатой кнопки

LiquidCrystal_PCF8574 lcd(0x3F);  // Адрес дисплея читать сканером !!!!!

void setup () {
// Назначаем порты на вход
pinMode (bt1,INPUT);
pinMode (bt2,INPUT);
pinMode (bt3,INPUT);
// Назначаем порты на выход
pinMode (ant1,OUTPUT);
pinMode (ant2,OUTPUT);
pinMode (ant3,OUTPUT);
digitalWrite (ant1, HIGH);//включаем нужную антенну при старте ардуино
lcd.begin(16, 2);   //старт дисплея его инициализация                 
  lcd.setBacklight(255);// Включаем подсветку дисплея
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");//верхняя надпись при старте ардуино
  lcd.setCursor(0, 1);// нижняя надпись при старте
  lcd.print("   CI-BI-10M   ");//содержимое при старте второй строки
}

void SetButton () //Определяем номер нажатой кнопки
{
if (digitalRead (bt1) == HIGH) {NumButton = 1;}
if (digitalRead (bt2) == HIGH) {NumButton = 2;}
if (digitalRead (bt3) == HIGH) {NumButton = 3;}
if (digitalRead (bt4) == HIGH) {NumButton = 4;}
}

void loop ()
{
SetButton ();
switch (NumButton) { //Выбираем что и где нужно установить в зависимости от номера нажатой кнопки
case 1: {digitalWrite (ant1, HIGH); //Устанавливаем «1» выход антенны 1, остальные сбрасываем в «0»
digitalWrite (ant2, LOW);
digitalWrite (ant3, LOW);
  lcd.setBacklight(255);
  lcd.setCursor(0, 1);
  lcd.print("   CI-BI-10M   ");
break;
}
case 2: {digitalWrite (ant2, HIGH); //Устанавливаем «1» выход антенны 2, остальные сбрасываем в «0»
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
  lcd.setBacklight(255);
  lcd.setCursor(0, 1);
  lcd.print("  TRIANGLE-20  ");
 break;
}
case 3: {digitalWrite (ant3, HIGH);
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
  lcd.setBacklight(255);
  lcd.setCursor(1, 0);
  lcd.setCursor(0, 1);
  lcd.print("   DIPOL 40-M   ");
  delay(1000);
  break; 

  case 4:
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
  lcd.setCursor(1, 0);
  lcd.setCursor(0, 1);
  lcd.print(" ALL ANT GROUND ");
  delay(5000);
  lcd.setBacklight(0);
  break;
}   
}

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

Оффлайн Koshak 03 Августа 2018, 22:32:45 (#8)

  • Отпусти меня чудо халфа
  • КотЭ
  • Ветеран
  • *
  • Сообщений: 2825
  • Карма: +271/-16
    • Просмотр профиля
    • Infotex Мир Хобби
Я думаю решим проблему  :-) щас времени ноль((( семья... работа... на сайт уже времени нет(((
У кошки четыре ноги: вход, выход, земля и питание

Оффлайн Love777888 03 Августа 2018, 22:41:12 (#9)

  • Старожил
  • ****
  • Сообщений: 31
  • Карма: +1/-0
  • Здесь может быть Ваша подпись
    • Просмотр профиля
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>

//Порты для выходов переключаемых антенн
int ant1 = A2;
int ant2 = A1;
int ant3 = A0;
//Порты для кнопок
int bt1 = 2;
int bt2 = 3;
int bt3 = 4;
int bt4 = 5;
int NumButton; //Номер нажатой кнопки

LiquidCrystal_PCF8574 lcd(0x3F);  // Адрес дисплея читать сканером !!!!!

void setup () {
// Назначаем порты на вход
pinMode (bt1,INPUT);
pinMode (bt2,INPUT);
pinMode (bt3,INPUT);
// Назначаем порты на выход
pinMode (ant1,OUTPUT);
pinMode (ant2,OUTPUT);
pinMode (ant3,OUTPUT);
digitalWrite (ant1, HIGH);//включаем нужную антенну при старте ардуино
lcd.begin(16, 2);   //старт дисплея его инициализация                 
  lcd.setBacklight(255);// Включаем подсветку дисплея
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");//верхняя надпись при старте ардуино
  lcd.setCursor(0, 1);// нижняя надпись при старте
  lcd.print("   CI-BI-10M   ");//содержимое при старте второй строки
}

void SetButton () //Определяем номер нажатой кнопки
{
if (digitalRead (bt1) == HIGH) {NumButton = 1;}
if (digitalRead (bt2) == HIGH) {NumButton = 2;}
if (digitalRead (bt3) == HIGH) {NumButton = 3;}
if (digitalRead (bt4) == HIGH) {NumButton = 4;}
}

void loop ()
{
SetButton ();
switch (NumButton) { //Выбираем что и где нужно установить в зависимости от номера нажатой кнопки
case 1: {digitalWrite (ant1, HIGH); //Устанавливаем «1» выход антенны 1, остальные сбрасываем в «0»
digitalWrite (ant2, LOW);
digitalWrite (ant3, LOW);
  lcd.setBacklight(255);
  lcd.display();
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");
  lcd.setCursor(0, 1);
  lcd.print("   CI-BI-10M   ");
break;
}
case 2: {digitalWrite (ant2, HIGH); //Устанавливаем «1» выход антенны 2, остальные сбрасываем в «0»
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
  lcd.setBacklight(255);
  lcd.display();
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");
  lcd.setCursor(0, 1);
  lcd.print("  TRIANGLE-20  ");
 break;
}
case 3: {digitalWrite (ant3, HIGH);
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
  lcd.setBacklight(255);
  lcd.display();
  lcd.setCursor(1, 0); lcd.print("Antenna Switch");
  lcd.setCursor(0, 1);
  lcd.print("   DIPOL 40-M   ");
  //delay(1000);
  break; 

  case 4:
digitalWrite (ant2, LOW);
digitalWrite (ant1, LOW);
digitalWrite (ant3, LOW);
  lcd.setCursor(0, 1);
  lcd.print(" ALL ANT GROUND ");
  delay(1000);
  lcd.setBacklight(0);
  lcd.noDisplay();
  break;
}   
}

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