Помогите в скетче ошибки найти плизззз...

Тема в разделе "Arduino & Shields", создана пользователем ToxaRU, 27 сен 2015.

  1. ToxaRU

    ToxaRU Гик

    написал скетч для передачи двух переменных int в пакете через радиомодули 433.... вроде передается и все мигает и на передатчике и на приемнике, но в мониторе порта одни нули посмотрите плиз что не так код ниже
    Код (C++):
    //  скетчь передатчика
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);
    #include <VirtualWire.h>
    #include <EasyTransferVirtualWire.h>

    int q;
    int z;

    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 q;
      int z;
    };

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

    void setup()
    {
      lcd.init();
      lcd.backlight();
      Serial.begin(9600);
      lcd.setCursor(0, 0);                   // Устанавливаем курсор в начало 2 строки
      lcd.print("S");  // Выводим текст
      delay(100);
      lcd.print("T");    // Выводим текст
      delay(100);
      lcd.print("A");   // Выводим текст
      delay(100);
      lcd.print("R");              // Выводим текст
       delay(100);
       lcd.print("T");            // Выводим текст
       delay(100);
      lcd.print(" ");              // Выводим текст
       delay(100);
       lcd.print("A");    // Выводим текст
       delay(100);
      lcd.print("R");              // Выводим текст
       delay(100);          // Выводим текст
    lcd.print("D"); // Выводим текст
    delay(100);
      lcd.print("U");              // Выводим текст
      delay(100);
      lcd.print("I");              // Выводим текст
       delay(100);
       lcd.print("N");            // Выводим текст
       delay(100);
      lcd.print("O");              // Выводим текст
       delay(500);
     
       //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(8);
      vw_setup(2000);  // Bits per sec

      pinMode(13, OUTPUT);

      randomSeed(analogRead(0));

    }


    void loop()
    {
      delay(150); // Защита от скачков напряжения тока.
      int q = analogRead(A0); // Чтоб не засорять радио эфир, отправим данные только, если обнаружим изменения на PIN (A0).
      int z = analogRead(A1); // Чтоб не засорять радио эфир, отправим данные только, если обнаружим изменения на PIN (A1).
      delay(100); // Пауза для обнаружения изменения на  PIN (A0) (A1).
    q = map(q, 0, 1023, 0, 360); // Конвертируем значения с 1023 в 254, для светодиода.
    z = map(z, 0, 1023, 0, 180); // Конвертируем значения с 1023 в 254, для светодиода.  
    lcd.clear();
    lcd.print("Horizont -- ");
      lcd.print(q);            // Выводим текст
      lcd.setCursor(0, 1);   // Устанавливаем курсор в начало 2 строки
      lcd.print("Vertical -- ");
      lcd.print(z);              // Выводим текст
       Serial.print(q);
       Serial.print(z);
     
       digitalWrite(13, HIGH);
      ET.sendData();
      digitalWrite(13, LOW);

      delay(random(100, 1000));
    }
     
    Код (C++):
    //  код для приемника
    #include <VirtualWire.h>
    #include <EasyTransferVirtualWire.h>

    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 q;
      int z;
    };

    //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));
      Serial.begin(9600);
      // Initialise the IO and ISR
      vw_set_ptt_inverted(true); // Required for DR3100
      vw_setup(2000);  // Bits per sec
      vw_set_rx_pin(2);
      vw_rx_start();       // Start the receiver PLL running

      pinMode(13, OUTPUT);
    }

    void loop(){
      //check and see if a data packet has come in.
      if(ET.receiveData()){
        //this is how you access the variables. [name of the group].[variable name]
        //since we have data, we will blink it out.
        if (mydata.ID == 1) {
       
          Serial.print(mydata.q);
          Serial.print(mydata.z);
        }
     
      }
    }
    мне нужно на другом конце получить 2 int переменные помоему в приемнике я что то недоделал
     
    Последнее редактирование: 27 сен 2015
  2. geher

    geher Гуру

    А поместить значения q и z в структуру перед отправкой? В упор не вижу, чтобы это происходило.

    Задаются значения локальных переменных q и z, а отправляется-то глобальная структура с полями q и z.

    Т.е. перед ET.sendData();
    поставить
    mydata.q=q;
    mydata.z=z;
    Или убрать переменные q и z и сразу использовать соответствующие поля структуры.
     
  3. ToxaRU

    ToxaRU Гик

    Код (C++):
    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;
      mydata.q=q;
       mydata.z=z;

    то есть вт так? А как сразу без обьявления переменных? И как на том конце вытащить переменные?
     
  4. ToxaRU

    ToxaRU Гик

    или так
    Код (C++):
     digitalWrite(13, HIGH);
    mydata.q=q;
    mydata.z=z;
      ET.sendData();
      digitalWrite(13, LOW);
     
  5. geher

    geher Гуру

    Второй вариант верный.
    Первый вариант не cкомпилируется, поскольку переменные q и t объявлены локально.
    А без объявления переменных q и z - это сразу использовать вместо них поля имеющейся структуры.
    Т.е. так:
    Код (Text):

    void loop()
    {
      delay(150); // Защита от скачков напряжения тока.
      mydata.q = analogRead(A0); // Чтоб не засорять радио эфир, отправим данные только, если обнаружим изменения на PIN (A0).
      mydata.z = analogRead(A1); // Чтоб не засорять радио эфир, отправим данные только, если обнаружим изменения на PIN (A1).
      delay(100); // Пауза для обнаружения изменения на  PIN (A0) (A1).
      mydata.q = map(mydata.q, 0, 1023, 0, 360); // Конвертируем значения с 1023 в 254, для светодиода.
      mydata.z = map(mydata.z, 0, 1023, 0, 180); // Конвертируем значения с 1023 в 254, для светодиода.
      lcd.clear();
      lcd.print("Horizont -- ");
      lcd.print(mydata.q);            // Выводим текст
      lcd.setCursor(0, 1);   // Устанавливаем курсор в начало 2 строки
      lcd.print("Vertical -- ");
      lcd.print(mydata.z);              // Выводим текст
       Serial.print(mydata.q);
       Serial.print(mydata.z);

       digitalWrite(13, HIGH);
      ET.sendData();
      digitalWrite(13, LOW);

      delay(random(100, 1000));
    }
     
    На приеме вроде все нормально, в последовательный порт выводятся сразу поля структуры.
     
    ToxaRU нравится это.
  6. ToxaRU

    ToxaRU Гик



    спасибо сейчас попробую.....))) А как на приеме результаты не в порт выдавать а в обьявленную переменную на другом конце int?
     
  7. geher

    geher Гуру

    Просто присвоить переменной значение поля структуры, заполненной принятыми данными.
    Например,
    int val = mydata.z;

    С другой стороны, никто не мешает пользоваться непосредственно полем структуры mydata (точно так же, как оно используется для вывода в последовательный порт).
    Чем оно хуже отдельно объявленной целой переменной?
    Переменная может реально понадобиться, если надо преобразовать значение поля, например, сместить в другой диапазон, но при этом надо будет оставить для каких-то целей непосредственно принятое значение.
     
    ToxaRU нравится это.
  8. ToxaRU

    ToxaRU Гик

    Спасибо))
     
  9. ToxaRU

    ToxaRU Гик


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