#1 2016-08-18 14:58:57

lav522
Учасник
Зареєстрований: 2016-08-18
Повідомлень: 2

Помогите изменить код.

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

Что я от нее хочу: при одном положении выключетеля - светодиод не горит, сонар не измеряет, в общем все спит. Как только включаю второе положение - задержка на пару сек, чтобы успел отойти, затем загорается светик и начинает работать SR04. При фиксировании изменения начинает пищать зуммер, при том зуммер у меня без генератора, хотелось бы узнать, возможно ли, чтобы при фиксации движения запускался цикл типа:

tone(ALARM, 2000);

delay(100);

и так бесконечно, до тех пор, пока не изменится положение переключателя.

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

Вот код:

#define ALARM 5
#define LED 7
#define SWITCH 8
int echoPin = 11;
int trigPin = 12;

void setup(){
  pinMode(ALARM, OUTPUT);
  pinMode(SWITCH, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  pinMode(trigPin, OUTPUT);
  Serial.begin(9600);
}

void loop (){
 
  int var = digitalRead(SWITCH);
 
switch(var){
  case 1:
   digitalWrite(LED, HIGH);
  int duration, cm;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  cm = duration / 58;
  delay(10);
   
   /*Serial.println(cm);
   delay(300);*/

  if (cm<45 || cm>60){
     
    tone(ALARM, 2000);
   
    delay(100);
   
    case 0:
   
   
      noTone(ALARM);
      digitalWrite(LED, LOW);
    }
  }
  }

Неактивний

#2 2016-08-18 15:28:21

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Помогите изменить код.

а как пищалку будете отключать

Неактивний

#3 2016-08-18 15:49:09

lav522
Учасник
Зареєстрований: 2016-08-18
Повідомлень: 2

Re: Помогите изменить код.

хотелось, чтобы при выключении тумблера и пищалка и светик отключались. noTone(ALARM)

Неактивний

#4 2016-09-19 15:46:28

LGii
Учасник
Зареєстрований: 2016-09-18
Повідомлень: 3

Re: Помогите изменить код.

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

int flag=0;

void setup()   

{
    pinMode(13, OUTPUT);       
}

void loop()

{
   if(digitalRead(7)==HIGH&&flag==0)
{
   digitalWrite(13,!digitalRead(13));
   flag=1;

   }

   if(digitalRead(7)==LOW&&flag==1)

     {
flag=0;//обнуляем переменную flag

     }

}

помогите добавить кнопки

Неактивний

#5 2016-09-19 16:05:16

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Помогите изменить код.

а сами вы не можете поменять пины для кнопок и светиков ?

Неактивний

#6 2016-09-20 08:12:12

LGii
Учасник
Зареєстрований: 2016-09-18
Повідомлень: 3

Re: Помогите изменить код.

я сам не понимаю как добавить еще количество кнопок ((

Неактивний

#7 2016-09-20 08:34:18

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Помогите изменить код.

Ну если по простому то как-то так:

int flag0 = 0;
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

void setup()
{
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);

  pinMode(0, INPUT);
  pinMode(1, INPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
}

void loop()
{
  //первая кнопка
  if (digitalRead(0) == HIGH && flag0 == 0)
  {
    digitalWrite(10, !digitalRead(10));
    flag0 = 1;
  }
  if (digitalRead(0) == LOW && flag0 == 1)
  {
    flag0 = 0; //обнуляем переменную flag
  }

  //вторая кнопка
  if (digitalRead(1) == HIGH && flag1 == 0)
  {
    digitalWrite(11, !digitalRead(11));
    flag1 = 1;
  }
  if (digitalRead(1) == LOW && flag1 == 1)
  {
    flag1 = 0; //обнуляем переменную flag
  }

  //третья кнопка
  if (digitalRead(2) == HIGH && flag2 == 0)
  {
    digitalWrite(12, !digitalRead(12));
    flag2 = 1;
  }
  if (digitalRead(2) == LOW && flag2 == 1)
  {
    flag2 = 0; //обнуляем переменную flag
  }

  //четвертая кнопка
  if (digitalRead(3) == HIGH && flag3 == 0)
  {
    digitalWrite(13, !digitalRead(13));
    flag3 = 1;
  }
  if (digitalRead(3) == LOW && flag3 == 1)
  {
    flag3 = 0; //обнуляем переменную flag
  }
}

Хотя есть и более красивые решения.

Неактивний

#8 2016-09-20 08:41:18

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Помогите изменить код.

если и с таким кодом разобраться не сможете путь один - книжки

#define Button_1    3     ///кнопка 1
#define Led_1       13    ///светик 1
int flag_1 = 0;           ///флаг - состояние кнопки 1

void setup()   

{
  pinMode(Button_1, INPUT);   ///пин кнопки 1 на вход
  pinMode(Led_1, OUTPUT);     ///пин светика 1 на выход     
}

void loop()
{
  if(digitalRead(Button_1) == HIGH && flag_1 == 0)
  {
    digitalWrite(Led_1, !digitalRead(Led_1));
    flag_1 = 1;
  }
  if(digitalRead(Button_1) == LOW && flag_1 == 1)
  {
    flag_1 = 0;     
  }
}

Неактивний

#9 2016-09-27 08:23:41

LGii
Учасник
Зареєстрований: 2016-09-18
Повідомлень: 3

Re: Помогите изменить код.

спасибо ребята , я знал что есть еще отзывчивые люди.  smile

Неактивний

#10 2016-09-27 10:57:08

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

Re: Помогите изменить код.

LGii, Вы ошибаетесь, Вам показалось )

Неактивний

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

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

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