Передача данных по радиомодулю.
- Войдите на сайт для отправки комментариев
Пытаюсь сделать пульт управления для промышленного оборудования. Использую 2 ардуино и 2 радиомодуля NRF24L01 и релюшки на 5 вольт. Скетч нашел хороший в интернете и доделал для себя.
Но есть 2 загвоздки, при попытке отправить 2 команды, то есть зажать 2 кнопки на пульте одновременно на приемнике реле начинают запускаться по очереди. Моргают. Это конечно дело в способе передачи в самом скетче, но он удобен тем, что когда пропадает сигнал с пульта, на приемнике просто перестает работать реле ( это очень важно для промышленного оборудования ). Вдруг сигнал не дошел, вдруг батарейка на пульте села. Помогите реализовать передачу одного сигнала при зажатии 2х кнопок, будто это одна кнока...
И почему-то реле работают в обратном положении. Они изнчально включаются, а когда приходит сигнал выключются. В форумах почему-то об этом не говорится, хотя пдключить их не правильно не получится...
Вот скетч Передатчика...
#include <SPI.h>
#include "RF24.h"
int msg[1]; // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino
//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9
RF24 radio(9,10); // адреса каналов приема и передачи
const uint64_t pipes[2] = {
0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
//кнопки подключены к этим пинам
int buttonPin2 = 2;
int buttonPin3 = 3;
int buttonPin4 = 4;
int buttonPin5 = 5;
int buttonPin6 = 6;
int buttonPin7 = 7;
void setup(void){
radio.begin();
radio.setDataRate(RF24_1MBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
radio.setRetries(15,15); // Кол-во попыток и время между попытками
radio.openWritingPipe(pipes[1]); // Открываем канал передачи
radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
radio.startListening(); // Начинаем слушать эфир
}
void loop(void){
//пока кнопка (buttonPin1)нажата отправляем пакет (111)в Arduino №2
if (digitalRead(buttonPin2) == HIGH){
msg[0] = 111;
radio.stopListening();
radio.write(msg, 1);
radio.startListening();
}
if (digitalRead(buttonPin3) == HIGH){
msg[0] = 112;
radio.stopListening();
radio.write(msg, 1);
radio.startListening();
}
if (digitalRead(buttonPin4) == HIGH){
msg[0] = 113;
radio.stopListening();
radio.write(msg, 1);
radio.startListening();
}
if (digitalRead(buttonPin5) == HIGH){
msg[0] = 114;
radio.stopListening();
radio.write(msg, 1);
radio.startListening();
}
if (digitalRead(buttonPin6) == HIGH){
msg[0] = 115;
radio.stopListening();
radio.write(msg, 1);
radio.startListening();
}
if (digitalRead(buttonPin6) == HIGH){
msg[0] = 116;
radio.stopListening();
radio.write(msg, 1);
radio.startListening();
}
}
Приемник
#include <SPI.h>
#include "RF24.h"
int msg[1];
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
//Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino
//SCK -> 13
//MISO -> 12
//MOSI -> 11
//CSN -> 10
//CE -> 9
RF24 radio(9,10);
//светодиоды подключены к этим пинам
int LEDpin2 = 2;
int LEDpin3 = 3;
int LEDpin4 = 4;
int LEDpin5 = 5;
int LEDpin6 = 6;
int LEDpin7 = 7;
// адреса каналов приема и передачи
const uint64_t pipes[2] = {
0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
void setup(void){
radio.begin();
radio.setDataRate(RF24_1MBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
radio.setRetries(15,15); // Кол-во попыток и время между попытками
radio.openWritingPipe(pipes[0]); // Открываем канал передачи
radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
radio.startListening(); // Начинаем слушать эфир
pinMode(LEDpin2, OUTPUT);
pinMode(LEDpin3, OUTPUT);
pinMode(LEDpin4, OUTPUT);
pinMode(LEDpin5, OUTPUT);
pinMode(LEDpin6, OUTPUT);
pinMode(LEDpin7, OUTPUT);
}
void loop(void){
if (radio.available()){
bool done = false;
while (!done){
done = radio.read(msg, 1); //если пришел пакет от Arduino №1 (111) вКлючается светодиод (горит)LEDpin1, HIGH
if (msg[0] == 111){
delay(10);
digitalWrite(LEDpin2, HIGH);
}
else {
digitalWrite(LEDpin2, LOW);
}
delay(10);
if (msg[0] == 112){
delay(10);
digitalWrite(LEDpin3, HIGH);
}
else {
digitalWrite(LEDpin3, LOW);
}
delay(10);
if (msg[0] == 113){
delay(10);
digitalWrite(LEDpin4, HIGH);
}
else {
digitalWrite(LEDpin4, LOW);
}
delay(10);
if (msg[0] == 114){
delay(10);
digitalWrite(LEDpin5, HIGH);
}
else {
digitalWrite(LEDpin5, LOW);
}
delay(10);
if (msg[0] == 115){
delay(10);
digitalWrite(LEDpin6, HIGH);
}
else {
digitalWrite(LEDpin6, LOW);
}
delay(10);
if (msg[0] == 116){
delay(10);
digitalWrite(LEDpin7, HIGH);
}
else {
digitalWrite(LEDpin7, LOW);
}
delay(10);
}
}
}

1. Ваших восторгов по скетчам не разделяю - они явно написаны новичком.
2. Полярность реле легко настраивается программно. Если бы скетчи были написаны грамотно, достаточно было бы вообще внести изменения в одну строку.
3. Самый сложный вопрос - реакция на две нажатые кнопки как на одну. А как Вы себе это вообще представляете? Дело в том, что физически нажать на две кнопки одновременно невозможно, неизбежно одна будет нажата чуть раньше, другая - чуть позже. Заранее предсказать, что будет нажата вторая кнопка, невозможно. Что Вы предлагаете делать, если зафиксировано нажатие одной кнопки, ничего не отправлять, ждать, не будет ли нажата вторая?
да и с дребезгом кнопок что то надо делать, для промышленного оборудования без этого как то не кошерно.
Да код примитивный очень. Извиняюсь что не расписал проблему более подробно. Дело в том, что иногда есть необходимость использовать 2 команды одновременно. Не обязательно чтобы 2 кнопки выполняли одну команду. Я это пытался для того чтобы избежать моргания 2х реле по череди с бешеной скоростью в данном скетче, когда я держу 2 зажатые кнопки. Нужно было чтобы каждая реле запускалась в не зависимости друг от друга. Например: во время зажатой кнопки номер один я мог зажимать и отпускать другую, а первая не прерывается для включения 2го или 3го реле. Максимум 3 кнопки одновременно.
Я нашел другой скетч, он более грамотно сделан. Там с зажатием кнопок нет проблем. Они все независимы друг от друга. Но проблема того скетча в том, что когда я отключаю пульт во время зажатой кнопки( могла сесть батарейка или пропал сигнал), приемник не останавливает реле, и продолжает выполнять последнюю поступившую команду. Моих мозгов новичка не хватает решить эту проблему. И в нашей стране специалистов крайне мало, посоветоваться не с кем. Вот и обращаюсь к китам програмного мира.
вот 2 скетч:
Передатчик
/* Данный скетч делает следующее: передатчик (TX) отправляет массив данных, который генерируется согласно показаниям с кнопки и с двух потенциомтеров. Приёмник (RX) получает массив, и записывает данные на реле, сервомашинку и генерирует ШИМ сигнал на транзистор. by AlexGyver 2016 */ #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно //RF24 radio(9,53); // для Меги byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte button = 2; // кнопка на 3 цифровом byte button1 = 3; byte button2 = 4; byte button3 = 5; byte button4 = 6; byte button5 = 7; byte button6 = 8; byte counter; byte transmit_data[7]; // массив, хранящий передаваемые данные byte latest_data[7]; // массив, хранящий последние переданные данные boolean flag; // флажок отправки данных void setup() { Serial.begin(9600); //открываем порт для связи с ПК pinMode(button, INPUT_PULLUP); // настроить пин кнопки pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); pinMode(button3, INPUT_PULLUP); pinMode(button4, INPUT_PULLUP); pinMode(button5, INPUT_PULLUP); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } unsigned long timestamp=millis(); unsigned long timestamp1=millis(); unsigned long timestamp2=millis(); unsigned long timestamp3=millis(); unsigned long timestamp4=millis(); unsigned long timestamp5=millis(); void loop() { if(button && millis()-timestamp>=50){ transmit_data[0] = !digitalRead(button); timestamp=millis(); } if(button1 && millis()-timestamp1>=50){ transmit_data[1] = !digitalRead(button1); timestamp1=millis(); } if(button2 && millis()-timestamp2>=50){ transmit_data[2] = !digitalRead(button2); timestamp2=millis(); } if(button3 && millis()-timestamp3>=50){ transmit_data[3] = !digitalRead(button3); timestamp3=millis(); } if(button4 && millis()-timestamp4>=50){ transmit_data[4] = !digitalRead(button4); timestamp4=millis(); } if(button5 && millis()-timestamp5>=50){ transmit_data[5] = !digitalRead(button5); timestamp5=millis(); } radio.write(&transmit_data, sizeof(transmit_data)); }Приемник:
/* Данный скетч делает следующее: передатчик (TX) отправляет массив данных, который генерируется согласно показаниям с кнопки и с двух потенциомтеров. Приёмник (RX) получает массив, и записывает данные на реле, сервомашинку и генерирует ШИМ сигнал на транзистор. by AlexGyver 2016 */ #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <Servo.h> RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно //RF24 radio(9,53); // для Меги byte recieved_data[7]; // массив принятых данных byte relay = 2; // реле на 2 цифровом byte relay1 = 3; byte relay2 = 4; byte relay3 = 5; byte relay4 = 6; byte relay5 = 7; byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { Serial.begin(9600); //открываем порт для связи с ПК pinMode(relay, OUTPUT); // настроить пин реле как выход pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); pinMode(relay5, OUTPUT); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { byte pipeNo; while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб radio.read( &recieved_data, sizeof(recieved_data) ); // чиатем входящий сигнал digitalWrite(relay, recieved_data[0]); // подать на реле сигнал с 0 места массива digitalWrite(relay1, recieved_data[1]); digitalWrite(relay2, recieved_data[2]); digitalWrite(relay3, recieved_data[3]); digitalWrite(relay4, recieved_data[4]); digitalWrite(relay5, recieved_data[5]); } }Что такое понятие одновременно? Для человека +- 0,5 секунды он и не заметит. Для ваших скетчей две последовательные команды с разницей в 50 миллисек считаются уже одновременными. И опять же даже за те же 50 милисек МК может сделать много.
у вас не совсем правильный подход.
вы сначала разберитесь с кнопками на простых примерах, окончательно определитесь с алгоритмом работы ваших кнопок, а уже потом работайте с передатчиками.
на форуме тема одновременного нажатия нескольких кнопок поднималась
1. Вторая пара скетчей ничем не лучше первой, просто реализует другой алгоритм.
2. Вероятнее всего, Вам будет достаточно добавить в скетч приемника таймаут, т.е. если никакие данные не приходят с передатчика, то по истечении некоторого времени реле отключаются.
3. В любом случае массив *_data целесообразно заменить на битовое поле. Вам нужно управлять 7 реле, один байт содержит 8 битов - этого вполне достаточно. Избежите сразу сножества проблем, начиная со случая, когда приемник и передатчик окажутся изначально рассинхронизированы, и заканчивая случаем, когда питание отрубится в момент передачи массива.
qwone
Видимо я тут на не правильном языке объяснил все. Извиняюсь.
Одновременно для моей задачи вот что значит: Я держу одну кнопку, приемник запускает одно реле привязанное к этой кнопке. И в этот же момент мне понадобится не отпуская например 1й кнопки задействовать например 2ю кнопку и запустить привязанную к ней реле. В первом скетче когда я запускаю 2ю кнопку во время зажатой другой они запускают и выключают реле по очереди.
Алгоритм кнопок очень простой. Нажимаешь кнопку на передатчике, запускается реле на приемнике. Каждая кнопка отвечает за свое реле. Как я уже писал выше 2й пример скетча функцианирует абсолютно корректно. И реле работают как надо. Проблема заключается в поведении когда сигнал внезапно теряется.
andriano
Вы абсолютно правы.
Мне как-то писали такой же совет по поводу истечения времени и отключения реле. Это очень хороший пример. Но я не осилил как это реализовать. Мне давали пример, но указали свои данные из своего скетча и не разобрался что и куда вставить чтобы это работало на моем скетче.
По сути на втором примере скетча ваш совет по поводу отлова времени и автоотключении при пропадании сигнала решит единственный недостаток его. Но видимо это не распространенная проблема и мало кто может помочь.
1. Я бы посоветовал начать с того, что реализовать п.3 моего поста №6. Иначе нужно будет как-то отслеживать неатомарную передачу.
2. В приемнике заменяете while на if. С учетом п.1 читаем единственный байт. Там же внутри блока if запоминаем текущее значение millis в статическую переменную. После блока if вычитаем из текущего значения millis запомненное, и если разность больше таймаута, гасим все реле.
3. В любом случае массив *_data целесообразно заменить на битовое поле. Вам нужно управлять 7 реле, один байт содержит 8 битов - этого вполне достаточно. Избежите сразу сножества проблем, начиная со случая, когда приемник и передатчик окажутся изначально рассинхронизированы, и заканчивая случаем, когда питание отрубится в момент передачи массива.
Сейчас буду искать в интернете как это все дело заменить на битовое.
вот пример отслеживания который мне давали.
byte rfdata; //payload=1 unsigned long lastcmd=millis(); void loop(){ bool done=0; if(radio.available()){ while(!done) done=radio.read(&rfdata,1); lastcmd=millis(); // custom code here... if(rfdata==7) PORTD&=B10011111; //stop } if(millis()-lastcmd>=3000) PORTD&=B10011111; //auto stop if no radio data }с ним то у меня и не получилось разобраться. Но по сути сходится с вашим советом. Совет повторюсь очень подходящий для моего случая. Тут я не понял что надо заменить и что поменять. Особенно PORTD&=B10011111; и if(rfdata==7) почему именно 7
Так здесь тоже все понятно. Нажатие кнопки формирует по радио команду <кнопка 1 нажата> , а это приводит на приемнике < реле 1 вкл>. Отжатие кнопки команду <кнопка 1 отжата> -- < реле 1 выкл>. Так со всеми кнопками и все.
qwone
Ну я про это и писал. Просто в первом скетче одновременное зажатие кнопок плохо реализовано. Они поочередно отправляют сигнал на приемник. А во втором без конфликтов. Не совсем понял ваших претензий.
Ну я про это и писал. Просто в первом скетче одновременное зажатие кнопок плохо реализовано. Они поочередно отправляют сигнал на приемник. А во втором без конфликтов. Не совсем понял ваших претензий.
Это не мой проект, а ваш. И у меня нет притензий к вам, даже если вы похороните ваш проект.
Но мне дико наблюдать это if (digitalRead(buttonPin4) == HIGH) { отправить сообщение } И не наблюдать этого btn4_old = btn4; btn4 = digitalRead(buttonPin4); if (!btn4_old && btn4) { отправить сообщение"кнопка 4 нажата" } if (btn4_old && !btn4) { отправить сообщение"кнопка 4 отжата" }qwone
С тем, что этот скетч примитивен я согласен. Спасибо за совет. Непременно использую в следующем пульте для другого оборудования...
Я хочу попробовать добить 2й скетч. Выже я уже писал почему именно 2й.
Помогите вставить в мой 2й скетч из сообщения номер 3 вот этот код, который мне любезно предоставили другие пользователи
byte rfdata; //payload=1 unsigned long lastcmd=millis(); void loop(){ bool done=0; if(radio.available()){ while(!done) done=radio.read(&rfdata,1); lastcmd=millis(); // custom code here... if(rfdata==7) PORTD&=B10011111; //stop } if(millis()-lastcmd>=3000) PORTD&=B10011111; //auto stop if no radio data }Но мне дико наблюдать это
if (digitalRead(buttonPin4) == HIGH) { отправить сообщение } И не наблюдать этого btn4_old = btn4; btn4 = digitalRead(buttonPin4); if (!btn4_old && btn4) { отправить сообщение"кнопка 4 нажата" } if (btn4_old && !btn4) { отправить сообщение"кнопка 4 отжата" }qwone, ему такой код не подойдет.
Ему нужно, если кнопка нажата, передавать сообщение непрерывно. Инече никак не реализовать отключение реле по отказу пульта.
Ему нужно, если кнопка нажата, передавать сообщение непрерывно. Инече никак не реализовать отключение реле по отказу пульта.
1 это упрощено для понимания подхода
2 "засeрать" канал (эфир )лишими сообщениями.
3 если вас так прет определять "есть ли еще пульт с нами или он уже не с нами" , пусть пульт передает раз в секунду , если нет передачи сообщение "я с вами".
ПС: Но похоже это проект не умению ТС.
Glacion, Вам этот код не нужен. Вам нужна только строка 8 и первая часть строки 12. В конце 12-й строки нужно отключать все реле.
Особенное сомнение вызывают строки, в которых используется переменная done. Мне кажется, она Вам не нужна и даже будет вредить.
Но прежде, чем вносить изменения в код, я Вам еще раз рекомендую переделать его так, чтобы передавался только один байт, и уже отдельные его биты отвечали за состояние разных реле.
Во-первых, лучше бы управление реле вынести в отдельную функцию, примерно так:
viod Rele(byte state) { for(byte i = 0; i < 7; i++) digitalWrite(pins[i], (state >> i) && 1); }где pins - массив с нмерами используемых реле пинов.
Ну а потом, если поступил новый байт, отправлять его в указанную функцию, одновременно запоминая время прихода. Если же нет - проверять время, прошедшее с последноего приема, и если оно превысило таймаут, гасить все реле.
2 "засeрать" канал (эфир )лишими сообщениями.
Они ек лишние, она сообщают устройству, что пульт жив. Судя по хотелкам ТС, для него это обязательно.
3 если вас так прет определять "есть ли еще пульт с нами или он уже не с нами" , пусть пульт передает раз в секунду , если нет передачи сообщение "я с вами".
При условии, если ТС устраивает ситуация, когда реле будет отключаться не сразу, а с задержкой в секунду.
Очевидно, величина таймаута должна быть привязана к периодичности передачи о они обе - определяться, исходя из конкретных требований к оборудованию.
ПС: Но похоже это проект не умению ТС.
Похоже. (
btn_old = btn; btn = PORTD & B10011111; if (btn_old = ! btn) { отправить сообщение"новое состояние такое btn" }else сообщение "я с вами"Ему нужно, если кнопка нажата, передавать сообщение непрерывно. Инече никак не реализовать отключение реле по отказу пульта.
Все верно.
3. В любом случае массив *_data целесообразно заменить на битовое поле. Вам нужно управлять 7 реле, один байт содержит 8 битов - этого вполне достаточно. Избежите сразу сножества проблем, начиная со случая, когда приемник и передатчик окажутся изначально рассинхронизированы, и заканчивая случаем, когда питание отрубится в момент передачи массива.
Я должен его задекларировать как byte ??? А как мне разделить кнопки в этом формате?
ПС: Но похоже это проект не умению ТС.
Поверьте я стараюсь.
Glacion, Вам этот код не нужен. Вам нужна только строка 8 и первая часть строки 12. В конце 12-й строки нужно отключать все реле.
Особенное сомнение вызывают строки, в которых используется переменная done. Мне кажется, она Вам не нужна и даже будет вредить.
Но прежде, чем вносить изменения в код, я Вам еще раз рекомендую переделать его так, чтобы передавался только один байт, и уже отдельные его биты отвечали за состояние разных реле.
Во-первых, лучше бы управление реле вынести в отдельную функцию, примерно так:
viod Rele(byte state) { for(byte i = 0; i < 7; i++) digitalWrite(pins[i], (state >> i) && 1); }где pins - массив с нмерами используемых реле пинов.
Ну а потом, если поступил новый байт, отправлять его в указанную функцию, одновременно запоминая время прихода. Если же нет - проверять время, прошедшее с последноего приема, и если оно превысило таймаут, гасить все реле.
Вот реализовать отлов времени и проверки прошедшего времени и так далее для меня как новичка трудно. То есть понятий даже нет какими командами орудовать не вразумлю.
А код с реле если я вставлю, то надо ли мне переделывать команды обработки принятых сигналов, чтобы они работали как работают во втором скетче?
btn_old = btn; btn = PORTD & B10011111; if (btn_old = ! btn) { отправить сообщение"новое состояние такое btn" }else сообщение "я с вами"Не следует плодить лишних сущностей.
Всю необходимую ТС информацию можно запихнуть в 1 байт. Передать и принять сообщение короче байта невозможно. Зачем выдумывать еще какое-то сообщение "я с вами", если это не имеет никаких преимуществ?
Я должен его задекларировать как byte ???
Можно по-разному. Лично мне проще byte.
А как мне разделить кнопки в этом формате?
Каждый бит отвечает за свое реле. Один бит лишний - можно использовать по своему усморению. Например, для передачи сигнала "я с вами". Или для проверки на четность.
Glacion, Вам этот код не нужен. Вам нужна только строка 8 и первая часть строки 12. В конце 12-й строки нужно отключать все реле.
Вот реализовать отлов времени и проверки прошедшего времени и так далее для меня как новичка трудно. То есть понятий даже нет какими командами орудовать не вразумлю.
Ну это же есть в процитированном Вами моем сообщении - выделил для нагладности.
А вообще настоятельно рекомендую почитать Кернигана и Ритчи - трудно "иметь понятия", если не владеешь языком, на котором нужно более или менее свободно изъясняться.
А код с реле если я вставлю, то надо ли мне переделывать команды обработки принятых сигналов, чтобы они работали как работают во втором скетче?
Не только команды обработки принятых сообщений, но и команды их отправки из комплиментарного скетча.
Господа форумчане, помогите просто дописать код в скетч в сообщении #3
Я подключил питание для 6ти реле через 7е реле. И чтобы при потере сигнала просто отключался 7е реле.
Таким образом проблема решится.
Пока что заняться изменениями всего кода по вашим советам у меня уходит очень много времени, так как новичок. Опять шарить форумы, чтобы узнать что, да как и с чем едят. И чем больше советов по изменению кода тем больше запутываюсь.
Если бы вы помогли с этой задачей был бы признателен.
Господа форумчане, помогите просто дописать код в скетч в сообщении #3
А что, по-Вашему, мы делаем на протяжении уже более двух дюжин постов?
Если же Вам нужна не помощь, а код - это в раздел "Ищу исполнителя".
Пока что заняться изменениями всего кода по вашим советам у меня уходит очень много времени, так как новичок.
Неправда Ваша.
Первому посту в этой теме 12 часов. Даже если это время умножить на 100, все равно "очень много времени" ну никак не вытанцовывается.
Да и двух месяцев на освоение программирования - тоже маловато.
Если хотите научиться, здесь Вам помогут.
Если нужен код - направление я указал.
Если хотите всего и сразу - (нет, я лучше воздержусь от комментариев)
И у меня уже начинает складываться впечатление, что Вы затеяли что-то несерьезное. Программирование - это не блиц турнир.
Извиняюсь если ввел в заблуждение. И в мыслях не было. С этим пультом и модулем управления мучаюсь вот уже полтора месяца. Раньше с программированием не имел дела совсем. Сейчас же пытаюсь с помощью чужих советов и помощи достичь цели. Все ваши советы очень дельные, но сроки поджимают и хотелось бы уже завершить этот проект и перейти к следующему. Но в будущем все равно буду доделывать и совершенствовать его. . Но закончить его мешает лишь один пункт на котором я сильно застрял. На то чтобы менять код с корня и начинать заново времени не остается. Но все равно спасибо за ваши старания. Они помогут мне сейчас и в будущем.