본문 바로가기

상상 Maker Space and US

아두이노 따라하기_03, 2 button OLED stopwatch

아두이노에 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 구동하기

 

아두이노 따라하기_02_128x64 I2C OLED 구동하기

128x64 I2C OLED를 아두이노 우노 보드에서 구동시키는 방법입니다. ●준비물 -. 아두이노 우노 -. 128x64 I2C OLED -. Wire -. bread board(wire만으로도 연결가능) ●제품 사양 -. interface : I2C(동일 제품에..

masnus.tistory.com