タイマーでLEDを点滅させる |
タイマーを使ってLEDを点滅させます。タイマーは制御プログラムの基本中の基本です。gtkmmでは簡潔にコードを書くことができます。動作はボタンに点滅を追加しただけです。 最初にボタンをクリックするとLEDが点灯。 次にボタンをクリックすると点滅。 次にボタンをクリックすると消灯。 以上を繰り返します。 ソースコードを示します。 #include <gtkmm.h> #include <iostream> #include <wiringPi.h> #define LED_PORT 4 class MainWin : public Gtk::Window { Gtk::Button m_btnLed; int m_nLedMode, m_nBlinkMode, m_nBlinkCnt; public: MainWin(); private: void on_btn_clicked(); bool onTimer(); }; MainWin::MainWin() { m_nLedMode = 0; m_btnLed.set_label("turn ON"); // シグナルとスロットをコネクト m_btnLed.signal_clicked().connect( sigc::mem_fun( *this, &MainWin::on_btn_clicked ) ); add( m_btnLed ); show_all_children(); resize(240, 32); set_title("LEDの制御"); Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWin::onTimer), 100); } bool MainWin::onTimer() { if(m_nLedMode == 2) { if(m_nBlinkMode == 0) { digitalWrite(LED_PORT, 0); } else { digitalWrite(LED_PORT, 1); } m_nBlinkCnt++; if(m_nBlinkCnt >= 5) { m_nBlinkCnt = 0; if(m_nBlinkMode == 0) { m_nBlinkMode = 1; } else { m_nBlinkMode = 0; } } } return true; } // スロット関数 void MainWin::on_btn_clicked() { if(m_nLedMode == 0) { m_nLedMode = 1; m_btnLed.set_label("bling"); digitalWrite(LED_PORT, 1); } else if(m_nLedMode == 1) { m_nLedMode = 2; m_btnLed.set_label("turn OFF"); m_nBlinkMode = 0; m_nBlinkCnt = 0; } else { m_nLedMode = 0; m_btnLed.set_label("turn ON"); digitalWrite(LED_PORT, 0); } } int main( int argc, char *argv[] ) { if(wiringPiSetupGpio() == -1) { std::cout << "GPIO setup error!" << std::endl; return -1; } pinMode(LED_PORT, OUTPUT); Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }タイマーをセットしているのは、 Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWin::onTimer), 100); 100ms周期でタイムアウトにします。MainWin::onTimerはタイムアウトに呼ばれる関数です。名前は任意です。 if(m_nBlinkCnt >= 5) の数値を変えることでLEDの点滅周期を変えることができいます。あとは簡単なコードなので解説は割愛します。 |
目次へ |