помогите оптимизировать код
- Войдите на сайт для отправки комментариев
Втр, 18/07/2017 - 18:46
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int cases = 0;
int t = 150;
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte button = 3; // кнопка на 3 цифровом
byte potent = 0; // потенциометр на 0 аналоговом
byte slider = 1; // движковый потенциометр на 1 аналоговом пине
byte transmit_data; // массив, хранящий передаваемые данные
byte latest_data; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(3, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP); // настроить пины датчика
mySwitch.enableTransmit(8);
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_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {
if (digitalRead(3) == LOW && digitalRead(4) == LOW && digitalRead(6) == LOW && digitalRead(7) == LOW)
{
delay(t);
if (digitalRead(3) == LOW && digitalRead(4) == LOW && digitalRead(6) == LOW && digitalRead(7) == LOW)
{
cases = 0; // blue
}
}
if (digitalRead(3) == 0 && digitalRead(4) == 0 && digitalRead(6) == 1 && digitalRead(7) == 1)
{
delay(t);
if (digitalRead(3) == 0 && digitalRead(4) == 0 && digitalRead(6) == 1 && digitalRead(7) == 1)
{
cases = 1; // green
}
}
if (digitalRead(3) == 1 && digitalRead(4) == 1 && digitalRead(6) == 0 && digitalRead(7) == 0)
{
delay(t);
if (digitalRead(3) == 1 && digitalRead(4) == 1 && digitalRead(6) == 0 && digitalRead(7) == 0)
{
cases = 2; // violet
}
}
if (digitalRead(3) == LOW && digitalRead(4) == 1 && digitalRead(6) == LOW && digitalRead(7) == 1)
{
delay(t);
if (digitalRead(3) == LOW && digitalRead(4) == 1 && digitalRead(6) == LOW && digitalRead(7) == 1)
{
cases = 3; // yellow
}
}
if (digitalRead(3) == 1 && digitalRead(4) == LOW && digitalRead(6) == 1 && digitalRead(7) == LOW)
{
delay(t);
if (digitalRead(3) == 1 && digitalRead(4) == LOW && digitalRead(6) == 1 && digitalRead(7) == LOW)
{
cases = 4; // red
}
}
if (digitalRead(3) == 1 && digitalRead(4) == 1 && digitalRead(6) == 1 && digitalRead(7) == 1)
{
delay(t);
if (digitalRead(3) == 1 && digitalRead(4) == 1 && digitalRead(6) == 1 && digitalRead(7) == 1)
{
cases = 5; // orange
}
}
transmit_data = cases;
if (transmit_data != latest_data) { // если есть изменения в transmit_data
flag = 1; // поднять флаг отправки по радио
latest_data = transmit_data; // запомнить последнее изменение
}
if (flag == 1) {
radio.powerUp(); // включить передатчик
radio.write(&transmit_data, sizeof(transmit_data));// отправить по радио
flag = 0; //опустить флаг
radio.powerDown(); // выключить передатчик
}
switch (cases) {// для 433 МГц
case 0: //Синий
for (int i = 0; i <= 1; i++)
{
mySwitch.send(5594115, 24);
delay(2);
}
break;
case 1: //Зеленый
for (int i = 0; i <= 1; i++)
{
mySwitch.send(5591811, 24);
delay(2);
}
break;
case 2: //Фиолетовый
for (int i = 0; i <= 1; i++)
{
mySwitch.send(5591280, 24);
delay(2);
}
break;
case 3: //Желтый
for (int i = 0; i <= 1; i++)
{
mySwitch.send(5591820, 24);
delay(2);
}
break;
case 4: //Красный
for (int i = 0; i <= 1; i++)
{
mySwitch.send(5591235, 24);
delay(2);
}
break;
case 5: //Оранжевый
for (int i = 0; i <= 1; i++)
{
mySwitch.send(5591244, 24);
delay(2);
}
break;
}
}
последний кусок (switch) можно так
unsigned long color[6] = { 5594115, //Синий 5591811, //Зеленый 5591280, //Фиолетовый 5591820, //Желтый 5591235, //Красный 5591244 //Оранжевый } for (int i = 0; i <= 1; i++) { mySwitch.send(color[cases], 24); delay(2); }а из этого
тоже слепить число и использовать его как индекс в масиве, а лучше как маску (писать не охота).
передатчик без умолку шлет команды по 433 ((((((
как сделать что бы он отправлял команду только один раз после изменения положения?
Сенсоры наклона стоят под угом 45 градусов к плате и дают 6 точных позиций.
если есть идеи как перевести систему на акселерометр, буду благодарен за помощь
он еще на другое устройство через NRF24L01+ шлёт команды включения треков
Алексей, помогите пожалуйста доделать код, будет даже лучше, если вместо датчиков наклона использовать акселерометр
Я не знаю вашей задачи, но судя по исходному коду и схеме, набросал вот это:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); int cases = 0; int t = 150; RF24 radio(9, 10); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte button = 3; // кнопка на 3 цифровом byte potent = 0; // потенциометр на 0 аналоговом byte slider = 1; // движковый потенциометр на 1 аналоговом пине byte transmit_data; // массив, хранящий передаваемые данные byte latest_data; // массив, хранящий последние переданные данные void setup() { Serial.begin(9600); //открываем порт для связи с ПК pinMode(3, INPUT_PULLUP); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); // настроить пины датчика mySwitch.enableTransmit(8); 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_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } unsigned long color[16] = { 5594115, //Синий 0, 0, 5591811, //Зеленый 0, 5591820, //Желтый 0, 0, 0, 0, 0, 0, 5591280, //Фиолетовый 0, 5591235, //Красный 5591244 //Оранжевый }; uint8_t GetCode() { return digitalRead(3) << 3 | digitalRead(4) << 2 | digitalRead(6) << 1 | digitalRead(7); }; void loop() { uint8_t code = GetCode(); if (code == 0 || code == 3 || code == 5 || code == 12 || code == 14 || code == 15) { delay(t); if (code == GetCode()) { if (code != latest_data) { // если есть изменения в latest_data latest_data = code; // запомнить последнее изменение switch (code) { case 0: transmit_data = 0; break; case 3: transmit_data = 1; break; case 12: transmit_data = 2; break; case 5: transmit_data = 3; break; case 14: transmit_data = 4; break; case 15: transmit_data = 5; break; } radio.powerUp(); // включить передатчик radio.write(&transmit_data, sizeof(transmit_data));// отправить по радио radio.powerDown(); // выключить передатчик for (int i = 0; i <= 1; i++) { mySwitch.send(color[code], 24); delay(2); } } } } };проверить понятное дело не могу...
давайте свяжемся в скайпе, и я всё расскажу