Помогите разобраться с Serial, пожалуйста!

Тема в разделе "Arduino & Shields", создана пользователем iBoy, 26 апр 2016.

  1. iBoy

    iBoy Гик

    Помогите, пожалуйста!
    Вот код. Он должен обрабатывать по методу наименьших квадратов показания датчика пульса(он показывает на шкале от 0 до 1023, причём не пропорционально) и выводить значения. При вводе значений вначале(там где измерить и ввести реальный пуль получается так: Я ввожу пульс, он пишет 56 или 57(как получится), в следующей строчке ввода пульса он просто не спрашивая вводит 55, 56 или 57, и так ещё 5 раз. Дальше всё он видимо считает из этих значений. Почему?
    Код (C++):
    int a_work;
    int b_work;
    int summa_x=0;
    int summa_y=0;
    int summa_x2=0;
    int summa_xy=0;
    int P_D=0;
    int x_work[9];
    int y_work[9];
    int y;
    int ggg;
    int ggj;
    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    while(!Serial) ;
      MNK();
    //  int optimal_puls=0.7*((220-vozrast)-mem)+mem;
    }

    void loop() {
      int  puls=(analogRead(A4)*a_work)+b_work;
      Serial.print(puls);
      Serial.print(" iz ");
      Serial.println(analogRead(A4));
      delay(1000);
    }
    void MNK(){
    for(ggj=0;ggj<=9;ggj++){
      delay(10000);
      Serial.flush();
      Serial.println("Izmerte i vvedite vash puls");
      while(!(Serial.available())){}
      y_work[ggj]=Serial.read();
      Serial.println(y_work[ggj]);
      for(ggg=0;ggg<=9;ggg++){
        P_D=P_D+analogRead(A4);//P_D-показания датчика
        }
        P_D=P_D/5;
        x_work[ggj]=P_D;
      }
      for(ggj=0;ggj<=9;ggj++){
        summa_xy=(x_work[ggj]*y_work[ggj])+summa_xy;
        }
      for(ggj=0;ggj<=9;ggj++){
        summa_x=summa_x+x_work[ggj];
        }
      for(ggj=0;ggj<=9;ggj++){
        summa_y=summa_y+y_work[ggj];
        }
      for(ggj=0;ggj<=9;ggj++){
        summa_x2=summa_x2+(x_work[ggj]^2);
        }
      a_work=(10*summa_xy)-(summa_x*summa_y)/((10*summa_x2)-((summa_x)^2));
      b_work=((10*summa_y)-(a_work*summa_x))/10;
    }
     
     
  2. ostrov

    ostrov Гуру

    Функция MNK вызывается один раз при запуске. Дальше по кругу печатается показание аналогового пина и производной от него.
     
  3. iBoy

    iBoy Гик

    Спасибо большое за ответ! Просто я не понимаю, почему он пишет произведения, ведь он в цикле должен 10 раз писать то же, что я и ввожу. Разве нет?
     
  4. ostrov

    ostrov Гуру

    Я не совсем понял что делает этот цикл, но он делает это один раз. А вам вроде бы надо постоянно или я что то путаю? Что вообще должно происходить?
     
  5. iBoy

    iBoy Гик

    В функции MNK должно внутри цикла фор 10 раз происходить такое:
    1. Ожидание 10 секунд
    2. Очистка сериал порта
    3. Просьба ввести пульс
    4. Ожидание, пока я что-то напишу
    5. Он пишет то же, что я ему ввёл(должен писать)
    6. Считывает показания датчика(5 раз, чтобы избежать шумов и затем их среднее арифметическое)
    7. Рассчитывает методом наименьших квадратов(МНК)(см. картинку) а и в, при функции у=ах+в. МНК:
    [​IMG]
    По факту он после 4 действия, вместо 5-го, пишет либо 55, либо 56, либо 57, затем, даже не спрашивая меня, пишет то же самое. Так ещё 5 раз.
    Функция нужна для калибровки, поэтому запускается только 1 раз в сетапе. Затем он должен просто писать пульс и из каких показаний он его получил.