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
}}
@Shridhar Sharma, 👍-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().
Таким образом, трудно точно сказать, почему вы видите то, что видите. Но это не удивляет меня как потенциальный результат. И это может быть не единственная проблема, просто проблема.
- Прокрутите одну строку текста, пока другая строка остается статической на OLED-дисплее SSD1306.
- Не могу отключить внутренний интерфейс I2C подтягиваний на ESP32
- Неустранимая ошибка Adafruit_SSD1306.cpp: pgmspace.h: нет такого файла или каталога с использованием SSD1306 на Arduino Nano RP2040
- «Ошибка выделения SSD1306» при #include SD.h
- Помогите настроить вертикальную прокрутку на SSD1306
- Arduino, проблема с прерыванием и SSD1306 OLED
- Сообщение об ошибке при попытке настроить библиотеку U8g2
- Поиск адреса OLED с использованием связи I2C и Arduino
Можете ли вы объяснить мне, что вы делаете в цикле for, где считываются данные? Вы манипулируете индексной переменной
x
таким образом, чтобы получить отрицательные индексы. Кроме того, только в трех случаях значение сохраняется подпоследовательно, то есть когда считанное значение равно 2, 32 или 62. Во всех остальных случаях индекс пересчитывается заново. То, что делает этот алгоритм, совершенно непредсказуемо. И выход, который вы нам показали, возможен.DrawLine
также вызывает у меня подозрения, не должно ли это быть " u8g.DrawLine(x, Buffer[x], x+1,Buffer[x+1]);. Я изменил 2-й
xна
x+1`. И я не вижу кода для очистки страницы перед перерисовкой., @Peter Paul Kiefer