아두이노에 2개의 버튼을 추가하고, 그 버튼을 이용하여 128x64 OLED에 표시헤 주는 Stopwatch를 만들어 봤습니다.
●준비물
1. Arduino Uno 1ea
2. tact switch 2ea
2. tact switch cap 2ea
4. 128X64 I2C OLED 1ea
●connection
●Library
1. Bounce2
2. U8g2
2개의 버튼을 추가할때 여러가지 방법이 있는데, Bounce2 Library를 이용 하겠습니다.
128x64 OLED display는 U8g2 Library를 이용해 보겠습니다.
그리고 Stopwatch를 만들기 위해서는 milli second단위로 경과 시간을 보여주는 millis()라는 아두이노 기본 함수를 이용하여 약간의 coding을 해야 합니다. 시간이 많으시면 해보셔도 되고, 저는 원래 코딩을 하는 사람이 아니어서 ^^;, 검색하여 괜찮은 stopwatch 코드를 이용하여 약간 수정하였습니다.
●code
#include <U8x8lib.h>
#include <Bounce2.h>
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // OLEDs without Reset of the Display
#define startButton 7 // PIN mapping
#define eventButton 8 // PIN mapping
Bounce startDebouncer1 = Bounce();
Bounce eventDebouncer2 = Bounce();
bool startState = LOW;
bool eventState = LOW;
unsigned int startCount = 0;
unsigned long startMillis;
unsigned long currentMillis;
unsigned long elapsedMillis;
void setup() {
u8x8.begin();
pre(); //User Interface display
pinMode(startButton, INPUT_PULLUP);
startDebouncer1.attach(startButton);
startDebouncer1.interval(5);
pinMode(eventButton, INPUT_PULLUP);
eventDebouncer2.attach(eventButton);
eventDebouncer2.interval(5);
}
void loop() {
startDebouncer1.update();
if ( startDebouncer1.fell() ) {
startMillis = millis();
startCount = startCount +1;
if (startCount >= 3){
startCount = 1;
pre();
}
startState = !startState;
}
if (startState)
{
currentMillis = millis();
elapsedMillis = (currentMillis - startMillis);
unsigned long durSS = (elapsedMillis/1000)%60; //Seconds
unsigned long durMM = (elapsedMillis/(60000))%60; //Minutes
unsigned long durHH = (elapsedMillis/(3600000)); //Hours
durHH = durHH % 24;
String durMilliSec = timeMillis(durHH, durMM, durSS);
u8x8.setCursor(6,0);
u8x8.print(durMilliSec.substring(3));
eventDebouncer2.update();
if ( eventDebouncer2.fell() ) {
eventState = !eventState;
u8x8.setCursor(6,1);
u8x8.print(durMilliSec.substring(3));
}
}
}
String timeMillis(unsigned long Hourtime,unsigned long Mintime,unsigned long Sectime){
String dataTemp = "";
if (Hourtime < 10) {
dataTemp = dataTemp + "0" + String(Hourtime)+ ":";
}
else{
dataTemp = dataTemp + String(Hourtime)+ ":";
}
if (Mintime < 10) {
dataTemp = dataTemp + "0" + String(Mintime)+ ":";
}
else{
dataTemp = dataTemp + String(Mintime)+ ":";
}
if (Sectime < 10) {
dataTemp = dataTemp + "0" + String(Sectime);
}
else{
dataTemp = dataTemp + String(Sectime);
}
Serial.println(dataTemp);
return dataTemp;
}
void pre(void)
{
u8x8.setFont(u8x8_font_chroma48medium8_r);
//u8x8.setFont(u8x8_font_amstrad_cpc_extended_f);
u8x8.setFlipMode(0);
u8x8.setInverseFont(0);
u8x8.clear();
u8x8.setCursor(0,0);
u8x8.drawString(0,0,"Time ");
u8x8.setCursor(0,1);
u8x8.drawString(0,1, "EVENT ");
}
●결과물
startButton(Yellow, pin 7)으로 start/stop/reset하게 만들었고, eventButton(Blue, pin8)를 누를때 마다, 현제 기록이 업데이트 되게 만들었습니다.
위코드를 좀더 보완하여 여러분의 작업물에 적용해 보세요.
128x64 OLED에 Text를 출력하는 방법은 제 이전글을 참조하세요.
2019/10/31 - [분류 전체보기] - 아두이노 따라하기_02_128x64 I2C OLED 구동하기
'상상 Maker Space and US' 카테고리의 다른 글
솔리드웍스 도면 연습 02_ivngwc-06-09_september06(Piece of Rope) (0) | 2019.12.03 |
---|---|
솔리드웍스 도면 연습_01_ivngwc-2008-07(hanger) (0) | 2019.12.02 |
아두이노 따라하기_02_128x64 I2C OLED 구동하기 (0) | 2019.10.31 |
아두이노 따라하기_01- 2004 I2C LCD 구동하기 (0) | 2019.10.30 |
서울 사회적 아카데미/중소상공인 희망재단 교육 목록 (0) | 2019.10.30 |