Panel Cookies
Arduino ESC/servo tester CODE
Help me by sharing this post

This is the code for the Arduino based servo turret. Make sure you also install the needed library for i2c LCD screen module. Download that from below. Install the library, compile and uplaod the code to the Arduino. Downlaod the zip file or copy+paste from below. Read all comments in the code!





schematic arduino ESC servo tester



//Tutorial: https://www.electronoobs.com/eng_arduino_tut90.php
//Schematic: https://www.electronoobs.com/eng_arduino_tut90_sch1.php

//LCD config
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>      //http://www.electronoobs.com/eng_arduino_liq_crystal.php
LiquidCrystal_I2C lcd(0x3f,20,4);  //sometimes the LCD adress is not 0x3f. Change to 0x27 if it dosn't work.


//inputs/outputs
int left = 2;
int right = 4;
int up = 5;
int down = 6;
int sel = 7;
int back = 8;
int pot = A0;
int pwm = 9;

///Variables
uint8_t retarrow[8] = {  
  B00000,
  B00100,
  B00010,
  B11111,
  B00010,
  B00100,
  B00000};
int menu_level = 0;
int menu_0_level = 0;
int menu_1_level = 0;
int menu_4_level = 0;
int menu_8_level = 0;
int menu_11_level = 0;
bool up_state = true;
bool down_state = true;
bool left_state = true;
bool right_state = true;
bool sel_state = true;
bool back_state = true;

int loop_counter = 0;
unsigned long previousMillis = 0; 

int deg_val = 0;
int width = 1000;
int width_min = 1000;
int width_max = 2000;
int frequency = 50;

int servo_freq = 20000;
int esc_freq = 20000; 

int calib_min = 1000;
int calib_max = 2000;


int esc_width = 1000;
int esc_width_min = 1000;
int esc_width_max = 2000;
int esc_frequency = 50;

void setup() {
  pinMode(left,INPUT_PULLUP);
  pinMode(right,INPUT_PULLUP);
  pinMode(up,INPUT_PULLUP);
  pinMode(down,INPUT_PULLUP);
  pinMode(sel,INPUT_PULLUP);
  pinMode(back,INPUT_PULLUP);
  pinMode(pot,INPUT);  
  pinMode(pwm, OUTPUT);
  
  lcd.init();                 //Init the LCD
  lcd.backlight();            //Activate backl
  lcd.createChar(1, retarrow);
  
  lcd.clear();
  
  lcd.setCursor(0,0);
  lcd.write(1);  
  lcd.print(" Servo control");
  lcd.setCursor(0,1);
  lcd.print("  ESC control");

  TCCR1A = 0;
  TCCR1A = (1 <<COM1A1) | (1 << WGM11);  
  TCCR1B = 0;
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); 
  ICR1 = 20000;   //Freq= 50Hz
  OCR1A = 0;      //PWM->OFF pulse width = 0;

}

void loop() {
  if(digitalRead(up))
  {    up_state = true;  }
  if(digitalRead(down))
  {    down_state = true;  }
  if(digitalRead(left))
  {    left_state = true;  }
  if(digitalRead(right))
  {    right_state = true;  }
  if(digitalRead(sel))
  {    sel_state = true;  }
  if(digitalRead(back))
  {    back_state = true;  }  


  if(!(menu_level == 2 || menu_level == 3 || menu_level == 9 || menu_level == 10 || menu_level == 17 ))
  {
    OCR1A = 0;      //PWM->OFF pulse width = 0;
    //digitalWrite(9,LOW);
  }
    
  
  ///////////////////////////////MENU 0////////////////////////////////
  if(menu_level == 0 && !digitalRead(up) && up_state == true)
  {    
    up_state = false;
    menu_0_level = menu_0_level - 1;
    if(menu_0_level < 0)
    {
      menu_0_level = 2;
    }
    if(menu_0_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo control");
      lcd.setCursor(0,1);
      lcd.print("  ESC control");
    }
    if(menu_0_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Servo control");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" ESC control");
    }
    if(menu_0_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  ESC control");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" ESC calibrate");
    }
  }

  if(menu_level == 0 && !digitalRead(down) && down_state == true)
  {    
    down_state = false;
    menu_0_level = menu_0_level + 1;
    if(menu_0_level > 2)
    {
      menu_0_level = 0;
    }
     if(menu_0_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo control");
      lcd.setCursor(0,1);
      lcd.print("  ESC control");
    }
    if(menu_0_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Servo control");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" ESC control");
    }
    if(menu_0_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  ESC control");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" ESC calibrate");
    }
  }
  ///////////////////////////////MENU 0////////////////////////////////






  ///////////////////////////////MENU CHANGE////////////////////////////////
  
  /////////////////////////////////////////////////////////////////////////////////
  if(!digitalRead(back) && back_state == true)
  {
    back_state = false;
    if(menu_level == 1 || menu_level == 8 || menu_level == 15)
    {
      menu_level = 0;
      menu_0_level = 0; 
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo control");
      lcd.setCursor(0,1);
      lcd.print("  ESC control");
    }
    if(menu_level == 2 || menu_level == 3 || menu_level == 4)
    {
      menu_level = 1;
      menu_1_level = 0; 
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo pot");
      lcd.setCursor(0,1);
      lcd.print("  Servo fine");
    }
    if(menu_level == 1)
    {
      menu_level = 0;
      menu_0_level = 0; 
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo control");
      lcd.setCursor(0,1);
      lcd.print("  ESC control");
    }
    if(menu_level == 5 || menu_level == 6 || menu_level == 7)
    {
      menu_level = 4;
      menu_4_level = 0;     
      lcd.clear();    
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Min");
      lcd.setCursor(0,1);
      lcd.print("  Max");
    }     
    if(menu_level == 9 || menu_level == 10 || menu_level == 11)
    {
      menu_level = 8;
      menu_8_level = 0; 
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" ESC pot");
      lcd.setCursor(0,1);
      lcd.print("  ESC fine");
    }
    if(menu_level == 12 || menu_level == 13 || menu_level == 14)
    {
      menu_level = 11;
      menu_11_level = 0;     
      lcd.clear();    
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Min");
      lcd.setCursor(0,1);
      lcd.print("  Max");
    }  
  }
  /////////////////////////////////////////////////////////////////////////////////


  

  
  /////////////////////////////////////////////////////////////////////////////////
  if(menu_level == 0 && menu_0_level == 0 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 1;    
    ICR1 = servo_freq;
    lcd.clear();  
    lcd.setCursor(0,0);
    lcd.write(1);  
    lcd.print(" Servo pot");
    lcd.setCursor(0,1);
    lcd.print("  Servo fine");
  }
  if(menu_level == 0 && menu_0_level == 1 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 8;   
    ICR1 = esc_freq; 
    lcd.clear();  
    lcd.setCursor(0,0);
    lcd.write(1);  
    lcd.print(" ESC pot");
    lcd.setCursor(0,1);
    lcd.print("  ESC fine");
  }
  if(menu_level == 0 && menu_0_level == 2 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 15;    
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Set min value:");
    lcd.setCursor(0,1);
    lcd.print(calib_min);
  }
  /////////////////////////////////////////////////////////////////////////////////


  
  /////////////////////////////////////////////////////////////////////////////////
  if(menu_level == 1 && menu_1_level == 0 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    previousMillis = millis();
    menu_level = 2;    
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Deg ");
    lcd.print(deg_val);    
  }
  if(menu_level == 1 && menu_1_level == 1 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    previousMillis = millis();
    menu_level = 3;    
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Deg ");
    lcd.print(deg_val);    
  }
  if(menu_level == 1 && menu_1_level == 2 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 4;    
    lcd.clear();  
    lcd.setCursor(0,0);
    lcd.write(1);  
    lcd.print(" Min");
    lcd.setCursor(0,1);
    lcd.print("  Max");    
  }
  /////////////////////////////////////////////////////////////////////////////////


  /////////////////////////////////////////////////////////////////////////////////
  if(menu_level == 4 && menu_4_level == 0 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 5;    
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set min:");
    lcd.setCursor(0,1);
    lcd.print(width_min);    
  }
  if(menu_level == 4 && menu_4_level == 1 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 6;    
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set max:");
    lcd.setCursor(0,1);
    lcd.print(width_max);     
  }
  if(menu_level == 4 && menu_4_level == 2 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 7;    
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set frequency:");
    lcd.setCursor(0,1);
    lcd.print(frequency);     
  }
  /////////////////////////////////////////////////////////////////////////////////


  /////////////////////////////////////////////////////////////////////////////////
  if(menu_level == 8 && menu_8_level == 0 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    previousMillis = millis();
    menu_level = 9;    
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("us: ");
    lcd.print(esc_width);    
  }
  if(menu_level == 8 && menu_8_level == 1 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 10;   
    previousMillis = millis(); 
    esc_width = esc_width_min;
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("us: ");
    lcd.print(esc_width);    
  }
  if(menu_level == 8 && menu_8_level == 2 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 11;    
    lcd.clear();  
    lcd.setCursor(0,0);
    lcd.write(1);  
    lcd.print(" Min");
    lcd.setCursor(0,1);
    lcd.print("  Max");    
  }
  /////////////////////////////////////////////////////////////////////////////////




  /////////////////////////////////////////////////////////////////////////////////
  if(menu_level == 11 && menu_11_level == 0 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 12;    
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set min:");
    lcd.setCursor(0,1);
    lcd.print(width_min);    
  }
  if(menu_level == 11 && menu_11_level == 1 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 13;    
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set max:");
    lcd.setCursor(0,1);
    lcd.print(width_max);     
  }
  if(menu_level == 11 && menu_11_level == 2 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 14;    
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set frequency:");
    lcd.setCursor(0,1);
    lcd.print(frequency);     
  }
  /////////////////////////////////////////////////////////////////////////////////


  
  



  
  ///////////////////////////////MENU CHANGE////////////////////////////////





  ///////////////////////////////MENU 1////////////////////////////////
  if(menu_level == 1 && !digitalRead(up) && up_state == true)
  {
    up_state = false;
    menu_1_level = menu_1_level - 1;
    if(menu_1_level < 0)
    {
      menu_1_level = 2;
    }
    if(menu_1_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo pot");
      lcd.setCursor(0,1);
      lcd.print("  Servo fine");
    }
    if(menu_1_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Servo pot");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" Servo fine");
    }
    if(menu_1_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  Servo fine");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" Servo config");
    }    
  }

  if(menu_level == 1 && !digitalRead(down) && down_state == true)
  {
    OCR1A = 0;      //PWM->OFF pulse width = 0;
    down_state = false;
    menu_1_level = menu_1_level + 1;
    if(menu_1_level > 2)
    {
      menu_1_level = 0;
    }
    if(menu_1_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Servo pot");
      lcd.setCursor(0,1);
      lcd.print("  Servo fine");
    }
    if(menu_1_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Servo pot");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" Servo fine");
    }
    if(menu_1_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  Servo fine");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" Servo config");
    } 
  }
  ///////////////////////////////MENU 1////////////////////////////////





    ///////////////////////////////MENU 2////////////////////////////////
  if(menu_level == 2)
  {
    width = map(analogRead(pot),0,1024,width_min,width_max);
    deg_val = map(width,width_min,width_max,0,181);
    OCR1A = width;

    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis >= 100)
    {
      previousMillis += 100;
      lcd.clear();  
      lcd.setCursor(0,0);    
      lcd.print("Deg: ");
      lcd.print(deg_val);      
    }      
  }
  ///////////////////////////////MENU 2////////////////////////////////

  

        
  ///////////////////////////////MENU 3////////////////////////////////
  if(menu_level == 3)
  {
    if(!digitalRead(left) && left_state==true)
    {
      deg_val = deg_val - 1;
      left_state = false;
    }
    if(!digitalRead(right) && right_state==true)
    {
      deg_val = deg_val + 1;
      right_state = false;
    }
    if(deg_val > 180) deg_val = 180;
    if(deg_val < 0) deg_val = 0;    
    
    width = map(deg_val, 0, 190,width_min, width_max);
    OCR1A = width;

    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis >= 100)
    {
      previousMillis += 100;
      lcd.clear();  
      lcd.setCursor(0,0);    
      lcd.print("Deg: ");
      lcd.print(deg_val);      
    }     
  }
  ///////////////////////////////MENU 3////////////////////////////////





  ///////////////////////////////MENU 4////////////////////////////////
  if(menu_level == 4 && !digitalRead(up) && up_state == true)
  {
    OCR1A = 0;      //PWM->OFF pulse width = 0;
    up_state = false;
    menu_4_level = menu_4_level - 1;
    if(menu_4_level < 0)
    {
      menu_4_level = 2;
    }
    if(menu_4_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Min");
      lcd.setCursor(0,1);
      lcd.print("  Max");
    }
    if(menu_4_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Min");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" Max");
    }
    if(menu_4_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  Max");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" Frequency");
    }    
  }

  if(menu_level == 4 && !digitalRead(down) && down_state == true)
  {
    OCR1A = 0;      //PWM->OFF pulse width = 0;
    down_state = false;
    menu_4_level = menu_4_level + 1;
    if(menu_4_level > 2)
    {
      menu_4_level = 0;
    }
    if(menu_4_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Min");
      lcd.setCursor(0,1);
      lcd.print("  Max");
    }
    if(menu_4_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Min");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" Max");
    }
    if(menu_4_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  Max");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" Frequency");
    } 
  }
  ///////////////////////////////MENU 4////////////////////////////////



  ///////////////////////////////MENU 5////////////////////////////////
  if(menu_level == 5 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    width_min = width_min - 5;
    if(width_min < 100)
    {
      width_min = 100;
    }
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set min:");
    lcd.setCursor(0,1);
    lcd.print(width_min);    
  }
  if(menu_level == 5 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    width_min = width_min + 5;
    if(width_min > width_max)
    {
      width_min = width_max;
    }   
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set min:");
    lcd.setCursor(0,1);
    lcd.print(width_min); 
  }
  ///////////////////////////////MENU 5////////////////////////////////


  

  ///////////////////////////////MENU 6////////////////////////////////
  if(menu_level == 6 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    width_max= width_max - 5;
    if(width_max < width_min)
    {
      width_max = width_min;
    }   
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set max:");
    lcd.setCursor(0,1);
    lcd.print(width_max); 
  }
  if(menu_level == 6 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    width_max = width_max + 5;
    if(width_max > 4000)
    {
      width_max = 40000;
    }   
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set max:");
    lcd.setCursor(0,1);
    lcd.print(width_max); 
  }
  ///////////////////////////////MENU 5////////////////////////////////


  ///////////////////////////////MENU 7////////////////////////////////
  if(menu_level == 7 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    frequency= frequency - 1;    
    if(frequency < 10)
    {
      frequency = 10;
    } 
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set frequency:");
    lcd.setCursor(0,1);
    lcd.print(frequency);     
    servo_freq = 16000000/(frequency*16);
  }
  if(menu_level == 7 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    frequency = frequency + 1;   
    if(frequency > 100)
    {
      frequency = 100;
    }        
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set frequency:");;
    lcd.setCursor(0,1);
    lcd.print(frequency); 
    servo_freq = 16000000/(frequency*16);
  }
  ///////////////////////////////MENU 7////////////////////////////////




  ///////////////////////////////MENU 8////////////////////////////////
  if(menu_level == 8 && !digitalRead(up) && up_state == true)
  {
    up_state = false;
    menu_8_level = menu_8_level - 1;
    if(menu_8_level < 0)
    {
      menu_8_level = 2;
    }
    if(menu_8_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" ESC pot");
      lcd.setCursor(0,1);
      lcd.print("  ESC fine");
    }
    if(menu_8_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  ESC pot");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" ESC fine");
    }
    if(menu_8_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  ESC fine");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" ESC config");
    }    
  }

  if(menu_level == 8 && !digitalRead(down) && down_state == true)
  {    
    down_state = false;
    menu_8_level = menu_8_level + 1;
    if(menu_8_level > 2)
    {
      menu_8_level = 0;
    }
    if(menu_8_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" ESC pot");
      lcd.setCursor(0,1);
      lcd.print("  ESC fine");
    }
    if(menu_8_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  ESC pot");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" ESC fine");
    }
    if(menu_8_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  ESC fine");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" ESC config");
    }    
  }
  ///////////////////////////////MENU 8////////////////////////////////



  ///////////////////////////////MENU 9////////////////////////////////
  if(menu_level == 9)
  {
    esc_width = map(analogRead(pot),0,1024,esc_width_min,esc_width_max);    
    OCR1A = esc_width;

    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis >= 100)
    {
      previousMillis += 100;
      lcd.clear();  
      lcd.setCursor(0,0);    
      lcd.print("us: ");
      lcd.print(esc_width);      
    }      
  }
  ///////////////////////////////MENU 9////////////////////////////////

  

        
  ///////////////////////////////MENU 10////////////////////////////////
  if(menu_level == 10)
  {
    if(!digitalRead(left))
    {
      esc_width = esc_width - 1;
      left_state = false;
      delay(10);
    }
    if(!digitalRead(right))
    {
      esc_width = esc_width + 1;
      right_state = false;
      delay(10);
    }
    if(esc_width > esc_width_max) esc_width = esc_width_max;
    if(esc_width < esc_width_min) esc_width = esc_width_min;     
 
    OCR1A = esc_width;

    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis >= 100)
    {
      previousMillis += 100;
      lcd.clear();  
      lcd.setCursor(0,0);    
      lcd.print("us: ");
      lcd.print(esc_width);      
    }     
  }
  ///////////////////////////////MENU 10////////////////////////////////




  ///////////////////////////////MENU 11////////////////////////////////
  if(menu_level == 11 && !digitalRead(up) && up_state == true)
  {
    up_state = false;
    menu_11_level = menu_11_level - 1;
    if(menu_11_level < 0)
    {
      menu_11_level = 2;
    }
    if(menu_11_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Min");
      lcd.setCursor(0,1);
      lcd.print("  Max");
    }
    if(menu_11_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Min");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" Max");
    }
    if(menu_11_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  Max");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" Frequency");
    }    
  }

  if(menu_level == 11 && !digitalRead(down) && down_state == true)
  {    
    down_state = false;
    menu_11_level = menu_11_level + 1;
    if(menu_11_level > 2)
    {
      menu_11_level = 0;
    }
    if(menu_11_level == 0)
    {
      lcd.clear();  
      lcd.setCursor(0,0);
      lcd.write(1);  
      lcd.print(" Min");
      lcd.setCursor(0,1);
      lcd.print("  Max");
    }
    if(menu_11_level == 1)
    {
      lcd.clear();  
      lcd.setCursor(0,0);      
      lcd.print("  Min");
      lcd.setCursor(0,1);
      lcd.write(1); 
      lcd.print(" Max");
    }
    if(menu_11_level == 2)
    {
      lcd.clear();  
      lcd.setCursor(0,0);          
      lcd.print("  Max");
      lcd.setCursor(0,1);    
      lcd.write(1);   
      lcd.print(" Frequency");
    } 
  }
  ///////////////////////////////MENU 11////////////////////////////////




  ///////////////////////////////MENU 12////////////////////////////////
  if(menu_level == 12 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    esc_width_min = esc_width_min - 5;
    if(esc_width_min < 100)
    {
      esc_width_min = 100;
    }
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set min:");
    lcd.setCursor(0,1);
    lcd.print(esc_width_min);    
  }
  if(menu_level == 12 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    esc_width_min = esc_width_min + 5;
    if(esc_width_min > esc_width_max)
    {
      esc_width_min = esc_width_max;
    }   
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set min:");
    lcd.setCursor(0,1);
    lcd.print(esc_width_min); 
  }
  ///////////////////////////////MENU 12////////////////////////////////


  

  ///////////////////////////////MENU 13////////////////////////////////
  if(menu_level == 13 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    esc_width_max= esc_width_max - 5;
    if(esc_width_max < esc_width_min)
    {
      esc_width_max = esc_width_min;
    }   
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set max:");
    lcd.setCursor(0,1);
    lcd.print(esc_width_max); 
  }
  if(menu_level == 13 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    esc_width_max = esc_width_max + 5;
    if(esc_width_max > 4000)
    {
      esc_width_max = 40000;
    }   
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set max:");
    lcd.setCursor(0,1);
    lcd.print(esc_width_max); 
  }
  ///////////////////////////////MENU 13////////////////////////////////


  ///////////////////////////////MENU 14////////////////////////////////
  if(menu_level == 14 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    frequency= frequency - 1;    
    if(frequency < 10)
    {
      frequency = 10;
    } 
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set frequency:");
    lcd.setCursor(0,1);
    lcd.print(frequency);     
    esc_freq = 16000000/(frequency*16);
  }
  if(menu_level == 14 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    frequency = frequency + 1;   
    if(frequency > 100)
    {
      frequency = 100;
    }        
    lcd.clear();  
    lcd.setCursor(0,0);     
    lcd.print("Set frequency:");;
    lcd.setCursor(0,1);
    lcd.print(frequency); 
    esc_freq = 16000000/(frequency*16);
  }
  ///////////////////////////////MENU 14////////////////////////////////



  ///////////////////////////////MENU 15////////////////////////////////
  if(menu_level == 15 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    calib_min= calib_min - 5;    
    if(calib_min < 100)
    {
      calib_min = 100;
    } 
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Set min value:");
    lcd.setCursor(0,1);
    lcd.print(calib_min);
  }

  if(menu_level == 15 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    calib_min= calib_min + 5;    
    if(calib_min > calib_max)
    {
      calib_min = calib_max;
    } 
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Set min value:");
    lcd.setCursor(0,1);
    lcd.print(calib_min);
  }
  if(menu_level == 15 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 16;
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Set max value:");
    lcd.setCursor(0,1);
    lcd.print(calib_max);
  }

   if(menu_level == 16 && !digitalRead(left) && left_state == true)
  {
    left_state = false;
    calib_max= calib_max - 5;    
    if(calib_max < calib_min)
    {
      calib_max = calib_min;
    } 
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Set max value:");
    lcd.setCursor(0,1);
    lcd.print(calib_max);
  }

  if(menu_level == 16 && !digitalRead(right) && right_state == true)
  {
    right_state = false;
    calib_max= calib_max + 5;    
    if(calib_max > 4000)
    {
      calib_max = 4000;
    } 
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Set max value:");
    lcd.setCursor(0,1);
    lcd.print(calib_max);
  }
  if(menu_level == 16 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;
    menu_level = 17;
    OCR1A = calib_max;
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Connect  battery");
    lcd.setCursor(0,1);
    lcd.print("And press select");
  }
  if(menu_level == 17 && !digitalRead(sel) && sel_state == true)
  {
    sel_state = false;  
    OCR1A = calib_min;
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("Calibrating");
    delay(1000);   
    
    lcd.clear();  
    lcd.setCursor(0,0);    
    lcd.print("ESC configured");
    lcd.setCursor(0,1);
    lcd.print("after beep");
    delay(2000);
    menu_level = 0;
    menu_0_level = 0;    
    lcd.setCursor(0,0);
    lcd.write(1);  
    lcd.print(" Servo control");
    lcd.setCursor(0,1);
    lcd.print("  ESC control");
  }
  ///////////////////////////////MENU 15,16,17////////////////////////////////
}//end void loop













yt_link
insta_link
fb_link
twitter_link

Code


ADVERTISERS



PCBWAY PCB service





Curso Arduino Online nivel Intermedio