Библиотека для цифрового выхода

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Arhat109-2 пишет:

Да надоел он.

и, ты его решил заболтать вусмерть?

очевидно же, что каждый из вас прав по своему - ты со своей неадекватной оценкой реальности и он с пидагогической точки искривления сознания.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Всё, облегчились? Ну, будем считать тему исчерпанной.

Arhat109-2 пишет:

буду препятствовать и далее.

Хорошо, только советую делать это как сейчас - просто "не верю", "ты не программист", "ты учишь плохому" - вот так и продолжайте. Главное, избегать любой конкретики, т.к. при любом появлении конкретики (кодов, примеров и т.п.) Вы опять будете сидеть в луже и нести ахинею про косяки в компиляторе и языке, как было уже не раз.

До свидания.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

До свидания. Пост #138 из этой темы станет вашей постоянной лужей как только продолжите нести ахинею.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП, не получается разобратся со статическими классами. Покажите пример.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an, хорошо, только давайте вечером или завтра. Сейчас у меня и работы много и ардуины нет, а вечером дома не знаю, если гости не придут - сделаю, а если придут, то завтра. Извините.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

похоже гости пришли и засиделись... С нетерпением жду продолжения темы (про классы, не про срач.)

п.с. я вот не пойму, если кому то не нравится что кто-то чего-то пишет, почему нельзя это просто игнорировать...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Mr.Privet, а что именно интересует? Делайте вброс, постараюсь ответить ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ребят, простите, обязательно вернусь к теме как только так сразу, но тут так всё навалилось. Сеёчас чуток расхлебаюсь.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

По мотивам титанового велосипеда для тактовой кнопки написал класс для цифрового входа с защитой от дребезга контактов (т.к. в качестве источников дискретного сигнала могут выступать не только кнопки, но и реле, герконы, биметаллические контакты и т.п.)

Текст класса

#ifndef DigIn_h
#define DigIn_h

#include <arduino.h>

class DigIn {
public:
	// Конструктор
	//DigIn NameDigIn(pin,pullup,debounce);
	DigIn (const int8_t pin=2, const bool state=0, const int8_t debounce=50) {
		_pin = pin;
		_debounce=debounce;
		st=digitalRead(_pin);
		(state) ? digitalWrite(_pin,INPUT_PULLUP) :pinMode(_pin, INPUT);
	}
	
	//получение состояния цифрового входа с защитой от дребезга
	bool valid()
	{
		unsigned long currentMillis=millis();//засекаем время
		bool nst=digitalRead(_pin);//считываем состояние
		if(nst==st)
		{
			if(currentMillis-previousMillis>=_debounce)
			{
				return 1;
			}
		}
		else
		{
			previousMillis=currentMillis;
			nst=st;
			return 0;
		}
	}
	
	//вместо простого digitalRead() - не обязательно
	bool state()
	{
		return digitalRead(_pin);
	}

private:
	int8_t _pin;	//выходной пин
	int8_t _debounce;	//выдержка антидребезга
	bool st;//состояние
	unsigned long previousMillis;
};
 
#endif

Пример использования

#include <DigIn.h>//yadi.sk/d/7tGp_zlVsBt7s
#include <DigOut.h>//yadi.sk/d/NM4S6HmFrTRu6
DigIn button_1(2,1);//кнопка на 2 пине, включена подтяжка
DigOut led(13,0);//светодиод на 13 пине по умолчаниюпогашен

void setup(){}

void loop()
{
  if(button_1.valid())//если действительно нажата кнопка
  {
    led.HI();//зажигаем светодиод
  }
  else//иначе
  {
    led.LO();//гасим светодиод
  }
}

Варианты объявления экземпляра класса

DigIn x; - с параметрами по умолчанию (имя экземпляра x, 2 пин по умолчанию, pullup-отк, время антидребезга-50мс)
DigIn x(myPin); - (имя экземпляра x, myPin назначенный пин, pullup-отк по умолчанию, время антидребезга-50мс по умолчанию)
DigIn x(myPin, 1); - (имя экземпляра x, myPin назначенный пин, pullup-вкл, время антидребезга-50мс по умолчанию)
DigIn x(myPin, 1, 30); - (имя экземпляра x, myPin назначенный пин, pullup-вкл, время антидребезга-30мс
(127мс максимум))

Включение кнопки

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

yul-i-an пишет:

По мотивам титанового велосипеда для тактовой кнопки написал класс для цифрового входа с защитой от дребезга контактов 

надеюсь, что по мотивам класс для цифрового входа кто-то напишет велосипед велосипеда велосипеда.

yul-i-an пишет:

т.к. в качестве источников дискретного сигнала могут выступать не только кнопки, но и реле, герконы, биметаллические контакты и т.п.

класс титановый велосипед для тактовой кнопки. не позволяет в качестве источников дискретного сигнала использовать не только кнопки, но и реле, герконы, биметаллические контакты и т.п. ?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Ваш класс Клапацуй 232 без сомнения также позволяет в качестве источников дискретного сигнала использовать не только кнопки, но и реле, герконы, биметаллические контакты и т.п.

В своем нашел ошибку, при создании более одного экземпляра класса защита от дребезга не производится, в данный момент ищу причину.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Устранил ошибку, теперь всё работает как надо.

Код на котором проверял

#include <DigIn.h>//yadi.sk/d/7tGp_zlVsBt7s
#include <DigOut.h>//yadi.sk/d/NM4S6HmFrTRu6

DigIn button_ON(2,1);//кнопка ON на 2 пине, встроенная подтяжка вкл
DigIn button_OFF(3,1);//кнопка OFF на 3 пине,встроенная подтяжка вкл
DigOut led(13,0);//светодиод led на 13 пине, отключен

unsigned long currentMillis=millis();//для хранения текущего времени

void setup()
{
  //прерывание от таймера 0 для опроса millis() не чаще 1 раза/мс
  OCR0A = 0xAF;//robotosha.ru/arduino/multitasking-and-interrupts-arduino.html
  TIMSK0 |= _BV(OCIE0A);
}

void loop()
{
  if(button_ON.valid(currentMillis))//если ON действительно нажата
  {
    led.HI();//включаем светодиод
  }
  if(button_OFF.valid(currentMillis))//если OFF действительно нажата
  {
    led.LO();//выключаем светодиод
  }
}

//по прерыванию таймера получаем текущий millis
SIGNAL(TIMER0_COMPA_vect) 
{
  currentMillis = millis();
}

Пришлось применить костыль в виде передачи текущего millis в функцию опроса цифрового входа, как найду выход исправлю.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

yul-i-an пишет:

как бы да, но:

причинно-следственная связь нарушена: согласно твоему коду - событие нажатия у тебя происходит после события дребезга.

как так, если дребезг есть есть следствие нажания?

подробней здесь #236