Напрямую точно долго не проработает
Напрямую точно долго не проработает
Попробовал поработать с 6-ю метрами провода))) Приобрел в радио магазине экранированный многожильный провод написал простейший скетч. На просторах интернета нашел даташит на at42qt1010 (одноканальный емкостный датчик)
и в даташите выяснил емкости конденсаторв Сs от 2 до 50 nF и Cх от 2 до 50 pF
в своем случае я взял Сх 5 pF
провод у меня 4-х жильный 3 жилы я замкнул на массу и оставил только одну а ее через конденсатор на массу.
в видео видно на мониторе порта что при касаниях число вазростает от 150 до 9 тысяч когда провод я держал в руке то чисто было где то 150 может чуть больше когда я его положил то от 25 до 80 а потом я положил локоть на все провода число поднялосьPHP код:
#include <CapacitiveSensor.h>
int Light = 12;
CapacitiveSensor Sensor1 = CapacitiveSensor(4,2); // назначить пины для сенсора
void setup()
{
Serial.begin(115200); // настроить скорость порта
pinMode(Light, OUTPUT);
}
void loop()
{
long temp1 = Sensor1.capacitiveSensor(30); // измерить емкость и сохранить в temp1
if (temp1 > 1000) // изменяя значение 60 мы регулируем чуствительность сенсора
{ digitalWrite(12, HIGH); } // включить светодиод
else { digitalWrite(12, LOW); } // выключить светодиод]
Serial.println(temp1); // для клибровки вашего датчика // или для использования этого значения в компьютере
}
опять где то до 150 я считаю что это не значительные наводки по с равнению с прикосновением тем более что провод будет растянут )))
так же я экспериментировал с 2-мя жилами в одном экране так не получается так как один провод даст наводку на другой внутри экрана и загорятся 2 диода одновременно. Продолжаем экспериментировать)))
не знаю где спрашивать так что спрошу тут хочу сделать кнопки многофункциональными например однократное нажатие двойное нажатие (как на мышке) и зажатие более 1 секунды при этом будут выполняться разные действия как это можно реализовать более простым способом или нужно вводить таймер в скетч ?
Можно использовать функцию millis
ага а с 9-ю кнопками прокатит?
вот скетч по многофункциональности нашел на английской версии сайта Arduino
http://forum.arduino.cc/index.php/topic,14479.0.html
благодаря manu_245 он помог мне совместить все это в один скетч
PHP код:
/* 4-Way Button: Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch
By Jeff Saltzman
Oct. 13, 2009
To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
1) Click: rapid press and release
2) Double-Click: two clicks in quick succession
3) Press and Hold: holding the button down
4) Long Press and Hold: holding the button for a long time
*/
#define buttonPin 19 // analog input pin to use as a digital input
#define ledPin1 18 // digital output pin for LED 1
#define ledPin2 17 // digital output pin for LED 2
#define ledPin3 16 // digital output pin for LED 3
#define ledPin4 15 // digital output pin for LED 4
// LED variables
boolean ledVal1 = false; // state of LED 1
boolean ledVal2 = false; // state of LED 2
boolean ledVal3 = false; // state of LED 3
boolean ledVal4 = false; // state of LED 4
// Button timing variables
int debounce = 20; // ms debounce period to prevent flickering when pressing or releasing the button
int DCgap = 250; // max ms between clicks for a double click event
int holdTime = 1000; // ms hold period: how long to wait for press+hold event
int longHoldTime = 3000; // ms long hold period: how long to wait for press+hold event
int checkButton();
// Button variables
boolean buttonVal = HIGH; // value read from button
boolean buttonLast = HIGH; // buffered value of the button's previous state
boolean DCwaiting = false; // whether we're waiting for a double click (down)
boolean DConUp = false; // whether to register a double click on next release, or whether to wait and click
boolean singleOK = true; // whether it's OK to do a single click
long downTime = -1; // time the button was pressed down
long upTime = -1; // time the button was released
boolean ignoreUp = false; // whether to ignore the button release because the click+hold was triggered
boolean waitForUp = false; // when held, whether to wait for the up event
boolean holdEventPast = false; // whether or not the hold event happened already
boolean longHoldEventPast = false;// whether or not the long hold event happened already
//=================================================
void setup() {
// Set button input pin
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH );
// Set LED output pins
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, ledVal1);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, ledVal2);
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin3, ledVal3);
pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin4, ledVal4);
}
void loop()
{
int b = checkButton();
if (b == 1) clickEvent();
if (b == 2) doubleClickEvent();
if (b == 3) holdEvent();
if (b == 4) longHoldEvent();
}
// Get button event and act accordingly
int checkButton()
{
int event = 0;
buttonVal = digitalRead(buttonPin);
// Button pressed down
if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce)
{
downTime = millis();
ignoreUp = false;
waitForUp = false;
singleOK = true;
holdEventPast = false;
longHoldEventPast = false;
if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true) DConUp = true;
else DConUp = false;
DCwaiting = false;
}
// Button released
else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime) > debounce)
{
if (not ignoreUp)
{
upTime = millis();
if (DConUp == false) DCwaiting = true;
else
{
event = 2;
DConUp = false;
DCwaiting = false;
singleOK = false;
}
}
}
// Test for normal click event: DCgap expired
if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2)
{
event = 1;
DCwaiting = false;
}
// Test for hold
if (buttonVal == LOW && (millis() - downTime) >= holdTime) {
// Trigger "normal" hold
if (not holdEventPast)
{
event = 3;
waitForUp = true;
ignoreUp = true;
DConUp = false;
DCwaiting = false;
//downTime = millis();
holdEventPast = true;
}
// Trigger "long" hold
if ((millis() - downTime) >= longHoldTime)
{
if (not longHoldEventPast)
{
event = 4;
longHoldEventPast = true;
}
}
}
buttonLast = buttonVal;
return event;
}
//=================================================
// Events to trigger
void clickEvent()
{
ledVal1 = !ledVal1;
digitalWrite(ledPin1, ledVal1);
}
void doubleClickEvent() {
ledVal2 = !ledVal2;
digitalWrite(ledPin2, ledVal2);
}
void holdEvent() {
ledVal3 = !ledVal3;
digitalWrite(ledPin3, ledVal3);
}
void longHoldEvent() {
ledVal4 = !ledVal4;
digitalWrite(ledPin4, ledVal4);
}
только работает он с обыкновенной кнопкой а мне нужно с сенсором
Последний раз редактировалось Omigovolt; 13.02.2014 в 01:28.
Вчера вечером дописав несколько строк с manu_245 все заработало с сенсором )
PHP код:
/* 4-Way Button: Click, Double-Click, Press+Hold, and Press+Long-Hold Test Sketch
By Jeff Saltzman
Oct. 13, 2009
To keep a physical interface as simple as possible, this sketch demonstrates generating four output events from a single push-button.
1) Click: rapid press and release
2) Double-Click: two clicks in quick succession
3) Press and Hold: holding the button down
4) Long Press and Hold: holding the button for a long time
*/
#include <CapacitiveSensor.h>
CapacitiveSensor Sensor1 = CapacitiveSensor(4,2);
#define buttonPin 19 // analog input pin to use as a digital input
#define ledPin1 18 // digital output pin for LED 1
#define ledPin2 17 // digital output pin for LED 2
#define ledPin3 16 // digital output pin for LED 3
#define ledPin4 15 // digital output pin for LED 4
// LED variables
boolean ledVal1 = false; // state of LED 1
boolean ledVal2 = false; // state of LED 2
boolean ledVal3 = false; // state of LED 3
boolean ledVal4 = false; // state of LED 4
// Button timing variables
int debounce = 20; // ms debounce period to prevent flickering when pressing or releasing the button
int DCgap = 250; //
int holdTime = 1000; // ms hold period: how long to wait for press+hold event
int longHoldTime = 3000; // ms long hold period: how long to wait for press+hold event
boolean flag=false;
int checkButton();
// Button variables
boolean buttonVal = HIGH; // value read from button
boolean buttonLast = HIGH; // buffered value of the button's previous state
boolean DCwaiting = false; // whether we're waiting for a double click (down)
boolean DConUp = false; // whether to register a double click on next release, or whether to wait and click
boolean singleOK = true; // whether it's OK to do a single click
long downTime = -1; // time the button was pressed down
long upTime = -1; // time the button was released
boolean ignoreUp = false; // whether to ignore the button release because the click+hold was triggered
boolean waitForUp = false; // when held, whether to wait for the up event
boolean holdEventPast = false; // whether or not the hold event happened already
boolean longHoldEventPast = false;// whether or not the long hold event happened already
//=================================================
void setup() {
Serial.begin(115200);
// Set button input pin
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH );
// Set LED output pins
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, ledVal1);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, ledVal2);
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin3, ledVal3);
pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin4, ledVal4);
}
void loop()
{
int b = checkButton();
if (b == 1) clickEvent();
if (b == 2) doubleClickEvent();
if (b == 3) holdEvent();
if (b == 4) longHoldEvent();
}
// Get button event and act accordingly
int checkButton()
{
int event = 0;
long temp1 = Sensor1.capacitiveSensor(30);
Serial.println(temp1);
if(temp1>1000)
{
buttonVal=0;
}
else buttonVal=1;
// Button pressed down
if (buttonVal == LOW && buttonLast == HIGH && (millis() - upTime) > debounce )
{
downTime = millis();
ignoreUp = false;
waitForUp = false;
singleOK = true;
holdEventPast = false;
longHoldEventPast = false;
if ((millis()-upTime) < DCgap && DConUp == false && DCwaiting == true ) DConUp = true;
else DConUp = false;
DCwaiting = false;
}
// Button released
else if (buttonVal == HIGH && buttonLast == LOW && (millis() - downTime ) > debounce)
{
if (not ignoreUp)
{
upTime = millis();
if (DConUp == false) DCwaiting = true;
else
{
event = 2;
DConUp = false;
DCwaiting = false;
singleOK = false;
}
}
}
// Test for normal click event: DCgap expired
if ( buttonVal == HIGH && (millis()-upTime) >= DCgap && DCwaiting == true && DConUp == false && singleOK == true && event != 2 )
{
event = 1;
DCwaiting = false;
}
// Test for hold
if (buttonVal == LOW && (millis() - downTime) >= holdTime ) {
// Trigger "normal" hold
if (not holdEventPast)
{
event = 3;
waitForUp = true;
ignoreUp = true;
DConUp = false;
DCwaiting = false;
//downTime = millis();
holdEventPast = true;
}
// Trigger "long" hold
if ((millis() - downTime) >= longHoldTime)
{
if (not longHoldEventPast)
{
event = 4;
longHoldEventPast = true;
}
}
}
buttonLast = buttonVal;
return event;
}
//=================================================
// Events to trigger
void clickEvent()
{
ledVal1 = !ledVal1;
digitalWrite(ledPin1, ledVal1);
}
void doubleClickEvent() {
ledVal2 = !ledVal2;
digitalWrite(ledPin2, ledVal2);
}
void holdEvent() {
ledVal3 = !ledVal3;
digitalWrite(ledPin3, ledVal3);
}
void longHoldEvent() {
ledVal4 = !ledVal4;
digitalWrite(ledPin4, ledVal4);
Serial.println (buttonVal);
}
Если кто будет тут проходить, может кто вспомнит эту штуку:
С этим методом возникла проблема. Я пытаюсь померять с помощью этих сенсорных кнопок уровень воды, не сенсоры разумеется с наружи пластикового бака. С самим измерением проблем, все можно откалибровать и замерить. Но возникла проблема после перезагруки уструстойства или сбросе - показания с датчиков падают в 0, и что бы вернуть систему к жизни, надо разорвать линию между контроллером и "сенсорной кнопкой". Причем разорвать физически, я даже пробовал при помощи реле, но выяснил, что если между реле и контроллером есть гальваническая связь - эффекта не будет. Пришлось брать второй контроллер с другим питанием что бы был четкий разрыв! Если землей связать 2 контроллера - эффекта от разрыва опять не будет!
Кто может подсказать что это за фигня такая???
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)