433Mh нужна помощь

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Друзья помогите, бестолковому, не могу разобраться, как передать состояние кнопок с одной ардуино на другую, при помощи MX-FS и MX-JS... пересмотрел кучу примеров, но они все связаны с предачей сообщений на монитор порта, а своих знании не хватает сообразить, как это дело перелопатить:(....

Помогите примером, хоть на 1 кнопке и лампочке на второй Ардуино, заранее спасибо

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ну это очень просто состояние 1 кнопки это 1 бит данных, 8 бит это 1 байт. Посылка должна состоять из 3 байт где 1 байт это идентификатор константа - например 0xAE, приняв этот байт на другом устройсве вы точно будете знать состояние каких 8 кнопок вы приняли, второй байт это само состояние а 3 байт это контрольная сумма CRC8 - для проверки на случай повреждеия данных при передаче. Принимающее устройство полкчает 3 байта - считает сумму 2байт и сравнивает с 3 - если равны то данные идут в обработку - иначе пакет считается поврежденным. 

Как установить биты переменной типа byte - вы сможите найти в программировании. Пример расчета контрольной суммы тут тоже был - надо поискать.

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

Puhlyaviy пишет:

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

.... Не было не одного примера, чтобы при нажатии на одной ардуино, передовать сигнал на другую, а та вследствии этого, что-либо включала... 

PS: Сарказм не уместен - я учусь, "Круто че" такие как ты седят на форуме...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

GothThug пишет:

.... Не было не одного примера, чтобы при нажатии на одной ардуино, передовать сигнал на другую, а та вследствии этого, что-либо включала... 

PS: Сарказм не уместен - я учусь, "Круто че" такие как ты седят на форуме...


ой, извените барин. Щас прям брошу гладить валенки и начну вам пример писать.
если вам тяжело написать програмку в 5 строчек которая будет при замыкании пина выплевывать в эфир какую нить фигню. И 5 строчек для другой дуино которая когда услышит фигню в эфире будет менять состояние пина. То я не знаю с чего прям вам посоветовать начать "я учусь". Остается только посоветовать вам бросить учиться и пойти побухать что ли или коров пасти.

com
Offline
Зарегистрирован: 06.09.2013

зажигать диод - это самый первый пример, с которого начинают, и который все должны знать наизусть. разобрать по командам и понять, что делается не просто в каждой строчке, а в каждом символе кода!

если вы это сделали, то заменить в той массе примеров, которые вы просмотрели, команду вывода в монитор порта на команду включения диода не должно составить труда.

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

неохота заниматься самообразованием(эффективно, но медленно), то выкладывайте свой код, вас натыкают носом в ошибки. результат будет быстро, но неэффективно, ибо в следующий раз вы опять сами можете не справиться с элементарными вещами

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

спасибо

GothThug
GothThug аватар
Offline
Зарегистрирован: 07.09.2014

В общем получилось что-то вроде этого: 



#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 строки.

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

rus2014
Offline
Зарегистрирован: 11.09.2014

Доброго времени суток!

Столкнулся с такой же проблемой описанной здесь.

Использую китайские радиомодули 433 Мг.

использовал библиотеку #include <VirtualWire.h>

код отправленный с передатчика получаю на приемник,

по нажатию кнопки на передатчике, код меняется в приемнике,

а как по изменению кода поменять состояние светодиода никак не получается.

Примеры с датчиком температуры работают.

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

и оключется в 118,

а его 079-090 строки, такие же как и у меня примерно -)

мой код



//приемник
//http://zelectro.cc/arduino-radio-transmitter-receiver

#include <VirtualWire.h>
const int ledPin =  13;      // номер выхода светодиода

void setup()
{
  Serial.begin(9600);
  //vw_set_ptt_inverted(true); // Необходимо для DR3100
  vw_setup(2000); // Задаем скорость приема
  vw_rx_start(); // Начинаем мониторинг эфира
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
  uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера

  if (vw_get_message(buf, &buflen)) // Если принято сообщение
  {
    // Начинаем разбор

    int i;
    // Если сообщение адресовано не нам, выходим
    if (buf[0] != 'z')
    {
      return; 
    }

    char command = buf[2]; // Команда находится на индексе 2

    // Числовой параметр начинается с индекса 4
    i = 4; 
    int number = 0;
    // Посколько передача идет посимвольно, то нужно преобразовать набор символов в число
    while (buf[i] != ' ')
    {
      number *= 10;
      number += buf[i] - '0';
      i++;
    }

    if(buf[i] == 123) 
    {
      digitalWrite(ledPin,HIGH);//включаем
    }
    else if(buf[i] == 321) 
    {
      digitalWrite(ledPin,LOW);//выключаем
    } 
    delay(2000);                   // ждем 2 сек.
    Serial.print(command);
    Serial.print(" ");
    Serial.println(number);
  }
}

плз.

 

 

rus2014
Offline
Зарегистрирован: 11.09.2014

Получилось с библиоткой  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);    
    //здесь может быть любое ваше действие   
  }
} 






































 

X-Dron
Offline
Зарегистрирован: 24.01.2015
////Передатчик,   использован режим и флаг, 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);

И посылка по фронту изменения режима

rus2014
Offline
Зарегистрирован: 11.09.2014

Спасибо!

правда работает: одно нажатие одна посылка кода в мониторе.

при отправке этого будет достаточно? или надо дублировать четыремя?

X-Dron
Offline
Зарегистрирован: 24.01.2015

Библиотека 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(), Я отправлял посылки на беспроводное реле и проконтолировать это не было возможности.
 

Snake
Offline
Зарегистрирован: 20.04.2015

теперь понятно почему в коде rc-switch написано

for (int i = 1; i<changeCount ; i=i+2) {
:) поэтому если будет ретрансмит 4, то посылки распознает 2 и тд
rus2014
Offline
Зарегистрирован: 11.09.2014

При изменение 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++)