АнтиДребезг. Не пойму - хорошо ли ?
- Войдите на сайт для отправки комментариев
Ср, 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
Если погуглить их еще киллограм найти можно. Кто их только не писал :) Хотя я, лично, предпочитаю все-таки в "писать вручную". не такая уж сложна логика, плюс часто в проекте бывают свою "нюансы" и с их проще учесть "частным решением", чем "универсальным".
Дык - готовые потом.... Сначала самому поучиться надо... И сравнить с другими... Спасибо за ссылку !
Ну если "самому":
Учитывая все это. Я не стал вникать "как рабоает этот код".