АнтиДребезг. Не пойму - хорошо ли ?
- Войдите на сайт для отправки комментариев
Ср, 26/09/2012 - 23:57
Цель: написать подпрограмму раз и навсегда для кнопки, чтобы не искрила... Потом - попытаться всунуть это дело в библиотеку....
Промежуточный результат - не пойму.... Толи хорошо написАл, то-ли тестировал неправильно....
Судите сами, пожста....
/* // Файл ButtonMagic.h #ifndef ButtonMagic_h #define ButtonMagic_h #include "Arduino.h" // или #include "WProgram.h" class ButtonMagic { public : ButtonMagic( int pin ) ; byte GetEvent( ) ; private: byte _pin; } ; #endif // Файл ButtonMagic.cpp #include "Arduino.h" // или #include "WProgram.h" #include "ButtonMagic.h" ButtonMagic::ButtonMagic( int pin , ) { pinMode( pin , INPUT ) ; digitalWrite( pin , HIGH ) ; _pin = pin ; } byte GetEvent( ) ; { boolean A , B ; int Event ; if ( millis() - BtnMouseLoopTime > 25 ) { A = BtnMouseStatus == 0 ; B = digitalRead( BtnMouse ) == HIGH ; if ( A && B ) { Event = 1 ; } if ( A && !B ) { Event = 2 ; } if ( !A && B ) { Event = 3 ; } if ( !A && !B ) { Event = 1 ; } switch ( Event ) { case 2 : { BtnMouseStatus = 1 ; BtnMouseLoopTime = millis() ; } break ; case 3 : { BtnMouseStatus = 0 ; BtnMouseLoopTime = millis() ; } break ; } } return Event ; } */ // СКЕТЧ #define BtnMouse 7 // подключение кнопки uint32_t BtnMouseLoopTime = 0 ; // фиксация времени предшествующего состояние кнопки uint8_t BtnMouseStatus = 0 ; // предшествующее состояние кнопки #define LedMouse 13 // подключение светодиода uint16_t N = 0 ; // для контроля наличия дребезга //----------------------------------------------------------------- void setup() { Serial.begin( 9600 ) ; pinMode( BtnMouse , INPUT ) ; // режим пина кнопки digitalWrite( BtnMouse , HIGH ) ; // подтяжка пина к + pinMode( LedMouse , OUTPUT ) ; // режим пина светодиода } //----------------------------------------------------------------- uint8_t EventBtnMouse() { boolean A , B ; uint8_t Event ; if ( millis() - BtnMouseLoopTime > 5 ) { A = BtnMouseStatus == 0 ; B = digitalRead( BtnMouse ) == HIGH ; if ( A && B ) { Event = 1 ; } if ( A && !B ) { Event = 2 ; } if ( !A && B ) { Event = 3 ; } if ( !A && !B ) { Event = 1 ; } switch ( Event ) { case 2 : { BtnMouseStatus = 1 ; BtnMouseLoopTime = millis() ; } break ; case 3 : { BtnMouseStatus = 0 ; BtnMouseLoopTime = millis() ; } break ; } } return Event ; } //----------------------------------------------------------------- void loop() { // if ( EventBtnMouse() == 2 ) // { // N ++ ; // Serial.println( N ) ; // } if ( EventBtnMouse() == 3 ) { N ++ ; Serial.println( N ) ; } } //-----------------------------------------------------------------
Вверху - жалкая пародия на конвертацию в библу....
При задержке = 1 в строке #81 - мало искрит, при значении = 50 - вааще не замечено :)
Тестил кнопкой-пальцем, потом подключил один канал энкодера ( без определения направления вращения ) - тоже не искрит !!!!!!
До ООП - далеко, сделал как смог.... И ещё... Напрягают после Паскаля сложносочинённые операторы CPP//// Поэтому - каждая операция отдельно.... За это не лупите, пожста....
Обсудить - есть кто ?
А поискать на arduino.cc готовые либы для этого не пробовали?
http://arduino.cc/playground/Code/Bounce
Если погуглить их еще киллограм найти можно. Кто их только не писал :) Хотя я, лично, предпочитаю все-таки в "писать вручную". не такая уж сложна логика, плюс часто в проекте бывают свою "нюансы" и с их проще учесть "частным решением", чем "универсальным".
Дык - готовые потом.... Сначала самому поучиться надо... И сравнить с другими... Спасибо за ссылку !
Ну если "самому":
Учитывая все это. Я не стал вникать "как рабоает этот код".