433Mh нужна помощь
- Войдите на сайт для отправки комментариев
Пнд, 13/10/2014 - 03:42
Друзья помогите, бестолковому, не могу разобраться, как передать состояние кнопок с одной ардуино на другую, при помощи MX-FS и MX-JS... пересмотрел кучу примеров, но они все связаны с предачей сообщений на монитор порта, а своих знании не хватает сообразить, как это дело перелопатить:(....
Помогите примером, хоть на 1 кнопке и лампочке на второй Ардуино, заранее спасибо
тоесть у вас есть примеры с передачей кнопок с одной ардуины на другую и в порт? и вы не можете заместо порта зажечь лампочку? крута че.
Ну это очень просто состояние 1 кнопки это 1 бит данных, 8 бит это 1 байт. Посылка должна состоять из 3 байт где 1 байт это идентификатор константа - например 0xAE, приняв этот байт на другом устройсве вы точно будете знать состояние каких 8 кнопок вы приняли, второй байт это само состояние а 3 байт это контрольная сумма CRC8 - для проверки на случай повреждеия данных при передаче. Принимающее устройство полкчает 3 байта - считает сумму 2байт и сравнивает с 3 - если равны то данные идут в обработку - иначе пакет считается поврежденным.
Как установить биты переменной типа byte - вы сможите найти в программировании. Пример расчета контрольной суммы тут тоже был - надо поискать.
тоесть у вас есть примеры с передачей кнопок с одной ардуины на другую и в порт? и вы не можете заместо порта зажечь лампочку? крута че.
.... Не было не одного примера, чтобы при нажатии на одной ардуино, передовать сигнал на другую, а та вследствии этого, что-либо включала...
PS: Сарказм не уместен - я учусь, "Круто че" такие как ты седят на форуме...
.... Не было не одного примера, чтобы при нажатии на одной ардуино, передовать сигнал на другую, а та вследствии этого, что-либо включала...
PS: Сарказм не уместен - я учусь, "Круто че" такие как ты седят на форуме...
ой, извените барин. Щас прям брошу гладить валенки и начну вам пример писать.
если вам тяжело написать програмку в 5 строчек которая будет при замыкании пина выплевывать в эфир какую нить фигню. И 5 строчек для другой дуино которая когда услышит фигню в эфире будет менять состояние пина. То я не знаю с чего прям вам посоветовать начать "я учусь". Остается только посоветовать вам бросить учиться и пойти побухать что ли или коров пасти.
зажигать диод - это самый первый пример, с которого начинают, и который все должны знать наизусть. разобрать по командам и понять, что делается не просто в каждой строчке, а в каждом символе кода!
если вы это сделали, то заменить в той массе примеров, которые вы просмотрели, команду вывода в монитор порта на команду включения диода не должно составить труда.
если это не получается, то возвращайтесь к примеру включения светодиода. научитесь, хотя бы, включать его кнопкой. если
неохота заниматься самообразованием(эффективно, но медленно), то выкладывайте свой код, вас натыкают носом в ошибки. результат будет быстро, но неэффективно, ибо в следующий раз вы опять сами можете не справиться с элементарными вещами
спасибо
В общем получилось что-то вроде этого:
#include <VirtualWire.h> #include <EasyTransferVirtualWire.h> #include <EEPROM.h> // эта библиотека нужна для работы с энерго-независимой памятью const int led_pin = 13; const int transmit_pin = 12; unsigned int unique_device_id = 0; const int buttonPin = 8; int count = 0; int buttonState = 0; int BlueLed = 7; //create object EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE{ //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire) unsigned int device_id; unsigned int destination_id; unsigned int packet_id; byte command; int data; }; //переменная с данными нашей структуры SEND_DATA_STRUCTURE mydata; //ниже пару функций для записи данных типа unsigned int в EEPROM void EEPROMWriteInt(int p_address, unsigned int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } unsigned int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); } void setup() { // блок инициализации pinMode(led_pin, OUTPUT); pinMode(buttonPin, INPUT); pinMode(BlueLed, OUTPUT); //digitalWrite(buttonPin, HIGH); ET.begin(details(mydata)); vw_set_tx_pin(transmit_pin); //установка пина, к которому подключен data-вход передатчика vw_setup(2000); //скорость передачи Serial.begin(9600); randomSeed(analogRead(0)); // Читаем/записываем Device ID Serial.print("Getting Device ID... "); unique_device_id=EEPROMReadInt(0); if (unique_device_id<10000 || unique_device_id>60000) { Serial.print("N/A, updating... "); unique_device_id=random(10000, 60000); EEPROMWriteInt(0, unique_device_id); } Serial.println(unique_device_id); } void loop() { { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { count=1; digitalWrite(BlueLed, HIGH); } else //(buttonState == LOW) { count=0; digitalWrite(BlueLed, LOW); } } //if(digitalRead(buttonPin)==LOW)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... // { // digitalWrite(BlueLed, LOW); //digitalWrite(7,!digitalRead(7)); // buttonState=0;//обнуляем переменную flag mydata.device_id = unique_device_id; mydata.destination_id = 0; mydata.packet_id = random(65535); mydata.command = 0; mydata.data = count; digitalWrite(led_pin, HIGH); // включаем светодиод для отображения процесса передачи Serial.print("Transmitting packet "); Serial.print(mydata.packet_id); Serial.print(" device id "); Serial.print(mydata.device_id); Serial.print(" data: "); Serial.print(mydata.data); Serial.print(" ... "); ET.sendData(); // отправка данных digitalWrite(led_pin, LOW); Serial.println("DONE"); delay(1000); // buttonState = digitalRead(buttonPin); //if (buttonState == HIGH) // { int count = 1;} //else {int count = 0;} }проблема в том что, состояние кнопки само меняеть вне зависимости он нажатия на неё.... Отдельно обе части кода работают изумительно, вместе же, как я понимаю либо скобки не там либо ?????
посмотрите подскажите 079-090 строки.
ПО идеи нужно снять показание кнопки, запомнить его, показав цветодиоом что она была нажата, и отправить её состояние в массиве данных на другую арду....
Доброго времени суток!
Столкнулся с такой же проблемой описанной здесь.
Использую китайские радиомодули 433 Мг.
использовал библиотеку
#include <VirtualWire.h>код отправленный с передатчика получаю на приемник,
по нажатию кнопки на передатчике, код меняется в приемнике,
а как по изменению кода поменять состояние светодиода никак не получается.
Примеры с датчиком температуры работают.
пример пробовал такой же. только здесь у него зажигается из стандартного примера при получении пакета, в строке 108 ,
и оключется в 118,
а его 079-090 строки, такие же как и у меня примерно -)
мой код
плз.
Получилось с библиоткой RCSwitch
но посыка кода идет постоянно, как написать чтоб отослало 4 посылки кода? никак не получается.
////Передатчик, использован режим и флаг, 2 режима при 1 нажатии передает 444 при повторном нажатии 555 при третьем 444 ит.д посылка идет постоянно #include <RCSwitch.h> int led1 = 13; int buttonPin = 11; int regim=1; int flag=0; RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); mySwitch.enableTransmit(10); // пин трансмитер №10 } void loop() { if(digitalRead(11)==HIGH&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { regim++; flag=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% if(regim>2)//ограничим количество режимов { regim=1;//так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if(digitalRead(11)==LOW&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0;//обнуляем переменную "knopka" } //___________________________________________ if(regim==1)//второй режим { mySwitch.send(555, 24); // delay(10); } //__________________________________________ if(regim==2)//первый режим { mySwitch.send(444, 24); //delay(10); //здесь может быть любое ваше действие } }////Передатчик, использован режим и флаг, 2 режима при 1 нажатии передает 444 при повторном нажатии 555 при третьем 444 ит.д посылка идет постоянно #include <RCSwitch.h> int led1 = 13; int buttonPin = 11; int regim=1, regim_Old; int flag=0; RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); mySwitch.enableTransmit(10); // пин трансмитер №10 mySwitch.setRepeatTransmit(4); } void loop() { if(digitalRead(11)==HIGH&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { regim++; flag=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% if(regim>2)//ограничим количество режимов { regim=1;//так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if(digitalRead(11)==LOW&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0;//обнуляем переменную "knopka" } //___________________________________________ if(regim==1 && regim_Old!=regim)//второй режим { mySwitch.send(555, 24); // delay(10); } //__________________________________________ if(regim==2 && regim_Old!=regim)//первый режим { mySwitch.send(444, 24); //delay(10); //здесь может быть любое ваше действие } regim_Old=regim; }mySwitch.setRepeatTransmit(4);
И посылка по фронту изменения режима
Спасибо!
правда работает: одно нажатие одна посылка кода в мониторе.
при отправке этого будет достаточно? или надо дублировать четыремя?
Библиотека RCSwitch на программном уровне имитирует работу энкодеров сигнала на схемах 2262/2272, 1527.
По протоколу 2262/2272 посылка повторяется 4 раза. Приемник должен получить за определенный период две одинаковые посылки, чтобы акцептировать данные.
The PT2262 encoder sends out a serial string with a sync pulse and then data represented by pulse-width modulation, repeated four times. The PT2272 must match the addresses in two pulse trains to its own address, to accept. One bit is represented by 32 clock cycles. Refer to Figure 7, below to see the pulse widths that represent each value. During the 32 clock cycles two short duration pulses high represent a data bit “0”, two long duration high pulses represent a data bit “1” and one short short duration pulse high followed by one short long duration pulse high represent a floating bit, “F”. Note that the “F” bit is only used in address bits. The leading sync pulse is 4 cycles high followed by low 124 cycles, for a total of 128 cycles. Thus, one individual twelve bit packet is 512 clock cycles long and the 2262 IC sends four repeats. One clock cycle is typically about 300 to 500 microseconds (~451 with my fob). The bit arrival sequence is A0, A1, A2, A3, A4, A5, A6, A7, D3, D2, D1, D0, SYNC.
https://dzrmo.wordpress.com/2012/07/08/remote-control-pt2272-for-android/
Не знаю, как написана библиотека на прием, но на отправку количество повторов посылки задается методом setRepeatTransmit(int repeats);
Если делать по умолчанию, то количество повторов в библиотеке: 10.
this->setRepeatTransmit(10); при создании класса. Это для моих целей было очень много, передача занимала много времени, по-моему 500мс, используя setRepeatTransmit(2); уменьшил до 92мс. Вроде стабильно работает не особо и не тормозит остальную программу.
Посмотрите монитором на приемнике как будет меняться количество принятых посылов в зависимости от значения в setRepeatTransmit(), Я отправлял посылки на беспроводное реле и проконтолировать это не было возможности.
теперь понятно почему в коде rc-switch написано
При изменение mySwitch.setRepeatTransmit(4); (в передатчике)
с моим скетчем выдает
mySwitch.setRepeatTransmit(8); = 1 посылка
mySwitch.setRepeatTransmit(10); = 2 посылки
mySwitch.setRepeatTransmit(16); = 3 посылки
а скет для приема с примеров
mySwitch.setRepeatTransmit(6); = 2 посылки
mySwitch.setRepeatTransmit(8); = 3 посылки
mySwitch.setRepeatTransmit(10); = 4 посылки
при редактировании
for (int i = 1; i<changeCount ; i=i+2)
на
for (int i = 1; i<changeCount ; i=i+4)
скет для приема с примеров работает, принимает ретрансмит 4, распознает 4
а с моим скетчем не принимает, да ладно, помогли с этим спасибо!
А скажите пожалуйста еше, можно же спомошью цикла for задать отпрвку количества посылок кодов
вроде с помошью этого? или я неправ?
for (int i = 0; i < 25; i++)