Помощь в сигнализации

Тема в разделе "Arduino & Shields", создана пользователем DavOg56, 12 июл 2017.

  1. DavOg56

    DavOg56 Нуб

    Идея такая,если ультразвуковой датчик заметил расстояние,менее 100 см,включается сигнализация,и будет она работать до тех пор,пока ик приемник не примет сигнал с моего пульта от телевизора.Кашу в программе заварил я что надо, поэтому прошу помочь.Потом на основе этой программы сделаю умную комнату(да да,умную комнату).

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

    Код (C++):
    #define Trig 12 //ультразвук
    #define Echo 13 //ультразвук(2)
    #define ledPin 8 //светодиод
    //пьезопищалка
    //все для приемника
    #include "IRremote.h"
    IRrecv irrecv(10); // Указываем пин, к которому подключен приемник
    decode_results results;

    void setup()
    {
      pinMode(Trig, OUTPUT); //инициируем как выход
      pinMode(Echo, INPUT); //инициируем как вход
      pinMode(ledPin, OUTPUT);

      Serial.begin(9600);
      /* задаем скорость общения. В нашем случае с компьютером */
      //ПРИЕМНИК=======>
      irrecv.enableIRIn(); // Запускаем прием
    }
    unsigned int impulseTime=0;
    unsigned int distance_sm=0;

    void loop()
    {
      digitalWrite(Trig, HIGH);
      /* Подаем импульс на вход trig дальномера */
      delayMicroseconds(10); // равный 10 микросекундам
      digitalWrite(Trig, LOW); // Отключаем
      impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
      distance_sm=impulseTime/58; // Пересчитываем в сантиметры
      Serial.println(distance_sm); // Выводим на порт
      int i = 0;
      if (distance_sm < 100 &&  i=0; ) // Если расстояние менее 100 сантиметром
      {
      {
        digitalWrite(ledPin, HIGH); // Светодиод горит
        delay(100);
        digitalWrite(ledPin, LOW); // Светодиод Потухает
        i++;
      }
      }
       if (irrecv.decode(&results));
       {
        int res = results.value;
        if(res== 0x24DB && 0x824DB)
        {
          int i=0;
           digitalWrite(ledPin, LOW);
        }
        }
        delay(100);
       }

      /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего.
       Это время называется периодом цикла (cycle period).
       Рекомендованный период между импульсами должен быть не менее 50 мс.  */

     
     

    Вложения:

  2. railmisaka

    railmisaka Гик

    А проблема то в чем?
     
  3. DavOg56

    DavOg56 Нуб

    Проблема в том,что я не могу полноценно дописать программу.Поэтому и пишу в форум
     
  4. railmisaka

    railmisaka Гик

    У вас есть вопрос, или вы хотите чтобы кто-то сделал это вместо вас?
     
  5. DavOg56

    DavOg56 Нуб

    Вопрос состоит в том,как дописать правильно эту программу.Я хочу,чтобы мне ее помогли доделать
     
  6. fogary

    fogary Гик

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

    Добавил свои комментарии, из того что заметил.
    Код (C++):
    void loop()
    {
      digitalWrite(Trig, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig, LOW);
      impulseTime=pulseIn(Echo, HIGH);
      distance_sm=impulseTime/58;
      Serial.println(distance_sm);
      int i = 0; // здесь объявляете переменную и присваиваете ей 0
      if (distance_sm < 100 &&  i=0; ) //снова присваиваете переенной 0,
      { //в результате получается false  и код в фигурных скобках не будет выполняться ни разу
      { // для чего нужна вторая пара фигурный скобок - не понятно
        digitalWrite(ledPin, HIGH);
        delay(100);
        digitalWrite(ledPin, LOW);
        i++; // совершенно бессмысленная операция (см. выше)
      }
      }
       if (irrecv.decode(&results)); //если условие == true, то выполняется пустой оператор ";", а не код ниже
       {
        int res = results.value;
        if(res== 0x24DB && 0x824DB) // т. к. 0x824DB всегда больше 0,
        { //на результат влияет только первая часть условия
          int i=0; // повторное объявление переменной, зачем?
           digitalWrite(ledPin, LOW);
        }
        }
        delay(100);
       }
     
    Для начала исправьте ошибке в коде.