Специальные цены   новые товары
Закрытая тема
Показано с 1 по 1 из 1

RSSI переключатель от MatCat's (на плате от Ardustation2)

Тема раздела Самодельная электроника, компьютерные программы в категории Общие вопросы; Некторое время назад стал собирать себе Ardustation, и совершенно случайно наткнулся на интересный проект полностью построенный на аналогичном железе. Это ...

  1. #1

    Регистрация
    12.04.2013
    Адрес
    Спб
    Возраст
    36
    Сообщений
    207
    Записей в дневнике
    8

    RSSI переключатель от MatCat's (на плате от Ardustation2)

    Некторое время назад стал собирать себе Ardustation, и совершенно случайно наткнулся на интересный проект полностью построенный на аналогичном железе. Это был переключатель сигнала по уровням RSSI. На тот момент у меня уже было собранно несколько лишних экземпляров Ardustation (было дешевле купить детали разом вышло что-то вроде 300р за комплект). По этой причине я немного подредактировал проект, а именно переместил пины для совместимости с платой Ardupilot2.

    1) выходы для управления микросхемой переключения видео выведены на выход серв, сигналы D9 D10
    2) входы RSSI перенесены на AD0 AD1
    3) вход AD_KEY перенесён на AD2

    Нажмите на изображение для увеличения
Название: IMAG4012.jpg
Просмотров: 16
Размер:	36.2 Кб
ID:	905593
    Нажмите на изображение для увеличения
Название: IMAG3840.jpg
Просмотров: 13
Размер:	108.2 Кб
ID:	905594
    Нажмите на изображение для увеличения
Название: IMAG3837.jpg
Просмотров: 16
Размер:	98.9 Кб
ID:	905595

    Оригинальный вариант схемы, из него надо взять переключатель видеосигнала
    Оригинальный проект http://fpvlab.com/forums/showthread....ered-Diversity
    Интересная страница, на ней описано как вывести сигнал RSSI с приёмника

    Код:
    #include <EEPROM.h>
    #include <LiquidCrystal.h>
    
    //Keypad Support
    //--------------------------------------------------
    int KeyPin = A2;
    int adc_key_old = -1;
    int adc_key_in = -2;
    int adc_key_reading;
    long time_detected;
    int NUM_KEYS = 5;
    int key=-1;
                        //Up,Lft, OK,Rgt,Down
    int adc_key_val[5] = {30,160,360,550,780};
    int UpButton = 0;
    int LeftButton = 1;
    int OKButton = 2;
    int RightButton = 3;
    int DownButton = 4;
    int RandomVar = 0;
    
    //Menu Support
    //--------------------------------------------------
    char MenuItems[][19] = {"Time Information",
                            "Settings",
                            "About"};
                        
    char SettingsMenu[][19] = {"Input 1",
                               "Input 2",
                               "Switch %",
                               "Threshold %",
                               "Save Settings",
                               "Reset Settings"};
    char SettingsInputMenu[][19] = {"Reverse Scale",
                                    "Min. RSSI",
                                    "Max. RSSI"};                           
    int SelectedMenu = -1;
    int InMenu = 0;
    
    //Display Support
    //--------------------------------------------------
    int RSpin = 2;
    int RWpin = 3;
    int Enablepin = 4;
    int D4pin = 5;
    int D5pin = 6;
    int D6pin = 7;
    int D7pin = 8;  
    int delaytime = 400;
    int row = 4;
    int col = 20; 
    
    // Custom LCD Characters
    int custom1_Right_Arrow[] = {0x0,0x4,0x6,0x1f,0x1f,0x6,0x4,0x0};
    int custom2_Left_Arrow[] = {0x0,0x4,0xc,0x1f,0x1f,0xc,0x4,0x0};
    int custom3_Up_Arrow[] = {0x4,0xe,0x1f,0x4,0x4,0x4,0x4,0x4};
    int custom4_Down_Arrow[] = {0x4,0x4,0x4,0x4,0x4,0x1f,0xe,0x4};
    int custom5_Shaft[] = {0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4};
    int custom6_Selector[] = {0x4,0x4,0x6,0x7,0x7,0x6,0x4,0x4};
    int custom7_Lock[] = {0x4,0xa,0xa,0xe,0x1f,0x1b,0x1f,0xe};
    int buttoncount[5] = {0,0,0,0,0};
    //Diversity Support
    //--------------------------------------------------
    // Configurable parameters
    unsigned int RSSICenterPoint = 50;    // 50% mark of RSSI reading
    unsigned int RSSIDiffPerc = 5;         // 5% difference before switching can happen
    unsigned int RSSIMin[3] = {0,390,390}; // Set no signal mark        
    unsigned int RSSIMax[3] = {0,633,633}; // Set Full Signal Mark
    unsigned int RSSIReverse[3] = {0,1,0};
    // Time based variables
    unsigned long lastChange;              // Last switch time
    unsigned int SecondsOn[3] = {0,0,0};   // Number of seconds each input has been active
    
    // Pin Configurations
    int RSSI1 = A0;
    int RSSI2 = A1;
    int SwitchPinA = 9;
    int SwitchPinB = 10;
    
    // Diversity value variables
    int DrawNow = 1;
    int CurrentInput = 1;
    int LockedInput = 0;
    int RSSIValues[3] = {0,0,0};
    float RSSIVolt[3] = {0.0,0.0,0.0};
    int RSSICount = 0;
    int VoltCount = 0;
    long RSSIAvg[3] = {0,0,0};
    int RSSIAvgValue[3] = {0,0,0};
    
    LiquidCrystal lcd(RSpin, RWpin, Enablepin, D4pin, D5pin, D6pin, D7pin);
    
    void setup() {
      // Check Stored Data
      int ReadByte = 255;
      ReadByte = EEPROM.read(0);
      if (ReadByte == 1) {
        RSSICenterPoint = EEPROM.read(1);
        RSSIDiffPerc = EEPROM.read(2);
        RSSIReverse[1] = EEPROM.read(3);
        RSSIReverse[2] = EEPROM.read(4);
        RSSIMin[1] = EEPROM.read(5);
        RSSIMin[2] = EEPROM.read(6);
        RSSIMax[1] = EEPROM.read(7);
        RSSIMax[2] = EEPROM.read(8);
      }
      time_detected = millis();
      pinMode(SwitchPinA,OUTPUT);
      pinMode(SwitchPinB,OUTPUT);
      pinMode(RSSI1,INPUT);
      pinMode(RSSI2,INPUT);
      pinMode(KeyPin,INPUT);
      lcd.begin(col,row);
      defineCharacter(1, custom1_Right_Arrow);
      defineCharacter(2, custom2_Left_Arrow);
      defineCharacter(3, custom3_Up_Arrow);
      defineCharacter(4, custom4_Down_Arrow);
      defineCharacter(5, custom5_Shaft);
      defineCharacter(6, custom6_Selector);
      defineCharacter(7, custom7_Lock);
    
      lcd.setCursor(0, 1);
      lcd.print("MatCat Groundstation");
      lcd.setCursor(0,2);
      lcd.print("    Version 1.0");
      adc_key_old = analogRead(KeyPin);
      delay(2000);
      lcd.clear();
      lcd.setCursor(0,0);
    }
    void loop() {
      adc_key_reading = analogRead(KeyPin);         // Read for keypress
      adc_key_reading = get_key(adc_key_reading);
      if (adc_key_reading != adc_key_old) {         // Debounce routine
        time_detected = millis();
      }
      long timediff = millis() - time_detected;
      if (timediff > 70) {
        adc_key_in = adc_key_reading;  
        time_detected = millis() + 150;  // This makes sure if button is held it doesn't go crazy fast
        if (adc_key_in != -1) {
          buttoncount[adc_key_in]+=1;
        }
      }
        adc_key_old = adc_key_reading;
    
        if (InMenu == 0 || InMenu == 4) {    // Button handling while in no menus
          if (adc_key_in == OKButton) {      // Go in Menu
            SelectedMenu = 0;
            InMenu = 1;
            PrintMenu();
            goto EndButtons;
          }
          if (adc_key_in == LeftButton) {        // Lock Input 1
            LockedInput = 1;
            SetInput(1);
            DrawNow = 2;
            if (InMenu == 0) {
              lcd.setCursor(0,2);
              lcd.write(7);
              lcd.print("Lock Source 1");
              DrawNow = 1;
            }
          }
          if (adc_key_in == RightButton) {        // Lock Input 2
            LockedInput = 2;
            SetInput(2);
            DrawNow = 2;
            if (InMenu == 0) {
              lcd.setCursor(0,2);
              lcd.write(7);
              lcd.print("Lock Source 2");
              DrawNow = 1;
            }
          }
          if (adc_key_in == DownButton || adc_key_in == UpButton) {        // Unlock Inputs
            LockedInput = 0;
            DrawNow = 1;
          }
    
        }
        if (InMenu == 1) {                  // Button handling for Menu 1
            if (adc_key_in == LeftButton) {     // Exit menu
              SelectedMenu = -1;
              InMenu = 0;
              lcd.clear();
              DrawNow=1;
              goto EndButtons;
            }
           if (adc_key_in == RightButton) { // Go to specified menu option
             switch (SelectedMenu) {
               case 0:
               // Time Info
               InMenu=4;
               lcd.clear();
               DrawNow=2;
               goto EndButtons;
               break;
               case 1:
               // Settings Menu
               InMenu=2;
               SelectedMenu=0;
               PrintMenu();
               goto EndButtons;
               break;
               case 2:
               // About Menu
               InMenu=99;
               lcd.clear();
               break;
             }
           }
        }
        if (InMenu == 1 || InMenu == 2 || InMenu == 5 || InMenu == 6 || InMenu == 99) {
          if (adc_key_in == OKButton) {     // Exit menu
            SelectedMenu = -1;
            InMenu = 0;
            lcd.clear();
            DrawNow=1;
          }
          if (adc_key_in == RightButton) {      // Select Menu
            if (InMenu == 1) {
            } else {
              switch (InMenu) {
                case 5:  // We are doing Input 1 Setting Menu
                  switch (SelectedMenu) {
                    case 0:  // Reverse Scaling
                       if (RSSIReverse[1] == 0) {
                         RSSIReverse[1] = 1;
                       } else {
                         RSSIReverse[1] = 0;          
                       }
                       PrintMenu();
                       break;
                    case 1:  // Min
                      RSSIMin[1]+=1;
                      if (RSSIMin[1] > 1023) {
                        RSSIMin[1] = 1023;
                      }
                      PrintMenu();
                      break;
                    case 2:  // Max
                      RSSIMax[1]+=1;
                      if (RSSIMax[1] > 1023) {
                        RSSIMax[1] = 1023;
                      }
                      PrintMenu();
                      break;
                  }
                  break;
                case 6:    // We are Doing Input 2 Setting Menu
                  switch (SelectedMenu) {
                    case 0:  // Reverse Scaling
                       if (RSSIReverse[2] == 0) {
                         RSSIReverse[2] = 1;
                       } else {
                         RSSIReverse[2] = 0;          
                       }
                       PrintMenu();
                       break;
                    case 1:  // Min
                      RSSIMin[2]+=1;
                      if (RSSIMin[2] > 1023) {
                        RSSIMin[2] = 1023;
                      }
                      PrintMenu();
                      break;
                    case 2:  // Max
                      RSSIMax[2]+=1;
                      if (RSSIMax[2] > 1023) {
                        RSSIMax[2] = 1023;
                      }
                      PrintMenu();
                      break;
                  }
                  break;
                case 2:  // We are in Settings Menu
              switch (SelectedMenu) {
                case 0:  // Input 1 Settings
                 InMenu=5;
                 SelectedMenu=0;
                 PrintMenu();
                break;
                case 1:  // Input 2 Settings
                 InMenu=6;
                 SelectedMenu=0;
                 PrintMenu();
                break;
                case 2:  // Switch %
                  RSSIDiffPerc+=1;
                  if (RSSIDiffPerc > 100) {
                    RSSIDiffPerc = 100;
                  }
                    PrintMenu();
    
                break;
                case 3:  // Thres. %
                  RSSICenterPoint+=1;
                  if (RSSICenterPoint > 100) {
                    RSSICenterPoint = 100;
                  }
                    PrintMenu();
                break;
                case 4:  // Save Settings
                  EEPROM.write(0,1);
                  EEPROM.write(1,RSSICenterPoint);
                  EEPROM.write(2,RSSIDiffPerc);
                  EEPROM.write(3,RSSIReverse[1]);
                  EEPROM.write(4,RSSIReverse[2]);
                  EEPROM.write(5,RSSIMin[1]);
                  EEPROM.write(6,RSSIMin[2]);
                  EEPROM.write(7,RSSIMax[1]);
                  EEPROM.write(8,RSSIMax[2]);
                  lcd.setCursor(1,0);
                  lcd.print("Setting: Saved");
                break;
                case 5:  // Reset Settings
                  RSSICenterPoint=50;
                  RSSIDiffPerc=5;
                  RSSIReverse[1] = 1;
                  RSSIReverse[2] = 0;
                  RSSIMin[1] = 390;
                  RSSIMin[2] = 390;
                  RSSIMax[1] = 633;
                  RSSIMax[2] = 633;
                  lcd.setCursor(1,0);
                  lcd.print("Setting: Reset");
                break;
              }
            break;  
            }
          }
          goto EndButtons;
          }
          if (adc_key_in == LeftButton) {    
           if ( InMenu == 2 && SelectedMenu != 2 && SelectedMenu!=3) { // Return to Main Menu
              SelectedMenu = 0;
              InMenu = 1;
              PrintMenu();
              goto EndButtons;
            } else {
              if (InMenu==2) {  // We are in Setting Menu
                switch (SelectedMenu) {
                case 2:  // Switch %
                  RSSIDiffPerc-=1;
                  if (RSSIDiffPerc < 0 || RSSIDiffPerc > 100) {
                    RSSIDiffPerc = 0;
                  }
                    PrintMenu();
                break;
                case 3:  // Thres. %
                  RSSICenterPoint-=1;
                  if (RSSICenterPoint < 0 || RSSICenterPoint > 100) {
                    RSSICenterPoint = 0;
                  }
                    PrintMenu();
                break;
              }  
    
              } else {
                if (InMenu==5) {  // We are in Input 1 menu
                  switch (SelectedMenu) {
                    case 0:  // Reverse Scaling
                       if (RSSIReverse[1] == 0) {
                         RSSIReverse[1] = 1;
                       } else {
                         RSSIReverse[1] = 0;          
                       }
                       PrintMenu();
                       break;
                    case 1:  // Min
                      RSSIMin[1]-=1;
                      if (RSSIMin[1] < 0) {
                        RSSIMin[1] = 0;
                      }
                      PrintMenu();
                      break;
                    case 2:  // Max
                      RSSIMax[1]-=1;
                      if (RSSIMax[1] < 0) {
                        RSSIMax[1] = 0;
                      }
                      PrintMenu();
                      break;
                  }
                } else {
                  if (InMenu==6) {  // We are in Input 2 Menu
                    switch (SelectedMenu) {
                    case 0:  // Reverse Scaling
                       if (RSSIReverse[2] == 0) {
                         RSSIReverse[2] = 1;
                       } else {
                         RSSIReverse[2] = 0;          
                       }
                       PrintMenu();
                       break;
                    case 1:  // Min
                      RSSIMin[2]-=1;
                      if (RSSIMin[2] < 0) {
                        RSSIMin[2] = 0;
                      }
                      PrintMenu();
                      break;
                    case 2:  // Max
                      RSSIMax[2]-=1;
                      if (RSSIMax[2] < 0) {
                        RSSIMax[2] = 0;
                      }
                      PrintMenu();
                      break;
                  }
    
                  } else {
                  }
                }
              }
            }
          }
          if (adc_key_in == DownButton) {   // Scroll Down menu
            if ( (SelectedMenu == 2 && InMenu==1) || (SelectedMenu == 5 && InMenu==2) || (SelectedMenu == 2 && (InMenu == 5 || InMenu==6))) {
              SelectedMenu = 0;
            } else {
              SelectedMenu+=1;
            }
            PrintMenu();
          }
          if (adc_key_in == UpButton) {    // Scroll Up Menu
            if (SelectedMenu == 0) {
              switch (InMenu) {
                case 1:
                  SelectedMenu = 2;
                break;
                case 2:
                  SelectedMenu = 5;
                break;
                case 5:
                  SelectedMenu = 2;
                break;
                case 6:
                  SelectedMenu = 2;
                break;  
              }
            } else {
              SelectedMenu-=1;
            }
            PrintMenu();
          }
        } 
      EndButtons:
      
      RSSICount+=1;                            // Set counter for averaging
      RSSIValues[1] = analogRead(RSSI1);       // Get raw RSSI voltage
      RSSIValues[2] = analogRead(RSSI2);
      
      RSSIVolt[1] = (float)RSSIValues[1] * 0.0049;    // Store actual voltage value
      RSSIVolt[2] = (float)RSSIValues[2] * 0.0049;    // Store actual voltage value
    
      
      // Check for Reverse Scaling and adjust
      for (int a=1;a < 3;a++) {
        if (RSSIReverse[a]) {
          if (RSSIValues[a] < 5) {
            RSSIValues[a] = 1023;
          }
          RSSIValues[a] = map(RSSIValues[a],1023,0,0,1023);  
        } 
        // Do a quick auto-calibration check on RSS Max
        if (RSSIValues[a] > RSSIMax[a]) {
          RSSIMax[a] = RSSIValues[a];
        }      
        RSSIValues[a] = map(RSSIValues[a],RSSIMin[a],RSSIMax[a],0,100);
      }
    
      // Do a quick check for out of bounds values
      if (RSSIValues[1] < 0) {RSSIValues[1] = 0;}
      if (RSSIValues[2] < 0) {RSSIValues[2] = 0;}
      if (RSSIValues[1] > 100) {RSSIValues[1] = 100;}
      if (RSSIValues[2] > 100) {RSSIValues[2] = 100;}
    
      RSSIAvg[1]+= RSSIValues[1];              // Add up for average
      RSSIAvg[2]+= RSSIValues[2];
    
      if (RSSICount == 200) {                  // Sample from an average of 200 RSSI readings
        VoltCount+=1;
        RSSIAvgValue[1] = RSSIAvg[1]/200;
        RSSIAvgValue[2] = RSSIAvg[2]/200;
        RSSICount = 0;                         // Reset the RSSI Counter and averages
        RSSIAvg[1] = 0;                        
        RSSIAvg[2] = 0;
    
        if (VoltCount == 3) {
          if (InMenu==99) {  // Display About
           lcd.setCursor(0,0);
           lcd.print("  MatCat GS v1.00");
           lcd.setCursor(0,2);
           lcd.print("  Arduino Powered");
           lcd.setCursor(0,3);
           lcd.print("     Diversity");
          }    
        if (VoltCount == 3 || DrawNow == 1) {  // Purpose here is to not update the screen so fast that you can't read the value
          if (InMenu == 0) {
            lcd.setCursor(0,0);                    // Print RSSI data to screen
            if (CurrentInput == 1) {
              if (LockedInput == 1) {
                lcd.write(7);
              } else {
                lcd.write(1);
              }
            } else { 
              lcd.print(" ");
             }
            lcd.print("RSSI 1: ");
            lcd.setCursor(9,0);
            lcd.print("   ");
            lcd.setCursor(9,0);
            lcd.print(RSSIAvgValue[1]);
            lcd.print("%");
            lcd.setCursor(0,1);
            if (CurrentInput == 2) {
              if (LockedInput == 2) {
                lcd.write(7);
              } else {
                lcd.write(1);
              }
            } else { 
              lcd.print(" ");
            }
          
            lcd.print("RSSI 2: ");
            lcd.setCursor(9,1);
            lcd.print("   ");
            lcd.setCursor(9,1);
            lcd.print(RSSIAvgValue[2]);
            lcd.print("%");
            lcd.setCursor(0,2);
            if (LockedInput == 0) {
              lcd.print("Video Source ");
              lcd.print(CurrentInput);
              lcd.print("  ");
            } else {
              lcd.write(7);
              lcd.print("Locked Input ");
              lcd.print(LockedInput);
            }
            DrawNow = 0;
          }
        }
        // Print current voltage too
          VoltCount = 0;
          if (InMenu == 0) {
            printFloat(RSSIVolt[1],2,15,0);
            lcd.print("v");    
            printFloat(RSSIVolt[2],2,15,1);
            lcd.print("v");    
          }
        }
      }
        // Lets calcualte some time here
        unsigned long CurrentTime = millis();
        unsigned long TimeDifference = CurrentTime - lastChange;
        TimeDifference = TimeDifference / 1000;  // Convert to seconds
        SecondsOn[0]=TimeDifference;
    
        // Do we need to change inputs?
    
        // Calculate RSSI Difference
        int RSSIDifference = RSSIAvgValue[1] - RSSIAvgValue[2];  
        RSSIDifference = abs(RSSIDifference);
        
        if (RSSIAvgValue[1] > RSSIAvgValue[2]) {
          // Next we want to make sure the other input is already active, and the difference
          // is greater then 5% or the other RSSI is lower then roughly 50%, and that an input is not locked on
          if (LockedInput == 0 && CurrentInput == 2 && (RSSIAvgValue[2] < RSSICenterPoint || RSSIDifference > RSSIDiffPerc)) {
            // Switch from Input 2 to Input 1
            SetInput(1);
            if (InMenu == 0) {
              lcd.setCursor(0,2);
              lcd.print("Video Source 1");
            }
            // Store time of the change
            lastChange = millis();
          } 
        } else {
          if (LockedInput == 0 && CurrentInput == 1 && (RSSIAvgValue[1] < RSSICenterPoint || RSSIDifference > RSSIDiffPerc)) {
            //Switch from Input 1 to Input 2
            SetInput(2);
            if (InMenu == 0) {
              lcd.setCursor(0,2);
              lcd.print("Video Source 2");
            }
            // Store time of the change
            lastChange = millis();
          } 
        }
        
        if (InMenu == 4) {  // Time Info Screen
          if (VoltCount==0 || DrawNow==2) {  // Only want to do it just after a cycle
            DrawNow=0;  // Reset draw immediately flag
            int DrewInd = 0;  // Indicator Drawn Flag
            lcd.setCursor(0,0);
            if (LockedInput == 1) {
                lcd.write(7); 
                DrewInd=1;
            }
            if (CurrentInput == 1 && LockedInput == 0) {
                lcd.write(6);
                DrewInd=1;
            }
            if (!DrewInd) {
              lcd.print(" ");
            }
            DrewInd = 0;
            lcd.print("RSSI 1      ");
            if (LockedInput == 2) {
                lcd.write(7);      
                DrewInd = 1;  
            }
            if (CurrentInput == 2 && LockedInput == 0) {
                lcd.write(6);
                DrewInd = 1;
            }
            if (!DrewInd) {
              lcd.print(" ");
            }
            DrewInd = 0;
            lcd.print("RSSI 2");
            lcd.setCursor(1,1);
            lcd.print(RSSIAvgValue[1]);
            lcd.print("%");
            lcd.setCursor(13,1);
            lcd.print(RSSIAvgValue[2]);
            lcd.print("%");
            int Seconds[2];
            int Minutes[2];
            int Hours[2];
            if (CurrentInput == 1) {
              Seconds[0] = SecondsOn[0] + SecondsOn[1]; 
              Seconds[1] = SecondsOn[2];
            } else {
              Seconds[0] = SecondsOn[1];
              Seconds[1] = SecondsOn[0] + SecondsOn[2]; 
            }
            
            //Calculate the time
            Minutes[0] = Seconds[0]/60;
            Minutes[1] = Seconds[1]/60;
            Seconds[0] = Seconds[0] % 60;
            Seconds[1] = Seconds[1] % 60;
            Hours[0] = Minutes[0] / 60;
            Hours[1] = Minutes[1] / 60;
            Minutes[0] = Minutes[0] % 60;
            Minutes[1] = Minutes[1] % 60;
            lcd.setCursor(1,2);
            if (Hours[0] > 0) {
              lcd.print(Hours[0]);
              lcd.print("h");
            }
            if (Minutes[0] > 0) {
              lcd.print(Minutes[0]);
              lcd.print("m");
            }
            if (Seconds[0] > 0) {
              lcd.print(Seconds[0]);
              lcd.print("s");
            }
            lcd.setCursor(13,2);
            if (Hours[1] > 0) {
              lcd.print(Hours[1]);
              lcd.print("h");
            }
            if (Minutes[1] > 0) {
              lcd.print(Minutes[1]);
              lcd.print("m");
            }
            if (Seconds[1] > 0) {
              lcd.print(Seconds[1]);
              lcd.print("s");
            }
    
          }      
        }
        adc_key_in = -1;    // Make sure we don't do lots of button triggers
       
      }
    
    void printFloat(float value, int places, int lcdCol, int lcdRow) {
      // this is used to cast digits
      int digit;
      float tens = 0.1;
      int tenscount = 0;
      int i;
      float tempfloat = value;
    
        // make sure we round properly. this could use pow from , but doesn't seem worth the import
      // if this rounding step isn't here, the value  54.321 prints as 54.3209
    
      // calculate rounding term d:   0.5/pow(10,places)  
      float d = 0.5;
      if (value < 0)
        d *= -1.0;
      // divide by ten for each decimal place
      for (i = 0; i < places; i++)
        d/= 10.0;    
      // this small addition, combined with truncation will round our values properly
      tempfloat +=  d;
    
      // first get value tens to be the large power of ten less than value
      // tenscount isn't necessary but it would be useful if you wanted to know after this how many chars the number will take
    
      if (value < 0)
        tempfloat *= -1.0;
      while ((tens * 10.0) <= tempfloat) {
        tens *= 10.0;
        tenscount += 1;
      }
    
    
      // write out the negative if needed
       lcd.setCursor(lcdCol,lcdRow);
      if (value < 0)
        lcd.print('-');
    
      if (tenscount == 0)
        lcd.print(0, DEC);
    
      for (i=0; i< tenscount; i++) {
        digit = (int) (tempfloat/tens);
        lcd.print(digit, DEC);
        tempfloat = tempfloat - ((float)digit * tens);
        tens /= 10.0;
      }
    
      // if no places after decimal, stop now and return
      if (places <= 0)
        return;
    
      // otherwise, write the point and continue on
      lcd.print('.');  
    
      // now write out each decimal place by shifting digits one by one into the ones place and writing the truncated value
      for (i = 0; i < places; i++) {
        tempfloat *= 10.0;
        digit = (int) tempfloat;
        lcd.print(digit,DEC);  
        // once written, subtract off that digit
        tempfloat = tempfloat - (float) digit;
      }
    }
    int get_key(unsigned int input) {
      int k;
      for (k = 0; k < NUM_KEYS; k++) {
        if (input < adc_key_val[k]) {
          return k;
        }
      }
        k = -1;
      return k;
    }
    void PrintMenu(void) {
      /* Menu Layout
        0 1 2 3 4 5 6 7 8 910111213141516171819
      0 /             M a i n   M e n u
      1 >   S e l e c t e d   M e n u   I t e m
      2 |   N o r m a l   m e n u   i t e m
      3 \   N o r m a l   m e n u   i t e m
      */
      int menuSize;
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("                   ");
      lcd.setCursor(1,0);
      switch (InMenu) {
        case 1: 
          menuSize = sizeof(MenuItems) / (sizeof(char) * 19);
          lcd.print("   Main Menu");
        break;
        case 2:
          menuSize = sizeof(SettingsMenu) / (sizeof(char) * 19);    
          switch (SelectedMenu) {
            case 2:
            lcd.print("Setting: [");
            lcd.print(RSSIDiffPerc);
            lcd.print("%]");
            break; 
            case 3:
            lcd.print("Setting: [");
            lcd.print(RSSICenterPoint);
            lcd.print("%]");
            break; 
          default:
            lcd.print(" Settings Menu");
            break;
          }
        break;
        case 5:
          menuSize = sizeof(SettingsInputMenu) / (sizeof(char) * 19);    
          switch (SelectedMenu) {
            case 0:
            lcd.print("Setting: [");
            if (RSSIReverse[1]) {
              lcd.print("YES");
            } else {
              lcd.print("NO");
            }
            lcd.print("]");
            break; 
            case 1:
            lcd.print("Setting: [");
            lcd.print(RSSIMin[1]);
            lcd.print("]");
            break; 
            case 2:
            lcd.print("Setting: [");
            lcd.print(RSSIMax[1]);
            lcd.print("]");
            break; 
    
          default:
            lcd.print(" Input Menu");
            break;
          }
          break;
        case 6:
          menuSize = sizeof(SettingsInputMenu) / (sizeof(char) * 19);    
          switch (SelectedMenu) {
            case 0:
            lcd.print("Setting: [");
            if (RSSIReverse[2]) {
              lcd.print("YES");
            } else {
              lcd.print("NO");
            }
            lcd.print("]");
            break; 
            case 1:
            lcd.print("Setting: [");
            lcd.print(RSSIMin[2]);
            lcd.print("]");
            break; 
            case 2:
            lcd.print("Setting: [");
            lcd.print(RSSIMax[2]);
            lcd.print("]");
            break; 
    
          default:
            lcd.print(" Input Menu");
            break;
          }    
        break;    
      }
      if (menuSize > 3 && SelectedMenu > 1) {
        lcd.setCursor(0,0);
        lcd.write(3);
      }
      int MenuPointers[3];
      if (SelectedMenu < 2 || menuSize==3) {
        MenuPointers[0] = 0;
        MenuPointers[1] = 1;
        MenuPointers[2] = 2;
      } else {
        if (((menuSize - (SelectedMenu+1)) < 2) && menuSize > 3 ) {
          MenuPointers[0] = menuSize-3;
          MenuPointers[1] = menuSize-2;
          MenuPointers[2] = menuSize-1;
        } else {
          MenuPointers[0] = SelectedMenu -1;
          MenuPointers[1] = SelectedMenu;
          MenuPointers[2] = SelectedMenu +1;
        }
      }
      
      for (int a=1;a < 4;a++) {
        lcd.setCursor(0,a);
        if (SelectedMenu == MenuPointers[a-1]) {
          lcd.write(6);
        } else {
          lcd.write(5);
        }
        switch (InMenu) {
          case 1:
            lcd.print(MenuItems[MenuPointers[a-1]]);  
            break;
          case 2:
            lcd.print(SettingsMenu[MenuPointers[a-1]]);  
            break;
          case 5:
            lcd.print(SettingsInputMenu[MenuPointers[a-1]]);  
            break;
          case 6:
            lcd.print(SettingsInputMenu[MenuPointers[a-1]]);  
            break;
    
      }
        
      }
      if (menuSize > 3 && (menuSize - (SelectedMenu + 1)) > 1) {
        lcd.setCursor(0,3);
        lcd.write(4);
      }
    }
    
    // Special function to define custom characters for LCD
    int defineCharacter(int ascii, int *data) {
        int baseAddress = (ascii * 8) + 64;  
        // baseAddress = 64 | (ascii << 3);
        lcd.command(baseAddress);
        for (int i = 0; i < 8; i++)
            lcd.write(data[i]);
        lcd.command(128);
        return ascii;
    }
    void SetInput(int input) {
      // Update time data
      SecondsOn[CurrentInput] = SecondsOn[CurrentInput] + SecondsOn[0];
      SecondsOn[0] = 0;
      CurrentInput = input;
      lastChange = millis();
      if (CurrentInput == 1) {
        digitalWrite(SwitchPinB,LOW);
        digitalWrite(SwitchPinA,HIGH);
      } else {
        digitalWrite(SwitchPinA,LOW);
        digitalWrite(SwitchPinB,HIGH);
      }
    }
    Последний раз редактировалось Olegos; 22.02.2014 в 16:25.

  2.  
Закрытая тема

Похожие темы

  1. Rssi и приемник futaba r6308
    от cyberalex в разделе Аппаратура радиоуправления
    Ответов: 0
    Последнее сообщение: 27.01.2014, 02:31
  2. Walkera RSSI Выход для FPV
    от mvpolushin в разделе Аппаратура радиоуправления
    Ответов: 0
    Последнее сообщение: 06.12.2013, 22:04
  3. FrSky для настройки сигналов Low Voltage & RSSI какие USB шнурки нужны?
    от shkaff в разделе Аппаратура радиоуправления
    Ответов: 2
    Последнее сообщение: 16.11.2013, 10:09
  4. альтернативная прошивка open9x для платы ersky9x
    от s_m в разделе Аппаратура радиоуправления
    Ответов: 68
    Последнее сообщение: 13.08.2013, 15:49
  5. Индикатор RSSI для JMK подобных приемников
    от Дми-III-й в разделе Полеты по камере, телеметрия
    Ответов: 96
    Последнее сообщение: 13.03.2013, 23:18

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения