Радио реле на 433Mhz (с заморочками) ))
- Войдите на сайт для отправки комментариев
Чт, 11/04/2019 - 23:57
Доброго времени суток.
Имеется:
1х Arduino esplora
1x Arduino nano
smart rf315 tx & rx
Esplora как передатчик.
Нано как приёмник + подключены реле.
Необходимо:
Пока на esplora нажата кнопка 1, реле 1 включено. Кнопку отпустили, реле выключено. Так все 4 кнопки на 4 реле.
Теперь проблемная часть.
Если джойстик двинуть на половину в перед, реле 5 включено (весь ход до половины). Если двигать дальше за половину, реле 5 выключается и включается реле 6.
Так симетрично во все стораны + нажатие по середине тоже на реле.
Помогите пожалуйста с кодом. Я перепробовал всё, и никак немогу написать.. (
На эсплоре трансмитер на 7 пин можно подключить. Проверенно. Модули работают.
И пардон с нумерации реле. Правельная нумерация с 2 итд.
Передатчик:
#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(); } }Приемник:
#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); } } }По отпусканию кнопки, реле остается в включеном положении. Почему? Что делать?
А Вы уверены что у Вас buf на приемнике чистится и каждый раз получает новую команду? Смотрели что содержит buf[0]? Когда кнопку отпустили какая часть кода на приемнике выполнится? Какой смысл 14 строки кода передатчика?
В том и дело, что буфер не очищается. Ресивер берет последнее значение из буфера и щетает что кнопка еще нажата.
Как очистить буффер не знаю. тоже пробую разные варианты но пока не получается.
Передатчик пересылает кманды A, B, C, D только по нажатию. проверенно. Прошывал приемник на тест и смотрел что передатчик вещает.
0. Какие команды приходят на приемник (значения buf[0])
1. Опишите для себя алгоритм работы.
2. В какой момент должно выключаться реле?
3. Как приемник об этом узнает?
4. Какая часть кода на приемнике выполнится?
Распиновка со стороны реле (Arduino nano) : D2 - D5 на кнопки, джойстик вверх до середины D6, за середину D7, на лево до середины D8, за середину, D9, в низ до середины D10, за середину D12 ( по скольку на D11 rx pin), на право до середины A1, за середину A2. Нажатие на середину джойстика A3 включен пока нажато. D дигиталки A аналоговые. Каждый подключен к своему реле (нормально открытое).
Распиновка со стороны реле (Arduino nano) : D2 - D5 на кнопки, джойстик вверх до середины D6, за середину D7, на лево до середины D8, за середину, D9, в низ до середины D10, за середину D12 ( по скольку на D11 rx pin), на право до середины A1, за середину A2. Нажатие на середину джойстика A3 включен пока нажато. D дигиталки A аналоговые. Каждый подключен к своему реле (нормально открытое).
Это ответ на какой вопрос?
Выше все обяснил. Я профан в написании скетча. Про синтаксис вообще помолчу. прошу помощи.
Выше все обяснил. Я профан в написании скетча. Про синтаксис вообще помолчу. прошу помощи.
Вопросы не касались написания скетча. Если Вы просите написать за Вас - то сорри, я неправильно Вас понял, Вам в другой раздел.
Вам надо отправлять команду "выключить реле" при отпускании кнопки.
я писал чтото типо
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) сигнал. Не знаю как написать иначе, ато получается передатчик все время вещает. Как можно решить?
я писал чтото типо
......
получается передатчик все время вещает. Как можно решить?
Ну как... отправлять команду один раз. Примерно как то так(код написан от руки для примера):
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; // убираем флаг необходимости отправки выкл }Но кажется мне, что одной командой выключения для всех кнопок Вы не обойдетесь, придется для каждого релле давать отдельную команду на выключение.....
Спасибо. Всё решено.