помогите оптимизировать код

Girilovsky
Offline
Зарегистрирован: 18.07.2017
#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;
  }
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

последний кусок (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);
  }

а из этого

if (digitalRead(3) == LOW && digitalRead(4) == LOW && digitalRead(6) == LOW && digitalRead(7) == LOW)

тоже слепить число и использовать его как индекс в масиве, а лучше как маску  (писать не охота).

 

Girilovsky
Offline
Зарегистрирован: 18.07.2017

передатчик без умолку шлет команды по 433 ((((((

как сделать что бы он отправлял команду только один раз после изменения положения?

Сенсоры наклона стоят под угом 45 градусов к плате и дают 6 точных позиций.

если есть идеи как перевести систему на акселерометр, буду благодарен за помощь

Girilovsky
Offline
Зарегистрирован: 18.07.2017

он еще на другое устройство через NRF24L01+ шлёт команды включения треков

Girilovsky
Offline
Зарегистрирован: 18.07.2017

Алексей, помогите пожалуйста доделать код, будет даже лучше, если вместо датчиков наклона использовать акселерометр

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Я не знаю вашей задачи, но судя по исходному коду и схеме, набросал вот это:

#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);
        }
      }
    }
  }
};

проверить понятное дело не могу...

Girilovsky
Offline
Зарегистрирован: 18.07.2017

давайте свяжемся в скайпе, и я всё расскажу