#1 2014-08-11 09:50:24

SC-LERA
Учасник
Зареєстрований: 2014-08-11
Повідомлень: 1

Нужна помощь: Кнопка, тайминг, реле

Здравствуйте!

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

Алгоритм такой:

Ардуинка при включении слушает кнопку на пине №X, и при нажатии, включает реле на пине №Y на 6 секунд 19 милисекунд в это время ардуинка на кнопку не реагирует (то-есть таймер на 6 секунд 19 милисекунд не перезапускает), а по истечению этого времени, не реагирует еще 10 секунд 53 милисекунды и сново уходит в ожидание команды с кнопки.

Неактивний

#2 2014-08-17 14:25:40

admin
Administrator
З Киев
Зареєстрований: 2014-06-09
Повідомлень: 67

Re: Нужна помощь: Кнопка, тайминг, реле

Ну тут как бы все просто:

#define pinX 1
#define pinY 2
void setup(){
    pinMode(pinX,INPUT_PULLUP);//включаем пин Х на вход с внутр. подтягивающим резистором. Кнопкой замыкаем его на землю
    pinMode(pinY,OUTPUT);//пин реле на выход
}
void loop(){
    if(digitalRead(pinX)==LOW){//ждем нажатия кнопки
        digitalWrite(pinY,HIGH);//включили реле
        delay(6019);//ждем 6 секунд 19 милисекунд
        digitalWrite(pinY,LOW);//выключаем реле
        delay(10053);//ждем еще 10 секунд 53 милисекунды и продолжаем дальше ждать нажатия кнопки
    }
}

1 и 2 замените на номера используемых выводов

Неактивний

#3 2014-10-16 20:20:04

gnom537
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

{
   analog=analogRead(14);//считываем сигнал с пина АЦП

       if(analog>0&&analog<1020)   //здесь я сравниваю значение входящего сигнала для прихожая

         {
               if(digitalRead(2)==HIGH&&flag_1==1)//если свет не включен 
                 {
                   digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                   flag_1=0;
                   
                 }
               if(digitalRead(2)==LOW&&flag_1==0)//если свет включен
                 {
                 // digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                  flag_1=1;//обнуляем переменную flag
                 }
                 Serial.print("flag_1=  ");
                 Serial.print(flag_1);
                 Serial.print("  PIN-2=  ");
                 Serial.println(digitalRead(2));
         }
други дорогие, помогите наладить код. кнопок 10 на аналог 0, 10 выходов пин2-пин12, 1 нажатие кнопки должно изменять одно состояние пина!

#4 2014-10-16 20:21:49

gnom537
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

{
   analog=analogRead(14);//считываем сигнал с пина АЦП

       if(analog>0&&analog<1020)   //здесь я сравниваю значение входящего сигнала для прихожая

         {
               if(digitalRead(2)==HIGH&&flag_1==1)//если свет не включен 
                 {
                   digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                   flag_1=0;
                   
                 }
               if(digitalRead(2)==LOW&&flag_1==0)//если свет включен
                 {
                 // digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                  flag_1=1;//обнуляем переменную flag
                 }
                 Serial.print("flag_1=  ");
                 Serial.print(flag_1);
                 Serial.print("  PIN-2=  ");
                 Serial.println(digitalRead(2));
         }
други дорогие, помогите наладить код. кнопок 10 на аналог 0, 10 выходов пин2-пин12, 1 нажатие кнопки должно изменять одно состояние пина!  то биш будет аналоговый выключатель.

#5 2015-02-09 11:27:16

SeS
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Здравствуйте,

также нужен хелп с задержкой. Алгоритм следующий:
Для управления шаговиком использую (только одно направление):
void clockwise(){
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
}

где delayMicroseconds(motorSpeed); меняется в зависимости от скорости. Нужно что бы это все вращалось 5 секунд после нажатия кнопки старт (независимо от значения delayMicroseconds(motorSpeed);) при этом кнопка старт должна не реагировать на нажатие пока идет процес 5 секунд вращения. Время вращения планирую изменять.
заранее благодарю.

#6 2015-02-11 21:24:47

xpl01t
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Передай motorSpeed как аргумент для функции clockwise(). Тогда можно будет задавать скорость в теле main и считать кол-во оборотов для целевой задержки без неизбежного геморроя:

  unsigned long delay = 5000000;                    // Задержка 5 сек.
  unsigned long motorSpeed = 250;                 // Скорость 250мкс на такт, 1мс на оборот
  unsigned long iterations = delay/(speed * 4);  // кол-во оборотов для 5 сек.

void loop(){
  ...
 // Вращаем 5 сек.
 for(i=0;i<iterations;i++)  clockwise(motorSpeed);
  ...
}

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

+ Зачем в ручную-то крутить? Сейчас простенький H-Bridge стоит дешевле, чем транзисторы которыми драйвить мотор надо.

#7 2015-02-15 13:15:42

SeS
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Спасибо, испытаю.

#8 2015-03-13 22:05:17

Santer
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

admin пише:

Ну тут как бы все просто:

#define pinX 1
#define pinY 2
void setup(){
    pinMode(pinX,INPUT_PULLUP);//включаем пин Х на вход с внутр. подтягивающим резистором. Кнопкой замыкаем его на землю
    pinMode(pinY,OUTPUT);//пин реле на выход
}
void loop(){
    if(digitalRead(pinX)==LOW){//ждем нажатия кнопки
        digitalWrite(pinY,HIGH);//включили реле
        delay(6019);//ждем 6 секунд 19 милисекунд
        digitalWrite(pinY,LOW);//выключаем реле
        delay(10053);//ждем еще 10 секунд 53 милисекунды и продолжаем дальше ждать нажатия кнопки
    }
}

1 и 2 замените на номера используемых выводов

А без delay это можно сделать?

#9 2015-03-13 23:05:08

KVP
Учасник
Зареєстрований: 2015-03-11
Повідомлень: 16

Re: Нужна помощь: Кнопка, тайминг, реле

Можно, см.в сторону millis()
Стандартный пример мигания светодиодом без delay - http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Неактивний

#10 2015-05-01 09:27:55

SeS
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Здравствуйте

Буду признателен если кто нибудь подскажет с millis() - может кто нибудь уже проходил через такую задачу. Короче нужно ловить входящий дискретный сигнал и измерять его длительность на одном из входов ардуинки и считать их количество (планирую просто смотреть эти данные через Serial Monitor). Как бы лог такой вести. Пробовал организовать это по принципу кнопки с задержкой - no luck.
Спасибо если кто подскажет.

#11 2015-05-01 12:17:43

KVP
Учасник
Зареєстрований: 2015-03-11
Повідомлень: 16

Re: Нужна помощь: Кнопка, тайминг, реле

SeS пише:

Пробовал организовать это по принципу кнопки с задержкой - no luck.

Сложно представить, как тут задержку использовать.
Напрашивается следующий алгоритм:
1) отслеживаем начало сигнала и как только он появился считываем millis() и сохраняем значение в переменную
2) следим когда сигнал закончится и снова считываем значение millis()
3) от текущего показания вычитаем предыдущее - это и будет длительность сигнала
4) плюсуем единицу в счетчик количества сигналов

Неактивний

#12 2015-05-22 15:05:59

SeS
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Может кому пригодится ловить сигнал без осцила при помощи ардуино. cool

const int buttonPin = 2; 
const int ledPin =  13;
long startTime;
long endTime;
long signalLength;
int signalNumber = 0;
int buttonState;   
int lastButtonState = 0;

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the button pin as an input:
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void loop(){
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH)
    startTime = millis();
    digitalWrite(ledPin, HIGH);
    lastButtonState = buttonState;
  if (buttonState == LOW) {
    endTime = millis();
    signalLength = endTime - startTime;
    Serial.print("Pulse length:  ");
    Serial.println(signalLength);
    ++signalNumber;
    Serial.print("Signal Number:  ");
    Serial.println(signalNumber);
    digitalWrite(ledPin, LOW);
  }
}
}

#13 2015-06-11 18:20:32

nikon
Учасник
Зареєстрований: 2015-06-11
Повідомлень: 3

Re: Нужна помощь: Кнопка, тайминг, реле

Такой вопрос можете ли вы найти ошибку в программе . Программа для сигнализации. Тупик в том что когда дверь открываться сигнализация не срабатывает!
//
const int button = 12; //
const int gerkon = 3; //
const int sirena = 2; //
const int led = 13; //
//
int buttonState = 0; //
int gerkonState = 0; //
int N = 0; //
void setup(){
//
pinMode(sirena,OUTPUT);
pinMode(led,OUTPUT); //
pinMode(gerkon, INPUT);
pinMode(button, INPUT);
}
void loop()
{
digitalWrite(led, HIGH);
while(buttonState==0){//
buttonState = digitalRead(button); //
}
digitalWrite(led,LOW);
buttonState = 0; //
while(gerkonState = 0){ //
gerkonState = digitalRead(gerkon);
}
delay (500); //
digitalWrite(sirena, HIGH); //
delay (100); //
digitalWrite(sirena, LOW); //
delay (70); //
digitalWrite(sirena, HIGH); //
delay (100); //
digitalWrite(sirena, LOW); //
while(gerkonState==1){ //
gerkonState = digitalRead(gerkon);
}
for (int i=0; i<=5; i++){ //
buttonState = digitalRead(button); //
if (buttonState == HIGH){ //
N=N+1;
}
delay(1500); //
}
if (N>0){ //
digitalWrite(sirena, LOW); //
}
else {
digitalWrite(sirena, HIGH); //
}
digitalWrite(led, HIGH); //
buttonState = 0;
delay(1500); //
digitalWrite(led, LOW); //
}

Неактивний

#14 2015-06-11 18:26:07

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

while(gerkonState == 0)

Неактивний

#15 2015-06-11 20:25:20

nikon
Учасник
Зареєстрований: 2015-06-11
Повідомлень: 3

Re: Нужна помощь: Кнопка, тайминг, реле

Блинский можно по подробней

Неактивний

#16 2015-06-12 09:49:23

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

nikon, ну чё за сленг?, не Блинский я.

поподробнее?
вот поподробнее
см. код

while(gerkonState = 0){ //
gerkonState = digitalRead(gerkon);
}

gerkonState = 0   переменной gerkonState присваиваем ноль
gerkonState = digitalRead(gerkon); никогда не выполняется

надеюсь делаете сигналку для холодильника,
иначе рекомендую реализовать защиту от дребезга.

по хорошему - реализуйте на прерываниях, с запуском таймера в котором контролируете время непрерывного события, ну а дальше в зависимости от настроек вашего обьекта  (нормально замкнут или разомкнут) выставляете свой алярм.


итого
строчку while(gerkonState = 0){ //
заменить на while(gerkonState == 0) { //  check state gerkon

успеха.

Неактивний

#17 2015-06-15 17:25:27

nikon
Учасник
Зареєстрований: 2015-06-11
Повідомлень: 3

Re: Нужна помощь: Кнопка, тайминг, реле

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

Неактивний

#18 2015-06-15 20:41:34

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

так запустилось или нет ? )

void loop()
{

digitalWrite(led, HIGH);

do { //  ожидаем  постановки на охрану
	buttonState = digitalRead(button); //
} while( buttonState == 0 ) 
//  поставили на охрану

digitalWrite(led,LOW);
buttonState = 0; //

// выключили лампочку 
do { // ожидаем отработки геркона 
	gerkonState = digitalRead(gerkon);
} while( gerkonState == 0) 

// 1 сек  играет звук 
 exe_sirena ();

do { // ожидаем закрытия двери
	gerkonState = digitalRead(gerkon);
} while( gerkonState == 1 ) 

// кнопка нажата? не совсем корректный цикл. 
N = 0;
for (int i=0; i<=5; i++)
{ //
  buttonState = digitalRead(button); //
  if (buttonState == HIGH) N++;
  delay(1500); //
}
if ( N > 0 ) 
	  digitalWrite(sirena, LOW); //
else  digitalWrite(sirena, HIGH); //

digitalWrite(led, HIGH); //
buttonState = 0;
delay(1500); //
digitalWrite(led, LOW); //
}

можно и так

gerkonState = 1;  // 

while(gerkonState==1)
{ //
gerkonState = digitalRead(gerkon);
}

Неактивний

#19 2015-07-20 21:38:35

Алексей69
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Здравствуйте, уважаемые ардуиноведы. Помогите, пожалуйста, с кодом:

#include <SD.h>
const int buttonPin = 2; 
File myFile;
unsigned long startTime;
unsigned long endTime;
long signalLength;
int signalNumber = 0;
int buttonState;   
int lastButtonState = 0;

void setup()
{
  Serial.begin(9600);
   while (!Serial) {
}
  pinMode(buttonPin, INPUT); 
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}

void loop()
{
 buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH)
    startTime = millis();   
    lastButtonState = buttonState;
    if (buttonState == LOW) {
    endTime = millis();
    signalLength = endTime - startTime;
    ++signalNumber;
      myFile = SD.open("test.txt", FILE_WRITE);
      if (myFile) {
      myFile.print(signalNumber);
      myFile.print(" - ");
      myFile.println(startTime);
      myFile.close();
      }
  }
 }
}

Схема подключения кнопки.

Программу скопи-пастил с этой же страницы (спасибо SeSу из 12го поста).

Задумка такая - пользователь нажимает на кнопку (пин2), сие событие инициирует запись на SD. Проблема - запись идет постоянно, с 20 мс интервалом. Нажатие кнопки отображаеться как остановка записи в файл с длительностью удержания кнопки. Пробовал с условиями buttonState == LOW/HIGH играть - не то.

Буду благодарен за любую помощь.

#20 2015-07-20 23:51:38

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

attachInterrupt(0, key_interrupt, CHANGE );
key_interrupt- function

https://www.arduino.cc/en/Reference/AttachInterrupt

выбирайте тот пин на который можно прикрутить прерывание
ех хорошая каменюка в сторону атмела ))))


в функции выставляете флаг события, когда начнете запись, снимайте

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

Остання редакція NoName (2015-07-21 00:04:34)

Неактивний

#21 2015-07-21 21:05:32

Алексей69
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Спасибо за ответ.
Только что пробовал. Пин 2й (согласно спецификации на UNO).

#include <SD.h>
File myFile;
unsigned long time;

void setup()
{
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    return;
  }
  attachInterrupt(0, key_interrupt, CHANGE); 
}

void loop()
{
 time = millis();
}

void key_interrupt()
{
     myFile = SD.open("test.txt", FILE_WRITE);
     myFile.println(time);
     myFile.close();
}

Получилось снять данные в виде таблица
Пробовал через переменную-флаг, которая менялась по прерыванию, а в цикле loop() выполнял проверку на состояние флага - но цикличность записи была такая же. А мне нужно, чтобы запись была только по факту нажатия на кнопку, единожды... А тут "простыню" данных, на 1000-50000 значений выводит.

З.Ы.
Только что попробовал:

#include <SD.h>
File myFile;
unsigned long time;

void setup()
{
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    return;
  }
  attachInterrupt(0, key_interrupt, CHANGE); 
}

void loop()
{
 time = millis();
}

void key_interrupt()
{
zapis();
}

void zapis()
{
       myFile = SD.open("test.txt", FILE_WRITE);
     myFile.println(time);
     myFile.close();
}

И тоже, зараза, не пашет. Значения как на листе "вар. 3" в файле.

#22 2015-07-22 10:49:07

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

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

Неактивний

#23 2015-07-22 21:27:48

Алексей69
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Спасибо, NoName.

int pin = 13;
volatile int state = LOW;
unsigned long time;
 
void setup()
{
  pinMode(pin, OUTPUT);
  Serial.begin(57600);
  attachInterrupt(0, blink, FALLING);
}
 
void loop()
{
  time=millis();
  digitalWrite(pin, state);
  if(state==HIGH){
    Serial.println(time);
    state = LOW;
  }
    digitalWrite(2,LOW);
}
 
void blink()
{
  state = !state;
}

Работает как хотел. Запара в подключении кнопки была - история о «плохих» контактах и моих кривых руках ?

Спасибо.

#24 2015-07-23 08:20:22

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Нужна помощь: Кнопка, тайминг, реле

пожалуйста, успешного завершения проекта
как обычно,  история в плохих контактах, но о руках тоже не стоит забывать )

Неактивний

#25 2015-07-28 15:52:19

Sergey_:)
Гість

Re: Нужна помощь: Кнопка, тайминг, реле

Здравствуйте! Помогите советом начинающему.
Как реализовать разные режимы нажатия одной кнопки?
Например:
режим 1 - нажал кнопку около 1 сек. - светодиод загорелся, отпустил кнопку - светодиод потух;
режим 2 - нажал кнопку, удерживая 2 сек. - светодиод загорелся, отпустил кнопку - светодиод горит, нажал повторно кнопку на 2 сек. - светодиод потух.
отдельными скетчами режимы реализованы, но режим 2 реализовал классически, без тайминга (нажал - горит, отпустил - горит, нажал - потух)

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму