(2017.8.18 作成)
(2017.10.4 修正)
下に示していますが、STM32, Arduinoともにほぼ同じコードで実行できます。プログラムの内容は同じです。
"0123" -> "-456" -> "Ahoy" -> 時刻の順に表示して終了します。また時刻を表す":"マークが1秒周期で点滅します。
実際に時刻を設定しているわけではありませんので時間は変わりません。別途プログラムを作成する必要があります。
STM32で使用する場合で、時刻を表す":"を点滅させる場合Tickerクラスで呼び出す割り込みルーチンを実装する必要があります。
下のサンプルコードでは
TIM2_IRQ_Handler
になります。
#include "DKS_Common_F103xB.h" #include "DKS_F103C8T6.h" #include "DKS_I2C_F103xB.h" #include "DKS_GPIO_F103xB.h" #include "DKS_Wait_F103xB.h" #include "DKS_Timer_F103xB.h" #include "DKS_TM1637.h" #include <time.h> DKS::DigitalOut *scl, *sda; DKS::Wait *w; DKS::I2C::SoftwareI2C *i2c; DKS::LED_Display::TM1637 *tm; DKS::Ticker *ticker; DKS::LED_Display::LEDdisp_Clock *led; int main(void) { DKS::InitSystem(); scl = new DKS::DigitalOut(GPIOB, GPIO_PIN_10, DKS::OpenDrain, DKS::Pull_Up); sda = new DKS::DigitalOut(GPIOB, GPIO_PIN_11, DKS::OpenDrain, DKS::Pull_Up); w = new DKS::Wait(TIM3); ticker = new DKS::Ticker(TIM2, 500, DKS::TimeUnit_MilliSec); led = new DKS::LED_Display::LEDdisp_Clock(scl, sda, w, ticker); led->Show(123, 3, true); DKS::Delay(1000); led->Show(-456, 3, true); DKS::Delay(1000); led->Show(0, DKS::LED_Display::A, 1); led->Show(1, DKS::LED_Display::h, 2); const DKS::LED_Display::Char oy[] = { DKS::LED_Display::o, DKS::LED_Display::y }; led->Show(2, oy, 2, 1); DKS::Delay(1000); struct tm t; t.tm_year = 2017; t.tm_mon = 8; t.tm_mday = 14; t.tm_hour = 22; t.tm_min = 14; t.tm_sec = 12; led->Show(t, DKS::LED_Display::LEDdisp_Clock::hhmm, 7); led->TickStart(); for (;;) ; } extern "C" void TIM2_IRQHandler() { __HAL_TIM_CLEAR_IT(&ticker->Tim_Handle, TIM_IT_UPDATE); led->TickProcess(); }
Arduinoの場合もほぼ同じコードです。割り込みを制定する点も同じです。
Arduinoの場合はライブラリ内にサンプルプログラムが入っているので、それを実行するのが早いと思います。
#include <DKS_Timer_Arduino.h> #include <DKS_Wait_Arduino.h> #include <DKS_Common_Arduino.h> #include <DKS_I2C_Arduino.h> #include <DKS_GPIO_Arduino.h> #include "DKS_TM1637.h" DKS::DigitalOut *scl, *sda; DKS::Wait *w; DKS::Ticker *ticker; DKS::LED_Display::LEDdisp_Clock *led; extern "C" void blinkProcess() { led->TickProcess(); } void setup() { scl = new DKS::DigitalOut(2); sda = new DKS::DigitalOut(3); w = new DKS::Wait(); ticker = new DKS::Ticker(blinkProcess, 500, DKS::TimeUnit_MilliSec); led = new DKS::LED_Display::LEDdisp_Clock(scl, sda, w, ticker); // display "123" with zero pad led->Show(123, 3, true); DKS::Delay(1000); // display "-456" led->Show(-456, 3, true); DKS::Delay(1000); // display "Ahoy" with several way led->Show(0u, DKS::LED_Display::A, 1u); led->Show(1u, DKS::LED_Display::h, 2u); DKS::LED_Display::Char oy[] = { DKS::LED_Display::o, DKS::LED_Display::y }; led->Show(2, oy, 2, 1); DKS::Delay(1000); struct tm t; t.tm_year = 2017; t.tm_mon = 8; t.tm_mday = 14; t.tm_hour = 22; t.tm_min = 14; t.tm_sec = 12; // display Time led->Show(t, DKS::LED_Display::LEDdisp_Clock::mmss, 7); led->TickStart(); } void loop() { // put your main code here, to run repeatedly: }