Нормализация не работает на входном буфере. Как это решить?

Я написал фрагмент кода, который принимает входные данные от датчика, который называется всемирно известным импульсным датчиком с аналогового вывода 1, и сохраняет его в массиве из 127 элементов, затем находит в нем самый большой, делит остальные на самый большой, умножает на 64, что является максимальной длиной y на OLED и печатает его на OLED-дисплее. Он по-прежнему дает мне предварительно нормализованные и масштабированные значения на последовательном плоттере.

Что я делаю не так? Вот мой код.

#include <U8glib.h> 
U8GLIB_SSD1306_128X64 u8g(12, 11, 8, 9, 10);
int x, y;int Buffer2[128];
void pageBP();
const int pageCount = 1;
int p;
void (*pages[pageCount])() = {pageBP};
int duration [pageCount] = {1000};
void setup() {
  
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);
  p = 0;
  Serial.begin(9600); 

}

void loop() {
  
 


u8g.firstPage();
  do {  
    (*pages[p])();
  } while( u8g.nextPage() );
  delay(duration[p]);
  p = p+1;
  if (p == pageCount)
    p=0;
}


void pageBP() {
  for(x = 0;x < 128;x++) {
Buffer2[x] =(analogRead(A1)>>2);//IP для PPG
Serial.println(Buffer2[x]);
delay(5);
}
for(int i = 1;i < 128; i++)
    { 
       if(Buffer2[0] < Buffer2[i])
           Buffer2[0] = Buffer2[i];
    }
    for(int i = 1;i < 128; i++)
    {
       64*(Buffer2[i]/Buffer2[0]);        
    }
  for(x = 0;x < 127;x++) {

u8g.drawLine(x, Buffer2[x], x, Buffer2[x+1]); //OP to OLED для ЭКГ

u8g.drawLine(64, 0, 64, 63); 
u8g.drawLine(0, 32, 128, 32);}
for(x=0;x<128;x+=8) 
u8g.drawLine(x, 31, x, 33);
for(x=0;x<64;x+=8)
u8g.drawLine(63, x, 65, x); 
u8g.drawFrame(0, 0, 128, 64); 
}

Вот Мусорный график.

, 👍-1

Обсуждение

64*(Buffer2[i]/Buffer2[0]); : эта строка абсолютно ничего не делает. Вы нигде не храните результат этого вычисления., @Mat


1 ответ


Лучший ответ:

2

Я укажу на некоторые проблемы с вашим кодом:

  • Посмотрите на эту строку:

      64*(Buffer2[i]/Buffer2[0]);
    

    Он ничего не делает. Вы вычисляете масштабированное значение, но нигде его не сохраняете. Вам нужно присвоить это значение переменной (например, элементу в новом массиве).

  • С помощью этого кода

      for(int i = 1;i < 128; i++)
      { 
          if(Buffer2[0] < Buffer2[i])
              Buffer2[0] = Buffer2[i];
      }
    

    Вы перезаписываете первое значение в буфере, чтобы найти самое высокое значение. Это может быть не проблемой для вас, но чтобы быть чистым здесь, вы должны просто использовать новую переменную, которая содержит наибольшее значение за пределами буфера.

  • Я не уверен, что вы пытаетесь сделать с этой строкой:

      u8g.drawLine(x, Buffer2[x], x, Buffer2[x+1]);
    

    Обычно вам нужно провести линию от одной точки графика к другой. Таким образом, второй параметр x должен быть значением x для следующей точки. В настоящее время вы просто рисуете вертикальную линию. Вместо этого я бы написал

      u8g.drawLine(x, Buffer2[x], x+1, Buffer2[x+1]);
    

    так как вы уже считаете только до 127 вместо 128.

  • Даже если вы все сделаете правильно, последовательный монитор все равно будет показывать не масштабированные значения, так как вы печатаете в Serial непосредственно после измерения. Таким образом, чтобы отобразить масштабированные значения на последовательном мониторе, вам нужно переместить линию

      Serial.println(Buffer2[x]);
    

    вплоть до после масштабирования, например, в том же цикле for, что и код OLED-дисплея.

  • И, наконец, вы должны действительно исправить свой отступ. Это сделает ваш код более читабельным и, следовательно, более понятным. В Arduino IDE даже есть функция автоформата, которую вы можете использовать для этого.

,