SSD1306 не может связно отображать текст и форму сигнала.Почему?

ssd1306

Вот мой код: я собираю данные с помощью датчика ЭКГ и пытаюсь улучшить поступающие данные, растягивая их по оси x. Что и приводит к этому.

После этого экран в конце концов просто потемнеет. Что я делаю не так? Это мой код.

#include <U8glib.h> 
U8GLIB_SSD1306_128X64 u8g(12, 11, 8, 9, 10);
int Buffer[128];int Buffer2[128];int max=0;
//int самый большой;
void pageECG();     // Страница-1


const int pageCount = 2;
int p;
void (*pages[pageCount])() = {pageECG};
int duration [pageCount] = {10000};
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 pageECG() {  
for(int x = 0;x < 128;x++) 
{
Buffer[x] =(analogRead(A0)*0.075);//Этот цикл принимает
delay(5);
if(Buffer[x]<32&&Buffer[x]!=2)
x-=2;
if(Buffer[x]>32&&Buffer[x]!=62)
x+=2;
Serial.println(Buffer[x]);
}  

for(int x = 0;x < 127;x++) 
{
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 60, "ECG");
u8g.drawLine(x, Buffer[x], x,Buffer[x+1]); //OP to OLED for BP

}}

, 👍-1

Обсуждение

Можете ли вы объяснить мне, что вы делаете в цикле for, где считываются данные? Вы манипулируете индексной переменной x таким образом, чтобы получить отрицательные индексы. Кроме того, только в трех случаях значение сохраняется подпоследовательно, то есть когда считанное значение равно 2, 32 или 62. Во всех остальных случаях индекс пересчитывается заново. То, что делает этот алгоритм, совершенно непредсказуемо. И выход, который вы нам показали, возможен. DrawLine также вызывает у меня подозрения, не должно ли это быть " u8g.DrawLine(x, Buffer[x], x+1,Buffer[x+1]);. Я изменил 2-й x на x+1`. И я не вижу кода для очистки страницы перед перерисовкой., @Peter Paul Kiefer


1 ответ


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

1

Ну, одна из проблем заключается в следующем: вы создали массив указателей на функцию, но инициализировали только первый из них-pageECG.

const int pageCount = 2;
int p;
void (*pages[pageCount])() = {pageECG};

Последняя строка там примерно эквивалентна:

void (*pages[pageCount])() = {pageECG, nullptr};

Позже в loop() у вас есть:

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

После первого выполнения loop ()p равно 1. Поскольку это было не 2, он не был сброшен вашим if (p == pageCount) p=0; Поэтому при следующем проходе через loop(), (*pages[p])(); is (*pages[1])(); где pages[1] is nullptr.

На практике вы создаете и выполняете инструкцию AVR icall (косвенный вызов) для адреса 0x0000 (представление nullptr) вектора сброса. Таким образом, ваш скетч начинается почти как сброс, за исключением того, что аппаратное обеспечение не было сброшено. Важно отметить, что прерывания по-прежнему настроены так, как они были, и включен флаг глобального прерывания, что означает всевозможные потенциальные странности, если одному из них удастся выполнить до того, как вы вернетесь к ground setup(). Таким образом, трудно точно сказать, почему вы видите то, что видите. Но это не удивляет меня как потенциальный результат. И это может быть не единственная проблема, просто проблема.

,