Конфликт с приемом в 433 и выводом на индикатор

list65
Offline
Зарегистрирован: 21.04.2016

Добрый день, подскажите новичку.

Получил такие модули: http://ru.aliexpress.com/item/RF-wireless-receiver-module-transmitter-module-board-for-arduino-super-regeneration-315-433MHZ-DC5V-ASK-OOK/32266852614.html

Собрал схемку: На передачу ардуинка мини с датчиком температуры/влажности и передатчик.

Использую библиотеки VirtualWire и EasyTransferVirtualWire;

На приеме стоит Уна и подключил 7 сегментный индикатор: http://ru.aliexpress.com/item/Free-shipping-MAX7219-LED-Digital-Tube-Display-Module-Supports-cascading-three-IO-port-control-for-arduino/32359778439.html

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

Припаял антенны, разнес подальше сигнальные провода. Ничего не помогает (. Неужели от индикатора такие помехи? Подскажите.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Схема, скетч, ссылки на используемые библиотеки.

Без всего этого кто Вам что скажет? Разве что, "поправьте строку 32" и "проверьте контакт зелёного провода". Помогло?

list65
Offline
Зарегистрирован: 21.04.2016

Понял. Для наглядности сделал фото.

Вот передающая сторона:

 

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <DHT.h>
DHT dht(8, DHT22, 6);  // 8 пин


EasyTransferVirtualWire ET;

struct SEND_DATA_STRUCTURE {
  //put your variable definitions here for the data you want to send
  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
  //Struct can'e be bigger then 26 bytes for VirtualWire version
  //byte ID;
  int t1;
  int h1;
};

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;

void setup() {
  //start the library, pass in the data details
  ET.begin(details(mydata));
  //mydata.ID = 1;
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_set_tx_pin(7);
  vw_setup(2000);	 // Bits per sec

  pinMode(13, OUTPUT);
  // Инициализация консоли
  Serial.begin(9600);

  dht.begin();

}

void loop() {

  // Задержка 2 секунды между измерениями
  delay(2000);
  //Считываем влажность
  float h = dht.readHumidity();
  // Считываем температуру
  float t = dht.readTemperature();
  // Проверка удачно прошло ли считывание.
  if (isnan(h) || isnan(t)) {
    Serial.println("Не удается считать показания");
  }

  //this is how you access the variables. [name of the group].[variable name]
  mydata.t1 = t * 10; //умножаем на 10 чтоб сохранить десятые доли
  mydata.h1 = h * 10;
  Serial.print("Humidity: ");
  Serial.print(mydata.h1);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(mydata.t1);
  Serial.println(" *C ");
  //send the data
  digitalWrite(13, HIGH);
  ET.sendData();   // отправка сообщения с помощью библиотеки ЕТ
  digitalWrite(13, LOW);

  delay(500);

}

 

Вот приемная сторона:

//#include <DHT.h>
//DHT dht(8, DHT22, 6);  // 8 пин
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
// вызываем библиотеку индикатора
#include "LedControl.h"  

/*
 Назначаем пины индикатора на  цифровые выходы ардуинки
 pin 5 is connected to the DataIn 
 pin 7 is connected to the CLK 
 pin 6 is connected to LOAD  (CS)
1-количество последовательных модулей
  */
LedControl lc=LedControl(8,10,9,1);

/* задержка между зажиганиями разрядов */
unsigned long delaytime=950;




//создаем объект
EasyTransferVirtualWire ET; 


//описывается структура пакета EasyTransferVirtualWire
struct SEND_DATA_STRUCTURE{
  //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике
  //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire)
  //byte ID;  //идентификатор устройства один байт
  int t1;   //температура два байта
  int h1;  //влажность два байта и всего 5 байт
};

//присваиваем имя пакету
SEND_DATA_STRUCTURE mydata;

void setup(){
  //start the library, pass in the data details
  ET.begin(details(mydata));
  // Инициализация консоли
  Serial.begin(9600);
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Требуется для DR3100
  vw_setup(2000);	 // Скорость передачи
  vw_set_rx_pin(2);  //подключаем к 11 пин
  vw_rx_start();       // Start the receiver PLL running (Запуск ФАЧП приемника надо провести до приема сигнала)

 
  
   pinMode(13, OUTPUT);  
  //mudata.ID=1   //присваимаем значение id 
    /*    false- Отключаем энергосберегающий режим индикатора
true-включаем    */
  lc.shutdown(0,false);
  /* яркость от 0 до 15 */
  lc.setIntensity(0,5);
  /* очистка дисплея */
  lc.clearDisplay(0);

}

void loop(){
  //Serial.print("rabotaem ");
  //check and see if a data packet has come in. 
  if(ET.receiveData())// получили пакет данных, обрабатываем
  {
    digitalWrite(13, HIGH);
  //int t1;
  //int h1;
      //выводим информацию в Монитор последовательного порта
  Serial.print("Humidity: ");
  Serial.print(mydata.h1);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(mydata.t1);
  Serial.println(" *C ");
  digitalWrite(13, LOW);
 
  //выводим температуру в левую часть
   int x1;

   lc.clearDisplay(0);
   if( mydata.t1 < 0 )lc.setChar(0,7,'-',false);
   x1 = mydata.t1;
   lc.setDigit(0,4,x1%10,false);
   x1 = x1/10;
   lc.setDigit(0,5,x1%10,true);
   x1 = x1/10;
   if( x1 >0 )lc.setDigit(0,6,x1%10,false);

   //выводим влажность в правую часть
    int x2;
   
   x2 = mydata.h1;
   lc.setDigit(0,0,x2%10,false);
   x2 = x2/10;
   lc.setDigit(0,1,x2%10,true);
   x2 = x2/10;
   if( x1 >0 )lc.setDigit(0,2,x2%10,false);
  
//delay (500);
    }
    
  }
  
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Схему включения всё же нарисуйте, на фото ж ничерта толком не разберёшь.

list65
Offline
Зарегистрирован: 21.04.2016

Хорошо, вечером постараюсь найти програмку для рисования. Но там в принципе все тривиально. Питание да провода на цифровые выходы. Больше нет ничего.

dhog1
Offline
Зарегистрирован: 01.03.2016

Если бы сам делал такое устройство, то в приемной части на индикатор (похоже он на MAX7219) выводил бы данные по SPI на максимальной скорости 8 МГц (Fosc/2). Посылка на MAX7219 - 16 бит сдвиговому регистру и 2 раза щелкнуть защелкой. Неспокойствие на линиях ввода грубо ~ 8 МГц / 18 ~ 444 кГц.

Задумался. Наверное умничаю.

list65
Offline
Зарегистрирован: 21.04.2016

dhog1 пишет:

Если бы сам делал такое устройство, то в приемной части на индикатор (похоже он на MAX7219) выводил бы данные по SPI на максимальной скорости 8 МГц (Fosc/2). Посылка на MAX7219 - 16 бит сдвиговому регистру и 2 раза щелкнуть защелкой. Неспокойствие на линиях ввода грубо ~ 8 МГц / 18 ~ 444 кГц.

Задумался. Наверное умничаю.

Простите новичка.

Вы намекаете на гармоники и советуете изменить частоту шины? Все перелопатил, не найду как. Подскажите

dhog1
Offline
Зарегистрирован: 01.03.2016

list65

кончайте вы тут извиняться, после этого себя э-ээ... собакой чувствуешь.

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

Ну или спокойно дождался бы мнения (более) компентентных участников.

P.S. Частоту шины менять не нужно, обычно все всех устраивает и это не ваш вариант, IMHO. Я же говорю - поумничать решил.

list65
Offline
Зарегистрирован: 21.04.2016

Запитал приемник от отдельного питания. Индикатор от выхода Ардуино и связь появилась. Вот такие дела.

dhog1
Offline
Зарегистрирован: 01.03.2016

Спасибо, что отписались. Испытания _таких_  RF модулей у меня в будущем.

Ну и благодаря _вашему_ опыту уделю внимание чистоте питания.

А вы тут извиняться пробовали. Забудьте. Поздравляю с успехом, достигнутым вами самостоятельно. Такие дела.

list65
Offline
Зарегистрирован: 21.04.2016

Да, питанию наверное уделять нужно больше внимания. Расстояние, на котором была возможна связь, оказалось всего около 5 метров. Антенна - куски проводов 17 см.

uncle_grin
Offline
Зарегистрирован: 26.04.2015

Подстройте приемник. На плате есть индуктивность с сердечником. Запомните положение сердечника, на всякий случай и вращайте его на 5-10 градусов за раз