Помогите!! Задержка у кнопок на аналоговом.

Тема в разделе "Arduino & Shields", создана пользователем alekseev2017, 9 мар 2017.

  1. alekseev2017

    alekseev2017 Нерд

    Я доделал проект, всё отлично работает:
    Код передатчика:
    Код (C++):
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 5
    #include <nRF24L01.h>                                
    #include <RF24.h>

    Adafruit_SSD1306 display(OLED_RESET);
    RF24           radio(9, 10);

    int intensity = 0;
    int item = 1;
    int menuLevel = 1;
    int limit = 0;
    int ledOn = 0;
    int autoModeOn = 0;
    int pos1 = 0;
    int pos2 = 0;
    int pos3 = 0;
    int data[3];

    void setup()
    {
      Serial.begin(9600);
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
      radio.begin();                                    
      radio.setChannel(5);                              
      radio.setDataRate     (RF24_1MBPS);              
      radio.setPALevel      (RF24_PA_HIGH);              
      radio.openWritingPipe (0x1234567890LL);
    }

    byte Key()
    {
      if (analogRead(0) < 2) return 5;// вправо 0
      else if (analogRead(0) < 150) return 2;// вверх 144
      else if (analogRead(0) < 170) return 3;// вниз 164
      else if (analogRead(0) < 500) return 4;// влево 416
      else if (analogRead(0) < 800) return 1;// выбрать 718
      else if (analogRead(0) < 1023) return 0;// ничего не нажато
    }

    void loop()
    {
      Serial.println(Key());
      Serial.println(data[2]);
      if(menuLevel == 1 && item == 1)
      {
        M1I1();
      }
      else if(menuLevel == 1 && item == 2)
      {
        M1I2();
        pos1 = 1;
        pos2 = 0;
        pos3 = 0;
      }
      else if(menuLevel == 1 && item == 3)
      {
        M1I3();
        pos1 = 0;
        pos2 = 1;
        pos3 = 0;
      }
      else if(menuLevel == 1 && item == 4)
      {
        M1I4();
        pos1 = 0;
        pos2 = 0;
        pos3 = 1;
      }
      else if(menuLevel == 2 && item == 1 && pos1 == 1)
      {
        M2I1P1();
      }
      else if(menuLevel == 2 && item == 2 && pos1 == 1)
      {
        M2I2P1();
      }
      else if(menuLevel == 2 && item == 1 && pos2 == 1)
      {
        M2I1P2();
      }
      else if(menuLevel == 2 && item == 1 && pos3 == 1)
      {
        M2I1P3();
      }
      switch(Key())
      {
        case 1:
        if(menuLevel == 2 && item == 1 && pos1 == 1)
        {
          autoModeOn = 1;
          menuLevel = 1;
          item = 2;
          delay(250);
        }
        else if(menuLevel == 2 && item == 2 && pos1 == 1)
        {
          autoModeOn = 0;
          menuLevel = 1;
          item = 2;
          delay(250);
        }
        else if(menuLevel == 2 && item == 1 && pos2 == 1)
        {
          menuLevel = 1;
          item = 3;
          delay(250);
        }
        else if(menuLevel == 2 && item == 1 && pos3 == 1)
        {
          menuLevel = 1;
          item = 4;
          delay(250);
        }
        else if(menuLevel != 2)
        {
          menuLevel++;
          item = 1;
          delay(250);
        }
        break;
        case 2:
        if(menuLevel == 2 && item == 1 && pos2 == 1)
        {
          limit++;
          if(limit  > 1023)
          {
            limit = 0;
          }
        }
        else if(menuLevel == 2 && item == 1 && pos3 == 1)
        {
          intensity++;
          if(intensity > 1023)
          {
            intensity = 0;
          }
        }
        else if(item != 1)
        {
          item--;
          delay(250);
        }
        break;
        case 3:
        if(menuLevel == 2 && pos1 == 1)
        {
          if(item != 2)
          {
            item++;
          }
        }
        else if(menuLevel == 2 && item == 1 && pos2 == 1)
        {
          limit--;
          if(limit < 0)
          {
            limit = 1023;
          }
        }
        else if(menuLevel == 2 && item == 1 && pos3 == 1)
        {
          intensity--;
          if(intensity < 0)
          {
            intensity = 1023;
          }
        }
        else if(item != 4)
        {
          item++;
          delay(250);
        }
        break;
        case 4:
        if(menuLevel != 1)
        {
          menuLevel--;
          delay(250);
        }
        break;
      }
      data[0] = autoModeOn;
      data[1] = limit;
      data[2] = intensity;
      radio.write(&data, sizeof(data));
    }
    void M1I1()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print("->Led | On | ");
      display.println(intensity);
      display.setCursor(0, 10);
      display.print("  Auto mode | ");
      display.println(autoModeOn);
      display.setCursor(0, 20);
      display.print("  Limit | ");
      display.println(limit);
      display.display();
    }
    void M1I2()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print("  Led | On | ");
      display.println(intensity);
      display.setCursor(0, 10);
      display.print("->Auto mode | ");
      display.println(autoModeOn);
      display.setCursor(0, 20);
      display.print("  Limit | ");
      display.println(limit);
      display.display();
    }
    void M1I3()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print("  Led | On | ");
      display.println(intensity);
      display.setCursor(0, 10);
      display.print("  Auto mode | ");
      display.println(autoModeOn);
      display.setCursor(0, 20);
      display.print("->Limit | ");
      display.println(limit);
      display.display();
    }
    void M1I4()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print("  Auto mode | ");
      display.println(autoModeOn);
      display.setCursor(0, 10);
      display.print("  Limit | ");
      display.println(limit);
      display.setCursor(0, 20);
      display.print("->Intensity | ");
      display.println(intensity);
      display.display();
    }
    void M2I1P1()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print("->On");
      display.setCursor(0, 10);
      display.print("  Off");
      display.display();
    }
    void M2I2P1()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print("  On");
      display.setCursor(0, 10);
      display.print("->Off");
      display.display();
    }
    void M2I1P2()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print(limit);
      display.display();
    }
    void M2I1P3()
    {
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0, 0);
      display.print(intensity);
      display.display();
    }
    Код приёмника:
    Код (C++):
    #include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
    #include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
    #include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+
    RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int            data[3];                                   // Создаём массив для приёма данных
    void setup(){
        Serial.begin(9600);
        delay(1000);
        radio.begin();                                        // Инициируем работу nRF24L01+
        radio.setChannel(5);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
        radio.setDataRate     (RF24_1MBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
        radio.setPALevel      (RF24_PA_HIGH);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
        radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
        radio.startListening  ();                             // Включаем приемник, начинаем прослушивать открытую трубу
    //  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные
    }

    void loop()
    {
      Serial.println(analogRead(A0));
      if(radio.available())
      {                            
        radio.read( &data, sizeof(data) );
      }
      if(data[0] == 1)
      {
        if(analogRead(A0) > data[1])
        {
          analogWrite(6, data[2]);
        }
        else
        {
          analogWrite(6, 0);
        }
      }
      else
      {
        analogWrite(6, 0);
      }
    }
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Михаил, вы так всегда придираетесь ???