Нормализация не работает на входном буфере. Как это решить?
Я написал фрагмент кода, который принимает входные данные от датчика, который называется всемирно известным импульсным датчиком с аналогового вывода 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);
}
Вот Мусорный график.
@Shridhar Sharma, 👍-1
Обсуждение1 ответ
Лучший ответ:
Я укажу на некоторые проблемы с вашим кодом:
Посмотрите на эту строку:
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 даже есть функция автоформата, которую вы можете использовать для этого.
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
- Как я могу запитать Arduino Nano от батареи LiPo, желательно 3,7 В
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
64*(Buffer2[i]/Buffer2[0]);
: эта строка абсолютно ничего не делает. Вы нигде не храните результат этого вычисления., @Mat