Оптимизация кода

Нет ответов
vvadim
Offline
Зарегистрирован: 23.05.2012

Играюсь с нелинейными соотношениями.

Есть две кнопки - первая режимы записи и чтения данных, вторая запись данных и два потенциометра. В режиме записи при нажатии на вторую кнопку запоминаются данные с потенциометров - 5 запомненных положений. При переходе в режим чтения при вращении первого потенциометра переменная меняется в зависимости от сохранённых значений, получается кривая из четырёх отрезков. Код работает, пока меня устраивает. 

Вопрос в том, что нужно сохранять больше точек, допустим 50 шт, и расписывать простыни не хочется, а знаний как записать правильно, коротко и красиво, конечно если это возможно, ну не хватает. Прошу помощи.

На следующем этапе хочется предусмотреть возможность прекращения записи произвольно, например записал 35 точек из 50 возможных, и перехожу в режим чтения. Правда наверно прийдётся ещё кнопку добавлять.

 

#include <Bounce.h>

#define led          13
#define POT1         A1
#define POT2         A2
int valPOT1;
int valPOT2;
#define BUTTON_SAVE  8
#define BUTTON_READ  9
Bounce bouncerSAVE = Bounce( BUTTON_SAVE, 15 );
Bounce bouncerREAD = Bounce( BUTTON_READ, 15 );
int regim = 0; 
int flagR = 0;
int flagS = 0;
int Mode = 0;
int count = 0;
int val;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;
int pos1 = 0;
int pos2 = 0;
int pos3 = 0;
int pos4 = 0;
int pos5 = 0;

void Blink()
{
  digitalWrite(led, HIGH );
  delay(200); 
  digitalWrite(led, LOW );
  delay(200);
  digitalWrite(led, HIGH );
  delay(200); 
  digitalWrite(led, LOW );
  delay(200);
  digitalWrite(led, HIGH );
  delay(200); 
  digitalWrite(led, LOW );
  delay(200);
  digitalWrite(led, HIGH );
  delay(200); 
  digitalWrite(led, LOW );
}

void setup()
{
  pinMode(BUTTON_SAVE, INPUT);
  pinMode(BUTTON_READ, INPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  bouncerSAVE.update ( );
  bouncerREAD.update ( );
  int valueSAVE = bouncerSAVE.read();
  int valueREAD = bouncerREAD.read();

  ///////////////////////////////////////////////////////////  кнопка режимов записи и чтения
  if ( valueREAD == HIGH && regim == 0 && flagR == 0  && count == 5)
  {   
    flagR = 1;
    regim = 1;
  }
  if ( valueREAD == HIGH && regim == 1 && flagR == 0 )
  {   
    flagR = 1;
    regim = 0;
  }
  if ( valueREAD == LOW && flagR == 1)
  { 
    flagR = 0;
  }
  if(regim == 0)
  {
    Mode = 0;  
  }
  if(regim == 1)
  {
    count = 0;
    Mode = 1;
  } 
  ///////////////////////////////////////////////////////////////  кнопка записи
  if ( valueSAVE == HIGH && regim == 0 && count == 0 && flagS == 0) 
  {
    count = 1;
    Blink();
    pos1 = valPOT1;
    val1 = valPOT2;
    flagS = 1;
  } 
  if ( valueSAVE == HIGH && regim == 0 && count == 1 && flagS == 0)
  {
    count = 2;
    Blink();
    pos2 = valPOT1;
    val2 = valPOT2;
    flagS = 1;
  } 
  if ( valueSAVE == HIGH && regim == 0 && count == 2 && flagS == 0) 
  {
    count = 3;
    Blink();
    pos3 = valPOT1;
    val3 = valPOT2;
    flagS = 1;
  } 
  if ( valueSAVE == HIGH && regim == 0 && count == 3 && flagS == 0)
  {
    count = 4;
    Blink();
    pos4 = valPOT1;
    val4 = valPOT2;
    flagS = 1;
  } 
  if ( valueSAVE == HIGH && regim == 0 && count == 4 && flagS == 0) 
  {
    count = 5;
    Blink();
    pos5 = valPOT1;
    val5 = valPOT2;
    flagS = 1;
  } 
  if ( valueSAVE == LOW && regim == 0 && flagS == 1) 
  {
    flagS = 0;
  } 
  ///////////////////////////////////////////////////////////////////////////
  if(Mode == 0)
  {
    valPOT1 = analogRead(POT1); 
    valPOT2 = analogRead(POT2); 
  }
  if(Mode == 1)
  {
    valPOT1 = analogRead(POT1);              

    if(pos1 < pos5)                            valPOT1 = constrain(valPOT1, pos1, pos5);
    if(pos1 > pos5)                            valPOT1 = constrain(valPOT1, pos5, pos1);

    if(valPOT1 >= pos1 && valPOT1 <= pos2)     val = map(valPOT1, pos1, pos2, val1, val2);
    if(valPOT1 > pos2 && valPOT1 <= pos3)      val = map(valPOT1, pos2, pos3, val2, val3);
    if(valPOT1 > pos3 && valPOT1 <= pos4)      val = map(valPOT1, pos3, pos4, val3, val4);
    if(valPOT1 > pos4 && valPOT1 <= pos5)      val = map(valPOT1, pos4, pos5, val4, val5);

    if(valPOT1 >= pos2 && valPOT1 <= pos1)     val = map(valPOT1, pos2, pos1, val2, val1);
    if(valPOT1 > pos3 && valPOT1 <= pos2)      val = map(valPOT1, pos3, pos2, val3, val2);
    if(valPOT1 > pos4 && valPOT1 <= pos3)      val = map(valPOT1, pos4, pos3, val4, val3);
    if(valPOT1 > pos5 && valPOT1 <= pos4)      val = map(valPOT1, pos5, pos4, val5, val4);
  }

  Serial.print(count);
  Serial.print("\t");
  Serial.print(regim);
  Serial.print("\t");
  Serial.print(valPOT1);
  Serial.print("\t");
  Serial.print(valPOT2);
  Serial.print("\t");
  Serial.println(val);
}