Радио реле на 433Mhz (с заморочками) ))

NANKAT
Offline
Зарегистрирован: 11.04.2019

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

Имеется:
1х Arduino esplora
1x Arduino nano
smart rf315 tx & rx

Esplora как передатчик.
Нано как приёмник + подключены реле.

Необходимо:

Пока на esplora нажата кнопка 1, реле 1 включено. Кнопку отпустили, реле выключено. Так все 4 кнопки на 4 реле.

Теперь проблемная часть.
Если джойстик двинуть на половину в перед, реле 5 включено (весь ход до половины). Если двигать дальше за половину, реле 5 выключается и включается реле 6.
Так симетрично во все стораны + нажатие по середине тоже на реле.

Помогите пожалуйста с кодом. Я перепробовал всё, и никак немогу написать.. (

NANKAT
Offline
Зарегистрирован: 11.04.2019

На эсплоре трансмитер на 7 пин можно подключить. Проверенно. Модули работают.

И пардон с нумерации реле. Правельная нумерация с 2 итд.

NANKAT
Offline
Зарегистрирован: 11.04.2019

Передатчик:

#include <VirtualWire.h>
#include <Esplora.h>

void setup()
{
    Serial.begin(9600);	  
    Serial.println("setup"); 
    vw_set_tx_pin(7);    
    vw_set_ptt_inverted(true);
    vw_setup(4000);
}

void loop(){
if
{
if (Esplora.readButton(SWITCH_1) == LOW)
     {
    vw_send((uint8_t *)"A", strlen("A")); 
    vw_wait_tx();
    
 }
 if (Esplora.readButton(SWITCH_2) == LOW)
     {
    vw_send((uint8_t *)"B", strlen("B")); 
    vw_wait_tx();
    
 }
 if (Esplora.readButton(SWITCH_3) == LOW)
     {
    vw_send((uint8_t *)"C", strlen("C")); 
    vw_wait_tx();
 }
 if (Esplora.readButton(SWITCH_4) == LOW)
     {
    vw_send((uint8_t *)"D", strlen("D")); 
    vw_wait_tx();
     }
     }

 

NANKAT
Offline
Зарегистрирован: 11.04.2019

Приемник:

#include <VirtualWire.h>
uint8_t dely=0;
void setup()
{
    vw_set_ptt_inverted(true);
    vw_set_rx_pin(11);
    vw_setup(4000);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);

    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))
    {
      if(buf[0]=='A'){  
                         
    digitalWrite(2,1);
    delay(dely);
      }                  
else
      {
        digitalWrite(2,0);
      }
                      
      if(buf[0]=='B'){ 

   digitalWrite(3,1); 
   delay(dely);
      }
else
      {
        digitalWrite(3,0);
      }
        
      if(buf[0]=='C'){ 

   digitalWrite(4,1);
   delay(dely);
      }
      else
      {
        digitalWrite(4,0);
      }
      
      if(buf[0]=='D'){
    
   digitalWrite(5,1);
   delay(dely);
      }
       else
      {
        digitalWrite(5,0);
      }
        }
          } 

 

NANKAT
Offline
Зарегистрирован: 11.04.2019

По отпусканию кнопки, реле остается в включеном положении. Почему? Что делать?

T.Rook
Offline
Зарегистрирован: 05.03.2016

А Вы уверены что у Вас buf на приемнике чистится и каждый раз получает новую команду? Смотрели что содержит buf[0]? Когда кнопку отпустили какая часть кода на приемнике выполнится? Какой смысл 14 строки кода передатчика?

NANKAT
Offline
Зарегистрирован: 11.04.2019

В том и дело, что буфер не очищается. Ресивер берет последнее значение из буфера и щетает что кнопка еще нажата. 

Как очистить буффер не знаю. тоже пробую разные варианты но пока не получается.

Передатчик пересылает кманды A, B, C, D только по нажатию. проверенно. Прошывал приемник на тест и смотрел что передатчик вещает.

T.Rook
Offline
Зарегистрирован: 05.03.2016

0. Какие команды приходят на приемник (значения buf[0])

1. Опишите для себя алгоритм работы.

2. В какой момент должно выключаться реле?

3. Как приемник об этом узнает?

4. Какая часть кода на приемнике выполнится?

NANKAT
Offline
Зарегистрирован: 11.04.2019

Распиновка со стороны реле (Arduino nano) : D2 - D5 на кнопки, джойстик вверх до середины D6, за середину D7, на лево до середины D8, за середину, D9, в низ до середины D10, за середину D12 ( по скольку на D11 rx pin), на право до середины A1, за середину A2. Нажатие на середину джойстика A3 включен пока нажато. D дигиталки A аналоговые. Каждый подключен к своему реле (нормально открытое).

T.Rook
Offline
Зарегистрирован: 05.03.2016

NANKAT пишет:

Распиновка со стороны реле (Arduino nano) : D2 - D5 на кнопки, джойстик вверх до середины D6, за середину D7, на лево до середины D8, за середину, D9, в низ до середины D10, за середину D12 ( по скольку на D11 rx pin), на право до середины A1, за середину A2. Нажатие на середину джойстика A3 включен пока нажато. D дигиталки A аналоговые. Каждый подключен к своему реле (нормально открытое).

Это ответ на какой вопрос?

NANKAT
Offline
Зарегистрирован: 11.04.2019

Выше все обяснил. Я профан в написании скетча. Про синтаксис вообще помолчу.  прошу помощи.

T.Rook
Offline
Зарегистрирован: 05.03.2016

NANKAT пишет:

Выше все обяснил. Я профан в написании скетча. Про синтаксис вообще помолчу.  прошу помощи.

Вопросы не касались написания  скетча.  Если Вы просите написать за Вас - то сорри, я неправильно Вас понял,  Вам в другой раздел.

T.Rook
Offline
Зарегистрирован: 05.03.2016

NANKAT пишет:
.... Что делать?

Вам надо отправлять команду "выключить реле" при отпускании кнопки.

NANKAT
Offline
Зарегистрирован: 11.04.2019

я писал чтото типо 

if (Esplora.readButton(SWITCH_1) == LOW)
     {
    vw_send((uint8_t *)"A", strlen("A"));
    vw_wait_tx();
else
vw_send((uint8_t *)"X", strlen("X"));
    vw_wait_tx();

 

 

Где (X) сигнал на ресивере был записан как отключить реле. Но передатчик работал с сбоями по скольку на каждую кнопку в коде прописал что если не нажата то отправляет(X) сигнал. Не знаю как написать иначе, ато получается передатчик все время вещает. Как можно решить?

T.Rook
Offline
Зарегистрирован: 05.03.2016

NANKAT пишет:

я писал чтото типо

......

получается передатчик все время вещает. Как можно решить?

Ну как... отправлять команду один раз. Примерно как то так(код написан от руки для примера):

if (Esplora.readButton(SWITCH_1) == LOW)
     {
    vw_send((uint8_t *)"A", strlen("A"));
    vw_wait_tx();
    send_off = 0;  // убираем флаг необходимости отправки выкл
   }
else
   {
    send_off = 1;   // включаем флаг необходимости отправки выкл
   }

//тут блок проверки других кнопок и положений

if (send_off == 1) {   // проверяем флаг необходимости отправки выкл
   vw_send((uint8_t *)"X", strlen("X"));
    vw_wait_tx();
  send_off = 0;   // убираем флаг необходимости отправки выкл
  }

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

NANKAT
Offline
Зарегистрирован: 11.04.2019

Спасибо. Всё решено.