Конфликт с приемом в 433 и выводом на индикатор
- Войдите на сайт для отправки комментариев
Добрый день, подскажите новичку.
Получил такие модули: 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
Без индикатора все передается отлично и в терминалке все приходит и меняется, но стоит только подать напряжение на индикатор, как связь встает. Верней она проходит один раз после перезагрузки и все. Больше не обновляется.
Припаял антенны, разнес подальше сигнальные провода. Ничего не помогает (. Неужели от индикатора такие помехи? Подскажите.
Схема, скетч, ссылки на используемые библиотеки.
Без всего этого кто Вам что скажет? Разве что, "поправьте строку 32" и "проверьте контакт зелёного провода". Помогло?
Понял. Для наглядности сделал фото.
Вот передающая сторона:
#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); } }Схему включения всё же нарисуйте, на фото ж ничерта толком не разберёшь.
Хорошо, вечером постараюсь найти програмку для рисования. Но там в принципе все тривиально. Питание да провода на цифровые выходы. Больше нет ничего.
Если бы сам делал такое устройство, то в приемной части на индикатор (похоже он на MAX7219) выводил бы данные по SPI на максимальной скорости 8 МГц (Fosc/2). Посылка на MAX7219 - 16 бит сдвиговому регистру и 2 раза щелкнуть защелкой. Неспокойствие на линиях ввода грубо ~ 8 МГц / 18 ~ 444 кГц.
Задумался. Наверное умничаю.
Если бы сам делал такое устройство, то в приемной части на индикатор (похоже он на MAX7219) выводил бы данные по SPI на максимальной скорости 8 МГц (Fosc/2). Посылка на MAX7219 - 16 бит сдвиговому регистру и 2 раза щелкнуть защелкой. Неспокойствие на линиях ввода грубо ~ 8 МГц / 18 ~ 444 кГц.
Задумался. Наверное умничаю.
Простите новичка.
Вы намекаете на гармоники и советуете изменить частоту шины? Все перелопатил, не найду как. Подскажите
list65
кончайте вы тут извиняться, после этого себя э-ээ... собакой чувствуешь.
Ну да, как бы намекал, что радиоинтерференции тут скорее всего нет, расхождение в возможных возмущениях на порядки. Скорее по питанию возмущения, но это тоже спекулятивно. Не зная, в чем причина такого странного поведения, я бы озаботился питанием.
Ну или спокойно дождался бы мнения (более) компентентных участников.
P.S. Частоту шины менять не нужно, обычно все всех устраивает и это не ваш вариант, IMHO. Я же говорю - поумничать решил.
Запитал приемник от отдельного питания. Индикатор от выхода Ардуино и связь появилась. Вот такие дела.
Спасибо, что отписались. Испытания _таких_ RF модулей у меня в будущем.
Ну и благодаря _вашему_ опыту уделю внимание чистоте питания.
А вы тут извиняться пробовали. Забудьте. Поздравляю с успехом, достигнутым вами самостоятельно. Такие дела.
Да, питанию наверное уделять нужно больше внимания. Расстояние, на котором была возможна связь, оказалось всего около 5 метров. Антенна - куски проводов 17 см.
Подстройте приемник. На плате есть индуктивность с сердечником. Запомните положение сердечника, на всякий случай и вращайте его на 5-10 градусов за раз