#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
//OLED 연결핀
#define CLK 13
#define MOSI 11
#define CS 10
#define DC 4
#define RST 12
Adafruit_SSD1306 display(MOSI, CLK, DC, RST, CS);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
/********************************************/
#define CHARWIDTH 5
#define CHARHEIGHT 8
#define AXISWIDTH (2 + 1)
#define VISIBLEVALUEPIXELS (128 - AXISWIDTH)
#define NUMVALUES (2 * VISIBLEVALUEPIXELS)
#define TRIGGER_ENABLE_PIN 2
#define SCREEN_UPDATE_ENABLE_PIN 3
byte values[NUMVALUES];
int pos = 0;
int count = 0;
unsigned long readStartTime = 0;
int sampleRate = 1;
/********************************************/
//OLED에 글씨 출력하는 함수
void displayln(const char* format, ...)
{
char buffer[32];
va_list args;
va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);
display.setTextSize(1);
display.setTextColor(WHITE);
int len = strlen(buffer);
Serial.println(len);
for (uint8_t i = 0; i < len; i++) {
display.setCursor(9 * CHARWIDTH + (i * 7), 7 * CHARHEIGHT - 2);
display.println(buffer[i]);
Serial.print(buffer[i]);
}
}
//그래프의 Y축에 기준점 표시
void drawAxis()
{
for (int x = 0; x < 2; x++) {
display.drawPixel(x, 0, WHITE);
display.drawPixel(x, 13, WHITE);
display.drawPixel(x, 26, WHITE);
display.drawPixel(x, 38, WHITE);
display.drawPixel(x, 50, WHITE);
display.drawPixel(x, 63, WHITE);
}
}
//들어온 데이터를 바탕으로 파형을 OLED에 그린다
void drawValues()
{
int start = 0;
if ( digitalRead(TRIGGER_ENABLE_PIN) ) {
for (int i = 0; i < NUMVALUES; i++) {
if ( values[i] == 0 ) {
for (; i < NUMVALUES; i++) {
if ( values[i] != 0 ) {
start = i;
break;
}
}
break;
}
}
if ( start >= VISIBLEVALUEPIXELS )
return;
}
for (int i = 0; i < VISIBLEVALUEPIXELS; i++) {
display.drawPixel(i + AXISWIDTH, 63 - (values[i + start]), WHITE);
}
}
//화면 프레임시간 출력
void drawFrameTime(unsigned long us)
{
displayln("%ld us", us);
}
/********************************************/
void setup() {
display.begin(SSD1306_SWITCHCAPVCC);
//버튼 모드 설정
pinMode(TRIGGER_ENABLE_PIN, INPUT_PULLUP);
pinMode(SCREEN_UPDATE_ENABLE_PIN, INPUT_PULLUP);
display.display();
delay(2000);
display.clearDisplay();
}
/********************************************/
void loop() {
//1프레임 출력의 시간을 체크하기 위한 시간 측정 시작
if ( pos == 0 )
readStartTime = micros();
//BIT SHIFT 연산
if ( (++count) % sampleRate == 0 ) {
values[pos++] = analogRead(0) >> 4;
}
if ( pos >= NUMVALUES ) {
unsigned long totalSampleTime = (micros() - readStartTime) / 2;
//화면 업데이트 핀이 눌려졌다면 OLED에 파형을 출력한다.
if ( !digitalRead(SCREEN_UPDATE_ENABLE_PIN) ) {
display.clearDisplay();
drawAxis();
drawValues();
drawFrameTime(totalSampleTime);
display.display();
}
pos = 0;
count = 0;
}
}
미니 오실로스코프 컴파일 문제가있네요 무슨문제일까요 아무리 도무지 찾아봐도 모르겠네요ㅜ
|